最近学校举办了一个智能小车比赛,比赛内容为用手机蓝牙控制小车拥有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舵机和PWMSCON=0x50;PCON=0x00;TH0=(65536-100)/256;//定时0.1msTL0=(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