;显示 Good
ORG 0000H
JMP MAIN
ORG 0080H
MAIN:
MOV P0, #3DH ;显示G
CLR P20 ;选中第一个数码管
LCALL DELAY ;调用延时
SETB P20 ;关显示
MOV P0, #5CH ;显示o
CLR P21 ;选中第二个数码管
LCALL DELAY
SETB P21 ;关显示
MOV P0, #5CH ;显示o
CLR P22 ;选中第三个数码管
LCALL DELAY
SETB P22 ;关显示
MOV P0, #5EH ;显示d
CLR P23 ;选中第四个数码管
LCALL DELAY
SETB P23 ;关显示
AJMP MAIN ;重新开始
DELAY: ;延时子程序
MOV R7, #20H
D1: MOV R6, #30H
D2: DJNZ R6, D2
DJNZ R7, D1
RET
END
;----------------------------------------
;显示 HELLO
ORG 0000H
JMP MAIN
ORG 0080H
MAIN:
MOV P2, #0FFH
MOV P0, #76H ;显示H
CLR P20 ;选中第一个数码管
LCALL DELAY ;调用延时
SETB P20 ;关显示
MOV P0, #79H ;显示E
CLR P21 ;选中第二个数码管
LCALL DELAY
SETB P21 ;关显示
MOV P0, #38H ;显示L
CLR P22 ;选中第三个数码管
LCALL DELAY
SETB P22 ;关显示
MOV P0, #38H ;显示L
CLR P23 ;选中第四个数码管
LCALL DELAY
SETB P23 ;关显示
MOV P0, #3FH ;显示O
CLR P24 ;选中第五个数码管
LCALL DELAY
SETB P24 ;关显示
DELAY: ;延时子程序
MOV R7, #20H
D1: MOV R6, #30H
D2: DJNZ R6, D2
DJNZ R7, D1
RET
END
这个是没办法改的,改动特别大。两种芯片虽然从某种层次上来说,是大部分相同的。但是也可以说是截然不同的,因为其架构不一样,一个是51,一个是AVR,最具体的体现是,寄存器、 *** 作、和指令集都不一样。
我懂了,经过我的仿真,当程序第一次进入DELAYTIME时,执行到R0=03,R0=00,R2=F0时,T0中断到了,这时中断程序调用了DELAYTIME,当执行完中断服务程序,这是R0变成了0,返回到之前的延时函数,此时R0=0,R1=0,R2=0,所以你的延时程序就变成了256256256=16秒了,所以成了你说的15秒后才执行完。 所以以后写中断程序注意断点的保护,把中断程序里有修改掉的寄存器先压栈保护,结束之前d出来,这样就没事了。还有你在中断程序结束前没重新开启T0。还有在你的程序最好多点注释,这样看着不吃力。
以上就是关于请将下面的51单片机程序按照要求修改全部的内容,包括:请将下面的51单片机程序按照要求修改、51单片机程序怎么改成ATmega16的、请高手帮忙,51单片机执行定时器0的中断程序后,需要大约15秒才能返回主程序断点处继续运行 太奇怪了等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)