80C51按鍵的應用_第1頁
80C51按鍵的應用_第2頁
80C51按鍵的應用_第3頁
已閱讀5頁,還剩9頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、第六節按鍵的應用6.1按鍵簡介同學們!現在你們已經能熟練的使用數碼管了,那么,我們就可以用數碼管干些事情了,先設計個表吧。調表需要用按鍵,0K,讓我們來練習使用按鍵/<。按鍵分為編碼按鍵和非編碼按鍵。如果按鍵的識別由專門的按鍵編碼器識別并輸出特定的鍵值或編碼,這種按鍵稱為編碼按鍵,比如我們計算機的鍵盤,它內部有一個單片機專門識別按鍵并輸出對應的編碼。如果按鍵的識別依靠單片機本身來識別,則稱為非編碼按鍵。比如下面這些按鍵。AA«?圖6-1圖6-1是單片機常用的幾種按鍵。其中彈性小按鍵一按下,開關就閉臺,一松手,開關就會自動斷開。自鎖式按鍵按下時就會閉臺并且自動鎖定在閉臺狀態,再次

2、按下時才會彈起斷開,這種按鍵通常當做電源開關。6.2獨立按鍵檢測的原理般情況下,按鍵與單片機的連接如下面這圖6-2所示FOTAJPCrs-iR:i2-TJJD2iRj寸I0.5?I-A踞PUDPtiHJpiaIs!:Pr£H?Pi-7p;w.p:11*1K!n.wiiF3.JA11P3-Wk1PlowTrfjMATCIPITfij-1ECT-圖6-2圖中上拉電阻R1、R2值一般在4.7k10k之間(對于內部端口有上拉電阻的單片機則可省略此電阻,比如51的P1、P2、P3口),單片機對于按鍵的按下與否的檢測,則是通過檢測相應引腳上的電平來實現的。對于圖6-2而言,當單片機檢測(讀取)至

3、VP1.2和P1.3引腳上面的電平為低時,則表示按鍵已經按下,反之,則表明按鍵沒有按下。我們在程序中P1.2只要反復的檢測P1.2和P1.3引腳上面的電平,一旦檢測到為低了,就可以判斷按鍵按下。呵呵,簡單吧。等會,您先別樂呵,話還沒說完呢。下面我們來看看,當按鍵按下時,引腳上面的波形是怎么變化的。建出Mr:圖6-3圖6-3上圖是一個理想波形圖,當按鍵按下時,P1.2引腳的電平馬上被拉低到0V了。但是實際上,當按鍵閉臺時,由于按鍵的機械特性并不能馬上保持良好的接觸,而是來回彈跳。因此,實際的P1.2引腳的波形圖是圖6-3的下圖所示。盡管抖動的時間很短,我們的手根本感覺不出來。但是對于一秒鐘執行百

4、萬條指令的單片機而言,這個時間是相當的長了。那么在這段抖動的時間內,單片機可能讀到多次高低電平的變化。如果不加任何處理的話,就會認為已經按下,或者松開很多次了。而事實上,我們的手一直按在按鍵上,并沒有重復按動很多次。要想能夠正確的判斷按鍵是否按下就要避開這段抖動的時間。根據一般按鍵的機械特點,以及按鍵的新舊程度等而言,這段抖動的時間一般在5ms20ms之間。而一旦按鍵按下,穩定閉臺的時間一般最短是20ms(手最快的人按下到放開的時間)。因此,我們通常需要使用如下的防抖措施:1?當P1.2檢測到按鍵按下(即P1.2引腳讀到低電平)。2?延時1020ms。3?再次檢測P1.2按鍵是否仍被按下(即P

5、1.2弓I腳依舊讀到低電平),如果此時P1.2引腳仍然能讀到低電平,說明按鍵確實已經穩定的按下了。4?等待按鍵被放開。上述偽代碼寫成C51代碼就應該是這個樣子:sbitBtnAdd=P1A2;/將P1.2引腳重新命名為BtnAddif(BtnAdd=O)/當P1.2檢測到按鍵按下(即P1.2弓I腳讀到低電平)(Delay(20);/延時20ms。if(BtnAdd=O)再次檢測P1.2按鍵是否仍被按下,如果此時P1.2弓I腳仍然能讀到低電平,說明按鍵確實已經穩定的按下了while(!BtnAdd);等待按鍵被放開(按鍵沒放開時BtnAdd為低電平(邏輯0),取反后為高電平(邏輯1),此時whi

6、le循環條件為真,/則繼續執行該句,直到按鍵放開,后面的代碼才能被執行6.3獨立按鍵的使用請實現:一位數碼管顯示從09的數字,使用兩個按鍵“Add”和“Sub”,按一下Add,顯示數字加一,按一下Sub,顯示數字減一,如顯示數字小于0或大于9,顯示字符“E”,即“ERROR的簡寫。6.3.1硬件的選擇與仿真電路的設計1.打開Proteus,選擇“File/NewDesign”菜單選項,新建一個“設計項目”。并將項目保存為“PushButton_1"。ItlluMqfFIh£H4-12.選擇“P”按鈕或菜單"Library/PickDivice/Symbol-P”菜

7、單,從“元件庫”中選取元件。依次添加其他元件。其名稱和位置見下表。元件名稱CategorySub-CategoryResults單片機MicroprocessorICs8051FamilyAT89C52一位7段數碼管Optoelectronics7-SegmentDisplays7SEG-MPX1-CA按鈕Switches&RelaysSwitchesBUTTON電阻ResistorsGenericRES依次從備選元件庫中擺放器件,連線,畫出仿真電路圖,如圖6-4所示。圖6-4電路的說明:在仿真電路中,由于我們使用的是P1口,它內部已經有上拉電阻了,因此我們可以不再添加上拉電阻了。但是

8、,如果您使用的是P0口(內部沒有上拉電阻),大家必須添加上拉電阻,以確保單片機可以準確的檢測到按鍵按下的動作。632程序的設計新建一個keil項目,并命名為"PushButton_1”并添加一個名為"main.c”的源代碼文件,然后鍵入如下代碼。如代碼6.1所示。/代碼6.1#inelude<reg52.h>#inelude"function.h"#include"common.h"#defineSeg7PortP2/數碼管連接在P2口上用一個數組來定義字符09共陽極數碼管編碼ucharcodeSeg7ca=0xc0,0x

9、f9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;#defineE0x86II用一個字符E來代替字符E'的共陽極數碼管編碼(0x86是其編碼)sbitBtnAdd=P1A2;II將P1.2引腳重新命名為BtnAdd(加1按鍵)sbitBtnSub=P1A3;將P1.3引腳重新命名為BtnSub(減1按鍵)ucharcount;II定義一個變量來存儲當前數碼管顯示的值voidmain()count=0;數碼管將從0開始顯示while(1)BtnAdd=1;BtnSub=1;II在讀I/O口之前,先要將其置為高電平/如果加1按鍵按下,貝Ucount加1i

10、f(BtnAdd=0)/當P1.2檢測到按鍵按下(即P1.2引腳讀到低電平)Delay(20);II延時20msif(BtnAdd=0)再次檢測P1.2按鍵是否仍被按下,如果此時P1.2引腳仍然能讀到低電平,說明按鍵確實已經穩定的按下了while(舊tnAdd);等待按鍵被放開(按鍵沒放開時BtnAdd為低電平(邏輯0),取反后為高電平(邏輯1),此時while循環條件為真,則繼續執行該句,直到按鍵放開,后面的代碼才能被執行)count+;II加1鍵被按下,count加1elseif(BtnSub=0)/如果減1按鍵按下則count減1(過程與加1鍵檢測相同)Delay(20);if(BtnS

11、ub=O)while(舊tnSub);count-;/減1鍵被按下,count減1if(count>=0&&count<=9)/如果count在09之間,則顯示對應的數字(Seg7Port=seg7cacount;else/否則顯示字符'E'表示錯誤(Seg7Port=E;知識點:I/O口做輸入口當我們要用51單片機的I/O口做輸入口(即檢測I/O口當前的狀態)時,為了正確的讀取I/O口的輸入值,我們一般需要先將I/O口置為高電平,如:BtnAdd=1;BtnSub=1;/在讀I/O口之前,先要將其置為高電平知識點:ifelseifelse結構的語義

12、ifelseifelse判斷語句時C常用的判斷語句,其語義如下:if()如果(elseif()/或者(再如果)(else否貝U(這三個分支只有一個能發生(即3選1)。如果你使用if()(if()(那么,這兩個分支有可能同時發生(多選)。請大家注意它們在語義上的區別,在本例中,我們設計時,是不考慮兩個按鍵同時被按下的情形的,因此,實際是二選一的情況,因此,我們使用了ifelseifelse判斷語句。6.4多位數碼管的顯示請實現:兩位數碼管顯示從0059的數字,使用兩個按鍵Add和Sub,按一下Add,數字加一,按一下Sub,數字減一,如此反復。641硬件的選擇與仿真電路的設計1. 打開Prote

13、us,選擇"File/NewDesign”菜單選項,新建一個”設計項目”。并將項目保存為"PushButton_2”。選擇“P”按鈕或菜單"Library/PickDivice/SymbolP”菜單,從“元件庫”中選取元件。依次添加其他元件。其名稱和位置見下表。元件名稱CategorySub-CategoryResults51單片機MicroprocessorICs8051FamilyAT89C52兩位7段共陽數碼管Optoelectronics7-SegmentDisplays7SEG-MPX2-CA按鈕Switches&RelaysSwitchesBU

14、TTON電阻ResistorsGenericRES依次從備選元件庫中擺放器件,連線,畫出仿真電路圖,如圖6-5所示。BAp_-nBL?,口世m"m二urnraiffii一AFHfcA園0呻m<1從尉nAAW嶺JIMroaw*4H>SMi4RtfMKA|7M|iT并(MK血?0man舊也碼KrSAiiR-EAI-I圖6-5電路說明因為我們使用了兩位共陽數碼管,由于51的驅動能力不足以直接驅動數碼管,因此,我們通過兩個PNP三極管作為電子開關來驅動數碼管位選線,當P3.0輸出低電平時,PNP三極管導通,Vcc通過三極管Q1加在數碼管的個位,從而使數碼管的個位發光(P3.1控制

15、數碼管十位發光的原理相同)。電阻R3和R4為限流電阻,通常取值為1K左右。電阻R5和R6為下拉電阻,保證PNP三極管可靠地截止,通常取值為10K左右。642實現原理分析我們使用一個變量count表示當前數值,讓count從0開始,每按Add鍵加1,當count增加到59時,讓它回到0,每按Sub鍵減1,當count減少到0時,讓它回到59重新開始。這樣,count就在059之間反復變化。1. 我們讓數碼管的個位顯示count的個位,數碼管的十位顯示count的十位。6.4.3程序的設計新建一個keil項目,并命名為"PushButton_2”并添加一個名為"main.c”的

16、源代碼文件,然后鍵入如下代碼。如代碼6.2所示。代碼6.2#include<reg52.h>#include"function.h"#include"common.h"#defineSeg7PortP2/數碼管連接在P2口上用一個數組來定義字符09共陽極數碼管編碼ucharcodeSeg7ca=(0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;sbitBtnAdd=P1A2;/將P1.2引腳重新命名為BtnAdd(加1按鍵)sbitBtnSub=P"3;將P1.3引腳重新命名為Bt

17、nSub(減1按鍵)sbitGeWei=P3A0;定義數碼管個位的位選線sbitShiWei=P3A1;/定義數碼管十位的位選線ucharcount;定義一個變量來存儲當前數碼管顯示的值關閉所有的數碼管顯示voidCloseAIISeg()(GeWei=1;/關閉個位位選線ShiWei=1;/關閉十位位選線在數碼管上顯示count值voidDisplay。(uchartmp;CIoseAIISeg();/關閉所有的數碼管顯示先顯示個位tmp=count%10;提取count的個位數GeWei=0;先顯示個位,將十位關閉Seg7Port=seg7catmp;/將'count'個位

18、的編碼送出Delay(1);CIoseAIISeg();/關閉所有的數碼管顯示;消隱,防止閃爍/再顯示十位tmp=count/10;/提取十位數ShiWei=0;/先顯示十位,將個位關閉count=0;while(1)(BtnAdd=1;BtnSub=1;/在讀I/O口之前,先要將其置為高電平if(BtnAdd=0)(Delay(20);if(BtnAdd=0)再次檢測P1.2按鍵是否仍被按下,如果此時P1.2引腳仍然能讀到低電平,說明按鍵確實已經穩定的按下了(while(!BtnAdd);/等待按鍵被放開(按鍵沒放開時BtnAdd為低電平(邏輯0),取反后為高電平(邏輯1),此時while循

19、環條件為真,則繼續執行該句,直到按鍵放開,后面的代碼才能被執行)if(count<59)/如果countv59,每按Add鍵count加1,否則count回0count+;elsecount=0;elseif(BtnSub=0)/如果減1按鍵按下則count減1(過程與加1鍵檢測相同)Delay(20);if(BtnSub=0)while(!BtnSub);if(count>0)/如果count>0,每按Sub鍵count減1,否則count回59count-;elsecount=59;Display。;/在數碼管上顯示count值程序代碼說明1?程序結構說明在本例中,我們的

20、程序設計思路是這樣的在main函數的大循環中,不斷的檢測BtnAdd和BtnSub是否被按下,如果被按下,則根據按下的按鍵修改count值,然后再將count的個位和十位分另U顯示在數碼管上即可。2?個數循環變化的技巧if(count<59)/如果countv59,每按Add鍵count加1,否則count回0count+;elsecount=0;以及下面的代碼:if(count>0)/如果count>0,每按Sub鍵count減1,否則count回59count-;elsecount=59;在讓一個數循環變化時,這是一種常用的技巧,后面時鐘項目中,我們會使用到這種技巧(調整

21、時分秒,年月日等等)。Display。函數的使用因為在main函數的大循環中,我們要不斷的將count的個位和十位顯示在數碼管上,這個顯示操作可以寫為一個函數,即Display()函數,這是一種常用的代碼復用的技巧。6.54X4鍵盤的使用當我們的應用中要使用比較多的按鍵時,如果使用獨立按鍵的話,將會占用很多I/O口,那么,為了節約I/O口線,我們需要使用另一類按鍵,其中比較常用的是4X4鍵盤。讓我們實現如下功能:讓1位數碼管依次顯示4X4鍵盤的編碼(數字鍵顯示對應的數字,功能鍵顯示對應的AF字符)。6.5.14X4鍵盤實現按鍵檢測的原理分析一般情況下,4X4鍵盤與單片機的連接如下面這圖6-6所

22、示。-RBMMImg-nWHWU時血口FiWWiPSTiUJffEmwfl野沁地噲匹ii二#?4A13'WH;悴昨:Kl*f&WlAW.虻tfT常鮮廠皤ti?rrjfA-.S3科SO圖6-64X4鍵盤通常有4行4列共16個按鈕,分別跨接在4根交叉的行線和列線上,我們通常把4根行線和4根列線連接在單片機的一個I/O口上,比如像圖6-6那樣,4根行線連接在P2.0P2.3上,4根列線連接在P2.4P2.7上。當我們要檢測鍵盤上那個按鍵被按下,我們通常采用如下方法:1彼們先拉低P2.02?依次檢測P2.4P2.7,如果沒有檢測到任何低電平,說明沒有按鍵被按下。檢測到有低電平,比如P2

23、.5為低電平,說明P2.0和P2.5交叉的那個按鍵被按下了。8. 3彼們再拉低P2.14依次檢測P2.4P2.7o(同步驟2)5彼們再拉低P2.26依次檢測P2.4P2.7o(同步驟2)7彼們再拉低P2.3依次檢測P2.4P2.7o(同步驟2)重復步驟18。上述偽代碼寫成C51代碼就應該是這個樣子。sbitLine_A=P2P;/#4X4鍵盤的4根行線連接在P2.0P2.3sbitLine_B=P2A1;sbitLine_C=P2A2;sbitLine_D=P2A3;sbitLine_仁口2人4;/將4X4鍵盤的4根列線連接在P2.4P2.7sbitLine_2=P2A5;sbitLine_3

24、=P2A6;sbitLine_4=P2A7;Line_A=O;/先拉低P2.0if(Line1=0)/檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下Delay(10);/消抖if(Line_仁=0)(result=7;檢測到有低電平,說明P2.0和P2.4交叉的那個按鍵被按下了,則輸出對應的按鍵的編碼(編碼自己定)elseif(Line_2=0)/檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下(Delay(10);/消抖if(Line_2=0)(elseif(Line_3=0)/檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下(D

25、elay(10);/消抖if(Line_3=0)(result=9;檢測到有低電平,說明P2.o和P2.6交叉的那個按鍵被按下了,則輸出/對應的按鍵的編碼elseif(Line_4=0)/檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下(Delay(10);/消抖if(Line_4=0)(再依次檢測P2.1,P2.2,P2.36.5.2硬件電路的設計1. 打開Proteus,選擇"File/NewDesign”菜單選項,新建一個”設計項目”。并將項目保存為“4X4KeyPad'。選擇“P”按鈕或菜單"Library/PickDivice/Symb

26、olP”菜單,從“元件庫”中選取元件。依次添加其他元件。其名稱和位置見下表。元件名稱CategorySub-CategoryResults51單片機MicroprocessorICs8051FamilyAT89C521位7段共陽數碼管Optoelectronics7-SegmentDisplays7SEG-MPX1-CA4X4鍵盤Switches&RelaysKeyPadsKEYPAD-SMALLCA1電阻ResistorsGenericRES依次從備選元件庫中擺放器件,連線,畫出仿真電路圖,如圖6-7所示HET坐ri*ri.*WP17OdlFIHOEnn?fll圖6-7電路說明我們使

27、用P2口來驅動一位共陽極數碼管,同時使用P3口來檢測4X4按鍵,其中,P3.0P3.3引腳連接到行線ABCD上,P3.4P3.7連接到列線1234上。6.5.3程序的設計1.新建一個keil項目,并命名為"4X4Key”并添加一個名為"main.c”的源代碼文件,然后鍵入如下代碼。如代碼6.3所示。代碼6.3#include<reg52.h>#include"function.h”#include"common.h"#defineSeg7PortP2/數碼管連接在P2口上#defineKeyPadP3/鍵盤連接在P3口上sbitLi

28、ne_A=P3P;/將4X4鍵盤的4根行線連接在P3.0P3.3sbitLine_B=P3A1;sbitLine_C=P3A2;sbitLine_D=P3A3;sbitLine_仁口3人4;/將4X4鍵盤的4根列線連接在P3.4P3.7sbitLine_2=P3A5;sbitLine_3=P3A6;sbitLine_4=P3A7;用一個數組來定義字符0F共陽極數碼管編碼ucharcodeseg7ca=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e;ucharcount;定義一個變量來

29、存儲當前數碼管顯示的值/鍵盤掃描程序ucharScanKeypad。ucharresult='N:/定義函數輸出結果KeyPad=Oxff;全部置高電平,為檢測輸入做準備Line_A=0;/先拉低P3.0if(Line_1=0)/檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下。Delay(10);/消抖if(Line_仁=0)result=7;檢測到有低電平,說明P3.0和P3.4交叉的那個按鍵被按下了,則輸出對應的按鍵/的編碼(編碼自己定,本例中P3.0和P3.4交叉為數字7按鍵,所以我們輸出7)elseif(Line_2=0)檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下。(Delay(10);if(Line_2=0)(result=8;檢測到有低電平,說明P3.0和P3.5交叉的那個按鍵被按下了,則輸出對應的按鍵的編碼elseif(Line_3=0)檢測每根列線是否被拉低。如果沒有檢測到任何低電平,說明沒有按鍵被按下。(Delay(10);/消抖if(Line_3=0)(result=9;檢測到有低電平,說明P3.o和P3.6交叉的那個按鍵被按下了,則輸出對應的按鍵的編碼elseif

溫馨提示

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

評論

0/150

提交評論