- 電力系統(tǒng)單片機(jī)應(yīng)用技術(shù)
- 陳榮主編
- 4960字
- 2021-10-22 23:19:01
任務(wù)三 數(shù)碼管顯示
任務(wù)描述
這里的數(shù)碼管其實(shí)就是LED燈,七段數(shù)碼管是由7個(gè)LED組成的“8”字形的顯示
設(shè)備,每個(gè)LED一個(gè)段,分別用a、b、c、d、e、f、g和dp表示,可顯示數(shù)字0~9或
字母A~F,另外還有一個(gè)用于表示小數(shù)點(diǎn)的LED,共8個(gè)LED,如圖
1 23所示。
編寫一個(gè)程序控制單片機(jī)在4位七段數(shù)碼管中顯示數(shù)字“1234”,并讓顯示的內(nèi)容每隔1s自動(dòng)加1。
任務(wù)分析
本任務(wù)介紹單片機(jī)如何控制七段數(shù)碼管顯示,如何控制多個(gè)數(shù)碼管顯示,學(xué)習(xí)幾個(gè)常見的編程指令,了解循環(huán)程序設(shè)計(jì)格式、數(shù)碼管掃描顯示方法及原理。掌握七段數(shù)碼管的電路連接,掌握查表的編程方法。

任務(wù)實(shí)施
圖1-23 七段
數(shù)碼管
一、七段數(shù)碼管控制方式1.七段數(shù)碼管結(jié)構(gòu)
七段數(shù)碼管有共陰極和共陽極兩種,共陰極就是將所有發(fā)光二極管的陰極共同連接在一個(gè)COM點(diǎn),陽極分別用a、b、c、d、e、f、g和dp表示;共陽極就是將所有發(fā)光二極管的陽極共同連接在一個(gè)COM點(diǎn),陰極分別用a、b、c、d、e、f、g和dp表示,如圖1-24所示。

圖1-24 共陰極、共陽極七段數(shù)碼管電路
(a)共陰極;(b)共陽極
七段數(shù)碼管的顯示電路可分為靜態(tài)顯示電路和動(dòng)態(tài)顯示電路。數(shù)碼管不間斷地持續(xù)顯示為靜態(tài)顯示,一般用于只有1個(gè)七段數(shù)碼管的情況下。動(dòng)態(tài)顯示的數(shù)碼管處于高頻率的通斷刷新中,一般用于有多個(gè)七段數(shù)碼管組合的情況下,如圖1-25所示。

圖1-25 四位七段數(shù)碼管
2.靜態(tài)顯示
共陽極數(shù)碼管使用時(shí),將COM與VCC連接,然后在每個(gè)陰極接一個(gè)限流電阻,再與驅(qū)動(dòng)電路連接或直接接到單片機(jī)引腳,如圖1-26所示。

圖1-26 七段數(shù)碼管連接電路
當(dāng)陰極對應(yīng)的引腳輸出低電平時(shí),相應(yīng)的LED點(diǎn)亮,根據(jù)不同引腳電平的輸出組合可以顯示不同數(shù)字。
共陰極數(shù)碼管使用時(shí),先將COM連接GND,然后在每個(gè)陽極接一個(gè)限流電阻,再與驅(qū)動(dòng)電路連接或直接接到單片機(jī)引腳,如將陽極直接單片機(jī)引腳,則需給引腳加設(shè)2kΩ左右上拉電阻增加驅(qū)動(dòng)電流。
靜態(tài)顯示的電路優(yōu)點(diǎn)是控制簡單,只要在8個(gè)數(shù)據(jù)端口輸入相應(yīng)數(shù)字的編碼即可,易于編寫程序。以共陰極數(shù)碼管為例,顯示數(shù)字1時(shí)讓b、c兩段點(diǎn)亮即可,假如a~dp分
別連接P0.0~P0.7,那么數(shù)字1的編碼則為06H(0000 0110B),其余的數(shù)字編碼見
表1-5。缺點(diǎn)是當(dāng)數(shù)碼管的數(shù)量多時(shí),占用單片機(jī)I/O端口接線過多,因此有了動(dòng)態(tài)的顯示電路。
表1-5
七段數(shù)碼管顯示代碼表

續(xù)表

3.動(dòng)態(tài)顯示
動(dòng)態(tài)顯示電路是將多個(gè)數(shù)碼管的8根數(shù)據(jù)線(a~g和dp)分別連接在一起,每個(gè)公共端作為使能引腳,以4位的共陰極電路為例,如圖1-27所示。

圖1-27 四位七段數(shù)碼管單片機(jī)直接驅(qū)動(dòng)電路(亮度有限)
動(dòng)態(tài)顯示原理是將要顯示的數(shù)字的編碼送到數(shù)碼管8根公共的總線上,如果只要第一個(gè)數(shù)碼管顯示,則使其公共端為低電平,其余三個(gè)公共端為高電平。在顯示四個(gè)不同的數(shù)字時(shí),將需顯示的數(shù)字編碼送到總線上,并使其相應(yīng)的數(shù)碼管的公共端為低電平,其余三個(gè)高電平關(guān)閉顯示,依次讓第一到第四個(gè)顯示不同的數(shù)字并快速切換刷新。每個(gè)數(shù)碼管顯示的時(shí)間控制在16ms以內(nèi),由于人眼的遲滯效應(yīng)會(huì)同時(shí)看到4個(gè)數(shù)碼管的數(shù)字。
4.驅(qū)動(dòng)電路
七段數(shù)碼管的驅(qū)動(dòng)電路主要有3種:①單片機(jī)引腳加上拉電阻驅(qū)動(dòng),用于數(shù)碼管功率較小時(shí);②使用三極管或邏輯門芯片驅(qū)動(dòng),用于數(shù)碼管的功率較大時(shí);③使用專用的可編程數(shù)碼管控制芯片,通常可以驅(qū)動(dòng)較大功率的數(shù)碼管,且占用單片機(jī)的I/O口數(shù)量少。以共陰極數(shù)碼管為例:
使用第一種驅(qū)動(dòng)電路的接法如圖1-27所示。其中P0口已加設(shè)了2kΩ的上拉電阻,
將P0口的P0.0~P0.7分別接a~g和dp,4個(gè)公共使能端與P2.3~P2.0連接。
將P2.3配置為低電平時(shí),電流從P0口通過第1個(gè)數(shù)碼管的8個(gè)LED流回P2.3引腳,8個(gè)LED都點(diǎn)亮?xí)r,P2.3引腳約吸納10~15mA電流,如果電流超過了P2口引腳電流吸納的極限值20mA,可采用第二種驅(qū)動(dòng)電路,使用三極管或門電路來增加驅(qū)動(dòng)電流,共陽極的四位七段數(shù)碼管連接圖見圖1-28所示。

圖1-28 共陽極四位七段數(shù)碼管三極管驅(qū)動(dòng)連接
這種方式在數(shù)碼管點(diǎn)亮?xí)r,電流從UCC開始依次經(jīng)三極管、數(shù)碼管內(nèi)發(fā)光二極管、限流電阻后回到GND,若采用S9012三極管集射極電流最大可達(dá)500mA。與第1種電路不同的是,單片機(jī)的使能控制引腳不是直接與數(shù)碼管的公共端相連,而是接到三極管的基極。
第3種驅(qū)動(dòng)電路采用集成化的串行控制數(shù)碼管驅(qū)動(dòng)芯片。例如MAX7219,它可驅(qū)動(dòng)8個(gè)七段數(shù)碼管64個(gè)LED燈,內(nèi)部具有寄存器可配置數(shù)碼管亮度、位數(shù)及編碼方式等信息,具體用法可參考MAX7219的使用說明。
二、編寫程序?qū)崿F(xiàn)數(shù)碼管控制
實(shí)驗(yàn)板上的數(shù)碼管驅(qū)動(dòng)電路是采用單片機(jī)加上拉電阻直接驅(qū)動(dòng)的,其電路如圖1-27所示。P0口每個(gè)引腳增設(shè)了2kΩ的上拉電阻以增加驅(qū)動(dòng)電流,P0.0~P0.7分別與a~g、dp連接,4個(gè)公共使能端與P2.3~P2.0連接。假如我們要顯示“1234”這個(gè)數(shù)字,對應(yīng)第1個(gè)數(shù)碼管顯示1字樣,則在P0口輸出數(shù)字1的編碼06H:
79.MOV P0,06H
;
再在第一個(gè)數(shù)碼管的控制引腳P2.3輸出低電平使能顯示,并保證控制引腳P2.0~P2.2輸出高電平關(guān)閉其他三個(gè)數(shù)碼管(為保證輸出有效,首先得給P2口寫入1),然后調(diào)用延時(shí)程序(不超過16ms):

根據(jù)上面的步驟寫出四位七段數(shù)碼管的程序段,并依次讓4個(gè)數(shù)碼管循環(huán)顯示:

只要將上面代碼放在主程序中一直循環(huán)執(zhí)行即可看到數(shù)碼管顯示“1234”的字樣。從上面的代碼我們可以知道,要顯示某個(gè)數(shù)字或字母時(shí)都得去查它的編碼,很麻煩。這里可以用查表法來改進(jìn),先將每個(gè)數(shù)字的編碼使用DB指令依次存放ROM中:

TAB為指令的標(biāo)簽,因?yàn)镈B是偽指令,因此TAB代表的不是DB指令的地址,而是DB指令第1個(gè)參數(shù)(也就是數(shù)據(jù))的ROM地址,第3行是數(shù)碼管編碼對應(yīng)的字符,第4行是對應(yīng)的編號。在程序中可先將TAB的值賦予DPTR,再用MOVC A,@A+DPTR指令從ROM中讀取數(shù)據(jù),然后送到P0口鎖存器中:

上面的指令就是一個(gè)查表過程,從A中的值查到其相應(yīng)的編碼,使用查表法改進(jìn)的程序如下:


在新建的“閃爍燈.ASM”文件中輸入上面的程序,編譯后下載到實(shí)驗(yàn)板中,然后單片機(jī)復(fù)位開始運(yùn)行,就可以看到四位七段數(shù)碼管顯示“4321”。有興趣的讀者可以嘗試每隔1s自動(dòng)加1的程序編寫。
拓展知識(shí)
一、匯編語言移位指令
移位指令能對累加器ACC中的內(nèi)容進(jìn)行循環(huán)移位操作,8051指令系統(tǒng)中支持循環(huán)左移、循環(huán)右移、帶進(jìn)位循環(huán)左移和帶進(jìn)位循環(huán)右移共4條移位指令。
◆ RL A
功能:循環(huán)左移,將累加器A中的每個(gè)位向左移動(dòng)一位,最高位移到最低位。
例如:RL A
執(zhí)行前,(A)=7FH,即01111111執(zhí)行后,(A)=FEH,即11111110
另:二進(jìn)制數(shù)中,每一個(gè)位的權(quán)為2n,因此在沒溢出的前提下每向左移一位,相當(dāng)于將該數(shù)乘以2。而右移恰好相反,相當(dāng)于是除以2的運(yùn)算。
◆ RR A
功能:循環(huán)右移,將累加器A中的每個(gè)位向右移動(dòng)一位,最低位移到最高位。
例如:RR A
執(zhí)行前,(A)=7FH,即01111111執(zhí)行后,(A)=BFH,即10111111◆ RLCA
功能:帶進(jìn)位循環(huán)左移,將累加器A中的每個(gè)位向左移動(dòng)一位,最高位移到進(jìn)位標(biāo)志C中,C的內(nèi)容補(bǔ)到最低位。
例如:RLC A
執(zhí)行前,(A)=7FH,即01111111,C=0執(zhí)行后,(A)=FEH,即11111110,C=0◆ RRCA
功能:帶進(jìn)位循環(huán)右移,將累加器A中的每個(gè)位向右移動(dòng)一位,最低位移到進(jìn)位標(biāo)志C中,C的內(nèi)容送到最高位。
例如:RRC A
執(zhí)行前,(A)=7FH,即01111111,C=0執(zhí)行后,(A)=3FH,即00111111,C=1
二、匯編語言算術(shù)運(yùn)算指令
功能:將源操作數(shù)與目標(biāo)操作數(shù)進(jìn)行加、減、乘、除等運(yùn)算,其結(jié)果存放于目標(biāo)操作數(shù)中。8051的邏輯單元只能對8位無符號數(shù)進(jìn)行運(yùn)算,利用帶進(jìn)位的指令時(shí)可以對多字節(jié)的無符號整數(shù)進(jìn)行運(yùn)算。同時(shí)利用溢出標(biāo)志位,可以對有符號數(shù)進(jìn)行運(yùn)算。算術(shù)運(yùn)算指令除加減1指令外,運(yùn)算結(jié)束都會(huì)刷新PSW寄存器的標(biāo)志位。算術(shù)運(yùn)算指令共有24條,可分為6類。
1.加減1指令
用于循環(huán)計(jì)數(shù)和地址的偏置查表。加1指令助記符為INC(increase),減1指令助記符為DEC(decrease),只有1個(gè)目標(biāo)操作數(shù),可以是直接尋址、工作寄存器、間接尋址和累加器。加減1指令說明見表1-6。
表1-6
加減1指令說明

注意:加減1指令的執(zhí)行結(jié)果不影響任何標(biāo)志位。2.加法指令
將源操作數(shù)與目標(biāo)操作數(shù)相加,結(jié)果存放于目標(biāo)操作數(shù)中。目標(biāo)寄存器只能為A,源操作數(shù)的尋址方式可以是立即數(shù)、直接尋址、工作寄存器或間接尋址。加法指令有帶進(jìn)位與非帶進(jìn)位的指令兩大類,非進(jìn)位的加法指令助記符為ADD,帶進(jìn)位的加法指令助記符為ADDC。加法指令說明見表1-7。
表1-7
加法指令說明

加法運(yùn)算指令的運(yùn)算結(jié)果會(huì)影響C、AC和OV標(biāo)志位。當(dāng)最高位bit7產(chǎn)生進(jìn)位時(shí),C被置位,否則復(fù)位;當(dāng)?shù)?位產(chǎn)生進(jìn)位,即bit3位有進(jìn)位時(shí),AC被置位,否則復(fù)位;當(dāng)運(yùn)算結(jié)果不在有符號數(shù)范圍內(nèi)時(shí),即有符號數(shù)運(yùn)算溢出,OV被置位,否則復(fù)位。
3.減法指令(帶進(jìn)位)
減法指令都是帶進(jìn)位的指令,指令助記符為SUBB,目標(biāo)操作數(shù)只能為A,源操作數(shù)可以是立即數(shù)、直接尋址、間接尋址和工作寄存器。運(yùn)算過程是將A寄存器的內(nèi)容減去源操作數(shù)及進(jìn)位標(biāo)志C的內(nèi)容,結(jié)果存回A中。減法指令運(yùn)算結(jié)果會(huì)影響C、AC與OV標(biāo)志位。減法指令說明見表1-8。
表1-8
減法指令說明

當(dāng)運(yùn)算過程最高位產(chǎn)生借位時(shí),C=1,否則C=0;當(dāng)?shù)?位產(chǎn)生借位時(shí),AC=1,否則AC=0;當(dāng)單字節(jié)有符號數(shù)運(yùn)算溢出時(shí),OV位置1,否則為0。
4.乘法指令
◆ MUL AB
功能:將A寄存器與B寄存器中的無符號數(shù)相乘,乘積結(jié)果的高8位賦給B寄存器,低8位賦給A寄存器。當(dāng)乘積的值大于FFH時(shí),OV標(biāo)志位置1,如果OV標(biāo)志位為0則說明乘積小于FFH,可在A寄存器中讀取結(jié)果即可。
例如:MUL AB
執(zhí)行前,(A)=20H,(B)=12H執(zhí)行后,(A)=40H,(B)=02H
5.除法指令
◆ DIV AB
功能:將A寄存器中的無符號數(shù)除以B寄存器中的無符號數(shù),所得的商存于累加器A中,余數(shù)存于B寄存器中。除法指令總是使OV和C標(biāo)志位為0,如OV=1,表示B的值為0,除法有溢出,運(yùn)算結(jié)果為不定值。
例如:DIV AB
執(zhí)行前,(A)=20H,(B)=12H執(zhí)行后,(A)=01H,(B)=0EH
6.BCD碼調(diào)整指令
◆ DA A
功能:將A寄存器中的BCD碼和進(jìn)行進(jìn)位調(diào)整。DA指令調(diào)整的依據(jù)是,如果低4位的值大于9,則加06H,并向高4位進(jìn)位,如高4位的值大于9,也加06H,那么進(jìn)位
標(biāo)志CY置1。38
例如:DA A
執(zhí)行前,(A)=ABH,(C)=0執(zhí)行后,(A)=11H,(C)=1
三、匯編語言邏輯運(yùn)算指令
邏輯運(yùn)算指令是對操作數(shù)按位進(jìn)行與、或、非、取反、異或運(yùn)算的指令,它的運(yùn)算結(jié)果不會(huì)影響標(biāo)志位,共有4類19條邏輯運(yùn)算指令。
1.邏輯與指令
功能:將兩個(gè)操作數(shù)對應(yīng)的位進(jìn)行與運(yùn)算并存回目標(biāo)操作數(shù)中,當(dāng)兩個(gè)位都為邏輯1時(shí),運(yùn)算結(jié)果方為1,否則為0。指令助記符ANL為AND(與)和LOGIC(邏輯)的縮寫,共有6條。指令說明見表1-9。
表1-9
邏輯與指令說明

例如:ANL23H,#E9H
執(zhí)行前,(23H)=67H,即67H(01100111B)和E9H(11101001B)作邏輯與運(yùn)算執(zhí)行后,(23H)=61H
2.邏輯或指令
功能:將兩個(gè)操作數(shù)對應(yīng)的位進(jìn)行或運(yùn)算并存回目標(biāo)操作數(shù)中,當(dāng)兩個(gè)位為邏輯0時(shí),運(yùn)算結(jié)果方為0,否則為1。指令助記符ORL為OR(或)和LOGIC(邏輯)的縮寫,共有6條。指令說明見表1-10。
表1-10
邏輯或指令說明

例如:ORL A,69H
執(zhí)行前,(A)=C3H,(69H)=38H,即C3H(1100 0011B)和38H(0011 1000B)作邏輯或運(yùn)算,結(jié)果為1111 1011B
執(zhí)行后,(A)=FBH,(69H)=38H 3.異或指令XOR
功能:將兩個(gè)操作數(shù)對應(yīng)的位進(jìn)行異或運(yùn)算并存回目標(biāo)操作數(shù)中,當(dāng)兩個(gè)位邏輯值相反,即其中一個(gè)為真,另一個(gè)為假時(shí)運(yùn)算結(jié)果方為1,否則為0。操作助記符XRL為EX
CLUSIVE OR LOGIC的縮寫,共有6條指令。指令說明見表1-11。
表1-11
異或指令說明

例如:XRL A,37H
執(zhí)行前,(A)=D3H,(37H)=58H,即58H(0101 1000B)和D3H(1101 0011B)作異或運(yùn)算,結(jié)果為1000 1011B(8BH)
執(zhí)行后,(A)=8BH,(37H)=58H
4.累加器取反指令
◆ CPL A
功能:將累加器中的內(nèi)容按位取反,然后存回A中。指令只有1個(gè)目標(biāo)操作數(shù)A。
例如:CPL A
執(zhí)行前,(A)=3DH執(zhí)行后,(A)=C2H
四、匯編語言程序結(jié)構(gòu)
默認(rèn)情況下程序是從0000H地址開始存放的,而ROM地址0003H~0023H的范圍是單片機(jī)中斷的向量地址,也就是在中斷使能情況下的目標(biāo)地址,因此這個(gè)區(qū)間是存儲(chǔ)中斷服務(wù)程序的,如果將用戶主程序存放在這就與之相沖突了,因此在程序中使用ORG偽指令指定程序段放置的起始地址。用ORG偽指令指定在0000H~0002H存放LJMP指令,再由LJMP指令跳轉(zhuǎn)到同樣由ORG偽指令指定的存放主程序段的地址(一般為0030H),避開中斷向量區(qū)間。通常程序開始部分用于參數(shù)初始化,如堆棧、中斷等,處理完初始化程序后進(jìn)入主程序開始循環(huán)執(zhí)行。
我們還會(huì)經(jīng)常碰到需要反復(fù)多次執(zhí)行某個(gè)程序段的情況,如果重復(fù)編寫這個(gè)程序段會(huì)使程序變得冗長而雜亂,因此使用子程序的結(jié)構(gòu)來避免,這樣能使程序的結(jié)構(gòu)更加清晰,方便閱讀與維護(hù)。另外程序中還經(jīng)常會(huì)使用宏偽指令EQU用于代替變量地址或使用頻率較高的常量,宏定義段一般位于程序最開始。下面我們來看一段程序。

如要修改上面程序中P1和P2的輸出只需修改第一行的宏即可。匯編程序典型結(jié)構(gòu)
如圖1-29所示。

圖1-29 匯編程序典型結(jié)構(gòu)
能力檢測
編程實(shí)現(xiàn)數(shù)碼管靜態(tài)顯示秒表的倒計(jì)時(shí)。
- 節(jié)電百例一點(diǎn)通(第2版)
- 圖解電工快速入門與提高
- 風(fēng)力發(fā)電機(jī)組控制技術(shù)及仿真
- 圖解電工技能入門
- 中小型電機(jī)修理手冊
- 電力電子技術(shù)與運(yùn)動(dòng)控制系統(tǒng)綜合實(shí)驗(yàn)教程
- 家裝水電工施工技能視頻寶典
- 西門子PLC編程指令與梯形圖快速入門
- 電氣制圖技能訓(xùn)練
- 圖解彩色電視機(jī)故障檢修一本通
- 電氣可編程控制原理與應(yīng)用(S7-200 PLC)
- 電工技術(shù)(第3版)
- 電磁線制造工藝學(xué)
- 風(fēng)力發(fā)電機(jī)組機(jī)械裝調(diào)工:初級
- 變頻調(diào)速技術(shù)與應(yīng)用項(xiàng)目教程