单片机——智能循迹避障计数小车

各位网友,这次我在实训期间做的一个智能小车项目,可以延着黑线循迹,小于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,车子转速变为原来的一半,连续按两下恢复原速。

在后面,我用了蓝牙作为开关,实训了用手机控制小车。

代码如下:

#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; }

}

有写的不好地方,请各位大佬多多指教。

经验分享 程序员 微信小程序 职场和发展