<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機程序該如何寫(xiě)

單片機程序該如何寫(xiě)

作者: 時(shí)間:2012-08-29 來(lái)源:網(wǎng)絡(luò ) 收藏
單片機的C語(yǔ)言編程是不同于傳統的C語(yǔ)言的編程的,這是與它本身的體系結構有關(guān)。單片機編程是軟硬件結合比較精密的。如果沒(méi)有一些硬件方面的知識可能大家很難編出正確的程序。
如有的同學(xué)的主程序是類(lèi)似這樣的結構
void main(void)
{
P0 = 0xff ;
sleep(1000) ;
P0 = 0x00 ;
sleep(1000) ;
}
仿真的時(shí)候可能會(huì )看到燈是閃爍的。但事實(shí)上這樣的程序是不對的。也有同學(xué)發(fā)現了這個(gè)問(wèn)題,我看到他都把匯編代碼貼出來(lái)了。
分析下上面的程序的流程 P0口輸出高電平---->延時(shí)一會(huì )兒----->P0口輸出低電平----->延時(shí)一會(huì )兒。 這樣接在P0口上的LED就會(huì )亮暗的閃爍。如果要一直這樣循環(huán)閃爍下去呢?看到這里大家發(fā)現問(wèn)題了沒(méi)有?
問(wèn)題就在這里了,我們想讓它循環(huán)閃爍,但是回過(guò)頭來(lái)看看我們的主程序,有循環(huán)的地方嗎?
之所以這樣的程序仿真的時(shí)候還是正確的,那是因為編譯器在生成匯編代碼的時(shí)候已經(jīng)自動(dòng)加上了跳轉語(yǔ)句,主程序執行完了之后就重新跳轉到初始化處重新執行。
所以上面這段程序的流程是這個(gè)樣子的:

初始化(內部RAM,堆棧初始化,由編譯器自動(dòng)生成相應代碼) --------> 跳轉到用戶(hù)的主程序-------->主程序執行完畢---->再次跳轉到初始化處,重新執行。

上面這個(gè)流程是我們不想要的。因為初始化是只需要在開(kāi)機的時(shí)候(系統上電)時(shí)候初始化一次的時(shí)候。想想看如果你的手機每次開(kāi)機完成之后如果沒(méi)有按鍵按下去或者收到短信電話(huà)什么的,就會(huì )重新初始化一次,是什么后果:) 估計你肯定會(huì )扔了那手機,罵道這是誰(shuí)寫(xiě)的程序呀。

我們希望初始化完成之后,程序就會(huì )跳入到主程序(main函數)中去,并且始終循環(huán)執行里面的代碼(哪怕沒(méi)有任務(wù),只在那里空跳轉循環(huán)) 因為只有那里面的代碼(中斷函數同樣屬于)才是屬于我們用戶(hù)編寫(xiě)的有用代碼,是希望按照我們的意圖去執行的。所以我們希望的正確流程是如下的:

初始化(內部RAM,堆棧初始化,由編譯器自動(dòng)生成相應代碼) --------> 跳轉到用戶(hù)的主程序-------->主程序執行完畢---->
繼續執行主循環(huán)里面的用戶(hù)代碼。

理解了上面的那個(gè)流程,我們正確的函數應該是如下的。
void main(void)
{
while(1) //循環(huán)條件,永遠為真,下面復合語(yǔ)句里面的內容會(huì )一直循環(huán)執行
{
P0 = 0xff ;
sleep(1000) ;
P0 = 0x00 ;
sleep(1000) ;

}
}

當然循環(huán)語(yǔ)句的寫(xiě)法不止這一種,我在第十三課 C51循環(huán)語(yǔ)句里有詳細的介紹 :http://www.51hei.com/mcuteach/136.html
小結一下:基于單片機的程序是一個(gè)死循環(huán)。所有的代碼和函數調用都應該在這個(gè)循環(huán)里面,(中斷函數例外,在進(jìn)入循環(huán)之前可以調用其它的一些初始化的函數或者是其它只需要在系統上電調用一次的函數或者代碼)。

如下

void main(void)
{
// 初始化函數,根據實(shí)際系統情況編寫(xiě)

while(1) //死循環(huán) 也可以用for(;;;)形式或其它形式
{
//1
//2
..........
}

}

先寫(xiě)到這里。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>