- 51單片機(jī)應(yīng)用開發(fā)從入門到精通(“十二五”國(guó)家重點(diǎn)圖書出版規(guī)劃項(xiàng)目)
- 張華杰編著
- 2511字
- 2019-01-02 09:17:13
第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。
- 單片機(jī)基礎(chǔ)及應(yīng)用項(xiàng)目式教程
- 輕松學(xué)會(huì)單片機(jī)
- ABAQUS 2016有限元分析從入門到精通
- 單片機(jī)應(yīng)用項(xiàng)目化教程
- TinyML:基于TensorFlow Lite在Arduino和超低功耗微控制器上部署機(jī)器學(xué)習(xí)
- 嵌入式產(chǎn)品分析與設(shè)計(jì)
- ANSYS Workbench 17.0有限元分析從入門到精通
- AVR單片機(jī)實(shí)用程序設(shè)計(jì)
- 51單片機(jī)C語(yǔ)言編程一學(xué)就會(huì)
- 51單片機(jī)工程師是怎樣煉成的:基于C語(yǔ)言+Proteus仿真
- 單片微型計(jì)算機(jī)原理及應(yīng)用
- 嵌入式Linux軟硬件開發(fā)詳解:基于S5PV210處理器
- AVR單片機(jī)原理與應(yīng)用實(shí)例
- 基于ARM Cortex-M0+的CW32嵌入式開發(fā)實(shí)戰(zhàn)
- 從零開始學(xué)TensorFlow2.0