找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3548|回复: 13
收起左侧

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

  [复制链接]
ID:882276 发表于 2021-2-2 13:22 | 显示全部楼层 |阅读模式
如下图所示,这是一个利用定时器中断让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. }
复制代码






回复

使用道具 举报

ID:851164 发表于 2021-2-2 16:53 | 显示全部楼层
你这个程序中就是为了等待中断产生,防止程序跑飞
单片机中使用while(1),大部分还是为了防止程序跑飞,因为很多时候执行完某段程序后单片机的程序指针PC(就是程序指针)并不会停止,仍然会继续从ROM中读取指令并执行,这样一来可能会出现程序跑飞的情况,进而出现不确定的结果,我们加个while(1)就能让程序在执行完后在原地循环,相当于停在原地,防止跑飞。
原则上来讲,如果程序中没有加结尾的话,程序计数器会继续累加,从而执行正常程序后面的ROM空间里面的指令,不过一般这个指令都是0XFF,这就要看这条指令的含义了,如果是空的话就会一直执行到最后,直到程序计数器溢出,只是不知道程序计数器发生溢出是一个什么状态,有可能回到复位状态值,也有可能直接就让单片机死在这里不工作,这个就要看单片机的具体设计了。
在主程序里应当有
while(1)
{
  ..;
}
否则单片机的程序会继续按地址运行下去,到0ffffh后-》00000h。
如果不加while(1)语句,单片机依然正常运行,就是后面的地址里恰好有什么东西使得程序形成死循环,没有飞跑,那也是凑巧。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:332444 发表于 2021-2-2 16:25 | 显示全部楼层
中断是独立运行的与主函数循环无关
回复

使用道具 举报

ID:332444 发表于 2021-2-2 16:27 | 显示全部楼层
主函数空循环是必须的,就是让蛋骗鸡运行起来.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:878420 发表于 2021-2-2 16:30 来自手机 | 显示全部楼层
whiel(1),程序执行到这里停止。一直执行定时器中断程序。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:752974 发表于 2021-2-2 16:44 | 显示全部楼层
看看C语言教科书,里面讲的很明白。问题太简单,又不看书学习,如何进步!

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:412460 发表于 2021-2-2 17:25 | 显示全部楼层
别想太复杂啦,其实这是一个实验的程序,是为了单纯实现一个led闪烁功能而已,一般单片机的逻辑架构是这样的
void main()
{
    xxx_init()
    xxx_timer_init()
    ....
    while(1)
    {
       ....
    }
}
回复

使用道具 举报

ID:716656 发表于 2021-2-2 17:37 | 显示全部楼层
单片机将到程序第一课就讲这个
回复

使用道具 举报

ID:882358 发表于 2021-2-2 17:39 | 显示全部楼层
这个while(1);的作用就是让程序卡在这里,不会让程序运行结束,你可以把while(1)去掉看看效果
回复

使用道具 举报

ID:462827 发表于 2021-2-2 22:15 | 显示全部楼层
while(1); 就是个无限循环,程序运行了此就一直无限循环了,除了能响应中断。

如果不要这个无限循环的话,单片机会把整个程序都执行完完了,又要重新执行程序(跟反复软重启一样了)。
回复

使用道具 举报

ID:300267 发表于 2021-2-3 13:46 | 显示全部楼层
单片机上电运行后进入主函数里面先把定时器初始化,然后就没事做了,while(1);让主程序停留在这里,这时候就看定时器中断的表演了。
回复

使用道具 举报

ID:373388 发表于 2021-2-3 14:14 | 显示全部楼层
需要深入了解,还是先学习了解了单片机架构,寄存器,学习汇编,走一遍;再回头看c语言的while(1)就明白了,否则,单片机C语言当作上位机编程,别人怎么讲,估计都明白不了的。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:320306 发表于 2021-2-4 09:57 | 显示全部楼层
这个就是死循环,让单片机一直运行,不至于停止。!
回复

使用道具 举报

ID:882276 发表于 2021-2-4 14:51 | 显示全部楼层
谢谢各位回复,我大致已经懂了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表