![]() |
發(fā)布時間: 2020-8-8 10:35
正文摘要:樓主使用串口通信控制從機行為,仿真發(fā)現(xiàn)從機行為不穩(wěn)定,實際燒錄后發(fā)現(xiàn)主機單次按鍵傳輸數(shù)據(jù)次數(shù)過多,而且次數(shù)不穩(wěn)定無法確定穩(wěn)定次數(shù),進行按鍵消抖后也沒法清除這種情況,我想按鍵按下后只傳輸一次數(shù)據(jù)作為地址 ... |
記住: 串行通訊時,如果一個數(shù)據(jù)串入了,你必須在一個串行周期內(nèi)將它取走,否由下一個數(shù)據(jù)來了,它就會被沖掉。 你的程序能不能做到這一點呢?會不會數(shù)據(jù)來了,你的程序還在某個地方DELAY呢? |
知道你用bai的是51核的單片機,但du不知道你用的是哪一種規(guī)格型號?K1接的哪根I/O?這根I/O會不會與外部中斷有關?單片機是否開放了外部中斷?會不會因外部中斷的高優(yōu)先級別導致這種現(xiàn)象的發(fā)生?會是增強型的51單片機嗎?如果是,那么K1相關I/O又是如何配置的呢? |
核心思想:以按鍵松開作為執(zhí)行標準。 PS:你那個消抖處理時間也太長了吧!!! |
你沒做按鍵按下時長的處理,按下發(fā)送完一邊如果你沒及時松開按鍵而程序又進行第二次掃描就會再次發(fā)送數(shù)據(jù)了,你可以試一下不同按下按鍵到放開的時間,你一直按下就會一直發(fā)送了。 |
本帖最后由 wulin 于 2020-8-8 21:20 編輯 void button() { unsigned char k; if(!key1||!key2||!key3) { delay(20); if(!key1||!key2||!key3) { if(!key1) k=address_one; else if(!key2) k=address_two; else if(!key3) k=address_three; SBUF=k; while(!TI); TI=0; while(!key1||!key2||!key3); } } } |
Powered by 單片機教程網(wǎng)