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

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

python智能车遇到障碍物代码 智能小车识别障碍物_python智能车遇到障碍物代码

python智能车遇到障碍物代码 智能小车识别障碍物_python智能车遇到障碍物代码_02

 

python智能车遇到障碍物代码 智能小车识别障碍物_红外_03

代码如下:

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