標(biāo)題:
51單片機(jī)C語(yǔ)言while(1)執(zhí)行問(wèn)題
[打印本頁(yè)]
作者:
Mr.zxw
時(shí)間:
2021-2-2 13:22
標(biāo)題:
51單片機(jī)C語(yǔ)言while(1)執(zhí)行問(wèn)題
如下圖所示,這是一個(gè)利用定時(shí)器中斷讓D1(P2^0)led燈隔1秒閃爍的程序,我的問(wèn)題是:主函數(shù)中while(1)的作用是什么?其他渠道得知是讓main函數(shù)在此循環(huán),可是while(1)下的函數(shù)內(nèi)容不是為空嗎?為什么能循環(huán)主函數(shù)?還是我哪里理解有問(wèn)題,請(qǐng)大家指教,謝謝。
/**************************************************************************************
實(shí)驗(yàn)現(xiàn)象:下載程序后,D1小燈循環(huán)點(diǎn)亮1秒,熄滅1秒。使用單片機(jī)內(nèi)部定時(shí)器可以實(shí)現(xiàn)準(zhǔn)確延時(shí)
接線說(shuō)明: (具體接線圖可見(jiàn)開(kāi)發(fā)攻略對(duì)應(yīng)實(shí)驗(yàn)的“實(shí)驗(yàn)現(xiàn)象”章節(jié))
1,單片機(jī)-->LED&交通燈模塊
P20-->D1
注意事項(xiàng):
***************************************************************************************/
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16; //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
sbit led=P2^0; //定義P20口是led
/*******************************************************************************
* 函 數(shù) 名 : Timer0Init
* 函數(shù)功能 : 定時(shí)器0初始化
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Timer0Init()
{
TMOD|=0X01;//選擇為定時(shí)器0模式,工作方式1,僅用TR0打開(kāi)啟動(dòng)。
TH0=0XFC; //給定時(shí)器賦初值,定時(shí)1ms
TL0=0X18;
ET0=1;//打開(kāi)定時(shí)器0中斷允許
EA=1;//打開(kāi)總中斷
TR0=1;//打開(kāi)定時(shí)器
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void main()
{
Timer0Init(); //定時(shí)器0初始化
while(1);
}
/*******************************************************************************
* 函 數(shù) 名 : void Timer0() interrupt 1
* 函數(shù)功能 : 定時(shí)器0中斷函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Timer0() interrupt 1
{
static u16 i;
TH0=0XFC; //給定時(shí)器賦初值,定時(shí)1ms
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}
復(fù)制代碼
作者:
xianfajushi
時(shí)間:
2021-2-2 16:25
中斷是獨(dú)立運(yùn)行的與主函數(shù)循環(huán)無(wú)關(guān)
作者:
xianfajushi
時(shí)間:
2021-2-2 16:27
主函數(shù)空循環(huán)是必須的,就是讓蛋騙雞運(yùn)行起來(lái).
作者:
51mcu學(xué)習(xí)
時(shí)間:
2021-2-2 16:30
whiel(1),程序執(zhí)行到這里停止。一直執(zhí)行定時(shí)器中斷程序。
作者:
munuc_w
時(shí)間:
2021-2-2 16:44
看看C語(yǔ)言教科書(shū),里面講的很明白。問(wèn)題太簡(jiǎn)單,又不看書(shū)學(xué)習(xí),如何進(jìn)步!
作者:
zswhym
時(shí)間:
2021-2-2 16:53
你這個(gè)程序中就是為了等待中斷產(chǎn)生,防止程序跑飛
單片機(jī)中使用while(1),大部分還是為了防止程序跑飛,因?yàn)楹芏鄷r(shí)候執(zhí)行完某段程序后單片機(jī)的程序指針PC(就是程序指針)并不會(huì)停止,仍然會(huì)繼續(xù)從ROM中讀取指令并執(zhí)行,這樣一來(lái)可能會(huì)出現(xiàn)程序跑飛的情況,進(jìn)而出現(xiàn)不確定的結(jié)果,我們加個(gè)while(1)就能讓程序在執(zhí)行完后在原地循環(huán),相當(dāng)于停在原地,防止跑飛。
原則上來(lái)講,如果程序中沒(méi)有加結(jié)尾的話,程序計(jì)數(shù)器會(huì)繼續(xù)累加,從而執(zhí)行正常程序后面的ROM空間里面的指令,不過(guò)一般這個(gè)指令都是0XFF,這就要看這條指令的含義了,如果是空的話就會(huì)一直執(zhí)行到最后,直到程序計(jì)數(shù)器溢出,只是不知道程序計(jì)數(shù)器發(fā)生溢出是一個(gè)什么狀態(tài),有可能回到復(fù)位狀態(tài)值,也有可能直接就讓單片機(jī)死在這里不工作,這個(gè)就要看單片機(jī)的具體設(shè)計(jì)了。
在主程序里應(yīng)當(dāng)有
while(1)
{
..;
}
否則單片機(jī)的程序會(huì)繼續(xù)按地址運(yùn)行下去,到0ffffh后-》00000h。
如果不加while(1)語(yǔ)句,單片機(jī)依然正常運(yùn)行,就是后面的地址里恰好有什么東西使得程序形成死循環(huán),沒(méi)有飛跑,那也是湊巧。
作者:
DKC_LIN_123
時(shí)間:
2021-2-2 17:25
別想太復(fù)雜啦,其實(shí)這是一個(gè)實(shí)驗(yàn)的程序,是為了單純實(shí)現(xiàn)一個(gè)led閃爍功能而已,一般單片機(jī)的邏輯架構(gòu)是這樣的
void main()
{
xxx_init()
xxx_timer_init()
....
while(1)
{
....
}
}
作者:
壓著我頭發(fā)啦
時(shí)間:
2021-2-2 17:37
單片機(jī)將到程序第一課就講這個(gè)
作者:
神小C
時(shí)間:
2021-2-2 17:39
這個(gè)while(1);的作用就是讓程序卡在這里,不會(huì)讓程序運(yùn)行結(jié)束,你可以把while(1)去掉看看效果
作者:
hantu
時(shí)間:
2021-2-2 22:15
while(1); 就是個(gè)無(wú)限循環(huán),程序運(yùn)行了此就一直無(wú)限循環(huán)了,除了能響應(yīng)中斷。
如果不要這個(gè)無(wú)限循環(huán)的話,單片機(jī)會(huì)把整個(gè)程序都執(zhí)行完完了,又要重新執(zhí)行程序(跟反復(fù)軟重啟一樣了)。
作者:
STC15F
時(shí)間:
2021-2-3 13:46
單片機(jī)上電運(yùn)行后進(jìn)入主函數(shù)里面先把定時(shí)器初始化,然后就沒(méi)事做了,while(1);讓主程序停留在這里,這時(shí)候就看定時(shí)器中斷的表演了。
作者:
xhaity
時(shí)間:
2021-2-3 14:14
需要深入了解,還是先學(xué)習(xí)了解了單片機(jī)架構(gòu),寄存器,學(xué)習(xí)匯編,走一遍;再回頭看c語(yǔ)言的while(1)就明白了,否則,單片機(jī)C語(yǔ)言當(dāng)作上位機(jī)編程,別人怎么講,估計(jì)都明白不了的。
作者:
zsyzdx
時(shí)間:
2021-2-4 09:57
這個(gè)就是死循環(huán),讓單片機(jī)一直運(yùn)行,不至于停止。!
作者:
Mr.zxw
時(shí)間:
2021-2-4 14:51
謝謝各位回復(fù),我大致已經(jīng)懂了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1