最近学校举办了一个智能小车比赛,比赛内容为用手机蓝牙控制小车拥有5个功能,分别是超声波舵机避障,测距(显示在LCD1602上),红外跟随,循迹还有蓝牙控制小车前进后退左转又转以及停止。
文章目录
- 蓝牙控制所有功能
- 一、整体思路
- 二、代码部分
- 1、定时器初始化
- 2、蓝牙部分控制所有功能
- 3、红外跟随
- 4、循迹
- 三、完整代码
前言
基于51单片机的智能小车是比较基础的小车,很适合初学者学习
一、整体思路
这款小车单片机的芯片是52RC的,是有3个定时器T0,T1,T2,一般51的是只有两个定时器T0和T1,在这里我们将PWM模块和舵机共用一个定时器T0,定时器T1用于超声波,定时器T2用做串行口的波特率给蓝牙使用。
二、代码部分
1.定时器初始化
void TimeInit()
{
T2MOD=0x01;//蓝牙
T2CON=0x30;
TH2=0xfd;
TL2=0xfd;
RCAP2H=0xFF;
RCAP2L=0xDC;
TMOD|=0x11;//定时器1用于超声波,定时器0舵机和PWM
SCON=0x50;
PCON=0x00;
TH0=(65536-100)/256;//定时0.1ms
TL0=(65536-100)%256;
TH1=0x00;
TL1=0x00;
TR2=1;
ET1=1;
ET0=1;
PS=1;
EA=1;
TR0=1;
ES=1;
PT1=0;
IE=0x92;
}
2.蓝牙部分控制所有功能
while(1) //程序主循环
{
if(flag_REC==1) //
{
flag_REC=0;
if(buff[0]=='O'&&buff[1]=='N') //第一个字节为O,第二个字节为N,第三个字节为控制码
switch(buff[2])
{
case up : // 前进
send_str( );
run();
ShowPort=LedShowData[1];
break;
case down: // 后退
send_str1( );
back();
ShowPort=LedShowData[2];
break;
case left1: // 左转
send_str3( );
leftrun();
ShowPort=LedShowData[3];
break;
case right1: // 右转
send_str2( );
rightrun();
ShowPort=LedShowData[4];
break;
case stop: // 停止
send_str4( );
ShowPort=LedShowData[0];
stop1();
break;
case csbcj: //舵机超声波测距
send_str5( );
ShowPort=LedShowData[5];
Robot_Avoidance();
break;
case hwgs: //红外跟随
send_str6( );
ShowPort=LedShowData[6];
Hwgs();
break;
case xj: //循迹 寻黑线
send_str7( );
ShowPort=LedShowData[7];
Hwgs();
break;
}
}
}
3.红外跟随
void Hwgs()
{
while(1)
{
if(LeftIRBZ==1&&RightIRBZ==1)
stop1(); //调用停止函数 前面没有光线
if(LeftIRBZ==1&&RightIRBZ==0) //右边检测到红外信号
{
rightrun2(); //调用小车右转函数
delay(1);
}
if(RightIRBZ==1&&LeftIRBZ==0) //左边检测到红外信号
{
leftrun2(); //调用小车左转函数
delay(1);
}
if(RightIRBZ==0&&LeftIRBZ==0) //两边传感器同时检测到红外
{
run(); //调用前进函数
delay(1); //前进40毫秒
}
if(buff[2]!=hwgs)return;
}
return;
}
4.循迹
在这里我们用到的是三路循迹,有的小车可能有4路、5路循迹, 在这里可以自己根据PWM调节速度。
void Robot_Traction() //机器人循迹子程序
{
if(Left_1_led==0&&mid_1_led==1&&Right_1_led==0)//亮的时候为0,不亮才检测到黑线
{
run1();
}
if(Left_1_led==1&&mid_1_led==1&&Right_1_led==0)
{
left2();
}
if(Left_1_led==1&&mid_1_led==0&&Right_1_led==0) //原地向左旋转
{
leftrun();
}
if(Left_1_led==0&&mid_1_led==1&&Right_1_led==1)
{
right2();
}
if(Left_1_led==0&&mid_1_led==0&&Right_1_led==1) //原地向右旋转
{
rightrun();
}
if(Right_1_led==1&&Left_1_led==1)
{
run();
}
}
三、完整代码
下面是完整的代码
https://pan.baidu.com/s/1CYsrn7LoVRdI6DA6AxBVkw
链接:https://pan.baidu.com/s/1CYsrn7LoVRdI6DA6AxBVkw
提取码:srkl
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)