用51汇编语言写定时器中断控制流水灯延时1秒
时间: 2024-03-01 22:53:39 浏览: 82
51单片机定时器中断 汇编语言写的
好的,这是一个关于使用51单片机汇编语言编写定时器中断控制流水灯延时1秒的示例:
首先,定义一些常数和变量,如下所示:
```
ORG 0H ;程序起始地址
MOV TMOD,#01H ;定时器0工作在方式1下
MOV TH0,#0FEH ;计数初值, 1ms时常
MOV TL0,#0H
SETB TR0 ;开定时器0
MOV P1,#0FFH ;P1口初始值
MOV R0,#8 ;R0寄存器初始化为8,即8个LED灯
MOV DPTR,#DATA ;DPTR指向数据区
MOVX A,@DPTR ;从数据区取出流水灯的初始值
MOV P1,A ;将流水灯初始值送给P1口
INC DPTR ;指向下一个数据
MOV R7,#0 ;R7寄存器初始化为0
MOV R6,#0 ;R6寄存器初始化为0
MOV R5,#3 ;R5寄存器初始化为3,即1秒的延时时间
MAIN: JB TF0,MAIN ;等待定时器0溢出
CLR TF0 ;清除定时器0溢出标志
MOVX A,@DPTR ;从数据区取出流水灯的下一个值
MOV P1,A ;送给P1口
INC DPTR ;指向下一个数据
DJNZ R0,MAIN ;重复8次
CLR TR0 ;关闭定时器0
DJNZ R5,DELAY ;每延时1秒,R5减1
SJMP $ ;结束
DELAY: MOV R6,#250 ;R6寄存器初始化为250
DELAY_LOOP: DJNZ R6,DELAY_LOOP ;循环延时
DJNZ R7,DELAY ;每延时1秒,R7减1
RET ;返回
DATA: DB 7FH, 3FH, 1FH, 0FH, 07H, 03H, 01H, 00H ;流水灯的值
```
代码解释:
1. `ORG 0H`:程序起始地址为0。
2. `MOV TMOD,#01H`:定时器0工作在方式1下。
3. `MOV TH0,#0FEH`:定时器0计数初值,1ms时常。
4. `MOV TL0,#0H`:定时器0计数初值低8位。
5. `SETB TR0`:开定时器0。
6. `MOV P1,#0FFH`:P1口初始值为255(0xFF),即8个LED都灭。
7. `MOV R0,#8`:R0寄存器初始化为8,即8个LED灯。
8. `MOV DPTR,#DATA`:DPTR指向数据区。
9. `MOVX A,@DPTR`:从数据区取出流水灯的初始值。
10. `MOV P1,A`:将流水灯初始值送给P1口。
11. `INC DPTR`:指向下一个数据。
12. `MOV R7,#0`:R7寄存器初始化为0,用于记录已延时的秒数。
13. `MOV R6,#0`:R6寄存器初始化为0,用于记录已延时的毫秒数。
14. `MOV R5,#3`:R5寄存器初始化为3,即1秒的延时时间。
15. `MAIN:`:主程序入口。
16. `JB TF0,MAIN`:等待定时器0溢出。
17. `CLR TF0`:清除定时器0溢出标志。
18. `MOVX A,@DPTR`:从数据区取出流水灯的下一个值。
19. `MOV P1,A`:送给P1口。
20. `INC DPTR`:指向下一个数据。
21. `DJNZ R0,MAIN`:重复8次。
22. `CLR TR0`:关闭定时器0。
23. `DJNZ R5,DELAY`:每延时1秒,R5减1。
24. `SJMP $`:结束。
25. `DELAY:`:延时函数入口。
26. `MOV R6,#250`:R6寄存器初始化为250,即延时1ms。
27. `DELAY_LOOP:`:循环延时。
28. `DJNZ R6,DELAY_LOOP`:每循环一次,R6减1。
29. `DJNZ R7,DELAY`:每延时1秒,R7减1。
30. `RET`:返回。
31. `DATA: DB 7FH, 3FH, 1FH, 0FH, 07H, 03H, 01H, 00H`:流水灯的值。
这段代码的实现过程是:在定时器0中断服务程序中,每过1ms,将P1口的值改为流水灯的下一个值,重复8次后关闭定时器0,在延时函数中进行1秒的延时,延时结束后返回到主程序循环执行。注意,在延时函数中,为了实现1ms的延时,需要使用一个循环来进行计数,循环内部的计数次数需要根据实际情况进行调整。
阅读全文