51单片机C语言while(1)执行问题,如下图所示,这是一个利用定时器中断让D1(P2^0)led灯隔1秒闪烁的程序,我的问题是:主函数中while(1)的作用是什么?其他渠道得知是让main函数在此循环,可是while(1)下的函数内容不是为空吗?为什么能循环主函数?还是我哪里理解有问题,请大家指教,谢谢。
- /**************************************************************************************
- 实验现象:下载程序后,D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时
- 接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
- 1,单片机–>LED&交通灯模块
- P20–>D1
- 注意事项:
- ***************************************************************************************/
- #include “reg52.h” //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int u16; //对数据类型进行声明定义
- typedef unsigned char u8;
- sbit led=P2^0; //定义P20口是led
- /*******************************************************************************
- * 函 数 名 : Timer0Init
- * 函数功能 : 定时器0初始化
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer0Init()
- {
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- ET0=1;//打开定时器0中断允许
- EA=1;//打开总中断
- TR0=1;//打开定时器
- }
- /*******************************************************************************
- * 函 数 名 : main
- * 函数功能 : 主函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void main()
- {
- Timer0Init(); //定时器0初始化
- while(1);
- }
- /*******************************************************************************
- * 函 数 名 : void Timer0() interrupt 1
- * 函数功能 : 定时器0中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- static u16 i;
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- i++;
- if(i==1000)
- {
- i=0;
- led=~led;
- }
- }
复制代码
,你这个程序中就是为了等待中断产生,防止程序跑飞
单片机中使用while(1),大部分还是为了防止程序跑飞,因为很多时候执行完某段程序后单片机的程序指针PC(就是程序指针)并不会停止,仍然会继续从ROM中读取指令并执行,这样一来可能会出现程序跑飞的情况,进而出现不确定的结果,我们加个while(1)就能让程序在执行完后在原地循环,相当于停在原地,防止跑飞。
原则上来讲,如果程序中没有加结尾的话,程序计数器会继续累加,从而执行正常程序后面的ROM空间里面的指令,不过一般这个指令都是0XFF,这就要看这条指令的含义了,如果是空的话就会一直执行到最后,直到程序计数器溢出,只是不知道程序计数器发生溢出是一个什么状态,有可能回到复位状态值,也有可能直接就让单片机死在这里不工作,这个就要看单片机的具体设计了。
在主程序里应当有
while(1)
{
..;
}
否则单片机的程序会继续按地址运行下去,到0ffffh后-》00000h。
如果不加while(1)语句,单片机依然正常运行,就是后面的地址里恰好有什么东西使得程序形成死循环,没有飞跑,那也是凑巧。,中断是独立运行的与主函数循环无关,主函数空循环是必须的,就是让蛋骗鸡运行起来.,whiel(1),程序执行到这里停止。一直执行定时器中断程序。,看看C语言教科书,里面讲的很明白。问题太简单,又不看书学习,如何进步!