[問題] 控制8051的C語言程式!

看板C_and_CPP作者 (Frog )時間15年前 (2009/04/13 19:53), 編輯推噓5(509)
留言14則, 3人參與, 最新討論串1/1
這個程式是用Keil uVision3來控制或模擬8051 而控制的方法是一開始都不會動作 之後觸發某隻腳會輸入high訊號,之後會開始動作(觸發腳設為P1_7) 而觸發腳的high就要恢復為low(大約就等於彈簧按鈕會復歸原位) 之後再觸發一次動作會停止 這是c語言的程式,我覺得大概方向是對的 在動作方面雖然啟動觸發正常,但是在結束的觸發就沒反應 不知道是不是在宣告變數那邊要換別種類型? 希望有大大能幫解惑^^" #include<AT89X51.H> void delayms(unsigned int time); main() { while(1) { unsigned char j,k = 0; if(P1_7 == 0) { k = ~k; } while(k) { for(j=0x01; j<0x80; j<<=1) { P2 = j; delayms(200); } for(j=0x80; j>0x01; j>>=1) { P2 = j; delayms(200); } if(P1_7 == 0) { k = ~k; } } } } void delayms(unsigned int time) { unsigned int n; while( time>0 ) { n = 120; while(n>0) n--; time--; } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.126.27.237

04/13 21:01, , 1F
是左右來回跑的燈嘛?
04/13 21:01, 1F

04/13 22:24, , 2F
恩...動作是左右移的燈,不過主要問題在觸發那邊
04/13 22:24, 2F

04/13 23:26, , 3F
要記得你按下按鈕到放開, 中間有一段時間差
04/13 23:26, 3F

04/13 23:28, , 4F
所以第二次觸發跳出while(k)迴圈馬上又進入上面的觸發偵測
04/13 23:28, 4F

04/13 23:28, , 5F
while(k)馬上又成立了..
04/13 23:28, 5F

04/13 23:29, , 6F
另外就是按鈕會有彈跳的問題也要考慮到
04/13 23:29, 6F

04/13 23:46, , 7F
那將第2個按鈕觸發拿掉,只用第一個來觸發不知道還缺什麼
04/13 23:46, 7F

04/13 23:59, , 8F
會掉進無窮迴圈喔..
04/13 23:59, 8F

04/14 00:03, , 9F
或是拿掉第二個, 把while(k)改成if(k)也許可以成功
04/14 00:03, 9F

04/14 00:10, , 10F
拿掉第2個觸發改成if的話動作會變成,按鈕h>開始動作>
04/14 00:10, 10F

04/14 00:11, , 11F
按鈕0>停止動作,變成觸發復原之後影響到狀態= ="
04/14 00:11, 11F

04/14 00:19, , 12F
P1_7 要的二次變成 0 才會停止動作吧?
04/14 00:19, 12F
把修改的主程式部分貼上來 main() { while(1) { unsigned char j,k = 0; if(P1_7 == 0) { k = ~k; } if(k) { for(j=0x01; j<0x80; j<<=1) { P2 = j; delayms(200); } for(j=0x80; j>0x01; j>>=1) { P2 = j; delayms(200); } } } } 是有拿掉第二個觸發跟改成if,不過這樣子好像也有按鈕反應時間的問題 ※ 編輯: apol1033 來自: 59.126.27.237 (04/14 00:22)

04/14 00:29, , 13F
不知道可不可以還是有第二個觸發跟用while,不過第二觸發
04/14 00:29, 13F

04/14 00:29, , 14F
判斷後跳回的地方不會直接跟第一個觸發接觸到?
04/14 00:29, 14F
最後想到一個爛招,將第二觸發內加上延遲,不過按鈕的時間間隔就要自己算好 main() { while(1) { unsigned char j,k = 0; if(P1_7 == 0) { k = ~k; } while(k) { for(j=0x01; j<0x80; j<<=1) { P2 = j; delayms(2000); } for(j=0x80; j>0x01; j>>=1) { P2 = j; delayms(2000); } if(P1_7 == 0) { k = ~k; delayms(5000); } } } } 感覺蠻爛的= ="不穩定,不知道有沒有大大能提出一些意見或者修改@@" ※ 編輯: apol1033 來自: 59.126.27.237 (04/14 00:48)
文章代碼(AID): #19uoUj2F (C_and_CPP)