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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、算或取碼的方便,我們把a-dp依次接到單片機某個口上的Px.0-Px.7上。x表示0,1,2,3其中的一個。這樣我們只要給某個口,賦一個值,則相應的LED段就被點亮,但是在硬件連接上要注意了:單片機可能不能直接驅動LED,所以我們可以通過控制三級管的導通或截止,或者使用共陽極數碼管(以灌電流的方式)、或者使用鎖存器來驅動。來控制LED的亮與滅!硬件的選擇與仿真電路的設計1.打開Proteus,選擇“File/NewDesign”菜單選項,新建一個“設計項目”。并將項目保存為“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段數碼管(Proteus還提供了14段和16段數碼管)MPX1表示1位(Proteus還提供了2位、4位、

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

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

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

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

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

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

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

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

14、us,選擇“File/NewDesign”菜單選項,新建一個“設計項目”。并將項目保存為“SEG7_2”。“P”按鈕或菜單“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段數碼管、MPX2表示2位、CC表示共陰極(CC表示共極)注2:74HC573是一個8位鎖存器,在這里主要是提供鎖存和驅動功能。依次從備選元件庫中擺放器件,連線,畫出仿真電路圖,如圖5-6所示。圖5-6“LE”引腳相連,方法如下:“LE”引腳各用鼠標延長一段。(2)點擊Proteus側邊工具欄的“LBL(Wire Label Mode)”按鈕,如圖5-7所示。Wire Label Mode 按鈕圖5-7圖5-8

16、(3)將鼠標移動到51的P1.2引腳點一下,出現如下“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態非反轉透明鎖存器。數據從D0D7引腳輸入,從Q0Q7引腳輸出。他的真值表如圖5-9所示。圖5

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

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

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

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

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

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

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

24、。/代碼5.3#include #include commmon.h /包含#define uchar unsigned char等定義#include function.h /包含DelayMs函數#define SegPort P0 /定義數碼管連接的端口sbit GeWei=P11; /定義數碼管個位的位選線sbit ShiWei=P10; /定義數碼管十位的位選線sbit le573=P12; /定義573LE引腳的位選線/用一個數組來定義字符0f共陰極數碼管編碼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為當前的秒數GeWei=1; /先將數碼管個位顯示關閉ShiWei=1; /先將數碼管十位顯示關閉second=0; /second將從0開始增加while(1)/無限大循環tmp = second%10;/提取個位數le573=1; /將鎖存器設置為直通模式SegPort=seg7cctmp; /將second個位的編碼送出GeWei=0; /先顯示個位,將十位關閉le573=0; /將鎖存器設置為鎖存

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

27、碼說明1.讓second就在059之間反復變化。代碼如下: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. 我們讓數碼管的個位顯示second的個位,數碼管的十位顯示second的十位。SegPort=seg7cctmp; /將second個位的編碼送出SegPort=seg7cctmp; /將second十位的編碼送出

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

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

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

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

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

34、位的編碼送出ShiWei=0;/再顯示十位,將個位關閉le573=0; /將鎖存器設置為鎖存模式DelayMs(1); GeWei=1;ShiWei=1; /消隱操作,防止數碼管閃爍/定時器T0的中斷處理函數,本例中,該中斷函數每隔50毫秒執行一次,則執行20次后,累積的時間為1秒void T0_Timer() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256; /因為方式1中,TH和TL值會清零,因此需要重新設置定時器中斷時間間隔為50毫秒count+; /中斷執行的次數加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 知識點:中斷處理函數的格式C51的中斷處理函數的格式如下:void 函數名() interrupt 中斷號中斷處理的代碼例如 void T0_Timer() interrupt 1其中T0_Timer是函數名(可以自己取名)interrupt 是C51的關鍵字,表示該函數是中斷處理函數中斷號表示該中斷的種類。52系列 的單片機共有6個中斷

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

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

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

溫馨提示

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

評論

0/150

提交評論