A. 單片機消抖
去抖就是檢測到中斷電平後需要隔一段時間(幾十個ms)再去檢測一次。因為IO的抖動也可能有高低電平變化而被單片機檢測到,而真正的按鍵是持續100ms以上的,所以通過延時去抖可以判別出來。
B. 單片機定時中斷實現按鍵掃描消抖程序,有何利弊
中斷會終止當前主程序運行,中斷執行完成後主程序繼續執行,總中斷可能會打亂主程序時序。
C. 單片機程序中多個按鍵的消除抖動怎麼處理呢
有個想法,不知道行不行。對100個鍵進行編碼。
先掃描一次所有的鍵,保存可能被按下的鍵碼進數組,延時,再根據保存數組中的鍵碼進行掃描,得到被按下的鍵的鍵碼
D. 求51單片機按鍵中斷消抖程序
用if語句判斷一下唄比如
{
if(按鍵1按下)
{
延時10毫秒;
if(按鍵1按下)
{
這里寫你按鍵1按下要執行的程序
}
}
}
E. 外設鍵盤的工作原理
有人知道外設鍵盤的工作原理嗎?沒有的話就跟我來看看咯!以下就是我做的整理,希望大家能喜!
外設鍵盤的簡介
鍵盤是一組按鍵的組合,它是最常用的單片機輸入設備,操作人員可以通過鍵盤輸入數據或命令,實現簡單的人機對話。單片機使用的鍵盤是一種常開型的開關,通常鍵的兩個觸點處於斷開狀態,按下鍵時它們才閉合。鍵盤分編碼和非編碼鍵盤,鍵盤的識別可用軟體識別也可用專用晶元識別。
MCS-51單片機擴展鍵盤介面的 方法 用很多,從硬體結構上,可通過單片機I/0介面擴展鍵盤,也可通過擴展I/O介面設計鍵盤,還有些用的是專用鍵盤晶元。
鍵盤的工作原理
鍵盤從結構上分為獨立式鍵盤與矩陣式鍵盤。一般按鍵較少時採用獨立式鍵盤,按鍵較多時採用矩陣式鍵盤。
(1) 獨立式鍵盤。
在由單片機組成的測控系統及智能化儀器中,用的最多的是獨立式鍵盤。這種鍵盤具有硬體與軟體相對簡單的特點,其缺點是按鍵數量較多時,要佔用大量口線。圖1是一個利用MCS-51單片機的P1口設計的非編碼鍵盤。
圖1 獨立式鍵盤
當按鍵沒按下時,CPU對應的I/O介面由於內部有上拉電阻,其輸入為高電平;當某鍵被按下後,對應的I/O介面變為低電平。只要在程序中判斷I/O介面的狀態,即可知道哪個鍵處於閉合狀態。以下是非編碼鍵盤鍵處理子程序。
JNB P1.0, KEY00 ;轉按鍵1處理程序
JNB P1.1, KEY01 ;轉按鍵1處理程序
JNB P1.2, KEY02 ;轉按鍵1處理程序
JNB P1.3, KEY03 ;轉按鍵1處理程序
JNB P1.4, KEY04 ;轉按鍵1處理程序
JNB P1.5, KEY05 ;轉按鍵1處理程序
JNB P1.6, KEY06 ;轉按鍵1處理程序
JNB P1.7, KEY07 ;轉按鍵1處理程序
RET ;無鍵按下,返回
KEY00: …
RET
KEY01: …
RET
…
(2) 矩陣式鍵盤。
矩陣式鍵盤使用於按鍵數量較多的場合,它由行線與列線組成,按鍵位於行、列的交叉點上。一個3*3的行列結構可以構成一個有9個按鍵的鍵盤。同理,一個4*4的行列可以構成一個16按鍵的鍵盤。很明顯,在按鍵數量較多的場合,與獨立式鍵盤相比,矩陣式鍵盤要節省很多I/0介面。
2.鍵盤按鍵識別方法
(1)掃描法。
下面以圖2的K2鍵按下為例,說明此鍵是如何識別出來的。
圖2 8031與鍵盤連接
掃描法有行掃描和列掃描兩種,無論採用哪種,無論採用哪種,其效果是一樣的,只是在程序中的處理方法有所區別。下面以列掃描法為例來介紹掃描法識別按鍵的方法。首先在鍵處理程序中將P1.4-P1.7依次按位變低,P1.4-P1.7在某一時刻只有一個為低。在某一位為低時讀行線,根據行線的狀態即可判斷出哪一個按鍵被按下。如2號鍵按下,當列線P1.5為低時,讀回的行線狀態中P1.0被拉低,由此可知K2鍵被按下。一般在掃描法中分兩步處理按鍵,首先是判斷有無鍵按下,如行線有一個為低,則有鍵按下。當判斷有鍵按下時,使列線依次變低,讀行線,進而判斷出具體哪個鍵被按下。
(2)線反轉法。
掃描法是逐行或逐列掃描查詢,當被按下的鍵處於最後一列時,要經過多次掃描才能最後獲得此按鍵所處的行列值。而線反轉法則顯的簡練,無論被按的鍵處於哪列,均可經過兩步即能獲得此按鍵所在的行列值,仍以圖4.38為例來介紹線反轉法。
首先將行線P1.0-P1.3作為輸入線,列線P1.4-P1.7作為輸出線,並且輸出線輸出全為低電平,讀行線狀態,則行線中電平為低的是按鍵所在的行。然後將列線作為輸入線,行線作為輸出線,並將輸出線輸出為低電平,讀列線狀態,則列線是電平為低的是按鍵所在的列。綜合上述兩步結果,確定按鍵所在的行和列,從而識別出所按下的鍵。
假設10號鍵被按下,在第一步P1.3-P1.0全為低電平時,讀P1.4-P1.7的值,則P1.5為低電平;在第二步P1.4-P1.7輸出全為低電平時,讀P1.3-P1.0時,P1.2為低電平。由此可判斷第3行第2列有鍵被按下,此鍵就是K10鍵。
3. 鍵盤的介面電路
設計MCS-51單片機鍵盤時可根據單片機系統的實際情況來靈活處理。在使用內部有程序存儲器的單片機時,如單片機的I/O介面夠用,可直接利用單片機的I/O介面連接鍵盤。如果I/O介面不夠用,可利用擴展I/O介面連接鍵盤,有時也可使用專用的鍵盤介面晶元。
(1) 利用單片機的I/O介面連接鍵盤。
利用MCS-51單片機的I/O介面連接鍵盤時分兩種情況,一是當P0、P1、P2、P3均為普通輸入/輸出時,可使用任意I/0介面連接鍵盤;二是當單片機系統擴展程序存儲器、數據存儲器、I/O時,由於P0、P2作為地址數據匯流排的使用,所以擴展鍵盤時只能使用P1口、P3口。如圖2所示為利用MCS-51單片機的P1口設計的4*4矩陣鍵盤。
注意如果用P0口設計鍵盤,要給P0口各口線提供上拉電阻,其大小一般為2-10kn。
(2) 利用擴展I/O介面設計鍵盤。
MCS-51單片機在匯流排擴展凡是時由於P0口、P2口分別作為數據匯流排及地址匯流排,而P1口、P3口又有其他用途時,擴展鍵盤可利用擴展的I/O介面。利用8255的PC口設計的4*4矩陣鍵盤如圖3所示,利用8255的PC口設計的編碼鍵盤,PC0-PC3為行輸入,PC4-PC7為列輸出。
圖3 8255與鍵盤連接圖
(3) 按鍵去抖。
由於通常的按鍵所用的開關是機械開關,當開關閉合、斷開時並不是馬上穩定地接通和斷開,而是在閉合與斷開瞬間均伴隨有一連串的抖動。
為了確保CPU對鍵的一次閉合僅做一次處理,必須要在程序或硬體上進行防抖處理。為節省硬體,通常在單片機系統中,一般不採用硬體方法消除鍵的抖動,而是用軟體消抖方法。即檢測鍵閉合後延時5-10ms,讓前延抖動消失後再一次檢測鍵的狀態,如果仍保持閉合狀態電平,則確認真正有鍵按下。當檢測到按鍵釋放後,也要給5-10ms的延時,待後延抖動消失後才轉入該鍵處理程序。以下是具有消抖功能的鍵程序,只有按鍵按下再放開後才做一次鍵處理。
KEY_00:
JB P1.0, KEY_01 ;無鍵按下,查下一個鍵
LCALL DELAY ;延時10ms
JNB P1.0, $ ;鍵一直按下,等待
LCALL DELAY ;鍵松開,延時10ms
JB P1.0, KEY_00 ;一次按鍵完成,轉鍵盤處理程序
KEY_01: …
RET
(4) 鍵盤的編碼。
對於獨立式按鍵鍵盤,由於按鍵數目較少,可根據實際情況靈活編碼。對於矩陣式鍵盤,按鍵的位置由行號和列號唯一確定,所以分別對行號與列號進行二進制編碼,然後將兩值合成一個位元組,高4位是行號,低4位是列號。如10號鍵被按下時,列號讀回的值為1011,行號讀回的值為1101,此兩值合成為11011011=0DBH,據此值可轉到10號鍵處理程序。這種方式雖然簡單,但其離散性很大,在讀程序時必須要結合硬體電路。也可將讀回的鍵值按一定的方式運算後,算出對應的鍵值進行散轉,但這樣會增加程序的工作量,因而大多數單片機系統在鍵盤處理程序中只根據讀回的鍵值進行散轉。
(5) 常用的專用鍵盤晶元。
無論是利用CPU的I/O介面擴展鍵盤,還是利用擴展I/O晶元擴展鍵盤,由於均是用普通I/O介面擴展,如果要在單片機的程序中設計專用的鍵盤程序,特別是矩陣式鍵盤,其程序相對復雜一些。因而在較復雜一些的單片機系統中可選用專用的鍵盤晶元設計鍵盤。現常用的鍵盤擴展晶元有Intel8279、CH451、ICM7218、PCF8574等。
(6) 單片機對鍵盤的控制方式。
在單片機應用系統設計中,為了節省硬體,無論是採用獨立式鍵盤還是採用矩陣式鍵盤,單片機對鍵盤的控制有以下3種方式。
i 程序控制掃描方式。
這種方式只有單片機空閑時,才可調用鍵盤掃描子程序,查詢鍵盤的輸 入狀態是否改變。
ii 定時掃描方式。
單片機對鍵盤的掃描也可採用定時掃描方式,即單片機每隔一定的時間對鍵盤掃描一次。在這種方式中,通常採用單片機內部的定時器,產生10ms的定時中斷,CPU響應定時中斷請求後對鍵盤進行掃描,以查詢鍵盤是否有鍵按下。
iii 中斷掃描方式。
雖然採用程序查詢與定時對鍵盤的掃描方式時的程序編制簡單,但一個單片機系統在運行時的大多數時間里鍵盤基本是不工作的。為了進一步提高CPU的工作效率,可採用中斷方式。當鍵盤有鍵動作時產生中斷,CPU響應鍵盤中斷後,執行鍵盤中斷程序,判別鍵盤按下鍵的鍵號,並做相應處理。
F. 單片機按鍵去抖動有哪些方法
在按鍵上增加電容去除干擾,在按鍵上串一個電阻也可以解決靜電或者是其他干擾對按鍵造成的干擾。
軟體去抖動也是一種非常常見的去抖動的方法,就是對按鍵進行多次的檢測,每次檢測都被按下,才認為按鍵被按下。軟體去抖動要採用多次採集的方法,中間的間隔可以使用延時或者使用分時的思想來進行去抖動,一般的軟體去抖中都是用分時思想去抖動。
(6)鍵盤消抖程序單片機擴展閱讀:
注意事項:
按鍵穩定閉合時間長短是由操作人員決定的,通常都會在100ms以上,刻意快速按的話能達到40-50ms左右,很難再低了。抖動時間是由按鍵的機械特性決定的,一般都會在10ms以內。
為了確保程序對按鍵的一次閉合或者一次斷開只響應一次,必須進行按鍵的消抖處理。當檢測到按鍵狀態變化時,不是立即去響應動作,而是先等待閉合或斷開穩定後再進行處理。
利用電容的充放電特性來對抖動過程中產生的電壓毛刺進行平滑處理,從而實現消抖。但實際應用中,這種方式的效果往往不是很好,而且還增加了成本和電路復雜度,所以實際中使用的並不多。
G. 單片機消抖延時程序
#include<reg52.h>
bit KEYFlag = 1; //指示按鍵狀態,'1'為彈起態,'0'按下態
/********************************
按鍵去抖
*********************************/
void KEYDelay()
{
unsigned char i = 200;
while(i--);
}
/********************************
鍵翻譯
*********************************/
unsigned char KEY_Tran(unsigned char Key)
{
switch(Key)
{
case 0xee: return 0; break; //根據按鍵編碼返回對應的鍵值
case 0xde: return 1; break;
case 0xbe: return 2; break;
case 0x7e: return 3; break;
case 0xed: return 4; break;
case 0xdd: return 5; break;
case 0xbd: return 6; break;
case 0x7d: return 7; break;
case 0xeb: return 8; break;
case 0xdb: return 9; break;
case 0xbb: return 0x0a;break;
case 0x7b: return 0x0b;break;
case 0xe7: return 0x0c;break;
case 0xd7: return 0x0d;break;
case 0xb7: return 0x0e;break;
case 0x77: return 0x0f;break;
default: break;
}
}
/********************************
鍵掃描
*********************************/
unsigned char KEY_Scan()
{
unsigned char KEY_Value;
P2 = 0x0f;
KEY_Value = P2;
P2 = 0xf0;
KEY_Value |= P2;
return KEY_Value;
}
/********************************
查鍵
*********************************/
void KEY()
{
static bit KEYFlag = 1;
static unsigned char KEYCode;
if(KEYFlag)
{
if(KEY_Scan()!=0xff)
{
KEYCode = KEY_Scan();
KEYDelay();//有按鍵按下延時去抖
if(KEYCode==KEY_Scan())
{
// 鍵號 = KEY_Tran(KEYCode);
// 此處添加功能模塊
KEYFlag = 0;
}
}
}
else
{
if(KEY_Scan()==0xff)
{
KEYDelay();//按鍵彈起延時去抖
if(KEY_Scan()==0xff)
KEYFlag = 1;
}
}
}
H. 求51單片機利用定時器消抖的程序!!
定時器消抖就是利用定時器運行一段時間以消耗一段程序運行周期達到延時目的,再關閉定時器,如果你的想法是這樣那很好辦,一般我們都用delay函數來粗虐延時,你只要將TRx=1(定時器1或0的開關)去替換delay就行,然後根據定時器的初始化來確定延時長短,然後進去中斷服務函數,重裝初值後TRx=0,關閉定時器就行了,然後下一次消抖又打開,進去中斷又關閉,這樣反復就達到了延時目的。
有其他想法可以回復一起討論。
希望我的回答能幫助到你。
I. 單片機使用狀態機無延時按鍵消抖是怎樣的原理
狀態機,自動化專業一般比較願意吹噓這種花架子。
它是定時(比如20ms)檢測一遍各個變數,得到的數據,就稱為一個狀態。
隔一會,檢測一遍,得到一個狀態。
再隔一會,再檢測一遍,再得到一個狀態。
。。。
每次檢測後,對前後的狀態進行比較,由其不同的變化,執行相應的程序。
其實,這就是一個巡邏哨,很有可能錯過有用的信息。
這種方法,並不如直接掃描法更直接,更加穩定可靠。
J. 單片機鍵盤如何消抖
一般按鍵按下時,往往會出現所按的按鍵在閉合和斷開位置之間跳幾下才穩定在閉合狀態這就是按鍵抖動。抖動持續時間不一,一般不會大於10MS。
據此,在按下按鍵時,延時10MS,就可消除抖動。
程序可以這樣:
JB KEY1,$ ;等待按鍵按下,這只是個例子,用了$。如果幾個按鍵,KEY1沒按下,可以轉到判斷第2 個鍵
ACALL DL10MS
JNB KEY1,$-2 ;等待釋放,未釋放跳到上一條繼續延時
.... ;鍵 按下,執行按鍵處理程序