<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 單片機(jī)程序該如何寫

          單片機(jī)程序該如何寫

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

          初始化(內(nèi)部RAM,堆棧初始化,由編譯器自動生成相應(yīng)代碼) --------> 跳轉(zhuǎn)到用戶的主程序-------->主程序執(zhí)行完畢---->再次跳轉(zhuǎn)到初始化處,重新執(zhí)行。

          上面這個流程是我們不想要的。因?yàn)槌跏蓟侵恍枰陂_機(jī)的時候(系統(tǒng)上電)時候初始化一次的時候。想想看如果你的手機(jī)每次開機(jī)完成之后如果沒有按鍵按下去或者收到短信電話什么的,就會重新初始化一次,是什么后果:) 估計你肯定會扔了那手機(jī),罵道這是誰寫的程序呀。

          我們希望初始化完成之后,程序就會跳入到主程序(main函數(shù))中去,并且始終循環(huán)執(zhí)行里面的代碼(哪怕沒有任務(wù),只在那里空跳轉(zhuǎn)循環(huán)) 因?yàn)橹挥心抢锩娴拇a(中斷函數(shù)同樣屬于)才是屬于我們用戶編寫的有用代碼,是希望按照我們的意圖去執(zhí)行的。所以我們希望的正確流程是如下的:

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

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

          }
          }

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

          如下

          void main(void)
          {
          // 初始化函數(shù),根據(jù)實(shí)際系統(tǒng)情況編寫

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

          }

          先寫到這里。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();