51单片机C语言while(1)执行问题

51单片机C语言while(1)执行问题,如下图所示,这是一个利用定时器中断让D1(P2^0)led灯隔1秒闪烁的程序,我的问题是:主函数中while(1)的作用是什么?其他渠道得…

51单片机C语言while(1)执行问题,如下图所示,这是一个利用定时器中断让D1(P2^0)led灯隔1秒闪烁的程序,我的问题是:主函数中while(1)的作用是什么?其他渠道得知是让main函数在此循环,可是while(1)下的函数内容不是为空吗?为什么能循环主函数?还是我哪里理解有问题,请大家指教,谢谢。

  1. /**************************************************************************************
  2. 实验现象:下载程序后,D1小灯循环点亮1秒,熄灭1秒。使用单片机内部定时器可以实现准确延时
  3.                   
  4. 接线说明: (具体接线图可见开发攻略对应实验的“实验现象”章节)
  5.                    1,单片机–>LED&交通灯模块
  6.                                    P20–>D1
  7.                            
  8.         
  9. 注意事项:                                                                                                                                                               
  10.   
  11. ***************************************************************************************/
  12. #include “reg52.h”                         //此文件中定义了单片机的一些特殊功能寄存器
  13. typedef unsigned int u16;          //对数据类型进行声明定义
  14. typedef unsigned char u8;
  15. sbit led=P2^0;         //定义P20口是led
  16. /*******************************************************************************
  17. * 函 数 名         : Timer0Init
  18. * 函数功能                   : 定时器0初始化
  19. * 输    入         : 无
  20. * 输    出         : 无
  21. *******************************************************************************/
  22. void Timer0Init()
  23. {
  24.         TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
  25.         TH0=0XFC;        //给定时器赋初值,定时1ms
  26.         TL0=0X18;        
  27.         ET0=1;//打开定时器0中断允许
  28.         EA=1;//打开总中断
  29.         TR0=1;//打开定时器                        
  30. }
  31. /*******************************************************************************
  32. * 函 数 名       : main
  33. * 函数功能                 : 主函数
  34. * 输    入       : 无
  35. * 输    出             : 无
  36. *******************************************************************************/
  37. void main()
  38. {        
  39.         Timer0Init();  //定时器0初始化
  40.         while(1);               
  41. }
  42. /*******************************************************************************
  43. * 函 数 名         : void Timer0() interrupt 1
  44. * 函数功能                   : 定时器0中断函数
  45. * 输    入         : 无
  46. * 输    出         : 无
  47. *******************************************************************************/
  48. void Timer0() interrupt 1
  49. {
  50.         static u16 i;
  51.         TH0=0XFC;        //给定时器赋初值,定时1ms
  52.         TL0=0X18;
  53.         i++;
  54.         if(i==1000)
  55.         {
  56.                 i=0;
  57.                 led=~led;        
  58.         }        
  59. }

复制代码

,你这个程序中就是为了等待中断产生,防止程序跑飞
单片机中使用while(1),大部分还是为了防止程序跑飞,因为很多时候执行完某段程序后单片机的程序指针PC(就是程序指针)并不会停止,仍然会继续从ROM中读取指令并执行,这样一来可能会出现程序跑飞的情况,进而出现不确定的结果,我们加个while(1)就能让程序在执行完后在原地循环,相当于停在原地,防止跑飞。
原则上来讲,如果程序中没有加结尾的话,程序计数器会继续累加,从而执行正常程序后面的ROM空间里面的指令,不过一般这个指令都是0XFF,这就要看这条指令的含义了,如果是空的话就会一直执行到最后,直到程序计数器溢出,只是不知道程序计数器发生溢出是一个什么状态,有可能回到复位状态值,也有可能直接就让单片机死在这里不工作,这个就要看单片机的具体设计了。
在主程序里应当有
while(1)
{
  ..;
}
否则单片机的程序会继续按地址运行下去,到0ffffh后-》00000h。
如果不加while(1)语句,单片机依然正常运行,就是后面的地址里恰好有什么东西使得程序形成死循环,没有飞跑,那也是凑巧。,中断是独立运行的与主函数循环无关,主函数空循环是必须的,就是让蛋骗鸡运行起来.,whiel(1),程序执行到这里停止。一直执行定时器中断程序。,看看C语言教科书,里面讲的很明白。问题太简单,又不看书学习,如何进步!

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115