用51单片机汇编语言写定时器中断控制流水灯循环点亮延时1s的源程序
时间: 2023-08-30 12:06:23 浏览: 231
非常感谢您的提问,我会尽力回答。以下是用51单片机汇编语言写定时器中断控制流水灯循环点亮延时1s的源程序。
首先,我们需要在程序开头设置定时器中断。这里我们使用定时器1作为计时器,设置为1s中断一次。
```
ORG 0H
MOV TMOD, 0B00010000B ;设置定时器1为模式1
MOV TH1, -50000 ;设置定时器1初值为0x4C4B
MOV TL1, -50000
SETB TR1 ;启动定时器1
SETB EA ;开启总中断
```
接下来,在主程序中设置循环语句,每次循环让流水灯从左向右依次点亮,延时1s后再从右向左依次点亮,如此往复。
```
MAIN:
MOV P1, #0FEH ;默认第一个灯亮
MOV R1, #0FFH ;设置循环计数器
MOV R2, #01H ;设置灯的移动方向
SJMP MAIN_LOOP ;跳转到循环语句
MAIN_LOOP:
JB TF1, TIMER1_ISR ;检测定时器1是否中断
DJNZ R1, MAIN_LOOP ;循环计数器自减,检测是否结束
MOV A, P1 ;读取当前灯状态
MOV C, R2 ;读取移动方向
RLC A ;左移一位
MOV P1, A ;更新灯状态
JNC MAIN_LOOP ;判断是否到达最右侧,若未到达则继续循环
MOV R2, #80H ;到达最右侧,改变移动方向,从右向左点亮
SETB TF1 ;重置定时器1中断标志,开始计时1s
SJMP MAIN_LOOP ;跳转到循环语句
TIMER1_ISR:
CLR TF1 ;清除定时器1中断标志
RETI ;退出中断
```
完整的程序如下:
```
ORG 0H
MOV TMOD, 0B00010000B ;设置定时器1为模式1
MOV TH1, -50000 ;设置定时器1初值为0x4C4B
MOV TL1, -50000
SETB TR1 ;启动定时器1
SETB EA ;开启总中断
MAIN:
MOV P1, #0FEH ;默认第一个灯亮
MOV R1, #0FFH ;设置循环计数器
MOV R2, #01H ;设置灯的移动方向
SJMP MAIN_LOOP ;跳转到循环语句
MAIN_LOOP:
JB TF1, TIMER1_ISR ;检测定时器1是否中断
DJNZ R1, MAIN_LOOP ;循环计数器自减,检测是否结束
MOV A, P1 ;读取当前灯状态
MOV C, R2 ;读取移动方向
RLC A ;左移一位
MOV P1, A ;更新灯状态
JNC MAIN_LOOP ;判断是否到达最右侧,若未到达则继续循环
MOV R2, #80H ;到达最右侧,改变移动方向,从右向左点亮
SETB TF1 ;重置定时器1中断标志,开始计时1s
SJMP MAIN_LOOP ;跳转到循环语句
TIMER1_ISR:
CLR TF1 ;清除定时器1中断标志
RETI ;退出中断
```
希望这个程序能够帮到您,如有疑问请随时问我。
阅读全文