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

文章目录

  • 实验一:51单片机架构与汇编指令
    • 三.实验
        • (一) 点亮一个LED灯
        • (二) 点亮LED流水灯
          • 1.汇编指令
          • 2.c语言

##一.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 SETBP2.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 ALJMP 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  #include  void delay_ms(int a) { } int i,j; for(i=0;i