标题: 单片机红外控制遥控车程序的问题 我真的有很多问号 [打印本页]

作者: 壮大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:可不可以用手机上一个软件实现和我手里这个遥控器发射一摸一样数据格式,我的遥控器数据格式是


作者: 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
game灬boy 发表于 2020-3-29 15:13
direction();可以发出来吗?  你的程序应该是IrValue[2]=0x18;然后电机的信号线的状态变为前进状态;当IrV ...

direction 里面就是对P1总线赋值
direction(u8 i)
{
        P1=i;
}
P1八个IO口控制两个L293D的信号,以此来让电机正反转
作者: game灬boy    时间: 2020-3-30 12:03
壮大51 发表于 2020-3-30 10:12
direction 里面就是对P1总线赋值
direction(u8 i)
{

main你应该可以改成
while(1)
{
if (IrValue[2]==0x18)
  direction(0x55);
else
direction(0x00);
}
作者: game灬boy    时间: 2020-3-30 12:08
壮大51 发表于 2020-3-30 10:12
direction 里面就是对P1总线赋值
direction(u8 i)
{

你也说了“因为我在操作完direction函数后,用IrValue[2]=0把数据码清空了,所以在下一次循环时就不会执行direction”
所以你的P1状态为上次操作后的状态即 P1=0x55;电机前进,而后面的程序没有对P1的状态进行改变;所以车一直前进




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1