2301_77521321 2023-04-09 02:30 采纳率: 100%
浏览 31
已结题

为什么使用R0,#00H时使用keil 软件会00 FF循环,而使用Mov R0,#01H时是正常运行的

img

1 MOV RO,#01H
  2 MOV A,#0FFH
  3 LOOP:MOV @RO,A
  4 INC RO
  5
  6 CJNE RO,#80H,LOOP
  7 MOV RO,#00H
  8 MOV @RO,#OFFH
  9 SJMP $
  10 END

  • 写回答

1条回答 默认 最新

  • 红色荷包蛋 2023-04-11 09:55
    关注
    8051单片机中,MOV指令可以用来将立即数或者寄存器中的数据移动到另一个寄存器中。在你提供的代码中,MOV R0, #00H将立即数0x00复制到寄存器R0中。MOV R0, #01H将立即数0x01复制到寄存器R0中。
    
       根据你提供的代码,使用MOV R0, #00H指令会导致程序陷入无限循环的问题。这是因为在该指令后,程序会一直执行循环LOOP,这是因为指令MOV @RO,A将地址为0x0000(因为R0的值为0x00)的内存位置上的值设置为0xFF。在下一条指令INC RO后,R0的值增加为0x01。由于该内存位置的值被设置为0xFF,程序会一直执行循环直到R0的值变为0x80时退出循环。因为在8051单片机中,RAM的地址空间只有128字节,所以地址为0x800xFF的区域是无法被访问的。
    
       相反,使用MOV R0, #01H指令是正常的,因为在执行指令MOV @RO,A时,地址为0x0100(因为R0的值为0x01)的内存位置上的值被设置为0xFF。在下一条指令INC RO之后,R0的值增加为0x02,这意味着程序不会在访问RAM时陷入无限循环,因为所有的RAM地址都可以被访问。
    
       因此,在你提供的代码中,使用MOV R0, #01H是正确的方式来初始化寄存器R0
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月9日