久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5531|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 福利社午夜影院 | 日韩三级一区 | 日韩毛片播放 | 成人精品高清 | 亚洲精品视频在线播放 | 日韩精品一区二区三区在线播放 | 国产福利一区二区 | 无吗视频| 国产激情三区 | 国产精品99久久久久久宅男 | 色综合av | 国产毛片久久久 | 久久这里只有精品首页 | 国产一区二区三区四区在线观看 | 日韩无| 精品国产欧美 | 亚洲天堂av网 | 欧美综合一区二区三区 | 亚洲精品久久久一区二区三区 | 拍真实国产伦偷精品 | 日本久久www成人免 成人久久久久 | 欧美在线视频不卡 | 国产成人精品一区二区 | h在线看 | 成人乱人乱一区二区三区软件 | 午夜男人天堂 | 久久精品网 | 成人免费视频久久 | 天天夜夜操 | 四虎成人免费视频 | 精品9999 | 亚洲不卡视频 | 国产高潮好爽受不了了夜色 | 在线观看黄免费 | 久久精品视频在线播放 | 国产视频不卡一区 | 国产视频中文字幕 | 国产成人一区在线 | 亚洲精品久久久久久国产精华液 | 国产精品久久久久婷婷二区次 | jlzzjlzz国产精品久久 |