欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4552|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)的小車,尋跡,避障,測速,藍(lán)牙控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:333108 發(fā)表于 2018-5-18 16:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
下面是代碼,還有注釋哦~
#include <reg52.h>       //
#include <intrins.h>
#include <math.h>
#include <stdio.h>
/**************1602端口****************/
sbit lcden = P3^2;                 
sbit lcdrs = P3^3;
/***********調(diào)試程序端口**********/
sbit led = P2^0;
/*********模式選擇端口************/
sbit key = P2^4;
/*********************超聲波端口*********************/
sbit trig  = P1^0;                  
sbit echo  = P1^1;
/*****************藍(lán)牙端口******************/
sbit rxd = P3^0;    //接受端
sbit tdx = P3^1;
/*****************測速端口****************/
sbit speed = P3^4;
/***********************電機(jī)端口***********************/
/*使能端*/
sbit em1 = P1^4;        //左后
sbit em2 = P1^7;                //右后
sbit em3 = P2^7;                //右前
sbit em4 = P2^3;                //左前
/*電機(jī)口*/
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顯示距離數(shù)字
unsigned char code table1[] = "Distance:(cm)";

char code str[] =  "收到指令,向前\n";   //藍(lán)牙數(shù)據(jù)
char code str1[] = "收到指令,向后\n";
char code str2[] = "收到指令,向左\n";
char code str3[] = "收到指令,向右\n";
char code str4[] = "收到指令,停止\n";
char code str5[] = "收到指令,加速\n"
char code str6[] = "收到指令,減速\n"
/************************宏定義****************************/
/*藍(lán)牙軟件*/
#define left     3
#define right    4
#define forword  1
#define reverse  2
#define accelerate 5
#define decelerate 0

/***************函數(shù)聲明************/
void Stop();
void Forward();
void Reverse();
void Turn_left();
void Turn_right();
unsigned int meas_distance();
/*************************延時(shí)函數(shù)*****************************/
void Delay(unsigned int z)
{
        unsigned int x, y;      
        for(x = z; x > z; x--)
                for(y = 110; y > 0; y--);   
}
/*其他類的延時(shí)函數(shù)*/

/**********************初始化模塊**************************/
/*************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;
}
/*初始化電機(jī)*/
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*//*藍(lán)牙用*/
void init_T4()
{
        TMOD = 0x20;  
    TH1 = 0xFd;                     //11.0592M晶振,9600波特率
    TL1 = 0xFd;
    SCON = 0x50;  
    PCON = 0x00;
    TR1 = 1;
        ES = 1;   
    EA = 1;
}

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

/*************寫的內(nèi)容**************/
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;                   //計(jì)算距離,通過echo高電平的時(shí)間進(jìn)行計(jì)算
        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調(diào)速函數(shù)**********************/
void set_pwm()
{
        unsigned int velocity_factor = 10;
        /*藍(lán)牙發(fā)送指令調(diào)速*/
        if()                   //加速
        else if()          //減速
        else          //空語句
        {

        }
}
/********************電機(jī)轉(zhuǎn)動(dòng)************************/
void Forward() //前進(jìn)
{
        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()  //左轉(zhuǎn)
{
        in1 = 0;
        in2 = 1;
        in3 = 1;
        in4 = 0;
        in5 = 1;
        in6 = 0;
        in7 = 0;
        in8 = 1;
}

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

/***************************尋跡函數(shù)****************************/
void Trace()  
{  
    if((trace1 == 0) && (trace2 == 0) && (trace3 == 0))           //前進(jìn)
    {  
            Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 0 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace1 == 1 && trace3 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }   
    }  


    if((trace1 == 0) && (trace2 == 0) && (trace3 == 1))           //右轉(zhuǎn)
    {  
            Delay(10);
                Turn_right();
                        while(1)
                        {
                                Turn_right();
                                if(trace1 == 1 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Forward();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace1 == 1 && trace3 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }  
    }  

      if((trace1 == 0) && (trace2 == 1) && (trace3 == 0))              //前進(jìn)
    {  
                       Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 1 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Forward();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace3 == 1 && trace2 == 0)
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace1 == 1 && trace2 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }  

    if((trace1 == 0) && (trace2 == 1) && (trace3 == 1))         //右轉(zhuǎn)
    {  
                Delay(10);
                Turn_right();
                        while(1)
                        {
                                Turn_right();
                                if(trace1 == 0 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace1 == 1 && trace3 == 0)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }  
    }  

        if((trace1 == 1) && (trace2 == 0) && (trace3 == 0))       //左轉(zhuǎn)
    {  
                Delay(10);
                Turn_left();
                        while(1)
                        {
                                Turn_left();
                                if(trace1 == 1 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Forward();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace1 == 0 && trace3 == 1)
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }

        if((trace1 == 1) && (trace2 == 0) && (trace3 == 1))       //前進(jìn)
    {  
                        Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 0 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace3 == 0 && trace1 == 1)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }

        if((trace1 == 1) && (trace2 == 1) && (trace3 == 0))       //左轉(zhuǎn)
    {  
                Delay(10);
                Turn_left();
                        while(1)
                        {
                                Turn_left();
                                if(trace3 == 1 )                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        break;                                //跳出循環(huán)
                                }
                        }
                        Delay(20);
                        Forward();
    }

    if((trace1 == 1)&&(trace2 == 1)&&(trace3 == 1))        //前進(jìn)
    {  
            Delay(10);
                Forward();
                        while(1)
                        {
                                Forward();
                                if(trace1 == 0 && trace3 == 1)                                //一直左轉(zhuǎn)到傳感器檢測不到為止
                                {
                                        Delay(20);
                                        Turn_right();
                                        break;                                //跳出循環(huán)
                                }
                                else if(trace3 == 0 && trace1 == 1)
                                {
                                        Delay(20);
                                        Turn_left();
                                        break;                                //跳出循環(huán)
                                }
                                else
                                {
                                        Delay(20);
                                        Forward();
                                        break;
                                }
                        }
    }
}

/**********************藍(lán)牙類函數(shù)**********************/
void send_str( )// 傳送字串
{
        unsigned char i = 0;
        while(str[i] != '\0')
        {
                SBUF = str[i];
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
        }       
}
void send_str1( )                  
{
    unsigned char i = 0;
    while(str1[i] != '\0')
    {
                SBUF = str1[i];
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
    }       
}       

                          void send_str2( )
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str2[i] != '\0')
           {
                SBUF = str2[i];
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }       
    }       
                   
                          void send_str3()
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str3[i] != '\0')
           {
                SBUF = str3[i];
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }       
    }       

              void send_str4()
                   // 傳送字串
    {
            unsigned char i = 0;
            while(str4[i] != '\0')
           {
                SBUF = str4[i];
                while(!TI);                                // 等特?cái)?shù)據(jù)傳送
                TI = 0;                                        // 清除數(shù)據(jù)傳送標(biāo)志
                i++;                                        // 下一個(gè)字符
           }       
    }

void Bluetooth()
{
        init_T4();
    while(1)                                                        /*無限循環(huán)*/
        {
                  if(flag_REC == 1)                                    //
                   {
                        flag_REC = 0;
                        if(buff[0] == 'O' && buff[1] == 'N')        //第一個(gè)字節(jié)為O,第二個(gè)字節(jié)為N,第三個(gè)字節(jié)為控制碼
                        switch(buff[2])
                     {
                                case up :                                                    // 前進(jìn)
                                send_str(); Forward();
                                break;

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

                                case left:                                                // 左轉(zhuǎn)
                                send_str2(); Turn_left();
                                break;

                                case right:                                                // 右轉(zhuǎn)
                                send_str3(); Turn_right();
                                break;

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

                                case:

                     }                 
                 }
        }
}

void Time4() interrupt 4          //藍(lán)牙函數(shù)最開始啟動(dòng)中斷
{
    if(RI)                         //是否接收中斷
    {
        RI = 0;
        dat = SBUF;
        if(dat == 'O' && (i == 0)) //接收數(shù)據(jù)第一幀
        {
            buff[i] = dat;
            flag = 1;        //開始接收數(shù)據(jù)
        }
        else if(flag == 1)
        {
                 i++;
            buff[i] = dat;
            if(i >= 2)
                 {i = 0; flag = 0; flag_REC = 1;}  // 停止接收
        }
        }
}

///********************測速函數(shù)******************/
//void meas_velocity()
//{
//        init_T3();
//        while(1)
//        {       
//                if (P34 == 1)
//            {
//                led = 0;
//            }
//                display();
//                Delay(1);
//        }       
//}
//
//void Time3() interrupt 3  //定時(shí)器中斷時(shí)間到,就讀取計(jì)數(shù)器值
//{
//        TH1 = 0X3C;
//         TL1 = 0XB0;
//         i++;
//        if(i == 20) //1s才進(jìn)行技術(shù)脈沖值顯示,即每秒更新一次速度
//        {
//                   kop = TH0;//計(jì)數(shù)器計(jì)入脈沖,每來一個(gè)矩形脈沖計(jì)數(shù)值加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;//計(jì)數(shù)器速度獲取后清零,進(jìn)行下次獲取
//                TL1 = 0;
//               
//          }
//}
/***********************檢測模式*****************************/
bit Check_key()
{
        bit check_flag = 0;
        if(key == 0)
        {
                return check_flag;
        }
        else
        {
                check_flag = 1;
                return check_flag;
        }
}

/*主函數(shù)*/
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已經(jīng)初始化
                                        Delay(10);
                                        init_UltraSound();
                                        Delay(60);
                                }       
                        }
                        else
                        {
                                Delay(100);
                                Forward();
                                while(1)
                                {
                                        Trace();                                 //否則尋跡
                                }
                        }
        }
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:333108 發(fā)表于 2018-5-18 16:41 | 只看該作者
有的函數(shù)還沒完善,下次改進(jìn)
回復(fù)

使用道具 舉報(bào)

板凳
ID:419294 發(fā)表于 2018-11-7 16:23 | 只看該作者
有沒有藍(lán)牙APP呢
回復(fù)

使用道具 舉報(bào)

地板
ID:636540 發(fā)表于 2021-5-30 12:38 | 只看該作者
Dremt 發(fā)表于 2018-11-7 16:23
有沒有藍(lán)牙APP呢

串口助手
回復(fù)

使用道具 舉報(bào)

5#
ID:1531 發(fā)表于 2021-9-23 11:15 | 只看該作者
沒看到藍(lán)牙程序呀
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表