找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3722|回复: 4
打印 上一主题 下一主题
收起左侧

51单片机的小车,寻迹,避障,测速,蓝牙控制

[复制链接]
跳转到指定楼层
楼主
ID:333108 发表于 2018-5-18 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是代码,还有注释哦~
#include <reg52.h>       //
#include <intrins.h>
#include <math.h>
#include <stdio.h>
/**************1602端口****************/
sbit lcden = P3^2;                 
sbit lcdrs = P3^3;
/***********调试程序端口**********/
sbit led = P2^0;
/*********模式选择端口************/
sbit key = P2^4;
/*********************超声波端口*********************/
sbit trig  = P1^0;                  
sbit echo  = P1^1;
/*****************蓝牙端口******************/
sbit rxd = P3^0;    //接受端
sbit tdx = P3^1;
/*****************测速端口****************/
sbit speed = P3^4;
/***********************电机端口***********************/
/*使能端*/
sbit em1 = P1^4;        //左后
sbit em2 = P1^7;                //右后
sbit em3 = P2^7;                //右前
sbit em4 = P2^3;                //左前
/*电机口*/
sbit in1 = P1^2;        //左后
sbit in2 = P1^3;
sbit in3 = P1^5;                //右后
sbit in4 = P1^6;
sbit in5 = P3^6;                //右前
sbit in6 = P3^7;
sbit in7 = P2^1;                //左前
sbit in8 = P2^2;
/******************寻迹IO口声明********************/
/*白线为0,黑线为1*/
sbit trace1 = P3^5;     /*1路*/
sbit trace2 = P2^5;     /*2路*/
sbit trace3 = P2^6;     /*3路*/
/**********************定义全局变量***********************/
unsigned char code table[] = "0123456789";  //1602显示距离数字
unsigned char code table1[] = "Distance:(cm)";

char code str[] =  "收到指令,向前\n";   //蓝牙数据
char code str1[] = "收到指令,向后\n";
char code str2[] = "收到指令,向左\n";
char code str3[] = "收到指令,向右\n";
char code str4[] = "收到指令,停止\n";
char code str5[] = "收到指令,加速\n"
char code str6[] = "收到指令,减速\n"
/************************宏定义****************************/
/*蓝牙软件*/
#define left     3
#define right    4
#define forword  1
#define reverse  2
#define accelerate 5
#define decelerate 0

/***************函数声明************/
void Stop();
void Forward();
void Reverse();
void Turn_left();
void Turn_right();
unsigned int meas_distance();
/*************************延时函数*****************************/
void Delay(unsigned int z)
{
        unsigned int x, y;      
        for(x = z; x > z; x--)
                for(y = 110; y > 0; y--);   
}
/*其他类的延时函数*/

/**********************初始化模块**************************/
/*************1602写的格式*************/
void writecom(unsigned char com)
{
        P0 = com;
        lcdrs = 0;
        lcden = 0;
        Delay(10);
        lcden = 1;
        Delay(10);
        lcden = 0;               
}
/*初始化1602*/
void init1602()
{
        writecom(0x38);
        Delay(20);
        writecom(0x0c);
        Delay(20);
        writecom(0x06);
        Delay(20);
        writecom(0x01);
        Delay(20);
}
/*初始化超声波*/
void init_UltraSound()  
{  
        trig = 0;       //
        echo = 0;
}
/*初始化电机*/
void init_EM()
{
        em1 = 1;
        em2 = 1;
        em3 = 1;
        em4 = 1;
}
/*初始化中断0*//*超声波用*/
void  init_T0()
{
        TMOD = 0x01;
        TH0 = 0;         
    TL0 = 0;
        EA = 1;
        ET0 = 1;      
}
/*初始化中断4*//*蓝牙用*/
void init_T4()
{
        TMOD = 0x20;  
    TH1 = 0xFd;                     //11.0592M晶振,9600波特率
    TL1 = 0xFd;
    SCON = 0x50;  
    PCON = 0x00;
    TR1 = 1;
        ES = 1;   
    EA = 1;
}

/***********************1602操作****************************/

/*************写的内容**************/
void writedata(unsigned char date)      
{
        P0 = date;
        lcdrs = 1;
        lcden = 0;
        Delay(10);
        lcden = 1;
        Delay(10);
        lcden = 0;
}
/**********1602显示距离,单位(cm)(此处初始化1602)***************/
void lcd_show()              
{
                unsigned int distance;
                unsigned char qian, bai, shi, ge;
                unsigned char num, a;
                init1602();
                writecom(0x80 + 17);
                Delay(20);
                for (num = 0; num < 13; num++)
                {
                        writedata(table1[num]);
                        Delay(25);
                }

        writecom(0xc0 + 17);            
        Delay(50);

        distance = meas_distance();
        qian = distance / 1000;
        bai = (distance / 100) % 10;
        shi = (distance / 10) % 10;
        ge = distance % 10;
        writedata(table[qian]);Delay(25);
        writedata(table[bai]);Delay(25);
        writedata(table[shi]);Delay(25);
        writedata(table[ge]);Delay(25);

        for(a = 0; a < 16; a++)
                {
                        writecom(0x18);
                        Delay(200);
                }

                while(1);
}

/***********测量距离***************/
unsigned int  meas_distance()
{       
                unsigned int distance_data, a;
            trig = 1;
        Delay(20);
        trig = 0;   
        init_T0();      
        TR0 = 1;                               //
        while(echo);                           //返回信息
        distance_data = TH0;                   //计算距离,通过echo高电平的时间进行计算
        distance_data <<= 8;                   //
                distance_data = distance_data|TL0;     //
        distance_data *= 12;                   //
        a = distance_data / 58;                //
                return a;
}

/**********超声波中断返回距离**************/
void Time1() interrupt 1   //
{  
        if(a != 0)
        {
                        TR0 = 0;
                    TL0 = 0x00;
                    TH0 = 0x00;
        }
}

/********************PWM调速函数**********************/
void set_pwm()
{
        unsigned int velocity_factor = 10;
        /*蓝牙发送指令调速*/
        if()                   //加速
        else if()          //减速
        else          //空语句
        {

        }
}
/********************电机转动************************/
void Forward() //前进
{
        in1 = 1;
        in2 = 0;
        in3 = 1;
        in4 = 0;
        in5 = 1;
        in6 = 0;
        in7 = 1;
        in8 = 0;
}

void Stop()  //停止
{
        in1 = 0;
        in2 = 0;
        in3 = 0;
        in4 = 0;
        in5 = 0;
        in6 = 0;
        in7 = 0;
        in8 = 0;       
}

void Reverse()  //倒车
{
        in1 = 0;
        in2 = 1;
        in3 = 0;
        in4 = 1;
        in5 = 0;
        in6 = 1;
        in7 = 0;
        in8 = 1;
}

void Turn_left()  //左转
{
        in1 = 0;
        in2 = 1;
        in3 = 1;
        in4 = 0;
        in5 = 1;
        in6 = 0;
        in7 = 0;
        in8 = 1;
}

void Turn_right()   //右转
{
        in1 = 0;
        in2 = 1;
        in3 = 0;
        in4 = 1;
        in5 = 0;
        in6 = 1;
        in7 = 0;
        in8 = 1;
}

/***************************寻迹函数****************************/
void Trace()  
{  
    if((trace1 == 0) && (trace2 == 0) && (trace3 == 0))           //前进
    {  
            Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 0 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循环
                                }
                                else if(trace1 == 1 && trace3 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }   
    }  


    if((trace1 == 0) && (trace2 == 0) && (trace3 == 1))           //右转
    {  
            Delay(10);
                Turn_right();
                        while(1)
                        {
                                Turn_right();
                                if(trace1 == 1 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Forward();
                                        break;                                //跳出循环
                                }
                                else if(trace1 == 1 && trace3 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }  
    }  

      if((trace1 == 0) && (trace2 == 1) && (trace3 == 0))              //前进
    {  
                       Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 1 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Forward();
                                        break;                                //跳出循环
                                }
                                else if(trace3 == 1 && trace2 == 0)
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循环
                                }
                                else if(trace1 == 1 && trace2 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }  

    if((trace1 == 0) && (trace2 == 1) && (trace3 == 1))         //右转
    {  
                Delay(10);
                Turn_right();
                        while(1)
                        {
                                Turn_right();
                                if(trace1 == 0 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循环
                                }
                                else if(trace1 == 1 && trace3 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }  
    }  

        if((trace1 == 1) && (trace2 == 0) && (trace3 == 0))       //左转
    {  
                Delay(10);
                Turn_left();
                        while(1)
                        {
                                Turn_left();
                                if(trace1 == 1 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Forward();
                                        break;                                //跳出循环
                                }
                                else if(trace1 == 0 && trace3 == 1)
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }

        if((trace1 == 1) && (trace2 == 0) && (trace3 == 1))       //前进
    {  
                        Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 0 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循环
                                }
                                else if(trace3 == 0 && trace1 == 1)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }

        if((trace1 == 1) && (trace2 == 1) && (trace3 == 0))       //左转
    {  
                Delay(10);
                Turn_left();
                        while(1)
                        {
                                Turn_left();
                                if(trace3 == 1 )                                //一直左转到传感器检测不到为止
                                {
                                        break;                                //跳出循环
                                }
                        }
                        Delay(20);
                        Forward();
    }

    if((trace1 == 1)&&(trace2 == 1)&&(trace3 == 1))        //前进
    {  
            Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 0 && trace3 == 1)                                //一直左转到传感器检测不到为止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循环
                                }
                                else if(trace3 == 0 && trace1 == 1)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循环
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }
}

/**********************蓝牙类函数**********************/
void send_str( )// 传送字串
{
        unsigned char i = 0;
        while(str[i] != '\0')
        {
                SBUF = str[i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
        }       
}
void send_str1( )                  
{
    unsigned char i = 0;
    while(str1[i] != '\0')
    {
                SBUF = str1[i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
    }       
}       

                          void send_str2( )
                   // 传送字串
    {
            unsigned char i = 0;
            while(str2[i] != '\0')
           {
                SBUF = str2[i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }       
    }       
                   
                          void send_str3()
                   // 传送字串
    {
            unsigned char i = 0;
            while(str3[i] != '\0')
           {
                SBUF = str3[i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }       
    }       

              void send_str4()
                   // 传送字串
    {
            unsigned char i = 0;
            while(str4[i] != '\0')
           {
                SBUF = str4[i];
                while(!TI);                                // 等特数据传送
                TI = 0;                                        // 清除数据传送标志
                i++;                                        // 下一个字符
           }       
    }

void Bluetooth()
{
        init_T4();
    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(); Forward();
                                break;

                                case down:                                                // 后退
                                send_str1(); Reverse();
                                break;

                                case left:                                                // 左转
                                send_str2(); Turn_left();
                                break;

                                case right:                                                // 右转
                                send_str3(); Turn_right();
                                break;

                                case stop:                                                // 停止
                                send_str4(); Stop();
                                break;

                                case:

                     }                 
                 }
        }
}

void Time4() interrupt 4          //蓝牙函数最开始启动中断
{
    if(RI)                         //是否接收中断
    {
        RI = 0;
        dat = SBUF;
        if(dat == 'O' && (i == 0)) //接收数据第一帧
        {
            buff[i] = dat;
            flag = 1;        //开始接收数据
        }
        else if(flag == 1)
        {
                 i++;
            buff[i] = dat;
            if(i >= 2)
                 {i = 0; flag = 0; flag_REC = 1;}  // 停止接收
        }
        }
}

///********************测速函数******************/
//void meas_velocity()
//{
//        init_T3();
//        while(1)
//        {       
//                if (P34 == 1)
//            {
//                led = 0;
//            }
//                display();
//                Delay(1);
//        }       
//}
//
//void Time3() interrupt 3  //定时器中断时间到,就读取计数器值
//{
//        TH1 = 0X3C;
//         TL1 = 0XB0;
//         i++;
//        if(i == 20) //1s才进行技术脉冲值显示,即每秒更新一次速度
//        {
//                   kop = TH0;//计数器计入脉冲,每来一个矩形脉冲计数值加1
//                   kop = kop << 8; //
//                   kop = (( kop + TL0) / 20 * (2.5) * (3.14)); //直径
//
//                   qian = kop / 1000;   //                
//                   bai = kop / 100;     //
//                   shi = kop / 10;      //
//                   ge = kop;//               
//
//                i = 0;
//                TH1 = 0;//计数器速度获取后清零,进行下次获取
//                TL1 = 0;
//               
//          }
//}
/***********************检测模式*****************************/
bit Check_key()
{
        bit check_flag = 0;
        if(key == 0)
        {
                return check_flag;
        }
        else
        {
                check_flag = 1;
                return check_flag;
        }
}

/*主函数*/
void main()
{
        bit  pattern_flag;
        init_UltraSound();
        init_EM();
        while(1)
        {
                        pattern_flag = Check_key();
                        if(pattern_flag == 0)
                        {
                                Delay(100);
                                Forward();                                  //最开始是向前走
                                while(1)
                                {
                                        lcd_show();                            //1602已经初始化
                                        Delay(10);
                                        init_UltraSound();
                                        Delay(60);
                                }       
                        }
                        else
                        {
                                Delay(100);
                                Forward();
                                while(1)
                                {
                                        Trace();                                 //否则寻迹
                                }
                        }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:333108 发表于 2018-5-18 16:41 | 只看该作者
有的函数还没完善,下次改进
回复

使用道具 举报

板凳
ID:419294 发表于 2018-11-7 16:23 | 只看该作者
有没有蓝牙APP呢
回复

使用道具 举报

地板
ID:636540 发表于 2021-5-30 12:38 | 只看该作者
Dremt 发表于 2018-11-7 16:23
有没有蓝牙APP呢

串口助手
回复

使用道具 举报

5#
ID:1531 发表于 2021-9-23 11:15 | 只看该作者
没看到蓝牙程序呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表