1樓:匿名使用者
寫程式之前一定要先從系統的級別構建一下程式的結構。
你的程式中,有數碼管掃瞄顯示、按鍵掃瞄兩部分。
在構建程式結構的時候,考慮到幾個部分的特點,一般情況如下:
1、為了保證顯示不閃,應在20ms內完成一次顯示重新整理,假設你用了10個數碼管數字。
2、按鍵是隨機的,需要檢測,一般按鍵按下的時間不小於50ms,可以考慮在10ms檢測一次按鍵。
程式可以定義乙個1ms的定時器,設定幾個變數對定時器進行計數。
每個1ms定時到時,自加對定時器的計數,並更新數碼管顯示,10ms更新完10個數碼管。
每到10ms檢測一次按鍵,記錄狀態,與上次狀態進行比較,如果連續兩次或三次檢測到按鍵按下,設定按鍵動作的標記,並確定如何更改顯示,改變視訊記憶體。
如果數碼管需要調整亮度,可以將1ms定時器改為100us,分給每個數碼管的1ms內,改變其點亮的時間,就可以調出十種亮度。
用這種架構做這個程式,處理器負擔很輕,對所有的外設的響應一樣迅速。你會感到51微控制器還是能幹很多活的。比如你的程式增加乙個rtc模組,可以每100ms重新整理一下rtc時間到視訊記憶體,就可以實現顯示時間。
2樓:
不知道你的按鍵是怎麼接的,但是51微控制器上的按鍵,一般都是檢測低電平,極少有檢測高電平的。你這個應該是按鍵的電平檢測反了,所以當其中乙個按鍵沒有按下,那就一直是
while(s1 == 1);或者while(s2 == 1);死迴圈,所以會出錯
3樓:
1、將delay()的定義,放到main()的前面去,不要在main內宣告函式。
2、51微控制器的輸入輸出一般定義為低電平有效。
3、p0口做io用,必須接上拉電阻。
至於你的程式執行的問題,應該就是按鍵應該低電平有效才對,也就是說,將s1s2的按下判定條件
改為==0,試試。
4樓:匿名使用者
改為下面這樣, 你再試試
if(!s1) //按下s1鍵}if(!s2) //按下s2鍵}
51微控制器程式設計問題?
5樓:匿名使用者
你這微控制器程式跟誰學的這麼寫,三個程式中都有while(1),這是無限迴圈結構,只允許主程式中用,而被呼叫的子程式不能再用了。你現在程式肯定是只執行 zuo(); 這乙個,因為,有while(1),就無限迴圈在這個程式中了,跳不出來,就不會執行另兩個程式的。把三個程式中的while(1)都刪掉。
51微控制器SBUF什麼意思,51微控制器中SBUF中讀出的資料型別
define 巨集定義 unsigned乙個資料型別 還有就是signed 乙個是有符號 乙個是無符號 int資料型別 sbuf是串列埠接送或者傳送資料暫存器 define 是定義乙個常量 unsigned char 定義乙個字元型變數,unsigned int 定義乙個整數型變數購買sea wol...
51微控制器,在按下鍵盤,然後鬆開之後,為什麼電平會恢復
首先宣告本人不是高手,其次p2是不可以位操作的,即使你在p2.4接入乙個按鍵,當你按下按鍵時,p2.4被強制拉成低電平,當你鬆開時當然自動復位,不過想讓他保持,你可以在中斷中加上一條語句如 p2 0xf7 這樣可以保持在中斷時你的p2.4是低電平,其他的具體情況具體對待 請先搞清楚微控制器io口的結...
51微控制器串列埠通訊出現問題,5V微控制器與3 3V微控制器串列埠通訊問題
做而論道 void main 如果是ascii碼,加上引號即可 if sbuf 0 p0 smg 0 通過數碼管顯示接收到的資訊 if sbuf 1 p0 smg 2 通過數碼管顯示接收到的資訊 if sbuf 2 p0 smg 12 通過數碼管顯示接收到的資訊 if sbuf 3 p0 smg 1...