单片机汇编语言
程序执行到SJMP $ 是不是等到定时器0溢出之后跳转到ORG 000BH 执行中断程序
还有就是 CJNE A ,#20,LOOP
是当A≠20的时候跳转到loop
执行完loop这个子程序之后 就跳到SJMP $ ,这个程序不就相当于结束了
但是一开始A的值就为1
A≠20 ,就要跳到loop 不能达到满足计数20次的要求吧
还是我哪个地方理解错了呀
COUNTER EQU 30H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP ITT0
ORG 0100H
MAIN: MOV TMOD, #01H
MOV TH0, #3CH
MOV TL0, #0B0H ;定时 50ms
MOV COUNTER, #00H
SETB EA
SETB ET0
SETB TR0
SJMP $
ITT0: PUSH PSW
PUSH ACC
MOV TH0, #3CH
MOV TL0, #0B0H
INC COUNTER
MOV A, COUNTER
CJNE A, #20, LOOP
CPL P1.0
MOV COUNTER, #00H
LOOP: POP ACC
POP PSW
RETI
END
单片机定时器/计数器
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 阿尔法斗士 2023-04-20 16:38关注
对于第一个问题,确实是这样的。SJMP命令可以让程序跳转到当前语句位置,并继续执行下去。此处的SJMP $指的是程序跳转回当前地址,等待TIMER0中断事件的发生。
对于第二个问题,CJNE A,#20,LOOP指的是如果A不等于20,则跳转到LOOP标签处执行LOOP子程序。在LOOP子程序中,可能会有一些处理递增计数器COUNTER和更新P1.0输出端口状态的代码。函数执行完后,会回到CJNE语句进行条件测试,只要A仍然不等于20,就会跳转到LOOP继续执行。直到A等于20时,CJNE A,#20,LOOP指令才会跳转到当前位置下一行的代码执行,也就是CPL P1.0,从而实现按照计数器计数到一定值后改变P1.0电平的操作。随后通过MOV COUNTER,#00H将计数器COUNTER清零,并重新回到TIMER 0中断处理程序等待下一次TIMER0溢出中断事件的发生,重新开始计数。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 西门子S7-Graph,S7-300,梯形图
- ¥50 用易语言http 访问不了网页
- ¥50 safari浏览器fetch提交数据后数据丢失问题
- ¥15 matlab不知道怎么改,求解答!!
- ¥15 永磁直线电机的电流环pi调不出来
- ¥15 用stata实现聚类的代码
- ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
- ¥20 docker里部署springboot项目,访问不到扬声器
- ¥15 netty整合springboot之后自动重连失效
- ¥15 悬赏!微信开发者工具报错,求帮改