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

     各位网友,这次我在实训期间做的一个智能小车项目,可以延着黑线循迹,小于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;
    }

}


 

 

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

 

 

 

 

 

 

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值