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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

8、a1,0x86,0x8e /cf;/延時函數(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輪流顯示一遍,每個字符顯示1秒uchar i=0;/從數(shù)組第一個元素開始顯示for(i=0;i16;i+) SegPort=seg7cai;/按次序顯示字符0F DelayMs(1000); /延時1秒 l 知識點:數(shù)組seg7ca的定義格式:數(shù)據(jù)類型(數(shù)組位置)數(shù)組名稱= 數(shù)組元素1,數(shù)組元素2,;l 知識點:code關(guān)鍵字“code”是C51所定義

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

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

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

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

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

14、us,選擇“File/NewDesign”菜單選項,新建一個“設(shè)計項目”。并將項目保存為“SEG7_2”?!癙”按鈕或菜單“Library/Pick Divice/Symbol P”菜單,從“元件庫”中選取元件。依次添加其他元件。其名稱和位置見下表。元件名稱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是一個8位鎖存器,在這里主要是提供鎖存和驅(qū)動功能。依次從備選元件庫中擺放器件,連線,畫出仿真電路圖,如圖5-6所示。圖5-6“LE”引腳相連,方法如下:“LE”引腳各用鼠標延長一段。(2)點擊Proteus側(cè)邊工具欄的“LBL(Wire Label Mode)”按鈕,如圖5-7所示。Wire Label Mode 按鈕圖5-7圖5-8

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

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

18、加一個名為“”的源代碼文件,然后鍵入如下代碼。如代碼5.2所示。#include #define SegPort P0 /定義數(shù)碼管連接的端口#define uchar unsigned char /宏定義 將unsigned char 替換為較為簡單的uchar寫法#define uint unsigned int/宏定義 將unsigned int 替換為較為簡單的uint寫法/用一個數(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ù)碼管個位的位選線sbit ShiWei=P10; /定義數(shù)碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/延時函數(shù)ms毫秒void DelayMs(uint ms)uint i,j;for(i=0;ims;i+)for(j=0;j124;j+);void main()GeWei=1; /先將數(shù)碼管個位顯示關(guān)閉ShiWei=1; /先將數(shù)碼管十位顯示關(guān)閉while(1)/無限大循環(huán)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cc5; /將5的編碼送出G

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

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

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”同時顯示出來了。5.5多位數(shù)碼管顯示秒數(shù)據(jù)讓我們實現(xiàn)如下功能:讓兩位數(shù)碼管依次顯示數(shù)字“0059”,每個數(shù)字顯示1秒,顯示完59后,回到00,如此反復(fù)。5.5.1實現(xiàn)原理分析1.我們使用一個變量second表示當前的秒數(shù),讓second從0開

23、始,每隔一秒鐘加1,當second增加到59時,讓它回到0,重新開始。這樣,second就在059之間反復(fù)變化。2.從second中拆分出它的個位和十位呢?我們可以使用以下方法。提取個位:tmp=second%10;/例如second=45,second%10=5提取十位:tmp=second/10;/例如second=45,second/10=43.我們讓數(shù)碼管的個位顯示second的個位,數(shù)碼管的十位顯示second的十位。5.5.2 硬件電路的設(shè)計不變。5.5.3程序的設(shè)計1.新建一個keil項目,并命名為“SEG7_3”并添加一個名為“”的源代碼文件,然后鍵入如下代碼。如代碼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ù)碼管個位的位選線sbit ShiWei=P10; /定義數(shù)碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/用一個數(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為當前的秒數(shù)GeWei=1; /先將數(shù)碼管個位顯示關(guān)閉ShiWei=1; /先將數(shù)碼管十位顯示關(guān)閉second=0; /second將從0開始增加while(1)/無限大循環(huán)tmp = second%10;/提取個位數(shù)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cctmp; /將second個位的編碼送出GeWei=0; /先顯示個位,將十位關(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;/再顯示十位,將個位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(500); /延時500毫秒,連同前面延時的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中拆分出它的個位和十位。提取個位:tmp=second%10;/例如second=45,second%10=5提取十位:tmp=second/10;/例如second=45,second/10=43. 我們讓數(shù)碼管的個位顯示second的個位,數(shù)碼管的十位顯示second的十位。SegPort=seg7cctmp; /將second個位的編碼送出SegPort=seg7cctmp; /將second十位的編碼送出

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

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

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

31、commmon.h /包含#define uchar unsigned char等定義#include function.h /包含DelayMs函數(shù)#define SegPort P0 /定義數(shù)碼管連接的端口sbit GeWei=P11; /定義數(shù)碼管個位的位選線sbit ShiWei=P10; /定義數(shù)碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/用一個數(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;/定義一個全局變量,second為當前的秒數(shù)uchar count;/定義一個全局變量,count為定時器中斷執(zhí)行的次數(shù)void main()/*定時器T0的初始化*TMOD=0x01; /設(shè)置定時器T0工作在方式1TH0=(65536-50000)/256;TL0=(65536-50000)%256;/設(shè)置定時器中斷時間間隔為50毫秒EA=1; /開總中斷ET0=1; /開定時器T0中斷TR0=1; /定時器開始運行/*GeWei=1; /先將數(shù)碼管個位顯示關(guān)閉ShiWei=1; /先將數(shù)

33、碼管十位顯示關(guān)閉second=0; /second將從0開始增加count=0; /count將從0開始增加while(1)/無限大循環(huán)tmp = second%10;/提取個位數(shù)le573=1; /將鎖存器設(shè)置為直通模式SegPort=seg7cctmp; /將second個位的編碼送出GeWei=0; /先顯示個位,將十位關(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;/再顯示十位,將個位關(guān)閉le573=0; /將鎖存器設(shè)置為鎖存模式DelayMs(1); GeWei=1;ShiWei=1; /消隱操作,防止數(shù)碼管閃爍/定時器T0的中斷處理函數(shù),本例中,該中斷函數(shù)每隔50毫秒執(zhí)行一次,則執(zhí)行20次后,累積的時間為1秒void T0_Timer() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256; /因為方式1中,TH和TL值會清零,因此需要重新設(shè)置定時器中斷時間間隔為50毫秒count+; /中斷執(zhí)行的次數(shù)加1 if(count=20) /注意,中斷20次后,累計的時

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

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

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

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

溫馨提示

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

評論

0/150

提交評論