能不能解释一下这些程序是什么意思

发布网友 发布时间:2022-04-23 16:48

我来回答

2个回答

热心网友 时间:2023-07-31 01:21

首先看前几行:

ORG 0000H
LJMP START
ORG 000BH
LJMP T_0
ORG 0030H
START:

从它们的地址可以看出,这可能是 51 单片机的汇编,前几行的意思分别为:

程序空间从 0000 位置起

跳转到 START 位置

程序空间从 000B 位置起

跳转到 T_0 处

程序空间从 0030 位置起

START (标记)

具体来说,0000(指的是程序地址,十六进制) 即单片机复位之后首先要执行的代码位置,此处复位(或刚上电)之后立即跳转到 START 位置执行。000B 是定时器中断0触发之后要执行的代码位置,此处在定时器中断0触发之后跳转到 T_0 处执行,它们具体执行什么后面再看。

接下来:

MOV DPTR,#TABLE
MOV SP,#60H
MOV TH0,#0FFH
MOV TL0,#0F0H
SETB EA
SETB ET0
MOV TMOD,#05H
SETB TR0

这里执行了一些初始化操作,具体来说:

将 TABLE(常量数组,定义在最后)的地址放进 DPTR 里,以后寄存器间接寻址 DPTR 就意味着从 TABLE 中读取数据

将 60H(16进制的60,转换为十进制是 96,)放进 SP 里,SP 是堆栈指针,这句话的意思就是开辟一个堆栈空间

将 FFH 和 F0H 分别放进定时器寄存器 T0 的高位和低位,因此 T0 中现在就是 FFF0H,后面它会逐渐减少,减少到 0 触发定时器中断,进入 T_0 执行中断处理程序

开总中断

开定时器中断 0

将 T0 的定时器模式设置为 16 位计数器,具体来说,TMOD 此时值为 0000 0101,左边 0000 设置 T1,这里没有用到。右变 0101 设置的是 T0,从左到右: 0 是门控位,意思是暂时不开启定时器;1 是设置定时还是计数,此处设置为计数;01 是模式,这里设置为 16 位计数器模式

T0 开始计数

LOOP:
MOV A,TL0
SUBB A,#0F0H
MOV B,#100
DIV AB
MOVC A,@A+DPTR
MOV P2,#00001101B
MOV P1,A
LCALL DELAY4MS
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV P2,#00001011B
MOV P1,A
LCALL DELAY4MS
MOV A,B
MOVC A,@A+DPTR
MOV P2,#00000111B
MOV P1,A
LCALL DELAY4MS
LJMP LOOP

这是程序的主循环,理解之前先看 TABLE:

TABLE: DB 3FH,06H,5BH,4FH,66H
       DB 6DH,7DH,07H,7FH,6FH

这明显是数码管显示的数据,DB 代表存储单元,不用管,后面的十个数据代表着数码管显示 0~9 的代码。

因此主循环控制的是显示两个数码管,周期为 4ms显示一个字符,字符左边位是定时器的百位,右边为定时器值的十位,所以它可能是一个百位的计数器。

定时器在溢出之后会将 P3.0 取反,它可能连接着某个硬件(可能是 LED),代表着倒数结束。

详细看一下定时器中断处理部分:

T_0:
PUSH ACC
PUSH DPH
PUSH DPL
CPL P3.0
MOV TH0,#0FFH
MOV TL0,#0F0H
POP DPL
POP DPH
POP ACC
RETI

前面和后面进行一些压栈和出栈动作,保存触发中断时的状态,这是惯例。主要的就是一句 CPL P3.0,即将 P3.0 取反,常用于 LED 闪烁

之后给 T0 的寄存器重新装载初值

最后的 RETI 用于退出中断

DELAY4MS:
MOV R5,#10
DELAY_LOOP1:
MOV R4,#200
DELAY_LOOP2:DJNZ R4,DELAY_LOOP2
DJNZ R5,DELAY_LOOP1

这是一个延时函数,顾名思义,延时 4ms,里面就是一些简单的循环,不细说了。

热心网友 时间:2023-07-31 01:22

在单片机启动时,跳转到start处开始运行程序。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com