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

第2章 51單片機(jī)基礎(chǔ)實(shí)例

本章主要介紹以下幾個(gè)單片機(jī)的基礎(chǔ)實(shí)例程序:

● 簡(jiǎn)單點(diǎn)亮發(fā)光二極管實(shí)例

● 跑馬燈實(shí)例

● 流水燈實(shí)例

● 查0~9平方表實(shí)例

● 受控輸出實(shí)例

● 比較輸入數(shù)大小實(shí)例

● 交通燈控制器實(shí)例

● 蜂鳴器發(fā)音實(shí)例

● 單片機(jī)演奏音樂實(shí)例

● 軟件陷阱實(shí)例

2.1 簡(jiǎn)單點(diǎn)亮發(fā)光二極管實(shí)例

單片機(jī)最簡(jiǎn)單的實(shí)例之一就是點(diǎn)亮發(fā)光二極管(LED)閃爍。本節(jié)通過點(diǎn)亮1只發(fā)光二極管的實(shí)例來介紹單片機(jī)的I/O口操作。

本節(jié)首先介紹單片機(jī)I/O口結(jié)構(gòu)的基礎(chǔ)知識(shí),接著介紹實(shí)例的硬件電路,然后給出了實(shí)例程序,最后將分析操作單片機(jī)的I/O口的技巧與注意點(diǎn)。

2.1.1 基礎(chǔ)知識(shí)

8051單片機(jī)有4個(gè)并行I/O口:P0~P3。這4個(gè)I/O口中只有P0口是真正的雙向口,P1~P3是準(zhǔn)雙向口,P3口還具有第二功能,為系統(tǒng)提供一些控制信號(hào)。4個(gè)并行I/O口的結(jié)構(gòu)如表2-1所示。由I/O口結(jié)構(gòu)可知,P0口的輸出三態(tài)門由兩只場(chǎng)效應(yīng)管(FET)組成,所以是一個(gè)真正的雙向口,同時(shí)可以提供較強(qiáng)的輸出高電平(拉電流)和低電平(灌電流)驅(qū)動(dòng)能力;P1~P3口中,上拉電阻代替了場(chǎng)效應(yīng)管,輸出緩沖器不是三態(tài)的,因此不是真正的雙向口,只能稱為準(zhǔn)雙向口,同時(shí)這些I/O口的輸出高電平驅(qū)動(dòng)能力較弱,只能提供較強(qiáng)的輸出低電平驅(qū)動(dòng)能力。因此,在使用I/O口直接驅(qū)動(dòng)LED等電流負(fù)載時(shí),需要使用輸出低電平驅(qū)動(dòng)的接法。

表2-1 并行l(wèi)/O口的結(jié)構(gòu)

2.1.2 硬件電路圖

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

圖2-1 點(diǎn)亮發(fā)光二極管原理電路圖

2.1.3 軟件程序設(shè)計(jì)

要實(shí)現(xiàn)LED的閃爍效果需要通過程序控制單片機(jī)連接到LED的I/O引腳,點(diǎn)亮LED,延時(shí)一段時(shí)間后,再控制I/O引腳使LED熄滅,如此循環(huán)就可以實(shí)現(xiàn)LED的閃爍。下面,著重介紹延時(shí)程序,并給出完整的軟件程序?qū)嵗?/p>

1.延時(shí)程序

首先,通過下面的代碼演示單片機(jī)如何通過程序?qū)崿F(xiàn)延時(shí)一段時(shí)間。

    ;延時(shí)子程序
    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)為數(shù)據(jù)傳送指令,該指令的作用為將數(shù)據(jù)10H傳送到寄存器R7中。8051單片機(jī)執(zhí)行程序(1)~程序(3)后,寄存器R5、R6、R7的值分別為7FH、7FH和10H。程序(4)為減1不為0轉(zhuǎn)移指令,該指令的作用為將寄存器R5中的數(shù)據(jù)減1,如果結(jié)果不為0,則程序跳轉(zhuǎn)。其中“$”符號(hào)表示該指令的地址,所以若減1不為0則程序發(fā)生跳轉(zhuǎn),再次執(zhí)行程序(4)。同理,程序(5)為將寄存器R6中的數(shù)據(jù)減1,如果結(jié)果不為0,則程序跳轉(zhuǎn)到標(biāo)號(hào)“DELAY1”處繼續(xù)執(zhí)行。程序(7)為子程序返回指令,執(zhí)行該指令使程序返回調(diào)用子程序時(shí)的斷點(diǎn),繼續(xù)執(zhí)行斷點(diǎn)之后的程序。

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

表2-2 數(shù)據(jù)傳送指令

表2-3 控制轉(zhuǎn)移指令

以上代碼實(shí)例是一個(gè)完整的子程序。所謂子程序,就是完成確定任務(wù),并能被其他程序反復(fù)調(diào)用的程序代碼段,子程序在結(jié)構(gòu)上具有通用性和獨(dú)立性。子程序的編寫必須注意以下幾點(diǎn):

● 子程序調(diào)用使用LCALL指令。

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

● 子程序第一條必須有標(biāo)號(hào),以實(shí)現(xiàn)LCALL指令的調(diào)用。

● 正確傳遞入口參數(shù)和出口參數(shù)。

● 子程序需要注意現(xiàn)場(chǎng)的保護(hù)和恢復(fù)。

● 如果需要子程序嵌套,應(yīng)注意嵌套深度與堆棧區(qū)大小的問題。

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

2.程序全貌

本實(shí)例的軟件程序全貌如下:

    ;-----------------------------------
    ;                   簡(jiǎn)單點(diǎn)亮發(fā)光二極管實(shí)例
    ;功能:點(diǎn)亮發(fā)光管LED并閃爍
    ;-----------------------------------
    LED_PIN       EQU        P1.0                                                      ;(1)

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

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

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

表2-4 常用偽指令

8051單片機(jī)在上電復(fù)位后程序計(jì)數(shù)器PC中的值為0000H,也就是說程序是從0000H單元開始執(zhí)行的。通過偽指令ORG 0000H指定程序從0000H單元開始存放,并在該單元寫入跳轉(zhuǎn)指令LJMP MAIN,使程序跳轉(zhuǎn)到MAIN處開始執(zhí)行。“MAIN:”稱為標(biāo)號(hào),它代表了當(dāng)前行的程序存儲(chǔ)器地址。

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

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

表2-5 位操作指令

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

    LIGHT:
        CPL       LED_PIN        ;取反P1.0,改變LED的亮滅狀態(tài)
        LCALL     DELAY          ;調(diào)延時(shí)子程序
        SJMP LIGHT               ;跳轉(zhuǎn),程序繼續(xù)

3.運(yùn)行結(jié)果

本實(shí)例的運(yùn)行結(jié)果為L(zhǎng)ED不停閃爍。

2.1.4 技巧總結(jié)

本實(shí)例從單片機(jī)點(diǎn)亮1只發(fā)光二極管出發(fā),演示8051單片機(jī)是如何操作I/O口的。在單片機(jī)I/O口操作中應(yīng)注意以下的技巧。

● 硬件連接過程中應(yīng)注意各I/O口的內(nèi)部結(jié)構(gòu),選擇合適的引腳及連接方式。一般來說,對(duì)于I/O口驅(qū)動(dòng)電流負(fù)載的情況,應(yīng)采用輸出低電平驅(qū)動(dòng)電路的形式。對(duì)于許多新型的51內(nèi)核的單片機(jī),引腳提供了輸出20mA電流的LED驅(qū)動(dòng)能力,輸出高電平時(shí)也可以直接驅(qū)動(dòng)LED。

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

主站蜘蛛池模板: 娄烦县| 乌兰县| 南丰县| 桂林市| 红安县| 汝南县| 锦州市| 通渭县| 华蓥市| 伊川县| 定兴县| 巴林右旗| 屏南县| 佳木斯市| 界首市| 临夏市| 辽中县| 内江市| 蓬莱市| 蒙山县| 沁水县| 玉溪市| 姜堰市| 龙州县| 大邑县| 仁化县| 遵化市| 临沂市| 花垣县| 民勤县| 环江| 容城县| 南开区| 友谊县| 泰宁县| 南江县| 开平市| 蒲城县| 阜城县| 阿勒泰市| 营山县|