用51汇编语言写定时器中断控制流水灯
时间: 2023-07-18 21:23:54 浏览: 202
好的,这是一个关于使用51单片机汇编语言编写定时器中断控制流水灯的示例:
首先,定义一些常数和变量,如下所示:
```
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 ;指向下一个数据
MAIN: JB TF0,MAIN ;等待定时器0溢出
CLR TF0 ;清除定时器0溢出标志
MOVX A,@DPTR ;从数据区取出流水灯的下一个值
MOV P1,A ;送给P1口
INC DPTR ;指向下一个数据
DJNZ R0,MAIN ;重复8次
SJMP $ ;结束
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. `MAIN:`:主程序入口。
13. `JB TF0,MAIN`:等待定时器0溢出。
14. `CLR TF0`:清除定时器0溢出标志。
15. `MOVX A,@DPTR`:从数据区取出流水灯的下一个值。
16. `MOV P1,A`:送给P1口。
17. `INC DPTR`:指向下一个数据。
18. `DJNZ R0,MAIN`:重复8次。
19. `SJMP $`:结束。
20. `DATA: DB 7FH, 3FH, 1FH, 0FH, 07H, 03H, 01H, 00H`:流水灯的值。
这段代码的实现过程是:在定时器0中断服务程序中,每过1ms,将P1口的值改为流水灯的下一个值,重复8次后结束程序。
注意:这段代码是在KEIL C51编译器下编写的,如果您使用其他编译器,请根据自己的情况进行修改。同时,此代码仅供参考,具体实现过程需要根据实际情况进行调整。
阅读全文