51微控制器如何可以讓外加的常高訊號只處理一次,而且也有按鍵的處理

時間 2022-06-23 18:55:02

1樓:匿名使用者

這種情況一般檢測訊號沿,間隔去取埠的電平,依次放在一個位元組裡。比如<<1,上升沿」就是0x0f 下降沿就是0xff。取字簡易**如下,放在main函式或者定時中斷函式裡迴圈處理就好了

unsigned char keytemp;

void getkey(void){

keytemp<<1;

if(p1.1)

if(0x0f==keytemp)

if(0xf0==keytemp)

if(0xff==keytemp)

if(0x00==keytemp)

}main()}

2樓:匿名使用者

如果是迴圈檢測,那麼你說的這個常置高的訊號跟按鈕處理有什麼不同呢,對於微控制器的高速處理來說,你按得再短,對它來說也是「常置」訊號,「快速輕按」就足夠微控制器處理幾十上百次了。你的按鈕處理不是通過「上升沿」或者「下降沿」訊號來處理的嗎?即檢測到兩個相鄰的高電平和低電平,才做一次有效處理,其它不予理睬。

再或者,可以設定一個標誌位,檢測到高電平後,標誌位置位,檢測到低電平,標誌位清0,那麼每次處理前先檢測一下此標誌位,就可以保證只處理一次了。

3樓:匿名使用者

講清楚一點,幹嘛用,要什麼功能?

微控制器51,出現按一次按鍵,得到多次按鍵的情況,怎麼解決

4樓:匿名使用者

微控制器51,出現按一次按鍵,得到多次按鍵的情況,是由於沒有做「消抖」處理的結果,在軟體上做一些延時消抖處理後,一般就可以解決這個問題。比如:

keyscan()}}

5樓:

在檢測到按鍵時,延時10ms,再次檢測,如果仍然檢測到按鍵按下,才能說明有按鍵按下;

在按鍵檢測函式結束時,新增等待按鍵釋放程式,如while(key_valve!=0);

6樓:

if(key==0)}

怎樣用51微控制器實現累加計時和倒計時,並用六個共陰極數碼管顯示出來。用兩個按鍵分別切換。

7樓:匿名使用者

剛開始上電時, system_mode不是1 也不是2,不知你初始化時是否給它賦值?另外你的按鍵檢測程式沒加入到迴圈程式中,剛上電時若沒有按鍵按下,則很快跳過兩個按鍵檢測語句,然後進入迴圈顯示程式中,這是一個死迴圈,只有中斷才可打斷其執行,所以再按什麼鍵也沒反應了,建議把按鍵檢測放入顯示迴圈中,它對顯示效果不會有什麼影響,或在初始化後加一個迴圈,若兩個按鍵都沒有按下,一直檢測按鍵

51微控制器怎麼處理20個按鍵?

8樓:匿名使用者

最安全,最可靠的方式,是獨立的按鍵;

採用矩陣鍵盤,為了就是節省 io 口的使用

9樓:

採用矩陣鍵盤咯,節省io

效率主要看你怎麼程式設計的,其實也要看你要什麼東西吧

10樓:尼瑪真響亮

用專門的驅動晶片比較好;如果不缺io的話,那就用獨立的。

11樓:匿名使用者

不缺io口獨立按鍵好

微控制器如何接收外部的訊號

12樓:匿名使用者

如果只是開關訊號,那隻要掃描io就行;

如果是脈衝訊號,只要用外部定時計數器或者外部中斷就行,比如光電編碼器;

發射出來的訊號是個週期訊號,不同的按鍵,其編碼不同,編碼中0和1對應的脈衝長度有差別,詳細內容可以看相關的資料。

要實現一直按著音量會一直加(減),這個過程比較複雜,需要微控制器不斷的接收響應,要編寫相應的微控制器程式,之後還需要除錯。

13樓:

我講一下大概的思路哦,有2種辦法:

1.不用改變io的工作方式,採用查詢的方式接收訊號,比如,if( iox == 1 )//檢測到高電平訊號,低電平也一樣,把1改為0

else //否則沒有檢測到高電平訊號2.採用中斷,要改變io為中斷模式,這個可以看一下書,外部中斷那一章。

14樓:匿名使用者

不需要 直接接到i/o口上就可以了

微控制器按鍵按一下,數字只加一。

15樓:藏在水中的人

檢測上升沿,與下降沿,如下程式

unsigned char keyscan( bit key )keystatus = j; //記錄本次按鍵狀態

if( keystatus =1 )

else

}return 0x00;}

16樓:匿名使用者

你又想不停的+1,又想不迴圈,好像不可能吧。

17樓:匿名使用者

你可以用定器,分時去讀key的狀態,讀了就離開,並記錄key狀態維持的時間,來斷別是否有按鍵按下,

18樓:

這樣不是很好嗎,按下只要沒放就在那等待,如果不等待,又會進入下一次按鍵的判斷,這樣可能不是我們想要要的結果,如果你不想在那等,就不用while(!key),程式執行完這個key的過程後,可能會立馬又進入了key函式,那麼,你本來想要加1的,可能在你按的那一下,就加到5、6了。

但是,如果你一定要像你說的那樣的程式,也並不是不行,簡單可行的辦法就是中斷加查尋的方法,中斷的目的是在下降沿時觸發,由於微控制器的外中斷很少,不可能獨立做n多個按鍵,那麼,按鍵還要通過與門連到其他i/o口,有了中斷做為觸發前提,再通過其他i/o口查尋,就可以獲得當前是哪個鍵了。由於中斷是下降沿觸發,所以,每一次按鍵只會出現一個下降沿,反以不管你按下多久,程式執行完了都會立馬退出,而且不會有下一次的誤判。不過這樣做的缺點就是,按鍵越多,硬體(與門)就會用的越多,電路會複雜一些,當然,成本也會相應增加。

一個51微控制器如何同時響應兩個以上按鍵輸入訊號

19樓:回卜去的

如果是輪詢按鍵的話,可以按下key1以後將一個變數i置一,直到鬆開變數i清零,這樣再按key2的時候進去先檢測i是否為0,為0才能進行下一步

20樓:萬頃烽煙

所謂的同時響應是不可能的,無論是掃描還是中斷都有分先後。

你的問題可以參考以下解決方法:

掃描時先記錄key1的狀態,如果為按下則無論下次掃描到什麼狀態都不執行動作,如果是放開的記錄為放開,再次掃描到如果為按下則執行動作。這個掃描可以同時應用於key2兩個不相沖突。

51微控制器 獨立按鍵按下去 再放開才算按鍵一次 計算按鍵次數 程式應該怎麼寫?

21樓:禿賊

你好!因為按鍵操作涉及暫存器配置和按鍵防抖,因此寫了你也不一定用得上。而且你這個的邏輯比較簡單,建議自己寫。主要注意幾個地方就可以了:

按鍵i/o口電平的配置:要結合硬體電路確認按鍵是低電平觸發還是高電平觸發。在程式中設定正確的i/o口電平。

i/o口的輸入輸出狀態的配置:i/o口作為按鍵輸入必須是準雙向模式或輸入模式,這個不同微控制器配置暫存器方式不同但大同小異。

按鍵防抖:在按鍵按下時有時會有短暫的接觸不良,因此會多次判斷按鍵按下和斷開,因此一般在按鍵按下或斷開時增加幾十毫秒的防抖處理,具體就是連續多個迴圈判斷按鍵是否是一個狀態,如果狀態不變,再進行下一步處理。

51微控制器按鍵防抖這麼處理

22樓:

一般是檢測到按鍵按下後,過一段時間再檢測一次,如果兩次都檢測到了說明確實是按鍵按下了。

間隔時間 一般是10-20毫秒。

23樓:匿名使用者

防抖,判斷到埠高電平之後,延時10ms左右,再判斷一次是否還是剛剛的高電平狀態,如果是,再等待按鍵釋放,即while(!key);。跳出這個迴圈之後就表示按鍵事件完成。

那麼就led =~led。

你的程式:if(key == 0) 如果是高電平觸發,那麼大部分時間都在進行led取反,導致過快閃爍,你看不出變化,就看成了長亮。如果是低電平觸發,你按下的每一時刻都在變化,釋放之後,可能是亮的,也可能是滅的

51微控制器的pc值怎麼算,51微控制器中如何進行相對定址?pc值怎麼計算?rel又怎麼給

鈺瀟 a 50h sp 50h 51h 30h 52h 50h pc 5030h a 50h sp 50h 因為在程式中,sp減了兩次,後來又加了兩次,在程式最後ret有在返回的時候減了兩次,即地址出棧,故最終結果是50h。51h 30h 52h 50h 因為ret指令返回時,出棧的結果是高地址 5...

51微控制器學到什麼程度可以學其他的微控制器

不學51微控制器也可以學其他的微控制器 既然學了51微控制器,就不著急學其他的微控制器,先試試學習用51微控制器解決幾個實際問題,哪怕是很簡單的問題都可以。有一定解決實際問題的能力和經歷後,再學其他微控制器就能學到點子上,知道如何才能學以致用。 看你自己的理解情況,好的人可同時學習很多微控制器 以我...

51微控制器init什麼意思,51微控制器的“51”是什麼意思?

51微控制器init 一般初始化函式的函式名。用法 類 alloc init init 是建構函式初始化用,他能初始化啥,都初始化為預設值,alloc 之後就是預設值。51微控制器簡介 51系列微控制器是一個統稱。代表時鐘為12分頻,內部儲存器為哈佛結構 資料和 分別儲存 的一系列8位微控制器。代表...