实验一:51单片机架构与汇编指令

实验一:51单片机架构与汇编指令

##一.51单片机架构

内核
  51单片机由一个IP核和片上外设组成,IP核(内核)就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。IP核跟外设之间由系统总线连接,且是8bit的,速度有限。
51内核是上个世纪70年代Intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。这里Intel属于IP核厂商,STC属于IC厂商。我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。

外设
  我们在学习51的时候,关于内核部分接触的比较少,使用的最多的是片上外设,我们在编程的时候操作的也就是这些外设。
编程的时候操作的寄存器位于SFR和RAM这个部分,其中SFR(特殊功能寄存器)占有 128字节(实际上只用了 26 个字节,只有 26 个寄存器,其他都属于保留区),RAM占有 128 字节,我们在程序中定义的变量就是放在RAM中。其中SFR和RAM在地址上是重合的,都是在80~FF地址区间,但在物理区间上是分开的,所以51的RAM是有256个字节。

编写好的程序是烧写到ROM区。剩下的外设都是我们非常熟悉的IO口,串口、定时器、中断这几个外设。
##二.汇编指令

汇编指令是汇编语言中使用的一些操作符和助记符,还包括一些伪指令(如assume,end),汇编指令同机器指令一一对应。每一种CPU都有自己的汇编指令集。

计算机是通过执行指令来处理数据的,为了指出数据的来源、操作结果的去向及所执行的操作,一条指令一般包含操作码和操作数两部分。

指令是计算机能够识别和执行的操作命令,由二进制数“0”、“1”组成。每条指令的编码格式由机器指令系统规定。通常,一条指令包含操作码和操作数两部分内容,格式如下图所示:

在这里插入图片描述

操作码(Operation Code)用来说明指令操作的性质与功能,常用OP表示。操作码是指令中不可缺少的部分,通常由1~2个字节组成,机器通过译码电路来识别指令。操作数用于提供指令中要处理的数据或数据所在的地址信息。

以MOV指令作为例子,MOV指令的格式为:MOV dst,src。其中:MOV为指令助记符,表示传送,dst为目标操作数,src表示源操作数,该指令的功能是将源操作数传送到目标单元。例如:

MOV…AL,20H;将8位立即数20H传送到AL中。

MOV…AX,1234H;将16位立即数1234H传送到AX中。

MOV…EAX,34568020H;将32位立即数34568020H传送到EAX中。

三.实验

(一) 点亮一个LED灯
ORG 0100H 
SETB  P2.0 
SJMP $
END
  • ORG 0100H:设置程序的起始地址为0100H,表示程序从地址0100H处开始执行。
  • SETB P2.0:将P2寄存器的第0位设为1,即设置P2寄存器的第0位为1。
  • SJMP $:无条件跳转指令,跳转到当前指令的地址,实现一个无限循环。
  • END:指示程序结束。

在这里插入图片描述

(二) 点亮LED流水灯
1.汇编指令
ORG 0000H 
LJMP MAIN 
ORG 0100H 
MAIN: 
MOV A,#0FEH 
LOOP: 
MOV P0,A 
LCALL DELAY 
RL A  
LJMP LOOP 
DELAY: 
MOV R2,#255 
D1:MOV R3,#250 
D2:DJNZ R3,D2     
DJNZ R2,D1 
RET 
END
  • ORG 0000H:设置程序的起始地址为0000H,表示程序从地址0000H处开始执行。
  • LJMP MAIN:无条件跳转指令,跳转到标签MAIN处执行。
  • ORG 0100H:设置程序的起始地址为0100H。
  • MAIN::标签,表示程序的入口处。
  • MOV A,#0FEH:将立即数0FEH(带符号的十六进制数)移动到寄存器A中。
  • LOOP::标签,定义一个循环开始处。
  • MOV P0,A:将寄存器A中的值移动到P0端口。
  • LCALL DELAY:调用子程序DELAY。
  • RL A:将A寄存器的值向右循环移位。
  • LJMP LOOP:无条件跳转到LOOP处,实现循环。
  • DELAY::定义了一个子程序DELAY。
  • MOV R2,#255:将立即数255移动到寄存器R2中。
  • D1::标签,用于延时循环开始处。
  • MOV R3,#250:将立即数250移动到寄存器R3中。
  • D2::标签,用于内部延时循环开始处。
  • DJNZ R3,D2:R3不为零时跳转到标签D2处,实现内部延时。
  • DJNZ R2,D1:R2不为零时跳转到标签D1处,实现整体延时。
  • RET:子程序返回。
  • END:指示程序结束。
2.c语言
#include <reg51.h> 
#include <intrins.h> 
void delay_ms(int a) 
{ 
} 
int i,j; 
for(i=0;i<a;i++) 
{ 
} 
for(j=0;j<1000;j++) _nop_(); 
void main(void) 
 { 
  while(1) 
  { 
   P0=0xfe; 
   delay_ms(50); 
   P0=0xfd; 
   delay_ms(50); 
   P0=0xfb; 
   delay_ms(50); 
   P0=0xf7; 
   delay_ms(50); 
   P0=0xef; 
   delay_ms(50); 
   P0=0xdf; 
   delay_ms(50); 
   P0=0xbf; 
   delay_ms(50); 
   P0=0x7f; 
   delay_ms(50); 
  } 
 }

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>