標題: 單片機紅外控制遙控車程序的問題 我真的有很多問號 [打印本頁]
作者: 壯大51 時間: 2020-3-29 12:04
標題: 單片機紅外控制遙控車程序的問題 我真的有很多問號
日常提問,豐富自己。。。。
在此提前謝過各位的指點,感激之情,不勝言表!!!!
在此提前謝過各位的指點,感激之情,不勝言表!!!!
在此提前謝過各位的指點,感激之情,不勝言表!!!!
提問背景:我用51單片機開發板配的遙控器制作了一個遙控車,但是發現自己的遙控車和超市買的動作性質是不同的。
遙控原理:我先確定好遙控器每個按鍵發送的數據碼是什么,然后用switch語句進行選擇操作。代碼如下
while(1)
{
switch(IrValue[2])
{
case(0x45):
startstop();IrValue[2]=0;break;
case(0x18):
direction(0x55);IrValue[2]=0;break;
}
}
其中:IrValue[2]是數據碼字節,當IrValue[2]=0x45時,代表按下某一個按鍵發送的數據碼字節內容是0x45
我的問題是:當我按下數據碼為0x18的按鍵時,只能讓小車一直跑,按鍵松手了也一直跑。所以我就想,如果這個遙控器是以一定頻率發射紅外線信號的話,就不會出現這種情況,因為我在操作完direction函數后,用IrValue[2]=0把數據碼清空了,所以在下一次循環時就不會執行direction。所以我下定結論,紅外遙控器沒有以一定頻率發射紅外線信號。那么我要如何去做才能實現遙控器按下,小車跑,遙控器按鍵松開,小車停止呢???(在不換遙控器的前提下)
如果這種遙控器是不可以實現這個功能的,那我要如何才能實現這個功能
PS:可不可以用手機上一個軟件實現和我手里這個遙控器發射一摸一樣數據格式,我的遙控器數據格式是
W8N2MCWGFWWI`}0~BQ_3TI1.png (88.91 KB, 下載次數: 46)
下載附件
2020-3-29 12:03 上傳
作者: lzts88 時間: 2020-3-29 15:06
while(1)
{
switch(IrValue[2])
{
case(0x45):
startstop();IrValue[2]=0;break;
case(0x18):
direction(0x55);IrValue[2]=0;break;
//估計是你還有數據沒截取, 如釋放鍵碼, 新加下面試下
default:
break;
}
}
作者: game灬boy 時間: 2020-3-29 15:13
direction();可以發出來嗎? 你的程序應該是IrValue[2]=0x18;然后電機的信號線的狀態變為前進狀態;當IrValue[2]=0時你的電機的狀態沒有更新
作者: lzts88 時間: 2020-3-29 15:16
//估計是遙控的接收碼你沒列全, 你這樣試下
while(1)
{
switch(IrValue[2])
{
case(0x45):
startstop();IrValue[2]=0;break;
case(0x18):
direction(0x55);IrValue[2]=0;break;
//你應該是截取的數據碼不全, 你試加下面幾句試下
default:
startstop();IrValue[2]=0; //電機停, 接收數據清0, 不是這二句就按你的改
break;
}
}
作者: 壯大51 時間: 2020-3-30 10:12
direction 里面就是對P1總線賦值
direction(u8 i)
{
P1=i;
}
P1八個IO口控制兩個L293D的信號,以此來讓電機正反轉
作者: game灬boy 時間: 2020-3-30 12:03
main你應該可以改成
while(1)
{
if (IrValue[2]==0x18)
direction(0x55);
else
direction(0x00);
}
作者: game灬boy 時間: 2020-3-30 12:08
你也說了“因為我在操作完direction函數后,用IrValue[2]=0把數據碼清空了,所以在下一次循環時就不會執行direction”
所以你的P1狀態為上次操作后的狀態即 P1=0x55;電機前進,而后面的程序沒有對P1的狀態進行改變;所以車一直前進
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |