通過上節(jié)課的實(shí)驗(yàn),大家會發(fā)現(xiàn),我們逐漸進(jìn)入比較實(shí)質(zhì)性_第1頁
通過上節(jié)課的實(shí)驗(yàn),大家會發(fā)現(xiàn),我們逐漸進(jìn)入比較實(shí)質(zhì)性_第2頁
通過上節(jié)課的實(shí)驗(yàn),大家會發(fā)現(xiàn),我們逐漸進(jìn)入比較實(shí)質(zhì)性_第3頁
通過上節(jié)課的實(shí)驗(yàn),大家會發(fā)現(xiàn),我們逐漸進(jìn)入比較實(shí)質(zhì)性_第4頁
通過上節(jié)課的實(shí)驗(yàn),大家會發(fā)現(xiàn),我們逐漸進(jìn)入比較實(shí)質(zhì)性_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、通過上節(jié)課的 實(shí)驗(yàn),大家會發(fā)現(xiàn),我們逐漸進(jìn)入比較實(shí)質(zhì)性的學(xué)習(xí)了,需要記住的內(nèi)容也更多了,個別地方可能會感覺吃力。但是大家不要擔(dān)心,要有信心。這個跟小孩學(xué)走路一 樣,剛開始走路不太穩(wěn),沒關(guān)系,多走幾步多練練??匆曨l的時候要注意專心,一遍看不懂,思考一下,再回頭看第二遍和第三遍,沒準(zhǔn)一下就明白了。如果三遍還 看不明白,那就把不懂的問題放一放,繼續(xù)往下學(xué)兩課再回頭看一次,也可以到QQ群里(174280679)或 單片機(jī)論壇1.1 基本數(shù)字邏輯門電路不管是數(shù)字電路,還是C語言,我們都會經(jīng)常遇到邏輯運(yùn)算和邏輯電路,在這里我介紹一下,大家先簡單了解一下,知道有這么回事,回頭遇到了,再詳細(xì)研究。首

2、先,在“邏輯”這個概念范疇內(nèi),存在真和假這兩個邏輯值,而將其對應(yīng)到數(shù)字電路或C語言中,就變成了“非0值”和“0值”這兩個值,即邏輯上的“假”就是數(shù)字電路或C語言中的“0”這個值,而邏輯“真”就是其它一切“非0值”。然后,我們來具體分析一下幾個主要的邏輯運(yùn)算符。我們假定有2個字節(jié)變量:A和B,二者進(jìn)行某種邏輯運(yùn)算后的結(jié)果為F。以下邏輯運(yùn)算符都是按照變量整體值進(jìn)行運(yùn)算的,通常就叫做邏輯運(yùn)算符:&&:邏輯與,F(xiàn) = A && B,當(dāng)A、B的值都為真(即非0值,下同)時,其運(yùn)算結(jié)果F為真(具體數(shù)值為1,下同);當(dāng)A、B值任意一個為

3、假(即0,下同)時,結(jié)果F為假(具體數(shù)值為0,下同)。|:邏輯或,F(xiàn) = A | B,當(dāng)A、B值任意一個為真時,其運(yùn)算結(jié)果F為真;當(dāng)A、B值都為假時,結(jié)果F為假。! :邏輯非,F(xiàn) = !A,當(dāng)A值為假時,其運(yùn)算結(jié)果F為真;當(dāng)A值為真時,結(jié)果F為假。以下邏輯運(yùn)算符都是按照變量內(nèi)的每一個位來進(jìn)行運(yùn)算的,通常就叫做位運(yùn)算符:& :按位與,F(xiàn) = A & B,將A、B兩個字節(jié)中的每一位都進(jìn)行與運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0

4、b11001100,B = 0b11110000,則結(jié)果F就等于0b11000000。| :按位或,F(xiàn) = A | B,將A、B兩個字節(jié)中的每一位都進(jìn)行或運(yùn)算,再將得到的每一位結(jié)果組合為總結(jié)果F,例如A = 0b11001100,B = 0b11110000,則結(jié)果F就等于0b11111100。 : 按位取反,F(xiàn) = A,將A字節(jié)內(nèi)的每一位進(jìn)行非運(yùn)算(就是取反),再將得到的每一位結(jié)果組合為總結(jié)果F,例如,A = 0b11001100,則

5、結(jié)果 F就等于0b00110011;這個運(yùn)算符我們在前面的流水燈實(shí)驗(yàn)里已經(jīng)用過了,現(xiàn)在再回頭看一眼,是不是清楚多了。 : 按位異或,異或的意思是,如果運(yùn)算雙方的值不同(即相異)則結(jié)果為真,雙方值相同則結(jié)果為假。在C語言里沒有按變量整體值進(jìn)行的異或運(yùn)算,所以我們僅以按 位異或?yàn)槔?,F(xiàn) = A  B,A = 0b11001100,B = 0b11110000,則結(jié)果F就等于0b00111100。我們今后要看資料或芯片手冊的時候,會經(jīng)常遇到一些電路符號,表5-1就是數(shù)字電路中的常用符號,知道這些符號有利于我們理

6、解器件的邏輯結(jié)構(gòu),尤其重點(diǎn)認(rèn)識以下表中的“國外流行圖形符號”。在這里我們先簡單看一下,后邊遇到了知道到這里查閱就可以了。表5-1 數(shù)字邏輯門電路1.2 定時器的學(xué)習(xí)定時器是單片機(jī)的重點(diǎn)中的重點(diǎn),但不是難點(diǎn),大家一定要完全理解并且熟練掌握定時器的應(yīng)用。1.2.1 定時器的初步認(rèn)識時鐘周期:時鐘周期T是時序中最小的時間單位具體計(jì)算的方法就是1/時鐘源,我們KST-51單片機(jī)開發(fā)板上用的晶振是11.0592M,那么對于我們這個單片機(jī)系統(tǒng)來說,時鐘周期=1/11059200秒。機(jī) 器周期:我們的單片機(jī)完成一個操作的最短時間。機(jī)器周期主要針對匯編語言而言,在匯編語言下程序的

7、每一條語句執(zhí)行所使用的時間都是機(jī)器周期的整數(shù)倍,而且 語句占用的時間是可以計(jì)算出來的,而C語言一條語句的時間是不可計(jì)算的。51單片機(jī)系列,在其標(biāo)準(zhǔn)架構(gòu)下一個機(jī)器周期是12個時鐘周期,也就是 12/11059200秒?,F(xiàn)在有不少增強(qiáng)型的51單片機(jī),其速度都比較塊,有的1個機(jī)器周期等于4個時鐘周期,有的1個機(jī)器周期就等于1個時鐘周期,也 就是說大體上其速度可以達(dá)到標(biāo)準(zhǔn)51架構(gòu)的3倍或12倍。因?yàn)槲覀兪侵v標(biāo)準(zhǔn)的51單片機(jī),所以我們后邊的課程如果遇到這個概念,全部是指12個時鐘周期。這兩個概念了解即可,下邊就來我們的重頭戲,定時器和計(jì)數(shù)器。定時器和計(jì)數(shù)器是單片機(jī)內(nèi)部的同一個模塊,通過配置SFR(特殊功

8、能寄存器)可以實(shí)現(xiàn)兩種不同的功能,我們大多數(shù)情況下是使用定時器功能,因此我們的課程也是主要來講定時器功能,計(jì)數(shù)器功能大家自己了解下即可。顧 名思義,定時器就是用來進(jìn)行定時的。定時器內(nèi)部有一個寄存器,我們讓它開始計(jì)數(shù)后,這個寄存器的值每經(jīng)過一個機(jī)器周期就會加1一次,因此,我們可以把機(jī)器 周期理解為定時器的計(jì)數(shù)周期。我們的秒表,每經(jīng)過一秒,數(shù)字加1,而這個定時器就是每過一個機(jī)器周期的時間,也就是12/11059200秒,數(shù)字加1。 還有一個特別注意的地方,就是秒表是加到60后,秒就自動變成0了,這種情況在單片機(jī)和計(jì)算機(jī)里我們稱之為溢出。那定時器加到多少才會溢出呢?定時器有幾 種模式,假如是16位的

9、定時器,也就是2個字節(jié),最大值就是65535,那么加到65535后,再加1就算溢出,如果有其他位數(shù)的話,道理是一樣的,對于 51單片機(jī)來說,溢出后,這個值會直接變成0。從某一個初值,經(jīng)過計(jì)算確定的時間后溢出,這個過程就是其定時的含義。1.2.2 定時器的寄存器描述標(biāo) 準(zhǔn)的51里邊只有定時器0和定時器1這兩個定時器,現(xiàn)在很多單片機(jī)也有多個定時器的,在這里我們先講定時器0和1。那么我前邊提到過,對于單片機(jī)的每一個 功能模塊,都是由他的SFR,也就是特殊功能寄存器來控制。而和定時器有關(guān)的特殊功能寄存器,有以下幾個,大家不需要去記憶這些寄存器的名字和作用,你只 要大概知道就行,用的時候,隨時

10、可以查手冊,找到每個寄存器的名字和每個寄存器所起到的作用。表5-2 定時值存儲寄存器名稱描述SFR地址TH0定時器0高字節(jié)8CHTL0定時器0低字節(jié)8AHTH1定時器1高字節(jié)8DHTL1定時器1低字節(jié)8BH表5-3 TCON-定時器/計(jì)數(shù)器控制寄存器的位分配(地址:88H)       可位尋址;復(fù)位值:0x00;復(fù)位源:任何復(fù)位位76543210符號TF1TR1TF0TR0IE1IT1IE0IT0表5-4 TCON-定時器/計(jì)數(shù)器控制寄存器的位描述位符號描述7TF1定時器1溢出標(biāo)志。一旦定時器

11、1發(fā)生溢出時硬件置1。清零有兩種方式:軟件清零,或者進(jìn)入定時器中斷時硬件清零。6TR1定時1運(yùn)行控制位。軟件置位/清零來進(jìn)行啟動/關(guān)閉定時器。5TF0定時器0溢出標(biāo)志。一旦定時器0發(fā)生溢出時硬件置1。清零有兩種方式:軟件清零,或者進(jìn)入定時器中斷時硬件清零。4TR0定時0運(yùn)行控制位。軟件置位/清零來進(jìn)行啟動/關(guān)閉定時器。3IE1外部中斷部分,與定時器無關(guān),暫且不看2IT11IE00IT0    大家注意在表5-4中的描述中,只要寫到硬件置1或者清0的,就是指一旦符合條件,單片機(jī)自動完成的動作,只要寫軟件置1或者清0的,是指我們用程序去完成這個動作,后邊課程

12、中不再做說明。    表5-2中的寄存器,是存儲計(jì)數(shù)器的計(jì)數(shù)值的,兩個字節(jié)的用于定時器1,兩個字節(jié)用于定時器0。表 5-3中有TF1、TR1、TF0、TR0這4位需要我們理解清楚。兩位定時器1的,兩位定時器0的,我們只解釋定時器1的,定時器0的同理。先看 TR1,當(dāng)我們程序中寫TR1 = 1以后,定時器值就會每經(jīng)過一個機(jī)器周期加1,當(dāng)我們程序中寫TR1 = 0以后,定時器值就會保持不變化。TF1, 這個是一個標(biāo)志位,他的作用是告訴我們定時器溢出了。比如我們的定時器設(shè)置成16位的定時器,那么每經(jīng)過一個機(jī)器周期,TL1

13、加1一次,當(dāng)TL1加到 255后,再加1,TL1變成0,TH1會加1一次,如此一直加到TH1和TL1都是255(即TH1和TL1組成的16位整型數(shù)為65535)以后,再 加1一次,那么就會溢出,TH1和TL1同時都變?yōu)?,只要一溢出,TF1馬上自動變成1,告訴我們定時器溢出了,僅僅是提供給我們一個信號,讓我們知道 定時器溢出了,它不會對定時器是否繼續(xù)運(yùn)行產(chǎn)生任何影響。表5-5 TMOD-定時器方式控制寄存器的位分配(地址 89H)       不可位尋址;復(fù)位值:0x00;復(fù)位源:任何復(fù)位位7654321

14、0符號GATE(T1)C/T(T1)M1(T1)M0(T1)GATE(T0)C/T(T0)M1(T0)M0(T0)細(xì) 心的同學(xué)會發(fā)現(xiàn),TCON那個地方標(biāo)注的是“可位尋址”,TMOD這里標(biāo)注的是“不可位尋址”。這個地方的意思就是比如TCON有一位TR1,我們可以在 程序中直接進(jìn)行TR1 = 1;這樣操作。但是(T1)M1 = 1;這樣的操作就是錯誤的。我們要操作就必須一次操作一個字節(jié),就是必須一次性對 TMOD所有位操作,不能對其中某一位單獨(dú)進(jìn)行操作。表5-6 TMOD-定時器/計(jì)數(shù)器方式控制寄存器的位描述符號描述T1/T0在表5-5中,標(biāo)T1的

15、表示控制定時器1的位,標(biāo)T0的表示控制定時器0的位。GATE該位被置1時為門控位。僅當(dāng)INTx腳為高并且TRx控制位被置1時使能定時器x,定時器開始計(jì)時,當(dāng)該位被清0時,只要TRx位被置1,定時器x就使能開始計(jì)時,不受到單片機(jī)引腳INTx外部信號的干擾,常用來測量外部信號脈沖寬度。這是定時器一個額外功能,本節(jié)課暫不介紹。C/T定時器或計(jì)數(shù)器選擇位。該位被清零時用作定時器功能(內(nèi)部系統(tǒng)時鐘),被置1用作計(jì)數(shù)器功能。 表5-7 TMOD-定時器方式控制寄存器M1/M0工作模式M1M0工作模式描述000兼容8048單片機(jī)的13位定時器,THn的8位和TLn的5位組成一個13位定時

16、器011THn和TLn組成一個16位的定時器1028位自動重裝模式,定時器溢出后THn重裝到TLn中113禁用定時器1,定時器0變成2個8位定時器以上這4種模式的配置,其中模式0是為了兼容老的8048單片機(jī)而設(shè)的,現(xiàn)在的51幾乎不會用到這種模式,而模式3根據(jù)我的應(yīng)用經(jīng)驗(yàn),他的功能模式2完全可以取代,所以基本上也是不用,那么我們重點(diǎn)就學(xué)習(xí)模式1和模式2。模 式1就是THn和TLn組成了一個16位的定時器,取值范圍是0到65535,溢出后,只要不對THn和TLn重新賦值,則從0開始計(jì)數(shù)。模式2的功能是 自動裝載,就是TLn溢出后,TFn就直接置1了,并且THn的值直接賦給TLn,然后TLn從新賦值

17、的這個數(shù)字開始計(jì)數(shù)。這個功能可以用來產(chǎn)生串口的通 信波特率,我們講串口的時候要用到,本章節(jié)我們重點(diǎn)來學(xué)習(xí)模式1。為了加深大家理解這個定時器原理,我們來看一下他的模式1的電路示意圖5-1。圖5-1 定時器/計(jì)數(shù)器模式1示意圖我 帶著大家來分析一下這個示意圖,后邊如果手冊中遇到,大家也就會自己研究了。OSC框表示時鐘頻率,因?yàn)槲覀?個機(jī)器周期等于12個時鐘周期,所以那個d 就等于12。下邊GATA右邊的那個門是一個非門電路,再右側(cè)是一個或門,再往右是一個與門電路,大家可以對照一下5-1節(jié)的內(nèi)容。圖上可以看出來,下邊部分電路是控制了上邊部分,那我們先來看下邊是如何控制的,我們以定時器0為例

18、。1、TR0和下邊或門電路的結(jié)果要進(jìn)行與門運(yùn)算,TR0如果是0的話,與運(yùn)算完了肯定是0,所以確定如果要讓定時器工作,TR0 = 1。2、與門結(jié)果要想是1,那或門出來的信號必須也得是1才行。在GATE位為1的情況下,經(jīng)過一個非門變成0,或門電路結(jié)果要想是1的話,那INT0即P3.2引腳必須是1的情況下,這個時候定時器才會工作,而INT0引腳是0的情況下,定時器不工作,這就是GATE位的作用。3、當(dāng)GATE位為0的時候,經(jīng)過一個非門變成1,不管INT0引腳是什么電平,經(jīng)過或門電路后則肯定是1,定時器就會工作。4、要想讓定時器工作,就是加1,從圖上看有兩種方式,第一種方式是那個開

19、關(guān)打到上邊的箭頭,就是C/T = 0的時候,一個機(jī)器周期TL就會加1一次,當(dāng)開關(guān)打到下邊的箭頭,即C/T =1的時候,T0引腳即P3.4引腳來一個脈沖,TL就加1一次,這也就是計(jì)數(shù)器功能。INT0引腳是P3.2,INT1引腳是P3.3,T0引腳是P3.4,T1引腳是P3.5,這個可以從我們KST-51開發(fā)板原理圖上看出來。1.2.3 定時器程序應(yīng)用了解了定時器相關(guān)的寄存器,那么我們下面就來做一個定時器的程序,鞏固一下我們學(xué)到的內(nèi)容。我們這節(jié)課的程序先使用定時器0,在使用定時器的時候,需要以下幾個步驟:第一步:設(shè)置特殊功能寄存器TMOD,配置好工作模式;第

20、二步:設(shè)置計(jì)數(shù)寄存器TH0和TL0的初值;第三步:設(shè)置TCON,通過打開TR0位來讓定時器開始計(jì)數(shù)。第四步:判斷TCON寄存器的TF0位,監(jiān)測定時器溢出情況。寫 程序之前,我們要先來學(xué)會計(jì)算如何用定時器定時時間。我們的晶振是11.0592M,時鐘周期就是1/11059200,機(jī)器周期就是12 /11059200,我們假如要定時20ms,就是0.02秒,要經(jīng)過x個機(jī)器周期得到0.02秒,我們來算一下x*12/11059200=0.02, 得到x= 18432。那么我們現(xiàn)在16位的定時器溢出值是65536,我們可以這樣,先給TH0和TL0一個初值,讓他們經(jīng)過18432個機(jī)器周期后剛 好溢

21、出,溢出后我們可以通過檢測TF0位得知,就剛好是0.02秒。這個初值y = 65536 - 18432 = 47104,轉(zhuǎn)成16進(jìn)制就是 0xB800,那么就是TH0 = 0xB8,TL0 = 0x00。那0.02秒我們已經(jīng)定時出來了,細(xì)心的同學(xué)會發(fā)現(xiàn),我們?nèi)绻踔抵苯咏o一個0x0000,一直到65536溢出,定時器定時值最大也就是71ms左右,那么我們想定時更長時間怎么辦呢?用你小學(xué)學(xué)過的邏輯,倍數(shù)關(guān)系就可以解決此問題。那好了,我們下面就用程序來實(shí)現(xiàn)以下這個功能。#include<reg

22、52.h>               /包含寄存器的庫文件                   sbit  LED = P00;sbit  ADDR0 = P10;sbit

23、  ADDR1 = P11;sbit  ADDR2 = P12;sbit  ADDR3 = P13;sbit  ENLED = P14;void main()        unsigned char counter = 0;    ENLED = 

24、0; ADDR0 = 0; ADDR1 = 1;    ADDR2 = 1; ADDR3 = 1; LED = 1;  /74HC138和LED燈初始化部分    TMOD = 0x01;   /設(shè)置定時器0為模式1    TH0  = 0

25、xB8;    TL0  = 0x00;   /定時值初值    TR0  = 1;      /打開定時器0    while(1)            if(1 = TF0) 

26、;           /判斷定時器0是否溢出                    TF0 = 0;            TH0 =&#

27、160;0xB8;        /一旦溢出后,重新賦值            TL0 = 0x00;            counter+;         

28、0;  if(50 = counter) /判斷定時器0溢出是否達(dá)到50次                             counter = 0;  /counter清0,重新計(jì)數(shù)  

29、60;              LED = !LED;   /LED取反操作,0->1,1->0                         

30、                                          程序都有注釋,不難理解,這里要解釋一個地方,就是兩次if判斷,細(xì)心的同學(xué)會發(fā)現(xiàn),if(1

31、0;= TF0)這句,我把1寫前邊,這個地方我推薦新手按照我這樣來寫,因?yàn)槿绻覀儗慽f(TF0 = 1),作為新手來說,不小心丟掉一個=號后,寫成if(TF0 = 1),這樣實(shí)際上在語法上是可以通過的,我們用的Keil4還會出一個警告說明一下,Keil以前的版本以及一些其他軟件,可能根本不會出任何錯誤或者警告提示,但是這樣產(chǎn)生的Hex文件下載到單片機(jī)里邊,程序就錯了,大家可以改改試試看。本程序?qū)崿F(xiàn)的結(jié)果是我們板子上最右邊的小燈點(diǎn)亮持續(xù)一秒,熄滅持續(xù)一秒,也就是以0.5HZ的頻率進(jìn)行閃爍。1.3 數(shù)碼管學(xué)習(xí)小燈是一種簡單的LED,給我

32、們視覺效果只能通過亮和滅來表達(dá)簡單信息。而這節(jié)課我們要來學(xué)習(xí)一種表達(dá)更加明確的器件,數(shù)碼管。1.3.1 數(shù)碼管的基本介紹先給大家提供一張?jiān)韴D看一下,如圖5-1所示。圖5-2 數(shù)碼管原理圖這 是比較常見的數(shù)碼管的原理圖,我們板子上一共有6只數(shù)碼管。前邊有了LED小燈的學(xué)習(xí),數(shù)碼管學(xué)習(xí)就會輕松的多了。從圖5-1能看出來,數(shù)碼管共有 a,b,c,d,e,f,g,dp這8個段,而實(shí)際上,這8個段每一段都是一個LED小燈,所以數(shù)碼管就是由8個LED小燈所組成的。我們看一下數(shù)碼管內(nèi) 部結(jié)構(gòu)圖5-2。圖5-3 數(shù)碼管結(jié)構(gòu)圖數(shù) 碼管分為共陽數(shù)碼管和共陰數(shù)碼管,所謂的共陰數(shù)碼管就

33、是8只LED小燈的陰極是接在一起的,也就是陰極是公共端,由陽極來控制小燈是否亮滅。同理,共陽數(shù) 碼管就是陽極是接到一起的,大家可以仔細(xì)研究下圖5-2。細(xì)心的同學(xué)也會發(fā)現(xiàn),數(shù)碼管上邊有2個com,實(shí)際上就是我們數(shù)碼管的公共端。為什么有2個,我 個人認(rèn)為,一方面有2個可以起到對稱的效果,剛好是10個引腳,另外一個方面,公共端通過的電流較大,我們初中就學(xué)過,并聯(lián)電路電流之和等于總電流,用2 個com可以把公共電流平均到2個引腳上去,降低線路承受的電流。從我們板子的電路圖上能看出來,我們所用的數(shù)碼管是共陽數(shù)碼管,如圖5-3所示。圖5-4 共陽數(shù)碼管電路他 們的com是接到了正極上,當(dāng)然了,和

34、LED小燈電路類似,也是由74HC138控制了三極管的導(dǎo)通來控制整個數(shù)碼管的電流,我們先來看DS1這個數(shù)碼 管。原理圖上可以看出來,控制DS1的三極管是Q17,控制Q17的引腳是LEDS0,對應(yīng)到74HC138上邊就是Y0端的輸出。圖5-5 74HC138控制圖我 們現(xiàn)在的目的是讓LEDS0這個引腳輸出低電平,相信大家現(xiàn)在可以獨(dú)立根據(jù)前邊學(xué)到的內(nèi)容把ADDR0,ADDR1,ADDR2,ADDR3,ENLED 這4個輸入狀態(tài)寫出來,現(xiàn)在大家不要偷懶,都去根據(jù)138的手冊去寫一下,不需要你記住這些結(jié)論,但是遇到就寫一次,鍛煉過幾次后,遇到同類芯片自己就知 道如何去解決問題了。數(shù)碼管通常是

35、用來顯示數(shù)字的,我們板子上的6個數(shù)碼管,習(xí)慣上我們稱之為6位,那控制位選擇的就是74HC138了。而數(shù)碼管內(nèi)部的8個LED小燈我們稱之為數(shù)碼管的段,那么數(shù)碼管的段選擇(即該段的亮滅)是通過P0口控制,經(jīng)過74HC245驅(qū)動。1.3.2 數(shù)碼管的真值表數(shù) 碼管的8個段,我們直接當(dāng)成8個LED小燈來控制,那就是a、b、c、d、e、f、g、dp一共8個LED小燈。我們通過圖5-1可以輕而易舉的看出來, 如果我們點(diǎn)亮b和c這兩個LED小燈,也就是數(shù)碼管的b段和c段,其他的所有的段都熄滅的話,就可以讓數(shù)碼管DS1顯示一個數(shù)字1,那么這個時候?qū)嶋H上 P0的值的二進(jìn)制就是0b11111001,十六

36、進(jìn)制就是0xF9。也有可以自動生成數(shù)碼管段位碼的軟件可以從    #include<reg52.h>               /包含寄存器的庫文件                    

37、0;  sbit  ADDR0 = P10;    sbit  ADDR1 = P11;    sbit  ADDR2 = P12;    sbit  ADDR3 = P13;    sbit  ENLED = P14;

38、        void  main()            unsigned char j = 0;        unsigned int  i = 0;    &

39、#160;           ENLED = 0;        ADDR0 = 0;        ADDR1 = 0;         ADDR2 = 0;   &

40、#160;    ADDR3 = 1;           /74HC138開啟三極管Q17                   while(1)        

41、;     /程序死循環(huán)                       P0 = 0xF9;      /打開數(shù)碼管b和c段          

42、; 大家把這個程序編譯一下,下載到單片機(jī)里會發(fā)現(xiàn),最右側(cè)的數(shù)碼管成功顯示1這個數(shù)字。同樣的方法,我們可以把其他的數(shù)字都成功的在數(shù)碼管上顯示出來,而數(shù)碼管顯示的數(shù)字對應(yīng)給P0的賦值,我們叫做數(shù)碼管的真值表。我們來列一下我們這個電路圖的數(shù)碼管真值表,注意,這個真值表里顯示的數(shù)字都不帶小數(shù)點(diǎn)。表5-1 數(shù)碼管真值表數(shù)字01234567真值表0xC00xF90xA40xB00x990x920x820xF8數(shù)字89ABCDEF真值表0x800x900x880x830xC60xA10x860x8E大家可以把上邊那個數(shù)碼管顯示1的那個程序中的P0的賦值隨便修改成我們表5-1中的真值表里的

43、數(shù)字試試看,把數(shù)碼管顯示的數(shù)字顯示出來。1.3.3 數(shù)碼管的靜態(tài)顯示從第三課我們學(xué)習(xí)74HC138以后,我們了解到74HC138同時一次只能讓一個輸出口為低電平,也就是在一個時刻內(nèi),我們只能讓一個數(shù)碼管顯示,始終選通數(shù)碼管并且可以根據(jù)我們的P0總線的信號來改變這個數(shù)碼管的值,我們可以理解為數(shù)碼管的靜態(tài)顯示。數(shù)碼管靜態(tài)顯示是對應(yīng)動態(tài)顯示而言的,靜態(tài)顯示對于一兩個數(shù)碼管還行,多個數(shù)碼管,靜態(tài)顯示實(shí)現(xiàn)的意義就沒有了。這節(jié)課我們先用一個數(shù)碼管的靜態(tài)顯示來實(shí)現(xiàn)一個簡單的秒表,為下節(jié)課的動態(tài)顯示打下基礎(chǔ)。先 來介紹一個51單片機(jī)的關(guān)鍵字code。我們前邊課程定義變量的時候,一般用到unsigne

44、d char或者unsigned int這兩個關(guān)鍵字,這 樣定義的變量都是放在我們的單片機(jī)的RAM中,我們在程序中可以隨意去改變這個變量的值。但是還有一種常數(shù),我們在程序中要使用,但是卻不進(jìn)行對這個值的 改變,這種值我們可以加一個code關(guān)鍵字修飾一下,修飾完畢后,這個值就會存儲到我們的程序空間flash中,這樣可以大大節(jié)省我們單片機(jī)的RAM的使 用量,畢竟我們的RAM空間比較小,而程序空間是很大的。比如我們現(xiàn)在要使用的數(shù)碼管真值表,我們來看一下我們下邊的這個程序。#include<reg52.h>     &#

45、160;         /包含寄存器的庫文件                   sbit  LED = P00;sbit  ADDR0 = P10;sbit  ADDR1 = P11;sbit&#

46、160; ADDR2 = P12;sbit  ADDR3 = P13;sbit  ENLED = P14;unsigned char code LedChar = 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,    0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8e;     

47、0;            /用數(shù)組來存儲數(shù)碼管真值表,下一課詳細(xì)介紹數(shù)組void main()    unsigned char counter = 0;    unsigned char j = 0;    ENLED = 0; ADD

48、R0 = 0; ADDR1 = 0;     ADDR2 = 0; ADDR3 = 1; P0 = 0XFF;  /74HC138和P0初始化部分     TMOD = 0x01;                    /設(shè)置定時器0為模式1

49、0;    TH0  = 0xB8;    TL0  = 0x00;                   /定時值初值     TR0  = 1;                      /打開定時器0

50、60;   while(1)            if(1 = TF0)                 /判斷定時器0是否溢出                    TF0 = 0;            TH0 = 0xB8;        

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論