官术网_书友最值得收藏!

第3章 基礎程序設計

通過對前兩章的學習,讀者進一步熟悉了8051 單片機的基本硬件結構與內部資源,歸納了用C語言開發單片機程序必須參考和重點掌握的技術內容,了解了用C語言開發調試單片機系統的優勢,同時,還熟悉了Proteus的基本操作,Proteus與μ V3的聯合調試技術等,這為本章及后續章節Proteus環境下C語言程序設計案例的學習調試與研究作好了準備。

本章案例全面涉及8051單片機內部資源的程序設計及基本外圍元件的應用,案例包括3部分:

第1部分是1~23號案例,涉及基本I/O控制,包括LED、數碼管、按鍵、開關與繼電器、蜂鳴器等程序設計。

第2部分是24~42號案例,主要涉及外部中斷與定時計數器程序設計。

第3部分是43~48號案例,內容涉及串口控制,包括通過串口進行串并、并串轉換、雙單片機通信、單片機與PC通信等。

通過對這些案例的學習研究與跟蹤調試,并對各案例中提出的修改要求或新的設計目標的實踐與實訓,讀者將全面掌握8051單片機的C語言基礎程序設計技術,熟練使用C語言控制和運用單片機內部資源,為8051單片機擴展資源的應用及8051單片機系統的綜合設計打下良好基礎。

3.1 閃爍的LED

本例單片機P1.0引腳連接LED,程序按設定的時間間隔取反P1.0,使LED按固定時間間隔持續閃爍。

本例電路如圖3-1所示,注意電路中限流電阻R2的阻值不能過大,否則LED不會閃爍。

圖3-1 閃爍的LED電路

程序設計調試與實訓:

本程序頭文件reg51.h不能省略,否則,編譯時將會提示:

TEXT1.C(??): error C202: 'P1': undefined identifier

Keil C認為P1是未定義的標識符,因為頭文件reg51.h定義了所有的特殊功能寄存(SFR),錯誤提示中(??)是錯誤所在的行號。當然,讀者也可以在省略該頭文件時,添加一行代碼:sfr P1= 0x90; 因為P1的地址為0x90。

注意本例中的延時子程序放在main()函數前面,如果要放在main()函數后,則在#define的下面添加以下相應的函數申明語句:

void DelayMS(uint x);

要增加延時間隔時,可修改源程序中的延時值150,由于參數類型為uint,因此,最大可設延時為65535,如果延時參數類型為uchar,則參數最大值不要超過255。

另外,本程序及后續多道程序中均有uchar和uint的宏定義,雖然并非每個程序都同時使用了uchar和uint類型,但本書幾乎所有程序中都同時定義了這兩種類型。

讀者閱讀調試后可修改本例,控制多個LED閃爍,并改變它們的閃爍速度。

源程序代碼:

        //-----------------------------------------------------------------
        //  名稱: 閃爍的LED
        //-----------------------------------------------------------------
        //  說明: LED按設定的時間間隔閃爍。
        //-----------------------------------------------------------------
        #include <reg51.h>
        #define uchar unsigned char
        #define uint  unsigned int
        sbit LED = P1^0;
        //-----------------------------------------------------------------
        // 延時
        //-----------------------------------------------------------------
        void DelayMS(uint x)
        {
          uchar i;
          while(x--)
          {
            for(i = 0; i < 120; i++);
          }
        }
        //-----------------------------------------------------------------
        // 主程序
        //-----------------------------------------------------------------
        void main()
        {
          while(1)
          {
            LED = ~LED;
            DelayMS(150);
          }
        }
主站蜘蛛池模板: 股票| 孝昌县| 库尔勒市| 永昌县| 乌海市| 竹溪县| 山阴县| 炉霍县| 弥渡县| 阿克苏市| 新巴尔虎左旗| 湛江市| 丰原市| 祁门县| 凌源市| 平安县| 民勤县| 博客| 同德县| 策勒县| 田阳县| 荣昌县| 许昌市| 黄骅市| 凤山市| 台江县| 瓮安县| 泰安市| 凭祥市| 新野县| 阜城县| 巫溪县| 明光市| 巴马| 周宁县| 元阳县| 六安市| 千阳县| 海阳市| 涡阳县| 邵阳市|