• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機程序該如何寫

    單片機程序該如何寫

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

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

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

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

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

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

    }
    }

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

    如下

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

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

    }

    先寫到這里。



    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 壶关县| 兖州市| 济南市| 磴口县| 巨鹿县| 丹凤县| 轮台县| 武威市| 乳山市| 遂溪县| 石屏县| 边坝县| 鹤岗市| 镇江市| 晋中市| 科技| 鹤山市| 新民市| 汉寿县| 奉贤区| 万载县| 化德县| 仁寿县| 隆子县| 新丰县| 双流县| 云梦县| 梁河县| 慈利县| 读书| 武山县| 仁布县| 泾阳县| 外汇| 兴安县| 朔州市| 惠安县| 专栏| 嘉荫县| 佛教| 凌海市|