項目6-單片機(jī)按鍵_第1頁
項目6-單片機(jī)按鍵_第2頁
項目6-單片機(jī)按鍵_第3頁
項目6-單片機(jī)按鍵_第4頁
項目6-單片機(jī)按鍵_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 項目6單片機(jī)的按鍵單片機(jī)的按鍵 嵌入式單片機(jī)方向單片機(jī)C語言程序項目設(shè)計6.1任務(wù)說明任務(wù)說明任務(wù):了解按鍵的器件特性,學(xué)習(xí)利用外部中斷掃描,延時等手段實現(xiàn)按鍵的輸入,重點(diǎn)掌握按鍵程序的變成 方法。 6.2 按鍵抖動現(xiàn)象按鍵抖動現(xiàn)象 按鍵按下都會發(fā)出一聲響,隨然有的按鍵聲音很輕微,但這都是金屬導(dǎo)體碰撞產(chǎn)生的震動,這種現(xiàn)象稱為鍵盤抖動如果不對鍵盤的抖動進(jìn)行處理,按鍵會對系統(tǒng)電路或程序產(chǎn)生意外的干擾。為了觀察按鍵的抖動現(xiàn)象,我們先做一個小實驗,分析一下一個微觸按鍵產(chǎn)生抖動對系統(tǒng)的影響。加計數(shù)器+VCCCPKEYR圖圖6-1 加數(shù)計數(shù)小系統(tǒng)加數(shù)計數(shù)小系統(tǒng) T1T2T3T4T5高電平低電平 圖圖6-

2、2 加數(shù)計數(shù)小系統(tǒng)加數(shù)計數(shù)小系統(tǒng) 在圖6-1所示的一個加數(shù)計數(shù)小系統(tǒng)中,設(shè)計數(shù)器的脈沖輸入端CP為上升沿有效,加計數(shù)器初始顯示為0。按鍵不按時,CP = 0,計數(shù)器不加1計數(shù)。一般認(rèn)為:按鍵按下,CP端由低電平變?yōu)楦唠娖剑须娖缴仙?,計?shù)器加1計數(shù),并且按下1次,計數(shù)器加1。實際實驗時會發(fā)現(xiàn),按鍵按下1次,計數(shù)器不是加1,而是跳躍一次性增加3或4。原因是按鍵按下在導(dǎo)體接觸的瞬間產(chǎn)生了震動。圖6-2是按鍵按下過程中CP端實際電平改變情況。T1為不按按鍵時刻,T2為按鍵按下瞬間的抖動,T3為按鍵按下穩(wěn)定時刻,T4為按鍵放開時刻瞬間,T5為按鍵放開時刻。從圖中可以了解到,按鍵按下的瞬間由于震動會

3、是按鍵內(nèi)部的導(dǎo)體穩(wěn)定接觸,而是在導(dǎo)通和不導(dǎo)通之間來回彈跳,雖然時間一瞬間,但使CP端獲得了多個電平的上升沿。按鍵抖動時間的長短由按鍵的機(jī)械特性決定,一般為一般為5ms10ms。因此不能直接把按鍵作為1個脈沖的輸入。 在數(shù)字電路中,常利用觸發(fā)器消除鍵盤抖動,但在單片機(jī)系統(tǒng)中,按鍵可以直接接在單片機(jī)的I/O口上,常利用鍵盤程序來消除鍵盤的抖動現(xiàn)象。 6.3 利用外部中斷實現(xiàn)鍵盤輸入利用外部中斷實現(xiàn)鍵盤輸入 一、電路原理一、電路原理 在圖6-3中,單片機(jī)的P0.0口接一只LED,鍵盤接在P3.2端口,按鍵不按時,由于P3.2接有上拉電阻R3,所以P3.2此時為高電平+5V,如果按鍵按下,P3.2電源

4、地短路,P3.2為低電平。 為了消除鍵盤抖動現(xiàn)象,鍵盤兩端并聯(lián)濾波電容器C4。P3.2是單片機(jī)的外部中斷的輸入端,當(dāng)按鍵按下時,讓單片機(jī)執(zhí)行外部中斷服務(wù)程序,在中斷服務(wù)中完成對LED的控制。圖圖6-3 6-3 利用外部中斷利用外部中斷INT0INT0實現(xiàn)鍵盤輸入電路實現(xiàn)鍵盤輸入電路 二、外部中斷二、外部中斷 51系列單片機(jī)的中斷共有5個,其中外部中斷共占兩個。外部中斷主要通過單片機(jī)的引腳P3.3()、P3.4()接收外部脈沖或高低電平出發(fā)CPU中斷。與外部中斷有關(guān)的多功能寄存器為IE、IP、TCON。程序如下:/*/#include#includesbit LED = P00;sbit LED

5、 = P00;bit i;bit i;void delay()void delay() unsigned char a,b;unsigned char a,b;for(a=0;a255;a+)for(a=0;a255;a+)for(b=0;b255;b+);for(b=0;b255;b+); void int0_isr(void) interrupt 0 /INT0中斷服務(wù)函數(shù),INT0的中斷號為0i = i; /INT0中斷1次,i值改變1次LED = i; /INT0中斷1次,LED工作狀態(tài)變化1次delay(); /調(diào)用延時函數(shù)void main(void)LED = 0; /芯片初始化

6、時,LED滅EA = 0; EX0 = 1; /開啟INT0中斷PX0 = 1; /INT0中斷優(yōu)先,可以省去EA = 1; /開啟總中斷開關(guān)while(1); /等待按鍵按下,中斷發(fā)生/*/ 這里沒有設(shè)置INT0是下降沿觸發(fā)中斷或是低電平觸發(fā)中斷,原因是按鍵按下,不管產(chǎn)生不產(chǎn)生鍵抖現(xiàn)象,總能使INT0引腳產(chǎn)生1個下降沿和低電平。如果設(shè)置只有下降沿才觸發(fā)INT0中斷,需要利用設(shè)置計時器控制寄存器TCON的IT0 = 1位,按鍵按下是否產(chǎn)生中斷,可以利用程序檢測TCON的IE0位。利用外部中斷觸發(fā)作為按鍵輸入很好的解決了鍵盤抖動問題。 如果需要多個鍵盤,把INT0口與I/O口之間用鍵盤連接,I/

7、O輸出低電平掃面信號即可。在數(shù)碼管動態(tài)顯示電路中,為了節(jié)省硬件資源,可以在INT0口和P2口之間接入鍵盤,實現(xiàn)8只按鍵輸入。三、利用延時程序防止鍵盤抖動,實現(xiàn)鍵盤輸入三、利用延時程序防止鍵盤抖動,實現(xiàn)鍵盤輸入 按鍵按下產(chǎn)生的抖動現(xiàn)象持續(xù)的時間不會很久,因此在按鍵按下后,可延時一段時間跳過抖動,再對按鍵的狀態(tài)檢測,從而利用延時的方法也可以實現(xiàn)鍵盤輸入。本案例完通過兩個鍵盤設(shè)計,實現(xiàn)對數(shù)碼管顯示數(shù)據(jù)的調(diào)整。圖圖 6-4 利用延時函數(shù)消除鍵盤抖動實現(xiàn)鍵盤輸入電路利用延時函數(shù)消除鍵盤抖動實現(xiàn)鍵盤輸入電路 在圖6-4中,KEY1、KEY2兩個鍵盤一端分別接P3.0、P3.1,另一端接地,數(shù)碼管仍使用共陽

8、型。在Proteuse軟件中,按鍵的英文名字為BUTTON,在Switches & Relasy下的Switches里?,F(xiàn)在實現(xiàn)兩個按鍵控制數(shù)碼顯示的數(shù)字,其中KEY1按下使數(shù)字增加,數(shù)字到9后變?yōu)?,依次循環(huán);KEY2按下使數(shù)字減小。驗證程序如下:/*/#include #include #define uchar unsigned char#define uchar unsigned charuchar code seven_seg10 = uchar code seven_seg10 = 0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf

9、8,0 x80,0 x90;0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90;sbit key1 = P30;sbit key1 = P30;sbit key2 = P31;sbit key2 = P31;uchar key1_state,key2_state; /uchar key1_state,key2_state; /按鍵按按鍵按下的狀態(tài)變量下的狀態(tài)變量void delay(uchar i)void delay(uchar i) while(i) i-; while(i) i-; void key_scan(void)

10、 /void key_scan(void) /鍵盤掃描函數(shù)鍵盤掃描函數(shù) if(key1 = 0) /if(key1 = 0) /如果按鍵按下如果按鍵按下 delay(200); /delay(200); /延時一段時間,消除鍵抖延時一段時間,消除鍵抖while(key1 = 0);while(key1 = 0); key1_state = 1; / key1_state = 1; /再對按鍵檢測,如果確實按再對按鍵檢測,如果確實按下,按鍵狀態(tài)變量為下,按鍵狀態(tài)變量為1 1 if(key2 = 0)if(key2 = 0) delay(200);delay(200);while(key2 = 0

11、)while(key2 = 0) key2_state = 1;key2_state = 1; void main(void)void main(void) char i;char i;while(1)while(1) key_scan(); / key_scan(); /調(diào)用鍵盤掃描函數(shù)調(diào)用鍵盤掃描函數(shù)if(key1_state = 1) /if(key1_state = 1) /判斷鍵盤狀態(tài)變量,如果為判斷鍵盤狀態(tài)變量,如果為1 1,說明有按鍵按下說明有按鍵按下 i+; /i+; /顯示數(shù)據(jù)增加顯示數(shù)據(jù)增加key1_state = 0;/key1_state = 0;/數(shù)據(jù)增加后,鍵盤狀態(tài)

12、變量清零數(shù)據(jù)增加后,鍵盤狀態(tài)變量清零if(i9) i = 0; /if(i9) i = 0; /數(shù)據(jù)增加超過數(shù)據(jù)增加超過9 9后,回到后,回到0 0 if(key2_state = 1)if(key2_state = 1) i-;i-;key2_state = 0; key2_state = 0; if(i 0) i = 9;if(i 0) i = 9; P0 = seven_segi; /P0 = seven_segi; /顯示鍵盤調(diào)整數(shù)據(jù)顯示鍵盤調(diào)整數(shù)據(jù) 如果按鍵按下不放開,程序一直執(zhí)行語句while(key1 =0),這時程序在此處死循環(huán),不能執(zhí)行其它程序,所以本案例按鍵抬起后數(shù)據(jù)才能得到調(diào)整。此種編程方法并不影響單片機(jī)驅(qū)動1個數(shù)碼管工作,但動態(tài)顯示電路在此種情況下不能正常工作。如果把while改換成if,按鍵只要按下數(shù)據(jù)就能調(diào)整,但如果按下不放開按鍵,數(shù)據(jù)自動快速增加或減小。 如果按鍵按下既不讓程序死循環(huán),也不讓由于按鍵按的時間過長而數(shù)據(jù)調(diào)整失控,最可靠的辦法是利用變量記憶按鍵按下和放開的兩種狀態(tài),根據(jù)判斷實現(xiàn)鍵盤輸入。程序如下:/*/uchar key1_down_state, key1_up_state, /變量聲明,初始值為0if(key1 = 0)delay(200)if(key1 = 0)ke

溫馨提示

  • 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

提交評論