发布网友 发布时间:2022-04-23 16:48
共2个回答
热心网友 时间:2023-07-31 01:21
首先看前几行:
ORG 0000H从它们的地址可以看出,这可能是 51 单片机的汇编,前几行的意思分别为:
程序空间从 0000 位置起
跳转到 START 位置
程序空间从 000B 位置起
跳转到 T_0 处
程序空间从 0030 位置起
START (标记)
具体来说,0000(指的是程序地址,十六进制) 即单片机复位之后首先要执行的代码位置,此处复位(或刚上电)之后立即跳转到 START 位置执行。000B 是定时器中断0触发之后要执行的代码位置,此处在定时器中断0触发之后跳转到 T_0 处执行,它们具体执行什么后面再看。
接下来:
MOV DPTR,#TABLE这里执行了一些初始化操作,具体来说:
将 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:这是程序的主循环,理解之前先看 TABLE:
TABLE: DB 3FH,06H,5BH,4FH,66H这明显是数码管显示的数据,DB 代表存储单元,不用管,后面的十个数据代表着数码管显示 0~9 的代码。
因此主循环控制的是显示两个数码管,周期为 4ms显示一个字符,字符左边位是定时器的百位,右边为定时器值的十位,所以它可能是一个百位的计数器。
定时器在溢出之后会将 P3.0 取反,它可能连接着某个硬件(可能是 LED),代表着倒数结束。
详细看一下定时器中断处理部分:
T_0:前面和后面进行一些压栈和出栈动作,保存触发中断时的状态,这是惯例。主要的就是一句 CPL P3.0,即将 P3.0 取反,常用于 LED 闪烁
之后给 T0 的寄存器重新装载初值
最后的 RETI 用于退出中断
DELAY4MS:这是一个延时函数,顾名思义,延时 4ms,里面就是一些简单的循环,不细说了。
热心网友 时间:2023-07-31 01:22
在单片机启动时,跳转到start处开始运行程序。