单片机问题,为什么这个程序会连续执行两次

单片机问题,为什么这个程序会连续执行两次,第1张

产生这种想象的根本原因,是在DJNZ

R0,

LOOP指令后缺少一条令指令计数器PC不变的指令,如SJMP

$.

若不加该指令,会在程序循环5次(R0=5)后,即执行5次DJNZ

R0,

LOOP指令后,会再次进入延时程序(不是通过调用指令进入的),即此时SP的内容仍是07H;当延时程序执行RET时,会将07H单元的内容送到程序计数器PC中,SP的内容变为05H,此时程序将会从头开始执行,开始第2个5次循环。

在程序执行完第2个5次循环后,即执行10次DJNZ

R0,

LOOP指令后,会又次进入延时程序(不是通过调用指令进入的),即此时SP的内容仍是05H;当延时程序执行RET时,会将05H单元的内容送到程序计数器PC中,SP的内容变为03H,此时程序又会从头开始执行。

但此时从头开始执行的过程与前两个区别很大了。但执行第3条指令(调用指令)后进入延时程序,延时程序会把刚才压入堆栈中的断点覆盖掉,当执行完DJNZ

R3,

D1时,堆栈栈顶的内容变为0,执行完RET,程序又会从头开始执行,重环往复。从外观上看,P2一直为FFH,好像程序停止运行。

所以分析出现该现象,要注意堆栈。单步执行,好好观察。

哥实在不知道你说的是什么意思。我就按我想的写吧

好久都没有写51了,原谅里面的一些小错误,你自己再动动脑就行了!希望能帮到你,以后互相交流

#include<reg52.h>

void init()

{

TMOD=0x01

TH0=(65536-50000)/256

TL0=(65536-50000)%256

EA=1

ET0=1

TR0=1

}

void main()

{

Init()

while(1)

{

if(aa==20)//当延时一秒时,进入程序

{

P1^1=1 //自己随便接个灯,灯亮

aa=0 //清0

TR0=1 //重新打开定时器

}

}

}

void timer0() interrupt 1//这是中断程序,延时50毫秒,

{

TH0=(65536-50000)/256

TL0=(65536-50000)%256

aa++

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11133002.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存