七段數(shù)碼管的使用_第1頁(yè)
七段數(shù)碼管的使用_第2頁(yè)
七段數(shù)碼管的使用_第3頁(yè)
七段數(shù)碼管的使用_第4頁(yè)
七段數(shù)碼管的使用_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、5.1 數(shù)碼管簡(jiǎn)介同學(xué)們!相信你的流水燈也做的不錯(cuò)了吧,現(xiàn)在能玩出幾種花樣了?但是工程師們?cè)O(shè)計(jì)這么一個(gè)單片機(jī),并不是只為了讓它做流水燈的,那樣也太浪費(fèi)點(diǎn)了吧 . _。數(shù)碼管的一種是半導(dǎo)體發(fā)光器件,7段LED數(shù)碼管是利用7個(gè)LED(發(fā)光二極管)外加一個(gè)小數(shù)點(diǎn)的LED組合而成的顯示設(shè)備,可以顯示09等10個(gè)數(shù)字和小數(shù)點(diǎn),使用非常廣泛,數(shù)碼管可以分為一位和多位它的外觀如圖5-1所示。圖5-15.2 數(shù)碼管的顯示原理數(shù)碼管可以分為共陽(yáng)極與共陰極兩種,共陽(yáng)極就是把所有LED的陽(yáng)極連接到共同接點(diǎn)com,使用時(shí)com接正5伏電源,而每個(gè)LED的陰極分別為a、b、c、d、e、f、g及dp(小數(shù)點(diǎn));共陰極則是

2、把所有LED的陰極連接到共同接點(diǎn)com,使用時(shí)com要將其接地。而每個(gè)LED的陽(yáng)極分別為a、b、c、d、e、f、g及dp(小數(shù)點(diǎn)),8個(gè)LED的分布方式如圖5-2所示。圖中的8個(gè)LED分別與上面那個(gè)圖中的ADP各段相對(duì)應(yīng),通過控制各個(gè)LED的亮滅來顯示數(shù)字。那么,實(shí)際的數(shù)碼管的引腳是怎樣排列的呢?對(duì)于單個(gè)數(shù)碼管來說,從它的正面看進(jìn)去,左下角那個(gè)腳為1腳,以逆時(shí)針方向依次為110腳,左上角那個(gè)腳便是10腳了,上面兩個(gè)圖中的數(shù)字分別與這10個(gè)管腳一一對(duì)應(yīng)。注意,3腳和8腳是連通的,這兩個(gè)都是公共腳。它對(duì)應(yīng)的引腳分布為圖5-3所示。圖5-2圖5-3數(shù)碼管的8段,對(duì)應(yīng)一個(gè)字節(jié)的8位,a對(duì)應(yīng)最低位,dp

3、(小數(shù)點(diǎn))對(duì)應(yīng)最高位。所以如果想讓數(shù)碼管顯示數(shù)字0,那么共陰數(shù)碼管的字符編碼為00111111,即0x3f;共陽(yáng)數(shù)碼管的字符編碼為11000000,即0xc0??梢钥闯鰞蓚€(gè)編碼的各位正好相反。如圖5-4所示。圖5-4那么,一位數(shù)碼管要顯示字符0F,則對(duì)應(yīng)的編碼如表2所示。一個(gè)八段數(shù)碼管稱為一位,多個(gè)數(shù)碼管并列在一起可構(gòu)成多位數(shù)碼管,它們的段選線(即a,b,c,d,e,f,g,dp)連在一起,而各自的公共端稱為位選線。顯示時(shí),都從段選線送入字符編碼,而選中哪個(gè)位選線,那個(gè)數(shù)碼管便會(huì)被點(diǎn)亮。5.3 一位數(shù)碼管的顯示請(qǐng)實(shí)現(xiàn):讓一位數(shù)碼管依次顯示字符0F,每個(gè)字符顯示1秒,如此反復(fù)。一般情況下,為了計(jì)

4、算或取碼的方便,我們把a(bǔ)-dp依次接到單片機(jī)某個(gè)口上的Px.0-Px.7上。x表示0,1,2,3其中的一個(gè)。這樣我們只要給某個(gè)口,賦一個(gè)值,則相應(yīng)的LED段就被點(diǎn)亮,但是在硬件連接上要注意了:?jiǎn)纹瑱C(jī)可能不能直接驅(qū)動(dòng)LED,所以我們可以通過控制三級(jí)管的導(dǎo)通或截止,或者使用共陽(yáng)極數(shù)碼管(以灌電流的方式)、或者使用鎖存器來驅(qū)動(dòng)。來控制LED的亮與滅!硬件的選擇與仿真電路的設(shè)計(jì)1.打開Proteus,選擇“File/NewDesign”菜單選項(xiàng),新建一個(gè)“設(shè)計(jì)項(xiàng)目”。并將項(xiàng)目保存為“SEG7_1”。2.選擇“P”按鈕或菜單“Library/Pick Divice/Symbol P”菜單,從“元件庫(kù)”中

5、選取元件。依次添加其他元件。其名稱和位置見下表。元件名稱CategorySub-CategoryResultsAT89C52Microprocessor ICs8051 FamilyAT89C527SEG-MPX1-CA(注1)Optoelectronics7-Segment Displays7SEG-MPX1-CARX8(注2)ResistorsResistor PacksRX8RESPACK-8(注3)ResistorsResistor PacksRESPACK-8注1:7SEG表示7段數(shù)碼管(Proteus還提供了14段和16段數(shù)碼管)MPX1表示1位(Proteus還提供了2位、4位、

6、6位和8位數(shù)碼管)CA表示共陽(yáng)極(CC表示共陰極)注2:RX8表示電阻排,它實(shí)際相當(dāng)于8個(gè)電阻并排擺放在一個(gè)容器內(nèi)。在這里是作為限流電阻來使用的。注3:RESPACK-8表示電阻排,它實(shí)際相當(dāng)于8個(gè)電阻并排擺放在一個(gè)容器內(nèi),但是這8個(gè)電阻的一段是連接在一起作為公共端的。在這里是作為P0口的上拉電阻來使用的。依次從備選元件庫(kù)中擺放器件,連線,畫出仿真電路圖,如圖5-5所示。圖5-5注意:在Proteus中,實(shí)際上,51單片機(jī)是不需要晶振、復(fù)位電路和電源就可以仿真的,因此,為了方便我們教學(xué),以后,我們將不再畫上述51的外圍電路。程序的設(shè)計(jì)1.新建一個(gè)keil項(xiàng)目,并命名為“SEG7_1”并添加一個(gè)

7、名為“”的源代碼文件,然后鍵入如下代碼。如所示。#include #define SegPort P0 /定義數(shù)碼管連接的端口#define uchar unsigned char /宏定義 將unsigned char 替換為較為簡(jiǎn)單的uchar寫法#define uint unsigned int/宏定義 將unsigned int 替換為較為簡(jiǎn)單的uint寫法/用一個(gè)數(shù)組來定義字符0f共陽(yáng)極數(shù)碼管編碼uchar code seg7ca= 0xc0,0xf9,0xa4,0xb0,/030x99,0x92,0x82,0xf8,/470x80,0x90,0x88,0x83,/8b0xc6,0x

8、a1,0x86,0x8e /cf;/延時(shí)函數(shù)ms毫秒void DelayMs(uint ms)uint i,j;for(i=0;ims;i+)for(j=0;j124;j+);void main()while(1)/無限大循環(huán)/這段代碼將字符0F輪流顯示一遍,每個(gè)字符顯示1秒uchar i=0;/從數(shù)組第一個(gè)元素開始顯示for(i=0;i16;i+) SegPort=seg7cai;/按次序顯示字符0F DelayMs(1000); /延時(shí)1秒 l 知識(shí)點(diǎn):數(shù)組seg7ca的定義格式:數(shù)據(jù)類型(數(shù)組位置)數(shù)組名稱= 數(shù)組元素1,數(shù)組元素2,;l 知識(shí)點(diǎn):code關(guān)鍵字“code”是C51所定義

9、的關(guān)鍵字,他的含義是定義將代碼放在ROM中,由于51的RAM很小,因此,為了節(jié)約有限的RAM,我們通常會(huì)把一些不會(huì)變化的數(shù)據(jù)(比如數(shù)碼管的編碼、參數(shù)表等等)放在ROM中,這樣,我們就可以多空出一些RAM供程序來使用。那么怎樣把這些常量放在ROM中呢,即給定義語(yǔ)句前添加一個(gè)“code”關(guān)鍵字,告訴編譯器,這些常量要放在ROM中,如果沒有添加“code”,那么這些編碼就會(huì)放在RAM中。同學(xué)們可以通過刪除“code”關(guān)鍵字,重新build程序,然后查看程序占用RAM的大小,來驗(yàn)證“code”關(guān)鍵字的作用。l 知識(shí)點(diǎn):數(shù)組元素的訪問數(shù)組元素是通過他的序號(hào)來訪問的。例如數(shù)組seg7ca= 0xc0,0x

10、f9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e一共有16個(gè)元素,其中0xc0的序號(hào)為0(請(qǐng)記住,數(shù)組中的第一個(gè)元素序號(hào)為0),0xf9的序號(hào)為1,0x8e的序號(hào)為15,以此類推。那么當(dāng)我們想要使用0xc0時(shí),我們可以使用“seg7ca0”這種方式。因此,代碼“SegPort=seg7cai”;/按次序顯示字符0Fl 程序代碼說明uchar i=0;/從數(shù)組第一個(gè)元素開始顯示for(i=0;i16;i+)SegPort=seg7cai;/按次序顯示字符0FDelayMs(1000); /延時(shí)1秒這段

11、代碼將字符0F輪流顯示一遍,每個(gè)字符顯示1秒當(dāng)for循環(huán)開始時(shí),i=0,因此,SegPort=seg7ca0;由于SegPort是P0,seg7ca0=0xc0,因此,P0=0xc0,即P0口送出0xc0,由于0xc0是共陽(yáng)極數(shù)碼管字符“0”的編碼,因此,數(shù)碼管顯示字符“0”。當(dāng)for第二次循環(huán)時(shí),i=1,因此,SegPort=seg7ca1;即,P0=0xf9,即P0口送出0xf9,由于0xf9是共陽(yáng)極數(shù)碼管字符“1”的編碼,因此,數(shù)碼管顯示字符“1”。以此類推,隨著for循環(huán),P0口送出數(shù)組seg7ca所定義的16個(gè)元素,從而在數(shù)碼管上顯示對(duì)應(yīng)的十六個(gè)字符。5.4 多位數(shù)碼管的顯示想必大家

12、已經(jīng)可以把0-F顯示出來了吧!但是如果要你顯示兩位數(shù),三位數(shù)呢?讓我們實(shí)現(xiàn)如下功能:讓兩位數(shù)碼管顯示數(shù)字“15”。或許,有的朋友會(huì)這么想:在P0口上接一個(gè)數(shù)碼管,再在P1口上接個(gè)數(shù)碼管!但是,如果要顯示4位、5位的數(shù)字呢?那豈不是一塊AT8951都接不過來!難到就不能接4位或5位以上的嗎?肯定不是的!說到這里,我們來講講數(shù)碼管的顯示方式,可分為兩種:動(dòng)態(tài)掃描和靜態(tài)顯示。上面我們所說的即為靜態(tài)顯示。但是如果我們采用動(dòng)態(tài)掃描顯示,那么就可以解決上面的問題,動(dòng)態(tài)掃描是指每隔一段時(shí)間循環(huán)點(diǎn)亮每個(gè)數(shù)碼管,每次只有一個(gè)數(shù)碼管被點(diǎn)亮。細(xì)心的朋友會(huì)問這樣的問題:是讓數(shù)碼管一個(gè)一個(gè)亮,那還是不能控制數(shù)碼管一起亮

13、或滅嘛!怎么解決? 其實(shí),人的眼睛有視覺暫留效應(yīng),黑夜里,拿著一支煙,在你面前快速的晃動(dòng),你會(huì)發(fā)現(xiàn)什么樣的現(xiàn)象?是不是原本不連續(xù)的點(diǎn)變成了一條看上去連續(xù)的曲線或者直線!再回過頭來,仔細(xì)想想我們的數(shù)碼管!原理是一樣的,只要我們快速的循環(huán)顯示每個(gè)數(shù)碼管,人的眼睛看起來就好像是它們同時(shí)被點(diǎn)亮了,關(guān)鍵是速度。比如點(diǎn)亮6位數(shù)碼管,硬件連接可以這樣解決:a-dp還是接至P0.0-P0.7上,還有6個(gè)COM腳再接至另外口的P2.0-P2.5。P0口作段選(控制數(shù)字字符),P2口作位選(選通哪個(gè)數(shù)碼管被點(diǎn)亮)這樣我們控制P0和P2口就可以控制6個(gè)數(shù)碼管了。5.4.1硬件的選擇與仿真電路的設(shè)計(jì)1.打開Prote

14、us,選擇“File/NewDesign”菜單選項(xiàng),新建一個(gè)“設(shè)計(jì)項(xiàng)目”。并將項(xiàng)目保存為“SEG7_2”?!癙”按鈕或菜單“Library/Pick Divice/Symbol P”菜單,從“元件庫(kù)”中選取元件。依次添加其他元件。其名稱和位置見下表。元件名稱CategorySub-CategoryResultsAT89C52Microprocessor ICs8051 FamilyAT89C527SEG-MPX2-CC(注1)Optoelectronics7-Segment Displays7SEG-MPX2-CCRX8ResistorsResistor PacksRX8RESPACK-8Re

15、sistorsResistor PacksRESPACK-874HC573(注2)TTL 74HC seriesFlip-Flops & latches74HC573注1:7SEG表示7段數(shù)碼管、MPX2表示2位、CC表示共陰極(CC表示共極)注2:74HC573是一個(gè)8位鎖存器,在這里主要是提供鎖存和驅(qū)動(dòng)功能。依次從備選元件庫(kù)中擺放器件,連線,畫出仿真電路圖,如圖5-6所示。圖5-6“LE”引腳相連,方法如下:“LE”引腳各用鼠標(biāo)延長(zhǎng)一段。(2)點(diǎn)擊Proteus側(cè)邊工具欄的“LBL(Wire Label Mode)”按鈕,如圖5-7所示。Wire Label Mode 按鈕圖5-7圖5-8

16、(3)將鼠標(biāo)移動(dòng)到51的P1.2引腳點(diǎn)一下,出現(xiàn)如下“Edit Wire Label”窗口,在“Edit Wire Label”窗口的“string”編輯框中填入該引腳的名稱,比如“P12”,然后點(diǎn)擊“OK”。如果5-8所示。(4)再將將鼠標(biāo)移動(dòng)到74HC573的“LE”引腳點(diǎn)一下,再在“Edit Wire Label”窗口的“string”編輯框中填入該相同的名稱,比如“P12”,然后點(diǎn)擊“OK”。(5)這樣,引腳標(biāo)號(hào)相同的引腳就會(huì)被物理的連接在一起了。2.74HC573的使用74HC573為8位3態(tài)非反轉(zhuǎn)透明鎖存器。數(shù)據(jù)從D0D7引腳輸入,從Q0Q7引腳輸出。他的真值表如圖5-9所示。圖5

17、-9OE為輸出使能端,低電平有效,當(dāng)OE為高電平時(shí),D和Q不通,即所謂的輸出高阻態(tài)。LE為鎖存端,當(dāng)LE為高電平時(shí),D和Q是直通的,當(dāng)LE為低電平時(shí),不管D端輸入是什么,Q端保持上一次的輸出,即開啟鎖存功能。3.電路說明因?yàn)槲覀兪褂昧藘晌粩?shù)碼管,因此,我們需要輪流點(diǎn)亮數(shù)碼管的各位和十位。由于數(shù)碼管是共陰極的,因此,我們需要在P0口送出數(shù)碼管共陰極的編碼,同時(shí),給要點(diǎn)亮數(shù)碼管位選線一個(gè)低電平,由于51的驅(qū)動(dòng)能力不足以直接驅(qū)動(dòng)數(shù)碼管,因此,我們通過74HC573這個(gè)鎖存器來驅(qū)動(dòng),它的輸出電流足夠大,能夠很好的驅(qū)動(dòng)數(shù)碼管發(fā)光。5.4.2程序的設(shè)計(jì)1.新建一個(gè)keil項(xiàng)目,并命名為“SEG7_2”并添

18、加一個(gè)名為“”的源代碼文件,然后鍵入如下代碼。如代碼5.2所示。#include #define SegPort P0 /定義數(shù)碼管連接的端口#define uchar unsigned char /宏定義 將unsigned char 替換為較為簡(jiǎn)單的uchar寫法#define uint unsigned int/宏定義 將unsigned int 替換為較為簡(jiǎn)單的uint寫法/用一個(gè)數(shù)組來定義字符0f共陰極數(shù)碼管編碼uchar code seg7cc=0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x7d,0x07, /470x7f,0x6f,0x77,0x7c,

19、/8b0x39,0x5e,0x79,0x71 /cf;sbit GeWei=P11; /定義數(shù)碼管個(gè)位的位選線sbit ShiWei=P10; /定義數(shù)碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/延時(shí)函數(shù)ms毫秒void DelayMs(uint ms)uint i,j;for(i=0;ims;i+)for(j=0;j124;j+);void main()GeWei=1; /先將數(shù)碼管個(gè)位顯示關(guān)閉ShiWei=1; /先將數(shù)碼管十位顯示關(guān)閉while(1)/無限大循環(huán)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cc5; /將5的編碼送出G

20、eWei=0; /先顯示個(gè)位,將十位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(1);GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cc1; /將1的編碼送出ShiWei=0;/再顯示十位,將個(gè)位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(1);GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍l 程序代碼說明1.初始化 GeWei=1; /先將數(shù)碼管個(gè)位顯示關(guān)閉ShiWei=1; /先將數(shù)碼管十位顯示關(guān)閉通過這兩行代碼將數(shù)碼管的個(gè)位和十位位選線都置為高電平,對(duì)于共

21、陰極數(shù)碼管來講,那么個(gè)位和十位都不能顯示了,即先將兩位都關(guān)閉。2.我們現(xiàn)在想讓個(gè)位數(shù)碼管顯示字符“5”,我們需要做的是:(1)LE引腳拉高,使74HC573進(jìn)入直通模式。(2)P0口送出字符“5”共陰極編碼“0x6d”(3)GeWei (即)引腳送出低電平,選中數(shù)碼管個(gè)位,此時(shí)數(shù)碼管個(gè)位顯示字符“5”。(4)LE引腳拉低,使74HC573進(jìn)入鎖存模式,此時(shí),74HC573的Q端始終保持輸出“0x6d”,則數(shù)碼管個(gè)位始終保持顯示字符“5”把上述偽代碼翻譯為C51代碼就是:le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cc5; /將5的編碼送出GeWei=0; /先顯示個(gè)位,將

22、十位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式為了防止數(shù)碼管閃爍,我們需要消隱操作,即將兩位數(shù)碼管都關(guān)閉,代碼如下:DelayMs(1);GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍再用相同的方法讓十位數(shù)碼管顯示字符“1”。5.通過循環(huán)操作,使兩位數(shù)碼管快速輪流顯示字符“1”和“5”,由于視覺暫留效應(yīng),我們看到的就是字符“1”和“5”同時(shí)顯示出來了。5.5多位數(shù)碼管顯示秒數(shù)據(jù)讓我們實(shí)現(xiàn)如下功能:讓兩位數(shù)碼管依次顯示數(shù)字“0059”,每個(gè)數(shù)字顯示1秒,顯示完59后,回到00,如此反復(fù)。5.5.1實(shí)現(xiàn)原理分析1.我們使用一個(gè)變量second表示當(dāng)前的秒數(shù),讓second從0開

23、始,每隔一秒鐘加1,當(dāng)second增加到59時(shí),讓它回到0,重新開始。這樣,second就在059之間反復(fù)變化。2.從second中拆分出它的個(gè)位和十位呢?我們可以使用以下方法。提取個(gè)位:tmp=second%10;/例如second=45,second%10=5提取十位:tmp=second/10;/例如second=45,second/10=43.我們讓數(shù)碼管的個(gè)位顯示second的個(gè)位,數(shù)碼管的十位顯示second的十位。5.5.2 硬件電路的設(shè)計(jì)不變。5.5.3程序的設(shè)計(jì)1.新建一個(gè)keil項(xiàng)目,并命名為“SEG7_3”并添加一個(gè)名為“”的源代碼文件,然后鍵入如下代碼。如代碼5.3所示

24、。/代碼5.3#include #include commmon.h /包含#define uchar unsigned char等定義#include function.h /包含DelayMs函數(shù)#define SegPort P0 /定義數(shù)碼管連接的端口sbit GeWei=P11; /定義數(shù)碼管個(gè)位的位選線sbit ShiWei=P10; /定義數(shù)碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/用一個(gè)數(shù)組來定義字符0f共陰極數(shù)碼管編碼unsigned char code seg7cc=0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x

25、7d,0x07, /470x7f,0x6f,0x77,0x7c, /8b0x39,0x5e,0x79,0x71 /cf;void main()uchar tmp,second; /second為當(dāng)前的秒數(shù)GeWei=1; /先將數(shù)碼管個(gè)位顯示關(guān)閉ShiWei=1; /先將數(shù)碼管十位顯示關(guān)閉second=0; /second將從0開始增加while(1)/無限大循環(huán)tmp = second%10;/提取個(gè)位數(shù)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cctmp; /將second個(gè)位的編碼送出GeWei=0; /先顯示個(gè)位,將十位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存

26、模式DelayMs(500);GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍tmp = second/10;/提取十位數(shù)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cctmp; /將second十位的編碼送出ShiWei=0;/再顯示十位,將個(gè)位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(500); /延時(shí)500毫秒,連同前面延時(shí)的500毫秒,剛好是1秒GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍if(second59) /second 增加到59后,將重新從0開始增加second+;elsesecond=0;l 程序代

27、碼說明1.讓second就在059之間反復(fù)變化。代碼如下:if(second59) /second增加到59后,將重新從0開始增加second+;elsesecond=0;second中拆分出它的個(gè)位和十位。提取個(gè)位:tmp=second%10;/例如second=45,second%10=5提取十位:tmp=second/10;/例如second=45,second/10=43. 我們讓數(shù)碼管的個(gè)位顯示second的個(gè)位,數(shù)碼管的十位顯示second的十位。SegPort=seg7cctmp; /將second個(gè)位的編碼送出SegPort=seg7cctmp; /將second十位的編碼送出

28、4.second每隔一秒鐘加1我們使用兩次DelayMs(500),則總的延時(shí)時(shí)間就是1秒l 實(shí)際代碼執(zhí)行的效果我們看到,實(shí)際代碼執(zhí)行的效果其實(shí)不太理想,秒數(shù)的顯示不是同時(shí)顯示出來的,問題出在哪里呢?其實(shí),問題出在second的增加和數(shù)碼管掃描的速度要求不一致。second增加的速度要求很慢,1秒鐘增加一次,而數(shù)碼管掃描要求速度很快,幾毫秒就要?jiǎng)討B(tài)顯示一遍。而我們?cè)谝粋€(gè)程序序列中是無法同時(shí)滿足這個(gè)快速和慢速兩個(gè)要求的。5.6多位數(shù)碼管顯示秒數(shù)據(jù)改進(jìn)版(定時(shí)器的使用)5.6.1實(shí)現(xiàn)原理分析1.如果我們能使用一個(gè)方法使second值1秒鐘增加一次,同時(shí)能讓數(shù)碼管很快的動(dòng)態(tài)顯示,那么就能解決我們的問

29、題了。使用什么方法呢,答案就是使用定時(shí)器。定時(shí)器可以實(shí)現(xiàn)在一定的時(shí)間間隔重復(fù)執(zhí)行某個(gè)任務(wù)。例如,我們想每隔1秒執(zhí)行一次second值加1的操作,我們就應(yīng)該使用定時(shí)器。51單片機(jī)內(nèi)部有兩個(gè)定時(shí)器(52有三個(gè)),即T0和T1。2.我們?cè)谥鞒绦蜓h(huán)中做快速的數(shù)碼管動(dòng)態(tài)掃描,同時(shí)在定時(shí)器中斷中做second每秒加1的操作就可以了。l 知識(shí)點(diǎn):定時(shí)器中斷什么是中斷呢?講個(gè)比較通俗的例子:比如你正在家中看電視,突然電話響了,你的第一反應(yīng)是什么?是不是先跑過去接電話!接完電話后,繼續(xù)看電視。這就是個(gè)中斷的例子,電話打斷了你看電視這件事(所以叫做中斷源),你跑過去就是響應(yīng)中斷,接電話就是中斷的處理!接完電話后

30、,接續(xù)看電視,即恢復(fù)中斷!但是這個(gè)好象和單片機(jī)沒什么聯(lián)系呀?類比一下:比如單片機(jī)正在執(zhí)行某個(gè)任務(wù)(比如數(shù)碼管的顯示),突然要有任務(wù),要求單片機(jī)響應(yīng)(比如1秒時(shí)間到了,second要加1),單片機(jī)就會(huì)應(yīng)答響應(yīng),去執(zhí)行該任務(wù)(即中斷處理),原來的任務(wù)(數(shù)碼管的顯示)就會(huì)暫停。等執(zhí)行完中斷任務(wù)后,繼續(xù)執(zhí)行原來的任務(wù)(繼續(xù)數(shù)碼管的顯示)。由于中斷處理很快,因此你實(shí)際是感覺不到數(shù)碼管的顯示曾經(jīng)暫停過。5.6.2 硬件電路的設(shè)計(jì)不變。5.6.3程序的設(shè)計(jì)1.新建一個(gè)keil項(xiàng)目,并命名為“SEG7_4”并添加一個(gè)名為“”的源代碼文件,然后鍵入如下代碼。如代碼5.4所示。#include #include

31、commmon.h /包含#define uchar unsigned char等定義#include function.h /包含DelayMs函數(shù)#define SegPort P0 /定義數(shù)碼管連接的端口sbit GeWei=P11; /定義數(shù)碼管個(gè)位的位選線sbit ShiWei=P10; /定義數(shù)碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/用一個(gè)數(shù)組來定義字符0f共陰極數(shù)碼管編碼unsigned char code seg7cc=0x3f,0x06,0x5b,0x4f, /030x66,0x6d,0x7d,0x07, /470x7f,0x6f,0x7

32、7,0x7c, /8b0x39,0x5e,0x79,0x71 /cf;uchar tmp,second;/定義一個(gè)全局變量,second為當(dāng)前的秒數(shù)uchar count;/定義一個(gè)全局變量,count為定時(shí)器中斷執(zhí)行的次數(shù)void main()/*定時(shí)器T0的初始化*TMOD=0x01; /設(shè)置定時(shí)器T0工作在方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;/設(shè)置定時(shí)器中斷時(shí)間間隔為50毫秒EA=1; /開總中斷ET0=1; /開定時(shí)器T0中斷TR0=1; /定時(shí)器開始運(yùn)行/*GeWei=1; /先將數(shù)碼管個(gè)位顯示關(guān)閉ShiWei=1; /先將數(shù)

33、碼管十位顯示關(guān)閉second=0; /second將從0開始增加count=0; /count將從0開始增加while(1)/無限大循環(huán)tmp = second%10;/提取個(gè)位數(shù)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cctmp; /將second個(gè)位的編碼送出GeWei=0; /先顯示個(gè)位,將十位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(1);GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍tmp = second/10;/提取十位數(shù)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cctmp; /將second十

34、位的編碼送出ShiWei=0;/再顯示十位,將個(gè)位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(1); GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍/定時(shí)器T0的中斷處理函數(shù),本例中,該中斷函數(shù)每隔50毫秒執(zhí)行一次,則執(zhí)行20次后,累積的時(shí)間為1秒void T0_Timer() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256; /因?yàn)榉绞?中,TH和TL值會(huì)清零,因此需要重新設(shè)置定時(shí)器中斷時(shí)間間隔為50毫秒count+; /中斷執(zhí)行的次數(shù)加1 if(count=20) /注意,中斷20次后,累計(jì)的時(shí)

35、間為50*20=1000毫秒,即一秒,此時(shí),second該加1了count=0; /先將count重新置零/*每秒鐘second加1*if(second59) /second 增加到59后,將重新從0開始增加second+;elsesecond=0; /*l 知識(shí)點(diǎn):中斷處理函數(shù)的格式C51的中斷處理函數(shù)的格式如下:void 函數(shù)名() interrupt 中斷號(hào)中斷處理的代碼例如 void T0_Timer() interrupt 1其中T0_Timer是函數(shù)名(可以自己取名)interrupt 是C51的關(guān)鍵字,表示該函數(shù)是中斷處理函數(shù)中斷號(hào)表示該中斷的種類。52系列 的單片機(jī)共有6個(gè)中斷

36、源,分別為:外中斷INT0(中斷號(hào)0) 、定時(shí)器T0中斷(中斷號(hào)1)、外中斷INT1(中斷號(hào)2)、定時(shí)器T1中斷(中斷號(hào)3)、串口中斷(中斷號(hào)4)、定時(shí)器T2中斷(中斷號(hào)5)。又如 void T1_Timer() interrupt 3表示該函數(shù)是處理定時(shí)器T1的中斷處理函數(shù),也即當(dāng)T1發(fā)生中斷時(shí),會(huì)進(jìn)入該函數(shù)來處理中斷。l 知識(shí)點(diǎn):定時(shí)器的初始化(1)定時(shí)器的工作方式51的定時(shí)器有4種工作方式,本例中使用方式1,即16位定時(shí)器模式,要讓定時(shí)器工作在工作方式1,需要設(shè)置寄存器TMOD(高四位管T1,低四位管T0)的值,設(shè)置方式如下:TMOD=0x01; /設(shè)置定時(shí)器T0工作在方式1TMOD=0

37、x10; /設(shè)置定時(shí)器T1工作在方式1TMOD=0x11; /設(shè)置定時(shí)器T0、T1都工作在方式1注:TMOD的詳細(xì)設(shè)置,請(qǐng)參看單片機(jī)課本。(2)工作方式1模式下,我們通常通過如下代碼設(shè)置其中斷時(shí)間間隔THx=(65536-N)/256;TLx=(65536-N)%256; /x=0表示設(shè)置定時(shí)器0,x=1表示設(shè)置定時(shí)器1代碼中的“N”值就是定時(shí)器的中斷時(shí)間間隔。一般分為兩種情況:u 當(dāng)51采用12MHz的晶振時(shí),計(jì)時(shí)單位為1us,則N=t/1us,其中t為要設(shè)置的實(shí)際中斷間隔。例如我們想設(shè)置T0中斷時(shí)間間隔為50ms,則N=50ms/1us=50000。u 當(dāng)51采用11.0592MHz的晶振

38、時(shí),計(jì)時(shí)單位為1.085us,則N=t/1.085us,其中t為要設(shè)置的實(shí)際中斷間隔。例如我們想設(shè)置T0中斷時(shí)間間隔為50ms,則N=50ms/1.085us46083。由于我們采用的是12MHz的晶振,因此,本例中,T0的中斷時(shí)間間隔為50毫秒,即每隔50毫秒,進(jìn)入中斷處理程序一次。(3)設(shè)置中斷允許只用當(dāng)單片機(jī)允許響應(yīng)中斷時(shí),中斷發(fā)生時(shí),才會(huì)進(jìn)入中斷處理程序,利用這個(gè)特性,我們可以打開和切斷中斷的響應(yīng)。中斷的響應(yīng)允許分為兩個(gè)級(jí)別:特定中斷開關(guān)和總中斷開關(guān)。例如本例中EA=1; /開總中斷,當(dāng)EA=0即關(guān)閉總中斷時(shí),所有類型的中斷都不會(huì)被響應(yīng)ET0=1; /開定時(shí)器T0中斷其中,EA為總中斷開關(guān),EA=1為打開總中斷,EA=0,表示關(guān)閉總中斷,此時(shí),系統(tǒng)發(fā)生的所有類型的中斷都不會(huì)被響應(yīng),因此,我們可以利用EA=0來切斷所有的中斷響

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論