久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4557|回復: 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();                                 //否則尋跡
                                }
                        }
        }
}


回復

使用道具 舉報

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呢

串口助手
回復

使用道具 舉報

ID:1531 發表于 2021-9-23 11:15 | 顯示全部樓層
沒看到藍牙程序呀
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看不卡av | 国产欧美视频一区二区三区 | 久久久福利 | 国产日韩精品一区二区 | 日韩精品一区二区三区中文字幕 | 欧美不卡一区二区三区 | 国产精品一二区 | 成人免费三级电影 | 日韩一级电影免费观看 | 国产成人精品久久二区二区 | 精品一区二区免费视频 | 玖玖色在线视频 | 日本欧美在线视频 | 欧美激情精品久久久久久 | julia中文字幕久久一区二区 | www.五月天婷婷 | 蜜桃一区 | 精品久| 欧美一区二区在线播放 | 二区亚洲 | 中文字幕精品视频 | 免费国产视频 | 一区二区三区四区在线视频 | 免费视频二区 | 日韩在线电影 | 日日噜噜噜夜夜爽爽狠狠视频, | 日韩在线电影 | 欧美视频日韩 | 中文字幕人成乱码在线观看 | 亚洲国产精品一区二区第一页 | 国产精品一区在线观看 | 欧美日韩综合 | 精精国产xxxx视频在线 | 国产一区久久久 | 成人免费淫片aa视频免费 | 亚洲精品www. | 国产三级国产精品 | 国产黄色在线观看 | 91综合网 | 亚洲精品无 | 国产一二三区免费视频 |