又菜又爱玩的尾巴 2023-04-20 15:21 采纳率: 100%
浏览 17
已结题

单片机定时器/计数器

单片机汇编语言
程序执行到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

  • 写回答

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溢出中断事件的发生,重新开始计数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月20日

悬赏问题

  • ¥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 悬赏!微信开发者工具报错,求帮改