谁能给我说一下这个51单片机程序的执行顺序。

2025-03-20 23:47:01
推荐回答(2个)
回答(1):

程序为定时器的基本操作,
所有的c程序都是从main开始执行的,你的程序从main进入后,执行

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TMOD=0x01;
ET0=0x01;
EA=1;
TR0=1;


这些初始化定时器0
然后反复执行while语句。

While(1)
{
If(i>7) i=0;
}

等待定时器到达产生中断

Void Timer0IRQ(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
P2=1<i++;
}

定时器的 中断
就是 没到时间,i加一
然后将第p2口第i个引脚置位高电平,其他的为低电平
如果p2口连接发光二极管的话,就是循环点亮
到第八个时,再返回第一个。
基本上是这个吧步骤。

因为 i是全局变脸,所以中断时i=8时,主程序中直接把i置为0了,就是While(1)
{
If(i>7) i=0;
}
这句。

中断时,while语句是不执行的,
但是中断返回后,就会执行while语句,
所以i不会大于8 的。
先在中断中i加到8,
然后中断返回时,主程序中。立刻把i归零。

回答(2):

你觉得中断中,P2会为0x00吗?即i=9??
i的累加是在中断中实现的,中断的是时候,i才累加。
设i=7进入中断,此时,P2=1<<7,即P2=0x80。之后i再加1,即i=8。中断结束,返回主函数while内,If(i>7) i=0;,此时,i=0.
……
不用我多解释了吧?

在main中断时while还在执行吗?对于这个问题,我想你没用汇编编过……
while是个死循环,一直在判断if这条语句,中断到来的时候,立即进去中断,while不执行了,等中断响应完毕,又立即回到while中去。
你可以看看汇编是怎么push和pop的,看完你就明白了。