找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1472|回复: 6
打印 上一主题 下一主题
收起左侧

单片机红外控制遥控车程序的问题 我真的有很多问号

[复制链接]
跳转到指定楼层
楼主
日常提问,丰富自己。。。。

在此提前谢过各位的指点,感激之情,不胜言表!!!!

在此提前谢过各位的指点,感激之情,不胜言表!!!!

在此提前谢过各位的指点,感激之情,不胜言表!!!!



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

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:341045 发表于 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;


                         }
}
回复

使用道具 举报

板凳
ID:367369 发表于 2020-3-29 15:13 | 只看该作者
direction();可以发出来吗?  你的程序应该是IrValue[2]=0x18;然后电机的信号线的状态变为前进状态;当IrValue[2]=0时你的电机的状态没有更新
回复

使用道具 举报

地板
ID:341045 发表于 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;
                         }
}
回复

使用道具 举报

5#
ID:703220 发表于 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的信号,以此来让电机正反转
回复

使用道具 举报

6#
ID:367369 发表于 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);
}
回复

使用道具 举报

7#
ID:367369 发表于 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的状态进行改变;所以车一直前进
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表