单片机汇编语言中能用MOV代替PUSH吗?中断控制中,设置SP初值有何意义?怎样避免中断程序不破坏延时参数?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问,我会尽力回答。以下是用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 ;退出中断 ``` 希望这个程序能够帮到您,如有疑问请随问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值