欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機C語言while(1)執行問題
[打印本頁]
作者:
Mr.zxw
時間:
2021-2-2 13:22
標題:
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;
}
}
復制代碼
作者:
xianfajushi
時間:
2021-2-2 16:25
中斷是獨立運行的與主函數循環無關
作者:
xianfajushi
時間:
2021-2-2 16:27
主函數空循環是必須的,就是讓蛋騙雞運行起來.
作者:
51mcu學習
時間:
2021-2-2 16:30
whiel(1),程序執行到這里停止。一直執行定時器中斷程序。
作者:
munuc_w
時間:
2021-2-2 16:44
看看C語言教科書,里面講的很明白。問題太簡單,又不看書學習,如何進步!
作者:
zswhym
時間:
2021-2-2 16:53
你這個程序中就是為了等待中斷產生,防止程序跑飛
單片機中使用while(1),大部分還是為了防止程序跑飛,因為很多時候執行完某段程序后單片機的程序指針PC(就是程序指針)并不會停止,仍然會繼續從ROM中讀取指令并執行,這樣一來可能會出現程序跑飛的情況,進而出現不確定的結果,我們加個while(1)就能讓程序在執行完后在原地循環,相當于停在原地,防止跑飛。
原則上來講,如果程序中沒有加結尾的話,程序計數器會繼續累加,從而執行正常程序后面的ROM空間里面的指令,不過一般這個指令都是0XFF,這就要看這條指令的含義了,如果是空的話就會一直執行到最后,直到程序計數器溢出,只是不知道程序計數器發生溢出是一個什么狀態,有可能回到復位狀態值,也有可能直接就讓單片機死在這里不工作,這個就要看單片機的具體設計了。
在主程序里應當有
while(1)
{
..;
}
否則單片機的程序會繼續按地址運行下去,到0ffffh后-》00000h。
如果不加while(1)語句,單片機依然正常運行,就是后面的地址里恰好有什么東西使得程序形成死循環,沒有飛跑,那也是湊巧。
作者:
DKC_LIN_123
時間:
2021-2-2 17:25
別想太復雜啦,其實這是一個實驗的程序,是為了單純實現一個led閃爍功能而已,一般單片機的邏輯架構是這樣的
void main()
{
xxx_init()
xxx_timer_init()
....
while(1)
{
....
}
}
作者:
壓著我頭發啦
時間:
2021-2-2 17:37
單片機將到程序第一課就講這個
作者:
神小C
時間:
2021-2-2 17:39
這個while(1);的作用就是讓程序卡在這里,不會讓程序運行結束,你可以把while(1)去掉看看效果
作者:
hantu
時間:
2021-2-2 22:15
while(1); 就是個無限循環,程序運行了此就一直無限循環了,除了能響應中斷。
如果不要這個無限循環的話,單片機會把整個程序都執行完完了,又要重新執行程序(跟反復軟重啟一樣了)。
作者:
STC15F
時間:
2021-2-3 13:46
單片機上電運行后進入主函數里面先把定時器初始化,然后就沒事做了,while(1);讓主程序停留在這里,這時候就看定時器中斷的表演了。
作者:
xhaity
時間:
2021-2-3 14:14
需要深入了解,還是先學習了解了單片機架構,寄存器,學習匯編,走一遍;再回頭看c語言的while(1)就明白了,否則,單片機C語言當作上位機編程,別人怎么講,估計都明白不了的。
作者:
zsyzdx
時間:
2021-2-4 09:57
這個就是死循環,讓單片機一直運行,不至于停止。!
作者:
Mr.zxw
時間:
2021-2-4 14:51
謝謝各位回復,我大致已經懂了。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1