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

第2章 51單片機基礎實例

本章主要介紹以下幾個單片機的基礎實例程序:

● 簡單點亮發光二極管實例

● 跑馬燈實例

● 流水燈實例

● 查0~9平方表實例

● 受控輸出實例

● 比較輸入數大小實例

● 交通燈控制器實例

● 蜂鳴器發音實例

● 單片機演奏音樂實例

● 軟件陷阱實例

2.1 簡單點亮發光二極管實例

單片機最簡單的實例之一就是點亮發光二極管(LED)閃爍。本節通過點亮1只發光二極管的實例來介紹單片機的I/O口操作。

本節首先介紹單片機I/O口結構的基礎知識,接著介紹實例的硬件電路,然后給出了實例程序,最后將分析操作單片機的I/O口的技巧與注意點。

2.1.1 基礎知識

8051單片機有4個并行I/O口:P0~P3。這4個I/O口中只有P0口是真正的雙向口,P1~P3是準雙向口,P3口還具有第二功能,為系統提供一些控制信號。4個并行I/O口的結構如表2-1所示。由I/O口結構可知,P0口的輸出三態門由兩只場效應管(FET)組成,所以是一個真正的雙向口,同時可以提供較強的輸出高電平(拉電流)和低電平(灌電流)驅動能力;P1~P3口中,上拉電阻代替了場效應管,輸出緩沖器不是三態的,因此不是真正的雙向口,只能稱為準雙向口,同時這些I/O口的輸出高電平驅動能力較弱,只能提供較強的輸出低電平驅動能力。因此,在使用I/O口直接驅動LED等電流負載時,需要使用輸出低電平驅動的接法。

表2-1 并行l/O口的結構

2.1.2 硬件電路圖

本實例中,硬件電路主要包括8051單片機最小系統電路(包括5V電源,正極接40引腳,負極(地)接20引腳;振蕩電路,使用晶體振蕩器,接18、19腳;復位電路;EA引腳接到正電源端)和發光二極管LED電路(由1只LED和1只限流電阻串聯而成),具體的連接原理電路圖如圖2-1所示。當P1.0引腳輸出低電平時,點亮LED;當P1.0引腳輸出高電平時,LED熄滅。

圖2-1 點亮發光二極管原理電路圖

2.1.3 軟件程序設計

要實現LED的閃爍效果需要通過程序控制單片機連接到LED的I/O引腳,點亮LED,延時一段時間后,再控制I/O引腳使LED熄滅,如此循環就可以實現LED的閃爍。下面,著重介紹延時程序,并給出完整的軟件程序實例。

1.延時程序

首先,通過下面的代碼演示單片機如何通過程序實現延時一段時間。

    ;延時子程序
    DELAY:
        MOV  R7,#10H                                                               ;(1)
    DELAY0:
        MOV  R6,#7FH                                                               ;(2)
    DELAY1:
        MOV  R5,#7FH                                                               ;(3)
        DJNZ R5,$                                                                  ;(4)
        DJNZ R6,DELAY1                                                             ;(5)
        DJNZ R7,DELAY0                                                             ;(6)
        RET                                                                        ;(7)

程序(1)為數據傳送指令,該指令的作用為將數據10H傳送到寄存器R7中。8051單片機執行程序(1)~程序(3)后,寄存器R5、R6、R7的值分別為7FH、7FH和10H。程序(4)為減1不為0轉移指令,該指令的作用為將寄存器R5中的數據減1,如果結果不為0,則程序跳轉。其中“$”符號表示該指令的地址,所以若減1不為0則程序發生跳轉,再次執行程序(4)。同理,程序(5)為將寄存器R6中的數據減1,如果結果不為0,則程序跳轉到標號“DELAY1”處繼續執行。程序(7)為子程序返回指令,執行該指令使程序返回調用子程序時的斷點,繼續執行斷點之后的程序。

以上代碼實例使用了數據傳送指令和控制轉移指令,8051單片機的數據傳送指令及控制轉移指令如表2-2、表2-3所示。表2-2、表2-3中的其他一些數據傳送指令及控制轉移指令將在后面的實例中陸續詳細介紹。

表2-2 數據傳送指令

表2-3 控制轉移指令

以上代碼實例是一個完整的子程序。所謂子程序,就是完成確定任務,并能被其他程序反復調用的程序代碼段,子程序在結構上具有通用性和獨立性。子程序的編寫必須注意以下幾點:

● 子程序調用使用LCALL指令。

● 子程序必須通過RET指令返回。

● 子程序第一條必須有標號,以實現LCALL指令的調用。

● 正確傳遞入口參數和出口參數。

● 子程序需要注意現場的保護和恢復。

● 如果需要子程序嵌套,應注意嵌套深度與堆棧區大小的問題。

該延時子程序,可以實現約0.5秒的延時,下面看看如何來計算延時子程序的延時時間。8051單片機的一個機器周期包括12個時鐘周期,本實例中單片機晶振為12MHz,則它的1個時鐘周期是1/12微秒,1個機器周期是1微秒。DJNZ指令是雙周期指令,執行1次要2個微秒,延時子程序一共執行258064次DJNZ指令,一共為516128微秒,約為0.5秒。

2.程序全貌

本實例的軟件程序全貌如下:

    ;-----------------------------------
    ;                   簡單點亮發光二極管實例
    ;功能:點亮發光管LED并閃爍
    ;-----------------------------------
    LED_PIN       EQU        P1.0                                                      ;(1)

    ORG 0000H                ;偽指令,指定程序從0000H開始存放
    LJMP  MAIN               ;跳轉指令,程序跳轉到MAIN處
    ORG 0100H                ;偽指令,指定以下程序從0100H開始存放
    MAIN:
        MOV  SP,#60H         ;給堆棧指針賦初值                                   (2)
    LIGHT:
        SETB  LED_PIN        ;置一P1.0,LED滅                                    (3)
        LCALL  DELAY         ;調延時子程序                                       (4)
        CLR  LED_PIN         ;清零P1.0,LED亮                                    (5)
        LCALL  DELAY         ;調延時子程序                                       (6)
        SJMP  LIGHT          ;跳轉,程序繼續                                     (7)

    ;延時子程序
    DELAY:
        MOV  R7,#10H
    DELAY0:
        MOV  R6,#7FH
    DELAY1:
        MOV  R5,#7FH
        DJNZ R5,$
        DJNZ R6,DELAY1
        DJNZ R7,DELAY0
        RET
    END

程序(1)為偽指令,偽指令是在匯編程序中起某種控制作用的特殊命令,其格式與通常的操作指令一樣,并可加在匯編程序的任何地方,但它們并不產生實際的機器指令。程序(1)的作用是定義常數,也就是說,在該偽指令以下程序中出現的LED_PIN都是指代P1.0。8051單片機編程中常用的偽指令如表2-4所示。

表2-4 常用偽指令

8051單片機在上電復位后程序計數器PC中的值為0000H,也就是說程序是從0000H單元開始執行的。通過偽指令ORG 0000H指定程序從0000H單元開始存放,并在該單元寫入跳轉指令LJMP MAIN,使程序跳轉到MAIN處開始執行。“MAIN:”稱為標號,它代表了當前行的程序存儲器地址。

程序(2)為給堆棧指針賦初值指令。所謂堆棧是一個RAM區域,堆棧存放和取用數據的方式比較特殊:先進后出,后進先出。堆棧的數據傳輸指令有兩條,即PUSH和POP指令,堆棧的操作還涉及一個寄存器:堆棧指針SP。每當執一次PUSH指令時,SP的值就自動加1,然后數據被放到SP所指示的RAM單元中。每當執行一次POP指令,數據從SP所指示的RAM單元中取出,然后SP的值自動減1。由于上電復位后,SP的初始值為07H,這樣就使堆棧數據從08H單元開始往后存放,而08H到1FH這個區域正是8051 單片機的第二、三、四工作寄存器區,經常要被使用,這會造成數據的混亂。所以使用MOV SP,#60H指令設置堆棧指針,把堆棧設置在從60H開始的RAM單元中。

程序(3)、程序(5)為位操作指令,8051單片機的位操作指令見表2-5。

表2-5 位操作指令

通過直接尋址位取反指令CPL,程序(3)~(7)也可寫作如下:

    LIGHT:
        CPL       LED_PIN        ;取反P1.0,改變LED的亮滅狀態
        LCALL     DELAY          ;調延時子程序
        SJMP LIGHT               ;跳轉,程序繼續

3.運行結果

本實例的運行結果為LED不停閃爍。

2.1.4 技巧總結

本實例從單片機點亮1只發光二極管出發,演示8051單片機是如何操作I/O口的。在單片機I/O口操作中應注意以下的技巧。

● 硬件連接過程中應注意各I/O口的內部結構,選擇合適的引腳及連接方式。一般來說,對于I/O口驅動電流負載的情況,應采用輸出低電平驅動電路的形式。對于許多新型的51內核的單片機,引腳提供了輸出20mA電流的LED驅動能力,輸出高電平時也可以直接驅動LED。

● 操作I/O口的指令主要是SETB bit、CLR bit、CPL bit。

主站蜘蛛池模板: 枞阳县| 万山特区| 高青县| 长顺县| 娱乐| 广东省| 高平市| 读书| 电白县| 九江市| 腾冲县| 合川市| 建水县| 金溪县| 昌乐县| 天津市| 天台县| 阳信县| 嘉禾县| 名山县| 彰化市| 木兰县| 横峰县| 进贤县| 黎城县| 台江县| 澳门| 西充县| 辽源市| 永川市| 鄂伦春自治旗| 仁寿县| 宁海县| 海伦市| 新巴尔虎左旗| 库车县| 榆中县| 铜川市| 新津县| 同德县| 昭通市|