又菜又爱玩的尾巴 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日

悬赏问题

  • ¥15 vs2015到期想登陆但是登陆不上
  • ¥15 求解四个变换矩阵中的未知数θ
  • ¥20 Intellij实现web登录界面
  • ¥15 IPQ5018制作烧录固件,boot运行失败(操作系统-linux)(相关搜索:操作系统)(相关搜索:操作系统)
  • ¥20 icefall在librispeech基础上加入个人数据集
  • ¥30 keepalive高可用故障运维配置询问
  • ¥15 求帮助!国家电网内网u盘突然识别不出来了。
  • ¥15 matlab语音变速变调同时实现
  • ¥15 如何用Thoony写ESP32温湿度检测无源蜂鸣器报警代码?
  • ¥20 部件内部的CT图像数据集