第10章 單片機及常用外圍設備接口電路_第1頁
第10章 單片機及常用外圍設備接口電路_第2頁
第10章 單片機及常用外圍設備接口電路_第3頁
第10章 單片機及常用外圍設備接口電路_第4頁
第10章 單片機及常用外圍設備接口電路_第5頁
已閱讀5頁,還剩93頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第第10章章 單片機與常用外圍設備接口電路單片機與常用外圍設備接口電路 10.1 LED發(fā)光二極管發(fā)光二極管 發(fā)光二極管是半導體二極管的一種,可以把電能轉化成光能;常簡寫為LED。發(fā)光二極管與普通二極管一樣是由一個PN結組成,也具有。當給發(fā)光二極管加上正向電壓后,從P區(qū)注入到N區(qū)的空穴和由N區(qū)注入到P區(qū)的電子,在PN結附近數微米內分別與N區(qū)的電子和P區(qū)的空穴復合,產生自發(fā)輻射的熒光。 不同的半導體材料中電子和空穴所處的。當電子和空穴復合時釋放出的能量多少不同,釋放出的能量越多,則發(fā)出的光的波長越短。常用的是發(fā)紅光、綠光或黃光的二極管。發(fā)光二極管的外形如圖10-1所示。 發(fā)光二極管的反向擊穿電壓

2、約5伏。它的正向伏安特性曲線很陡,使用時必須串聯(lián)限流電阻以控制通過管子的電流。限流電阻R可用下式計算: 式中E為電源電壓,UF為LED的正向壓降,IF為LED的一般工作電流。1講10.1.1 物理特性 發(fā)光二極管的兩根引線中較長的一根為正極,應接電源正極。有的發(fā)光二極管的兩根引線一樣長,但管殼上有一凸起的小舌,靠近小舌的引線是正極。 發(fā)光二極管與小白熾燈泡和氖燈相比,發(fā)光二極管的特點是:工作電壓很低(有的僅一點幾伏);工作電流很小(有的僅零點幾毫安即可發(fā)光);抗沖擊和抗震性能好,可靠性高,壽命長;通過調制通過的電流強弱可以方便地調制發(fā)光的強弱。由于有這些特點,發(fā)光二極管在一些光電控制設備中用作

3、光源,在許多電子設備中用作信號顯示器。把它的管心做成條狀,用7條條狀的發(fā)光管組成7段式半導體數碼管,每個數碼管可顯示09十個數目字。多種顏色的發(fā)光二極管如圖10-2所示。10.1.2 發(fā)光原理 50年前人們已經了解半導體材料可產生光線的基本知識,。LED是英文light emitting diode(發(fā)光二極管)的縮寫,它的基本結構是一塊電致發(fā)光的半導體材料,置于一個有引線的架子上,然后四周用環(huán)氧樹脂密封,起到保護內部芯線的作用,所以LED的抗震性能好。 發(fā)光二極管的核心部分是由P型半導體和N型半導體組成的晶片,在P型半導體和N型半導體之間有一個過渡層,稱為。在某些半導體材料的PN結中,注入的

4、少數載流子與多數載流子復合時會把多余的能量以光的形式釋放出來,從而把電能直接轉換為光能。 PN結加反向電壓,少數載流子難以注入,故不發(fā)光。這種利用注入式電致發(fā)光原理制作的二極管叫發(fā)光二極管,通稱LED。 當它處于正向工作狀態(tài)時(即兩端加上正向電壓),電流從LED陽極流向陰極時,半導體晶體就發(fā)出從紫外到紅外不同顏色的光線,光的強弱與電流有關。10.1.3 分類 發(fā)光二極管還可分為普通單色發(fā)光二極管、高亮度發(fā)光二極管、超高亮度發(fā)光二極管、變色發(fā)光二極管、閃爍發(fā)光二極管、電壓控制型發(fā)光二極管、紅外發(fā)光二極管和負阻發(fā)光二極管等。10.1.4 LED光源的特點 1. 電壓 LED使用低壓電源,供電電壓在

5、6-24V之間,根據產品不同而異,所以它是一個比使用高壓電源更安全的電源,特別適用于公共場所。 2. 效能 消耗能量較同光效的白熾燈減少80% 3. 適用性 體積很小,每個單元LED小片是3-5mm2的正方形,所以可以制備成各種形狀的器件,并且適合于易變的環(huán)境的發(fā)光二極管 4. 穩(wěn)定性 10萬小時,光衰為初始的50% 5. 響應時間 其白熾燈的響應時間為毫秒級,LED燈的響應時間為納秒級 6. 對環(huán)境污染 無有害金屬汞 7. 顏色 發(fā)光二極管方便地通過化學修飾方法,調整材料的能帶結構和禁帶寬度,實現(xiàn)紅黃綠藍橙多色發(fā)光。紅光管工作電壓較小,顏色不同的紅、橙、黃、綠、藍的發(fā)光二極管的工作電壓依次升

6、高。 8. 價格 LED的價格現(xiàn)在越來越平民化,因LED省電的特性,也許不久的將來,人們都會的把白熾燈換成LED燈?,F(xiàn)在,我國部分城市公路、學校、廠區(qū)等場所已換裝萬LED路燈、節(jié)能燈等。10.1.5 LED光參數介紹 LED的光學參數中重要的幾個方面就是:光通量、發(fā)光效率、發(fā)光強度、光強分布、波長。 。發(fā)光效率就是光通量與電功率之比。發(fā)光效率表征了光源的節(jié)能特性,這是衡量現(xiàn)代光源性能的一個重要指標。 。LED發(fā)光強度是表征它在某個方向上的發(fā)光強弱,由于LED在不同的空間角度光強相差很多,隨之而來我們研究了LED的光強分布特性。這個參數實際意義很大,直接影響到LED顯示裝置的最小觀察角度。比如體

7、育場館的LED大型彩色顯示屏,如果選用的LED單管分布范圍很窄,那么面對顯示屏處于較大角度的觀眾將看到失真的圖像。而且交通標志燈也要求較大范圍的人能識別。 。對于LED的光譜特性我們主要看它的單色性是否優(yōu)良,而且要注意到紅、黃、藍、綠、白色LED等主要的顏色是否純正。因為在許多場合下,比如交通信號燈對顏色就要求比較嚴格,現(xiàn)在我國的一些LED信號燈中綠色的為深綠,紅色的為深紅,從這個現(xiàn)象來看我們對LED的光譜特性進行專門研究是非常必要而且很有意義的。10.1.6 發(fā)光二極管的檢測 1. 普通發(fā)光二極管的檢測(1)。利用具有10k擋的指針式萬用表可以大致判斷發(fā)光二極管的好壞。正常時,二極管正向電阻

8、阻值為幾十至200k,反向電阻的值為。如果正向電阻值為0或為,反向電阻值很小或為0,則已損壞。這種檢測方法,不能實質地看到發(fā)光管的發(fā)光情況,因為10k擋不能向LED提供較大正向電流。 如果有兩塊指針萬用表(最好同型號)可以較好地檢查發(fā)光二極管的發(fā)光情況。用一根導線將其中一塊萬用表的“+”接線柱與另一塊表的“-”接線柱連接。余下的“-”筆接被測發(fā)光管的正極(P區(qū)),余下的“+”筆接被測發(fā)光管的負極(N區(qū))。兩塊萬用表均置10k擋。正常情況下,接通后就能正常發(fā)光。若亮度很低,甚至不發(fā)光,可將兩塊萬用表均撥至1兆若,若仍很暗,甚至不發(fā)光,則說明該發(fā)光二極管性能不良或損壞。應注意,不能一開始測量就將兩

9、塊萬用表置于1m,以免電流過大,損壞發(fā)光二極管。 (2)。用3V穩(wěn)壓源或兩節(jié)串聯(lián)的干電池及萬用表(指針式或數字式皆可)可以較準確測量發(fā)光二極管的光、電特性。 如果測得VF在1.43V之間,且發(fā)光亮度正常,可以說明發(fā)光正常。如果測得VF=0或VF3V,且不發(fā)光,說明發(fā)光管已壞。 2. 紅外發(fā)光二極管的檢測 由于紅外發(fā)光二極管,它發(fā)射13m的紅外光,眼看不到。通常單只紅外發(fā)光二極管發(fā)射功率只有數mW,不同型號的紅外LED發(fā)光強度也不相同。紅外LED的正向壓降一般為1.32.5V。正由于其發(fā)射的紅外光人眼看不見,所以利用上述可見光LED的檢測法只能判定其PN結正、反向電學特性是否正常,而無法判定其發(fā)

10、光情況正常否。為此,最好準備一只(如2CR、2DR型硅光電池)作接收器。用萬用表測光電池兩端電壓的變化情況。來判斷紅外LED加上適當正向電流后是否發(fā)射紅外光。10.1.7 發(fā)光二極管發(fā)光二極管LED與單片機的應用與單片機的應用 例10-1 如圖10-3所示,單片機的P0口經74LS373鎖存器和發(fā)光二極管D1-D8連接,D1-D8的正極經過R1-R8限流電阻接+5V電壓,P0口因為沒有上拉電阻,所以要外加RP1排阻。編程實現(xiàn)LED發(fā)光二極管流水燈閃爍效果。 程序如下: #include #include void delay(unsigned char tmp);/延時子函數 unsigned

11、 chartmpled50=0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80,0X81,0X82,0X84,0X88,0X90,0XA0,0XC0,0XC1,0XC2,0XC4,0XC8,0XD0,0XE0,0XE1,0XE2,0XE4,0XE8,0XF0,0XF1,0XF2,0XF4,0XF8,0XF9,0XFA,0XFC,0XFD,0XFE,0XFF,0XFF,0X00,0XFF,0X00;/定義數組常量,前面加code表示常量在程序代碼中存放,/不占用RAM。該數組為發(fā)光二極管的輸出數據void main(void) /入口函數unsigned char i

12、;/定義變量while(1) /無限循環(huán) for(i=0;i50;i+)/連續(xù)輸出50個數據 P0=tmpledi; /這個符號是取反,因發(fā)光二極管采用共陽極,所以將數據取反再輸出delay(50); /調用延時子函數,改變參數大小,調整變化速度void delay(unsigned char tmp)/延時子函數unsigned char i,j;i=tmp;while(i) i-;j=255;while(j) j-; 10.2 數碼管數碼管 數碼管按段數分為七段數碼管和八段數碼管,八段數碼管比七段數碼管多一個發(fā)光二極管單元(多一個小數點顯示);按能顯示多少個“8”可分為1位、2位、4位等數

13、碼管。常用的LED顯示器有LED狀態(tài)顯示器(俗稱發(fā)光二極管)、LED七段顯示器(俗稱數碼管)和LED十六段顯示器。 發(fā)光二極管可顯示兩種狀態(tài),用于系統(tǒng)狀態(tài)顯示;數碼管用于數字顯示;LED十六段顯示器用于字符顯示。10.2.1 數碼管簡介 1. 數碼管結構數碼管結構如圖10-4所示。 數碼管由8個發(fā)光二極管(以下簡稱字段)構成,通過不同的組合可用來顯示數字0-9、字符A -F、H、L、P、R、U、Y、符號“”及小數點“”。 數碼管又分為共陰極和共陽極兩種結構。 LED數碼管分類:1)按其內部結構可分為共陰型和共陽型;2)按其外形尺寸有多種形式,使用較多的是0.5和0.8;3)按顯示顏色也有多種形

14、式,主要有紅色和綠色;4)按亮度強弱可分為超亮、高亮和普亮。5)正向壓降一般為1.52V,額定電流為10mA,最大電流為40mA。 共陽極數碼管的8個發(fā)光二極管的陽極(二極管正端)連接在一起。通常,公共陽極接高電平(一般接電源),其它管腳接段驅動電路輸出端。當某段驅動電路的輸出端為低電平時,則該端所連接的字段導通并點亮。根據發(fā)光字段的不同組合可顯示出各種數字或字符。此時,要求段驅動電路能吸收額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。 共陰極數碼管的8個發(fā)光二極管的陰極(二極管負端)連接在一起。通常,公共陰極接低電平(一般接地),其它管腳接段驅動電路輸出端。當某段驅

15、動電路的輸出端為高電平時,則該端所連接的字段導通并點亮,根據發(fā)光字段的不同組合可顯示出各種數字或字符。此時, 要求段驅動電路能提供額定的段導通電流,還需根據外接電源及額定段導通電流來確定相應的限流電阻。 3. 數碼管字形編碼()要使數碼管顯示出相應的數字或字符,必須使段數據口輸出相應的字形編碼。字型碼各位定義為:數據線D0與a字段對應,D1與b字段對應,依此類推。 如使用共陽極數碼管,數據為0表示對應字段亮,數據為1表示對應字段暗;如使用共陰極數碼管,數據為0表示對應字段暗,數據為1表示對應字段亮。如要顯示“0”,共陽極數碼管的字型編碼應為:11000000B(即C0H);共陰極數碼管的字型編

16、碼應為:00111111B(即3FH)。依此類推。數碼管字形編碼表如表10-1所示。10.2.2 驅動方式 數碼管要正常顯示,就要用驅動電路來驅動數碼管的各個段碼,從而顯示出我們要的數字,因此根據數碼管的驅動方式的不同,可以分為和兩類。 是指數碼管顯示某一字符時,相應的發(fā)光二極管恒定導通或恒定截止。這種顯示方式的各位數碼管相互獨立,公共端恒定接地(共陰極)或接正電源(共陽極)。每個數碼管的8個字段分別與一個8位I/O口地址相連,I/O口只要有段碼輸出,相應字符即顯示出來,并保持不變,直到I/O口輸出新的段碼。采用靜態(tài)顯示方式,較小的電流即可獲得較高的亮度,且占用CPU時間少,編程簡單,顯示便于

17、監(jiān)測和控制,但其占用的口線多,硬件電路復雜,成本高,只適合于顯示位數較少的場合。 是一位一位地輪流點亮各位數碼管,這種逐位點亮顯示器的方式稱為位掃描。通常,各位數碼管的段選線相應并聯(lián)在一起,由一個8位的I/O口控制;各位的位選線(公共陰極或陽極)由另外的I/O口線控制。動態(tài)方式顯示時,各數碼管分時輪流選通,要使其穩(wěn)定顯示,必須采用掃描方式,即在某一時刻只選通一位數碼管,并送出相應的段碼,在另一時刻選通另一位數碼管,并送出相應的段碼。依此規(guī)律循環(huán),即可使各位數碼管顯示將要顯示的字符。 雖然這些字符是在不同的時刻分別顯示,但由于人眼存在,只要每位顯示間隔足夠短就可以給人以同時顯示的感覺。 采用動態(tài)

18、顯示方式比較節(jié)省I/O口,硬件電路也較靜態(tài)顯示方式簡單,但其亮度不如靜態(tài)顯示方式,而且在顯示位數較多時,CPU要依次掃描,占用CPU較多的時間。10.2.3 常見問題常見問題 1、顯示效果 由于發(fā)光二極管基本上屬于電流敏感器件,其正向壓降的分散性很大, 并且還與溫度有關,為了保證數碼管具有良好的亮度均勻度,就需要使其具有恒定的工作電流,且不能受溫度及其它因素的影響。另外,當溫度變化時驅動芯片還要能夠自動調節(jié)輸出電流的大小以實現(xiàn)色差平衡溫度補償。 2、安全性 即使是短時間的電流過載也可能對發(fā)光管造成永久性的損壞,采用恒流驅動電路后可防止 由于電流故障所引起的數碼管的大面積損壞。另外,我們所采用的

19、超大規(guī)模集成電路還 具有級聯(lián)延時開關特性,可防止反向尖峰電壓對發(fā)光二極管的損害。超大規(guī)模集成電路還具有熱保護功能,當任何一片的溫度超過一定值時可自動關斷,并且可在控制室內看到故障顯示。1、使用三極管目的是放大電流2、三極管三腳順序ebc(三極管平的一面向自己時的順序),3、NPN(箭頭向出):腳e接數碼管的公共腳,腳c接+5V電源,腳b接P1.7;4、數碼管的腳abcdefgh并不是按一定的順序排列的,要用萬用表進行測量,看那段發(fā)亮;5、PNP(箭頭向入);6、電解電容長為正|-符號,短(灰白色)為負(-符號 關于亮度一致性的問題是一個行業(yè)內的常見問題。 有二個大的因素影響到亮度一致性。一是使

20、用原材料芯片的選取,一是使用數碼管時采取的控制方式。 1、原材料-芯片的UF和亮度和波長是一個,即使篩選過芯片,UF和亮度和波長已在一個很小的范圍了,生產出來的產品還是在一個范圍內,結果就是亮度不一致。 2、要保證數碼管亮度一樣,在控制方式選取上也有差別。最好的辦法是恒流控制,流過每一個發(fā)光二極管的電流都是相同的,這樣發(fā)光二極管看起來亮度就是一樣的了。如恒壓控制,則導致UF不相同的發(fā)光二極管分到的電流不相同,所以亮度也不同。當然以上二個條件是相輔相成的。 找公共共陰和公共共陽:首先,我們找個電源(3到5伏)和1個1K(幾百歐的也行)的電阻,Vcc串接一個電阻后和GND接在任意2個腳上,組合有很

21、多,但總有一個LED會發(fā)光的,找到一個就夠了,然后GND不動,Vcc(串電阻)逐個碰剩下的腳,如果有多個LED(一般是8個),那它就是共陰的了。相反用Vcc不動,GND逐個碰剩下的腳,如果有多個LED(一般是8個),那它就是共陽的。也可以直接用數字萬用表,紅表筆是電源的正極,黑表筆是電源的負極。10.2.4 10.2.4 數碼管與單片機的應用數碼管與單片機的應用 例10-2 如圖10-5所示,單片機的P2口接數碼管的字形口,P1.0-P1.2接譯碼器74LS138的A-C實現(xiàn)片選Y0-Y7,E1、E2、E3為使能端,E2=E3=0(4腳、5腳接低電平),E1=1(6腳接高電平),74LS138

22、被選通工作。數碼管的字位口接74LS128的Y0-Y7,因為Y0-Y7是低電平(即0)表示選中,所以數碼管應該采用共陰管。要求:在數碼管上動態(tài)顯示24C02。 1)采用74LS138譯碼器為中間器件,采用減少P口的使用,只用了P1.0-P1.2則可實現(xiàn)8個數碼管字位的控制;2)在實際硬件制作過程中,由于采用共陰管,靠P2口提供的電流令數碼管發(fā)光,存在電流拉動不夠,管不夠亮的情況;可以在74LS138后再加74LS240芯片,再把共陰管改為共陽管則可(記得程序代碼也要做相應調整)。市面上現(xiàn)在也很少八為一體數碼管,可以用2個四為一體的代替。在P2口和數碼管之間增加74LS373鎖存器(或者74HC

23、573鎖存器)3)74LS240是八反相緩沖器/線驅動器。也就是一片芯片上,有八路(個)反相緩沖器/線驅動器。反相的意思是當輸入是高電平,輸出就是低電平,當輸入是低電平,輸出就是高電平。緩沖器,因為芯片有三態(tài)門,數據可在用時打開三態(tài)門,驅動能力強,可用于總線上驅動用。 4)四位一體數碼管有12個腳,有4個公共端,8個字型端。萬用表選X10電阻擋,紅筆出來“負”,黑筆出來“正”。 思考:有沒有譯碼器是高電平輸出有效,若有則不需要用74LS240,硬件電路更加簡單。圖圖10-5 單片機與數碼管的連接單片機與數碼管的連接/*數碼管的顯示*/#include #include void display

24、(unsigned char *lp,unsigned char lc); /數字的顯示函數;lp為指向數組的地址,lc為顯示的個數void displaystr(unsigned char *lp,unsigned char lc); /字符的顯示函數,同上void delay(); /延時子函數,5個空指令code unsigned char table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x40,0 x00;/共陰數碼管 0-9 , , 全滅unsigned char l_tmpdate8=0,1,2

25、,3,4,5,6,7;/定義數組變量,并賦值0,12,3,4,5,6,7,就是本程序要顯示的八個數code unsigned char l_24C025=0 x5b,0 x66,0 x39,0 x3f,0 x5b;/24C02 /定義數組常量,前面加code表示常量在程序代碼中存放,ROM /不占用RAM,在數碼管上顯示24C02void main(void) unsigned char i=0;while(1) display(l_tmpdate,8);/用數字顯示函數顯示八個數字 /displaystr(l_24C02,5);/或者用這個函數顯示5個字符void display(unsig

26、ned char *lp,unsigned char lc) /顯示 unsigned char i;/定義變量 P2=0;/端口2為輸出 P1=P1&0 xF8; /將P1口的前3位輸出0,對應74LS138譯門輸入腳,全0為第一位數碼管 for(i=0;ilc;i+) /循環(huán)顯示 P2=tablelpi; /查表法得到要顯示數字的數碼段 delay( ); /延時5個空指令 if(i=7) /檢測顯示完8位否,完成直接退出,不讓P1口再加1,否則進位影響到第四位數據 break; P2=0;/清0端口,準備顯示下位 P1+;/下一位數碼管void displaystr(unsign

27、ed char *lp,unsigned char lc)/顯示unsigned char i;P2=0;P1=P1&0 xF8;for(i=0;ilc;i+) P2=lpi;/本函數跟上面函數一樣,不同的是它不用查表, /直接輸出顯示已設定好的數值到數碼段 delay(); if(i=7) break; P2=0; P1+;void delay(void) /空5個指令_nop_();_nop_();_nop_();_nop_();_nop_();10.3 點陣點陣 為集中反映晶體結構的周期性而引入的一個概念。首先考慮一張二維周期性結構的圖像??稍趫D上任選一點 O作為原點。在圖上就可

28、以找到一系列與O點環(huán)境完全相同的點子,這一組無限多的點子就構成了。將圖像作一平移,對應于從原點O移至點陣的任意位置,圖像仍然不變。這種不變性表明點陣反映了原結構的平移對稱性。上述的考慮顯然可以推廣到具有三維周期性結構的無限大晶體。應該指出,原點位置可以任意選,但得到的點陣卻是等同的。 點陣平移矢量L總可以選用三個非共面的基矢A1、A2及A3的組合來表示:L=mA1+nA2+pA3,這里的m、n、p為三個整數。A1、A2與A3所構成的平行六面體,稱為晶胞或初基晶胞,它包含了晶體結構的基本重復單元。 值得注意:基矢與晶胞的選擇都不是唯一的,存在無限多種選擇方案。一個初基晶胞是晶體結構的最小單元。但

29、是有時為了能更充分地反映出點陣的對稱性,也可選用稍大一些的非初基晶胞(即晶胞中包含一個以上的陣點)。2講 一個點陣可以還原為一系列平行的陣點行列(簡稱陣列),或一系列的平行的陣點平面(簡稱陣面)??捎糜梢唤M基矢所確定的坐標系來描述某一組特定的陣列或陣面族的取向。 我們選取通過原點的陣列上任意陣點的三個坐標分量,約化為互質的整數u、v、w作為陣列方向的指標,可用符號【uvw】來表示。為了標志某一特定陣面族的方向,可選擇最靠近(但不通過)原點的陣面,讀取它在三個坐標軸上截距的倒數,將這三個數約化為互質的數h、k、l就得該陣面旋的方向指標,可用符號(hkl)來表示。這就是陣面族的密勒指數。點陣外形圖

30、如圖10-6所示,點陣電路結構圖圖10-7所示。 圖圖10-6 點陣外形圖點陣外形圖 圖圖10-6 點陣外形圖點陣外形圖 圖圖10-7 點陣結構圖點陣結構圖 例10-3 如圖10-8所示,點陣8*8的行X0-X7接單片機P2.0-P2.7,列L0-L7接P3.0-P3.7,實現(xiàn)行列掃描。 單片機的P1.0接按鍵,初始狀態(tài)點陣顯示數碼“0”,每按一下按鍵,數碼管則加1顯示,到數碼“9”,再按則變回“0”,即0-9循環(huán)。 圖圖10-8 單片機和點陣的連接單片機和點陣的連接程序如下:#include #define hang P2 /*定義行的IO口*/#define lie P3 /*定義列的IO

31、口*/sbit an = P10; /定義按鍵char shu=0 ; /定義一個變量記下當前的數字unsigned char code tab =0 x00,0 x7E,0 xFF,0 xC3,0 xC3,0 xFF,0 x7E,0 x00, /字符00 x00,0 x00,0 x43,0 xFF,0 xFF,0 x03,0 x00,0 x00, /字符10 x00,0 x63,0 xC7,0 xCF,0 xDB,0 xF3,0 x63,0 x00, /字符20 x00,0 x42,0 xDB,0 xDB,0 xDB,0 xFF,0 x66,0 x00, /字符30 x00,0 x3E,0

32、x46,0 xFF,0 xFF,0 x06,0 x06,0 x00, /字符40 x00,0 xF6,0 xF7,0 xD3,0 xD3,0 xDF,0 xDE,0 x00, /字符50 x00,0 x7E,0 xFF,0 xDB,0 xDB,0 xDF,0 x4E,0 x00, /字符60 x00,0 xC0,0 xC0,0 xC7,0 xFF,0 xF8,0 xC0,0 x00, /字符70 x00,0 xFF,0 xFF,0 xDB,0 xDB,0 xFF,0 xFF,0 x00, /字符80 x00,0 x72,0 xFB,0 xDB,0 xDB,0 xFF,0 x7E,0 x00,

33、/字符9 ;void delay(unsigned int a)/延時子函數 while(a-);/*8x8點陣子函數,顯示數字子函數*/void draw_8x8(char tu) /定義一個名為tu的數組,形參用數組 char n; /變量標記掃描的次數 for(n=0;n8;n+) hang=1n; /選行 /hang=1=00000001B0,向左邊移動0位,就是說首次不用移動 /P2.0=1,有效,選中首行,即第0行; lie=tun; /送出8個列的狀態(tài),即顯示tu0。 delay(50); void qudoudong()/按鍵去抖動子函數 char a=10; while(a-

34、) draw_8x8(&tabshu*8);/去抖動時顯示當前數字void main() unsigned int n=0;/按鍵超時變量 while(1) draw_8x8(&tabshu*8); /顯示數字 /實參用指針變量;&tabshu*8是變量tabshu*8的地址;&是取地址運算符 /設shu=1,則darw_8x8(&tab1*8)=darw_8x8(&tab8),意思是指向tab8, /從第9個內容開始抽數,一抽抽8個,這樣送列才會顯示1; an=1;/按鍵沒有按下則為1;(按鍵首狀態(tài)) if(an=0)/有按下 qudoudon

35、g();/去抖動; if(an=0)/真的按下了鍵(再判) while(an=0) /等手放開,放手則不能進入這個循環(huán)體,因為an=1; draw_8x8(&tabshu*8);/顯示數字 n+; if(n=100) /n起到判斷作用,按的時間長了,就break,轉到去做顯示 break; /如果按鍵超時則退出 n=0;/回復按鍵超時變量為0 shu+; if(shu=10) /如果數字超過了9 shu=0; /回復為0 an=1; 例10-4 如圖10-9所示,在16*16點陣上循環(huán)顯示“單片機點陣實驗!”字樣。初始點陣屏幕顯示“單”字,向左移動。按下按鍵,則字樣向右移動。 圖10-

36、9 點陣16*16#include #include #include /*字模*/unsigned char code zdan32= /單0 x10,0 x10,0 x08,0 x20,0 x04,0 x48,0 x3f,0 xfc,0 x21,0 x08,0 x21,0 x08,0 x3f,0 xf8,0 x21,0 x08,0 x21,0 x08,0 x3f,0 xf8,0 x21,0 x00,0 x01,0 x04,0 xff,0 xfe,0 x01,0 x00,0 x01,0 x00,0 x01,0 x00;unsigned char code zpian32= /片0 x00,0

37、 x80,0 x20,0 x80,0 x20,0 x80,0 x20,0 x80,0 x20,0 x84,0 x3f,0 xfe,0 x20,0 x00,0 x20,0 x00,0 x3f,0 xc0,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x40,0 x40,0 x80,0 x40;unsigned char code zji32= /機0 x10,0 x00,0 x10,0 x10,0 x11,0 xf8,0 x11,0 x10,0 xfd,0 x10,0 x11,0 x10,0 x31,0 x10,0 x

38、39,0 x10,0 x55,0 x10,0 x51,0 x10,0 x91,0 x10,0 x11,0 x10,0 x11,0 x12,0 x12,0 x12,0 x14,0 x0e,0 x18,0 x00;unsigned char code zdian32= /點0 x02,0 x00,0 x02,0 x00,0 x02,0 x08,0 x03,0 xfc,0 x02,0 x00,0 x02,0 x10,0 x3f,0 xf8,0 x20,0 x10,0 x20,0 x10,0 x20,0 x10,0 x3f,0 xf0,0 x00,0 x00,0 x29,0 x10,0 x24,0 x

39、c8,0 x44,0 x44,0 x80,0 x04;unsigned char code zzhen32= /陣0 x00,0 x80,0 x78,0 x84,0 x4f,0 xfe,0 x50,0 x80,0 x50,0 xa0,0 x61,0 x20,0 x51,0 x28,0 x4b,0 xfc,0 x48,0 x20,0 x48,0 x20,0 x68,0 x24,0 x57,0 xfe,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20,0 x40,0 x20;unsigned char code zshi32= /實0 x02,0 x00,0 x01,0 x0

40、0,0 x7f,0 xfe,0 x48,0 x02,0 x86,0 x84,0 x02,0 x80,0 x10,0 x80,0 x0c,0 x80,0 x04,0 x84,0 xff,0 xfe,0 x01,0 x00,0 x01,0 x40,0 x02,0 x20,0 x04,0 x10,0 x18,0 x0c,0 x60,0 x04;unsigned char code zyan32= /驗0 x08,0 x40,0 xfc,0 x40,0 x08,0 xa0,0 x48,0 xa0,0 x49,0 x10,0 x4a,0 x0e,0 x4d,0 xf4,0 x48,0 x00,0 x7c

41、,0 x48,0 x06,0 x48,0 x05,0 x48,0 x1d,0 x50,0 xe5,0 x10,0 x44,0 x24,0 x17,0 xfe,0 x08,0 x00;unsigned char code ztanhao32= /!0 x00,0 x00,0 x01,0 x80,0 x03,0 xc0,0 x03,0 xc0,0 x03,0 xc0,0 x01,0 x80,0 x01,0 x80,0 x01,0 x80,0 x01,0 x80,0 x01,0 x80,0 x00,0 x00,0 x00,0 x00,0 x01,0 x80,0 x01,0 x80,0 x00,0 x

42、00,0 x00,0 x00;unsigned char *z_q=zdan,zpian,zji,zdian,zzhen,zshi,zyan,ztanhao,0; /要顯示的字/定義了*z_q指針指向數組,只是它的每一個數組元素又是一個數組(二維數組)unsigned char TU32; /要顯示的畫面sbit A_A =P11 ; /移動sbit P21 =P21 ;sbit P22 =P22 ;sbit P23 =P23 ;sbit P24 =P24 ;#define P00P0#define ZUO(a) P00=a;P24=0;P24=1#define YOU(a) P00=a;P2

43、1=0;P21=1#define SHANG(a) P00=a;P22=0;P22=1#define XIA(a) P00=a;P23=0;P23=1extern void xianshiyanshi(unsigned int n); /顯示延時子程序extern void chuqitu(void); /初始圖第一個字單extern void dian1616(unsigned char ZZ); /顯示畫圖子程序extern void DELAY(unsigned int a); /延時子函數 void DELAY(unsigned int a) /延時子函數a最大為十進制65535 wh

44、ile(a-) ; void dian1616(unsigned char ZZ)/顯示畫圖子程序 unsigned char a,b; /a放行號,b放字在數組的序號 b=0;XIA(0 x00);/不送出下半部分 for(a=0 x01;a!=0;a=(a1)/上半個字 DELAY(2) ; /延時一小段時間為看清楚 ZUO(ZZb); b+ ; YOU(ZZb); /送出右 b+ ; SHANG(a) ;/送出行號 DELAY(30) ;/延時一小段時間為了字型顯示更清楚 ZUO(0) ; /消影 YOU(0); SHANG(0 x00);/不送出上半部分 for(a=0 x01;a!=

45、0;a=(a1)/下半個字 DELAY(2) ;/延時一小段時間為看清楚 ZUO(ZZb) ; b+ ; YOU(ZZb); /送出右 b+ ; XIA(a); /送出行號 DELAY(30) ;/延時一小段時間為了字型顯示更清楚 ZUO(0) ; /消影 YOU(0); void chuqitu(void)/初始圖為第一個字單 char n; for(n=0;n32;n+) TUn=z_q0n; /二維數組 void xianshiyanshi(unsigned int n)/顯示延時 while(n-) dian1616(TU);/顯示畫圖子程序void zychulimain(void)

46、/左右處理子程序 unsigned char hao=0; /記第一序號 idata unsigned char haox=1; /記下一個序號 unsigned char n=0; /當前的處理的地方unsigned char n_n=0; /移動后的地方標記 haox=1; while(1) n_n+; if(n_n=16) n_n=0; haox+; if(z_qhaox=0) /如下一個序號為最后復位為0 haox=0; hao+; if(z_qhao=0) /如下第一序號為最后復位為0 hao=0; for(n=0;n16;n+)/左右處理 A_A=1; if(A_A=1)/沒有按下

47、則左移 TU2*n7)&1); TU2*n+1=1;/右半處理 if(n_n(7-n_n)&0 x01); else TU2*n+1|=(z_qhaox2*n+1(15-n_n)&0 x01); else/有按下右移 TU2*n+1=1;/右半處理 TU2*n+1|=(TU2*n=1;/左半處理 if(n_n8) TU2*n|=(z_qhaox2*n+1(7-n_n)&0 x80); else TU2*n|=(z_qhaox2*n(15-n_n)&0 x80); xianshiyanshi(15);/顯示延時 main( ) /主程序 chuqitu()

48、; /初始圖為第一個字單while(1) zychulimain() ;/左右處理子程序 10.4 鍵盤接口原理鍵盤接口原理10.4.1 按鍵的分類 按鍵按照結構原理可分為兩類,一類是觸點式開關按鍵,如機械式開關、導電橡膠式開關等;另一類是無觸點式開關按鍵,如電氣式按鍵,磁感應按鍵等。前者造價低,后者壽命長。目前,微機系統(tǒng)中最常見的是觸點式開關按鍵。 10.4.2 輸入原理 在單片機應用系統(tǒng)中,除了復位按鍵有專門的復位電路及專一的復位功能外,其它按鍵都是以開關狀態(tài)來設置控制功能或輸入數據的。當所設置的功能鍵或數字鍵按下時,計算機應用系統(tǒng)應完成該按鍵所設定的功能,鍵信息輸入是與軟件結構密切相關的

49、過程。 對于一組鍵或一個鍵盤,總有一個接口電路與CPU相連。CPU可以采用查詢或中斷方式了解有無將鍵輸入,并檢查是3講 哪一個鍵按下,將該鍵號送入累加器ACC,然后通過跳轉指令轉入執(zhí)行該鍵的功能程序,執(zhí)行完后再返回主程序10.4.3按鍵結構與特點 微機鍵盤通常使用,其主要功能是把機械上的通斷轉換成為電氣上的邏輯關系。也就是說,它能提供標準的TTL邏輯電平,以便與通用數字系統(tǒng)的邏輯電平相容。機械式按鍵再按下或釋放時,由于機械彈性作用的影響,通常伴隨有一定時間的,然后其觸點才穩(wěn)定下來。其抖動過程如下圖所示,抖動時間的長短與開關的機械特性有關,一般為510 ms。在觸點抖動期間檢測按鍵的通與斷狀態(tài),

50、可能導致判斷出錯,即按鍵一次按下或釋放被錯誤地認為是多次操作,這種情況是不允許出現(xiàn)的。為了克服按鍵觸點機械抖動所致的檢測誤判,必須采取去抖動措施。這一點可從硬件、軟件兩方面予以考慮。在鍵數較少時,可采用硬件去抖,而當鍵數較多時,采用軟件去抖。按鍵觸點機械抖動如圖10-10所示。 圖圖10-10 按鍵觸點機械抖動按鍵觸點機械抖動閉合穩(wěn)定鍵按下前沿抖動后沿抖動 1. 1. 按鍵編碼按鍵編碼 一組按鍵或鍵盤都要通過I/O口線查詢按鍵的開關狀態(tài)。根據鍵盤結構的不同,采用不同的編碼。無論有無編碼,以及采用什么編碼,最后都要轉換成為與累加器中數值相對應的鍵值,以實現(xiàn)按鍵功能程序的跳轉。 2. 2. 鍵盤程

51、序鍵盤程序 一個完善的鍵盤控制程序應具備以下功能: (1) 檢測有無按鍵按下,并采取硬件或軟件措施,消除鍵盤按鍵機械觸點抖動的影響。 (2) 有可靠的邏輯處理辦法。每次只處理一個按鍵,其間對任何按鍵的操作對系統(tǒng)不產生影響,且無論一次按鍵時間有多長,系統(tǒng)僅執(zhí)行一次按鍵功能程序。 (3) 準確輸出按鍵值(或鍵號),以滿足跳轉指令要求。 3. 3. 獨立式按鍵獨立式按鍵 單片機控制系統(tǒng)中,往往只需要幾個功能鍵,此時,可采用獨立式按鍵結構。 1)獨立式按鍵結構獨立式按鍵是直接用I/O口線構成的單個按鍵電路,其特點是每個按鍵單獨占用一根I/O口線,每個按鍵的工作不會影響其它I/O口線的狀態(tài)。獨立式按鍵的

52、典型應用如圖所示。獨立式按鍵電路配置靈活,軟件結構簡單,但每個按鍵必須占用一根I/O口線,因此,在按鍵較多時,I/O口線浪費較大,不宜采用。獨立式按鍵如圖10-11所示。P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.78031VCC8051 圖圖10-11 獨立式按鍵獨立式按鍵 2) 獨立式按鍵的軟件結構 獨立式按鍵的軟件常采用查詢式結構。先逐位查詢每根I/O口線的輸入狀態(tài),如某一根I/O口線輸入為低電平,則可確認該I/O口線所對應的按鍵已按下,然后,再轉向該鍵的功能處理程序。4. 矩陣式按鍵矩陣式按鍵 單片機系統(tǒng)中,若使用按鍵較多時,通常采用矩陣式(也稱行列式)鍵盤。 1)

53、矩陣式鍵盤的結構及原理 矩陣式鍵盤由行線和列線組成,按鍵位于行、列線的交叉點上,其結構如下圖所示。 由圖可知,一個44的行、列結構可以構成一個含有16個按鍵的鍵盤,顯然,在按鍵數量較多時,矩陣式鍵盤較之獨立式按鍵鍵盤要節(jié)省很多I/O口。行列式按鍵如圖10-12所示。 矩陣式鍵盤中,行、列線分別連接到按鍵開關的兩端,行線通過矩陣式鍵盤中,行、列線分別連接到按鍵開關的兩端,行線通過上拉電阻接到上拉電阻接到5V5V上。當無鍵按下時,行線處于高電平狀態(tài);當有鍵上。當無鍵按下時,行線處于高電平狀態(tài);當有鍵按下時,行、列線將導通,此時,行線電平將由與此行線相連的列線按下時,行、列線將導通,此時,行線電平將

54、由與此行線相連的列線電平決定。這是識別按鍵是否按下的關鍵。然而,矩陣鍵盤中的行線、電平決定。這是識別按鍵是否按下的關鍵。然而,矩陣鍵盤中的行線、列線和多個鍵相連,各按鍵按下與否均影響該鍵所在行線和列線的電列線和多個鍵相連,各按鍵按下與否均影響該鍵所在行線和列線的電平,各按鍵間將相互影響,因此,必須將行線、列線信號配合起來作平,各按鍵間將相互影響,因此,必須將行線、列線信號配合起來作適當處理,才能確定閉合鍵的位置。適當處理,才能確定閉合鍵的位置。 2) 矩陣式鍵盤按鍵的識別 識別按鍵的方法很多,其中,最常見的方法是掃描法。 按鍵按下時,與此鍵相連的行線與列線導通,行線在無鍵按下時處在高電平。顯然

55、,如果讓所有的列線也處在高電平,那么,按鍵按下與否不會引起行線電平的變化,因此,必須使所有列線處在低電平。只有這樣,當有鍵按下時,該鍵所在的行電平才會由高電平變?yōu)榈碗娖健PU根據行電平的變化,便能判定相應的行有鍵按下。 3) 鍵盤的編碼 對于獨立式按鍵鍵盤,因按鍵數量少,可根據實際需要靈活編碼。對于矩陣式鍵盤,按鍵的位置由行號和列號惟一確定,因此可分別對行號和列號進行二進制編碼,然后將兩值合成一個字節(jié),高4位是行號,低4位是列號。10.4.4 鍵盤的工作方式 對鍵盤的響應取決于鍵盤的工作方式,鍵盤的工作方式應根據實際應用系統(tǒng)中CPU的工作狀況而定,其選取的原則是既要保證CPU能及時響應按鍵操

56、作,又不要過多占用CPU的工作時間。通常,鍵盤的工作方式有三種,即編程掃描、定時掃描和中斷掃描。 1. 編程掃描方式 編程掃描方式是利用CPU完成其它工作的空余時間,調用鍵盤掃描子程序來響應鍵盤輸入的要求。在執(zhí)行鍵功能程序時,CPU不再響應鍵輸入要求,直到CPU重新掃描鍵盤為止。2. 定時掃描方式 定時掃描方式就是每隔一段時間對鍵盤掃描一次,它利用單片機內部的定時器產生一定時間(例如10 ms)的定時,當定時時間到就產生定時器溢出中斷。CPU響應中斷后對鍵盤進行掃描,并在有鍵按下時識別出該鍵,再執(zhí)行該鍵的功能程序。 3. 中斷掃描方式 采用上述兩種鍵盤掃描方式時,無論是否按鍵,CPU都要定時掃

57、描鍵盤,而單片機應用系統(tǒng)工作時,并非經常需要鍵盤輸入,因此,CPU經常處于空掃描狀態(tài)。 為提高CPU工作效率,可采用中斷掃描工作方式。其工作過程如下:當無鍵按下時,CPU處理自己的工作,當有鍵按下時,產生中斷請求,CPU轉去執(zhí)行鍵盤掃描子程序,并識別鍵號。10.4.5 實例分析實例分析 例10.5 如圖10-13所示,編程實現(xiàn)4x4鍵盤,按“0”號鍵在數碼管顯示“0”,按“1”號鍵在數碼管顯示“1”,.,按“F”號鍵在數碼管顯示“F”。 分析: 在單片機應用系統(tǒng)中,鍵盤是人機對話不可缺少的組件之一。在按鍵比較少時,我們可以一個單片機I/O口接一個按鍵,但當按鍵需要很多,I/O資源又比較緊張時,

58、使用矩陣式鍵盤無疑是最好的選擇。 4x4矩陣鍵盤是運用得最多的鍵盤形式,也是單片機入門必需掌握的一種鍵盤識別技術,下面我們就以實例來說明一下4 x 4矩陣鍵盤的識別方法。如下圖所示,我們把按鍵接成矩陣的形式,這樣用8個I/O口就可以對16個按鍵進行識別了,節(jié)省了I/O口資源。 (1)我們的識別思路是這樣的,初使化時我們先讓P1口的低四位輸出低電平,高四位輸出高電平,即讓P1口輸出0 xF0。 (2)掃描鍵盤的時候,我們讀P1口,看P1是 否還為0 xF0,如果仍為0 xF0,則表示沒有按鍵按下;如果不0 xF0,我們先等待10ms左右,再讀P1口,再次確認是否為0 xF0,這是為了防止是 抖動

59、干擾造成錯誤識別,如果不是那就說明是真的有按鍵按下了,我們就可以讀鍵碼來識別到底是哪一個鍵按下了。 (3)識別的過程是這樣的,初使化時我們讓P1口的低四位輸出低電平,高四位輸出高電平,確認了真的有按鍵按下時,我們首先讀P1口的高四位,然后P1口輸出 0 x0F,即讓P1口的低四位輸出高電平,高四位輸出低電平,然后讀P1口的低四位,最后我們把高四位讀到的值與低四位讀到的值做或運算就得到了該按鍵的 鍵碼。就可以知道是哪個鍵按下了。 (4)以0鍵為例,初使化時P1輸出0 xF0,當0鍵按下時,我們讀高四位的狀態(tài)應為1110,即P1為0 xe0,然后讓P1輸出0 x0F,讀低四位產狀態(tài)應為1110,即

60、P1為0 x0e,讓兩次讀數相與得0 xee。圖圖10-13 4*4鍵盤的數碼管顯示鍵盤的數碼管顯示L3L2L1L0H0H1H2H3L0L1L2L3H0H1H2H3XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1

溫馨提示

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

評論

0/150

提交評論