微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 请大侠们详细解释一下,本人菜鸟。

请大侠们详细解释一下,本人菜鸟。

时间:10-02 整理:3721RD 点击:
#include<reg52.h>
#define uchar unsigned char
sbit d0=P0^0;
uchar tt;
void main()
{
d0=0;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void inter0() interrupt 1
{

TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20)
  {
   tt=0;
   d0=!d0;
  }

}
请问一下,假设没有【while(1);】这条语句,程序在从main()函数往下运行的时候,遇到中断,并且在执行完中断函数后,下一步要返回主函数继续运行,请问他是从主函数哪里继续运行下去?,就是在执行完TR0=1后,主函数该往哪里执行?我这个地方不是很理解啊,求指教。

运行完TR0=1后,又返回第一句d0=0开始循环运行;其实main函数就相当于while(1){.};不过你这个程序的中断没法执行,因为一直不停地给TH0和TL0赋值,计时器还没溢出,就又被赋初值了。

可不是这样的。
如果没有while,很多单片机会继续向下执行,溢出后再从0x0000地址处开始执行。
实际上这种状态就叫程序跑飞。这个时候会出现意想不到的问题,所以在应用中加入看门狗,一旦跑飞就复位重启。不至于引起重大事故或损失。

但是我在运行的时候,二极管会一直亮,请问是怎么回事?

但是我在调试的时候,在运行完tr0=1之后就跳出了主函数,也不知道跑哪里了,但在运行程序的时候,二极管会一直亮,怎么解释?

怎么调试的呢?一步一步 芯片仿真么?51的仿真没有用过,所以只有猜:
第一种的话,程序回到开始地方循环执行,中断一直没有触发,每次都循环do=0;灯肯定一直亮着的哟,
第二种情况,最后程序死(或者说跑飞了)了,没有地方来修改do的值,肯定也是一直亮着的,我用stm32单片机试了一下,是这种现象,没有while大循环,程序会跳到出口地址,但是不会提示程序错误,不敢保证51也是这种情况;
建议小编在程序开始的时候加上一个灯交替闪烁的代码(记得加上一点小延时),然后看现象,就可以判断是以上那种情况了...

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top