这次我做的一个智能小车项目,可以延着黑线循迹,小于50cm自动避障,计数等等功能。
小车的功能如下:
1)开关S1控制全功能按钮。按一下开关S1开启全功能模块,长按S1, 2s及以上时间退出。全功能模块主要包括循迹跟着黑色线循迹,小车根据红外识别结果进行循迹;到达停止线之后结束循迹,执行继续前行任务,然后路过黑色计数线,统计路过的黑线条数;接着继续前行直到前方50cm遇到障碍物右转;右转之后遇到黑线停止;结束任务,结束之后4个LED 以二进制的形式显示计数结果;
(2)开关 S2 为红外控制按钮。按一下开关S2开启红外测试模式,4个红外对应4个灯,红外检测到黑线对应的灯亮;长按 S2,2s及以上时间退出;
(3)开关 S3 为电机控制按钮。按一下开关 S3 电机正转,车子全速往前走;连续按两下开关S3电机反向,全速倒退;长按 S3,2s及以上时间退出;
(4)开关S4为电机控制按钮。开启S3的情况下。按一下 S4,车子转速变为原来的一半,连续按两下恢复原速。
在后面,我用了蓝牙作为开关,实训了用手机控制小车。
(5)这里用到3个定时器,写的不好的地方,各位大佬多多指教.
代码如下:
#include "wave.h"
#include "ray.h"
//定时器0用于pwm
void time0Init();//定时器0的初始化
void time0FW();
//定时器1用于蓝牙模块
void time1Init();//定时器1的初始化
void Bluetooth();//处理蓝牙接收到的信息
uint pwm=60; //表示启动的时间,60表示启动60ms
uint toray=0;//是否开启循迹功能
uint count=0; //用于计数
uchar bloothFlag;
void main(void)
{
EA=1;//打开总中断
time0Init();//定时器0初始化
time2Init();//定时器2初始化
start();//使车的方向一开始向前
while(1)
{
time1Init();//定时器1初始化
if(toray)
ray();
if( bloothFlag%2)
{
wave();
}
if( bloothFlag%1)
{
time1Init();//定时器1初始化
}
if(count>=100) //100ms一个周期
count=0;
if(count<pwm) //pwm表示启动的时间
//pwm越大 速度越快
forward();
else if(count>=pwm)
stop();
}
}
void time0Init()//定时器0的初始化.
//用于控制高低电平的时间
//定时器比较准确
{
TMOD|=0x01;//工作方式一
//用或运算是为了不改变
//定时器1对应位的值。
TH0=0xfc;
TL0=0x66; //定时1ms
ET0=1;//开启定时器0的中断
TR0=1;//启动定时器0
}
void time0FW() interrupt 1 //定时器0的服务函数
{
TH0=0xfc;
TL0=0x66;
//1ms 中断一次,count加一
count++;
}
void time1Init()//定时器1的初始化
{
TMOD=0x20;//定时器1,工作模式2,8位自动重装模式
TH1=0xfd;//9600波特率,要与蓝牙的一致
TL1=0xfd;
//串口通信方式1
SM0=0;
SM1=1;
PCON=0x00;//波特率不加倍
SCON=0x50;//工作方式一
REN=1;//允许接收
ES=1;//开启串口中断
TR1=1;//启动定时1
}
void Bluetooth() interrupt 4 //中断4
//处理蓝牙接收到的信息
{
uchar shuju;
//等待接收完毕
while(!RI);//当RI为0时没有接收完毕
//信息存存在sbuf中
shuju=SBUF;//获取接收的信息
switch(shuju)
{
case 'f': //前进
forward();
break;
case 'b': //后退
back();
break;
case 'l': //左转
turnLeft();
break;
case 'r': //右转
turnRight();
break;
case 's': //停止
stop();
break;
case 'o':
start();
break;//启动
case 't': //开启循迹功能
toray=1;
break;
case 'z': //开启避障功能
{
wave();
bloothFlag++;
}
break;
case '1': //一档
pwm=20;
break;
case '2': //二档
pwm=40;
break;
case '3': //三档
pwm=60;
case '4': //四档
pwm=80;
break;
case '5': //五档
pwm=100;
break;
default:
break;
}
}
有写的不好地方,请各位大佬多多指教
全部代码51hei附件下载地址:
智能循迹避障小车.zip
(67.48 KB, 下载次数: 20)
|