作者apol1033 (Frog )
看板C_and_CPP
標題[問題] 控制8051的C語言程式!
時間Mon Apr 13 19:53:16 2009
這個程式是用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
1F:推 areyo:是左右來回跑的燈嘛? 04/13 21:01
2F:→ apol1033:恩...動作是左右移的燈,不過主要問題在觸發那邊 04/13 22:24
3F:推 TroyLee:要記得你按下按鈕到放開, 中間有一段時間差 04/13 23:26
4F:→ TroyLee:所以第二次觸發跳出while(k)迴圈馬上又進入上面的觸發偵測 04/13 23:28
5F:→ TroyLee:while(k)馬上又成立了.. 04/13 23:28
6F:→ TroyLee:另外就是按鈕會有彈跳的問題也要考慮到 04/13 23:29
7F:→ apol1033:那將第2個按鈕觸發拿掉,只用第一個來觸發不知道還缺什麼 04/13 23:46
8F:推 TroyLee:會掉進無窮迴圈喔.. 04/13 23:59
9F:推 TroyLee:或是拿掉第二個, 把while(k)改成if(k)也許可以成功 04/14 00:03
10F:→ apol1033:拿掉第2個觸發改成if的話動作會變成,按鈕h>開始動作> 04/14 00:10
11F:→ apol1033:按鈕0>停止動作,變成觸發復原之後影響到狀態= =" 04/14 00:11
12F:推 TroyLee:P1_7 要的二次變成 0 才會停止動作吧? 04/14 00:19
把修改的主程式部分貼上來
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)
13F:→ apol1033:不知道可不可以還是有第二個觸發跟用while,不過第二觸發 04/14 00:29
14F:→ apol1033:判斷後跳回的地方不會直接跟第一個觸發接觸到? 04/14 00:29
最後想到一個爛招,將第二觸發內加上延遲,不過按鈕的時間間隔就要自己算好
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)