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

单片机定时器/计数器

单片机汇编语言
程序执行到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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵