完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
初学51单片机,我现在要做一个走道灯,要用汇编语言,一个按钮开关控制一盏灯,第一次按下开关后灯亮,进入延时程序,到规定时间后灯自动灭。在灯亮延时的过程中我想灭灯,就是再按一次开关,灯就立刻灭掉(即中断程序),第三次按下开关后,灯亮,进入延时程序。。。以此类推。程序代码如下,但在protues仿真不理想,按钮无法精确控制灯的亮灭,望高人指点,如何改善,实现精确控制
LIGHT BIT P1.0 KEY BIT P3.2 ORG 0000H SJMP START ORG 0003H AJMP INTO ORG 0030H START:CLR LIGHT JB KEY,START SETB EA SETB EX0 LCALL DELAY SETB LIGHT LCALL DELAY AJMP $ DELAY:MOV R1,#50 LOOP4:MOV R2,#170 LOOP3:MOV R3,#100 LOOP2:MOV R4,#50 LOOP1:DJNZ R4,LOOP1 DJNZ R3,LOOP2 DJNZ R2,LOOP3 DJNZ R1,LOOP4 INTO:CPL P1.0 REti END |
|
相关推荐
4 个讨论
|
|
这段程序的逻辑关系的确有点问题,1、JB KEY,START说明每次按键都是清除LIGHT(可能是灯亮吧),就没有第二次、第三次之分了;2、RETI不当;3、START主循环结尾应该是AJMP START,程序中AJMP $不知是 $什么标号。
我帮你修改四个地方,你再试一下: LIGHT BIT P1.0 KEY BIT P3.2 ORG 0000H SJMP START ORG 0003H AJMP INTO ORG 0030H START:CLR LIGHT JB KEY,INTO ;1 SETB EA SETB EX0 LCALL DELAY SETB LIGHT LCALL DELAY AJMP START ;2 DELAY:MOV R1,#50 LOOP4:MOV R2,#170 LOOP3:MOV R3,#100 LOOP2:MOV R4,#50 LOOP1:DJNZ R4,LOOP1 DJNZ R3,LOOP2 DJNZ R2,LOOP3 DJNZ R1,LOOP4 RET ;3 INTO:CPL P1.0 LCALL DELAY ;4 AJMP START END |
|
|
|
|
|
还有个问题我刚才没注意,你的延时程序太长,上述修改不妥:JB KEY,INTO 语句不需要;主循环也有问题;原中断程序不须改。
应改为: START:CLR LIGHT SETB EA SETB EX0 LOOP: LCALL DELAY SETB LIGHT AJMP LOOP ;2 DELAY:MOV R1,#50 LOOP4:MOV R2,#170 LOOP3:MOV R3,#100 LOOP2:MOV R4,#50 LOOP1:DJNZ R4,LOOP1 DJNZ R3,LOOP2 DJNZ R2,LOOP3 DJNZ R1,LOOP4 RET ;3 INTO:CPL P1.0 RETI END |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-29 02:17 , Processed in 0.734507 second(s), Total 57, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191