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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

請(qǐng)問(wèn)在超聲波測(cè)距部分加入藍(lán)牙傳輸模塊,修改程序后不能正常測(cè)距,程序該如何修改

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
請(qǐng)問(wèn)在超聲波測(cè)距電路中加入藍(lán)牙傳輸模塊,在原本測(cè)距程序的基礎(chǔ)上修改程序后不能正常測(cè)距,這是什么原因,應(yīng)該如何修改,謝謝各位大佬
下有測(cè)距原理圖
附上

修改的程序:
#include "reg52.H"//器件配置文件
#include "intrins.h"
#include "eeprom52.h"
#include "uart.h"
#include "stdio.h"

#define uint unsigned int
#define uchar unsigned char
        
//傳感器接口
sbit RX  = P2^3;
sbit TX  = P2^2;
//按鍵聲明
sbit S1 = P1^4;
sbit S2 = P1^5;
sbit S3 = P1^6;
//小數(shù)點(diǎn)
sbit DIAN = P0^5;
//蜂鳴器
sbit Feng = P2^0;

sbit W0 = P2^4;
sbit W1 = P2^5;
sbit W2 = P2^6;
sbit W3 = P2^7;

//變量聲明
unsigned int  time = 0;
unsigned int  timer = 0;
unsigned char posit = 0;
unsigned long S = 0;
unsigned long BJS;//報(bào)警距離
char num = 0;
uchar count =  0;
//模式 0正常模式 1調(diào)整
char Mode = 0;
bit  flag = 0;

unsigned char const discode[] = {0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0x80};        //數(shù)碼管顯示碼0123456789-和不顯示

unsigned char disbuff[4] = {0,0,0,0};                 //數(shù)組用于存放距離信息

unsigned char disbuff_BJ[4]        = {0,0,0,0};//報(bào)警信息

//藍(lán)牙發(fā)送
uchar Tx_Buff[40]={0};
uint send_time = 0;                                //發(fā)送時(shí)間間隔控制變量

void HR04_sendstring();                //串口發(fā)送
        
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
void write_eeprom()
{
        SectorErase(0x2000);
        byte_write(0x2000, BJS);
        byte_write(0x2060, a_a);        
}

/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
void read_eeprom()
{
        BJS   = byte_read(0x2000);
        a_a      = byte_read(0x2060);
}

/**************開(kāi)機(jī)自檢eeprom初始化*****************/
void init_eeprom()
{
        read_eeprom();                //先讀
        if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
        {
                BJS   = 25;
                a_a = 1;
                write_eeprom();           //保存數(shù)據(jù)
        }        
}

//延時(shí)100ms(不精確)
void delay(void)
{
    unsigned char a,b,c;
    for(c=10;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}

//按鍵掃描
void Key_()
{
        //+
        if(S1==0&&Mode==1)
        {
                delay();           //延時(shí)去抖
                delay();           //延時(shí)去抖
                while(S1==0)
                {
                        P1=P1|0x0f;
                }
                        BJS++;         //報(bào)警值加
                if(BJS>=151) //最大151
                {
                        BJS=0;
                }
                write_eeprom();                           //保存數(shù)據(jù)
        }
        //-
        if(S2==0&&Mode==1)
        {
                delay();
                delay();           //延時(shí)去抖
                while(S2==0)
                {
                        P1=P1|0x0f;
                }
                        BJS--;         //報(bào)警值減
                if(BJS<=1)         //最小1
                {
                        BJS=150;
                }
                write_eeprom();                           //保存數(shù)據(jù)
        }
        //功能
        if(S3==0)                //設(shè)置鍵
        {
                delay();
                delay();           //延時(shí)去抖
                while(S3==0)
                {
                        P1=P1|0x0f;
                }
                        Mode++;                //模式加
                        num=0;
                if(Mode>=2)                //加到2時(shí)清零
                {
                        Mode=0;
                }        
        }
}

//掃描數(shù)碼管
void Display(void)                                 
{
        //正常顯示
        if(Mode==0)
        {
                num++;
                if(num==1)
                {
                        W3=1;
                        W0=1;
                        P0=~discode[disbuff[0]];
                        DIAN=0;
                        W1=0;        
                }
                else if(num==2)
                {
                        W1=1;
                        P0=~discode[disbuff[1]];
                        W2=0;
                }
                else if(num>=3)
                {
                        W2=1;
                        P0=~discode[disbuff[2]];
                        W3=0;
                        num=0;
                }
        }
        //報(bào)警顯示
        else
        {
                num++;
                if(num==1)
                {
                        W3=1;
                        P0=~0xCE;                  //11001110
                        W0=0;
                }
                else if(num==2)
                {
                        W0=1;
                        P0=~discode[disbuff_BJ[0]];
                        DIAN=0;
                        W1=0;        
                }
                else if(num==3)
                {
                        W1=1;
                        P0=~discode[disbuff_BJ[1]];
                        W2=0;
                }
                else if(num>=4)
                {
                        W2=1;
                        P0=~discode[disbuff_BJ[2]];
                        W3=0;
                        num=0;
                }
        }
}

//計(jì)算
void Conut(void)
{
        time=TH0*256+TL0;          //讀出T0的計(jì)時(shí)數(shù)值
        TH0=0;
        TL0=0;                                  //清空計(jì)時(shí)器
        S=(time*1.7)/100;     //算出來(lái)是CM
        //聲音的速度是340m/s,時(shí)間的單位是us,計(jì)算到秒需要將時(shí)間數(shù)據(jù)/1000000,
        //長(zhǎng)度=速度*時(shí)間,340*time/1000000,長(zhǎng)度數(shù)據(jù)單位是m轉(zhuǎn)換成cm需要乘以100得到340*time/10000,
        //小數(shù)點(diǎn)都向左移兩位得到3.4*time/100,因?yàn)槌暡ㄊ峭盗耍栽俪?,得到距離數(shù)據(jù)(time*1.7)/100
        if(Mode==0)                          //非設(shè)置狀態(tài)時(shí)
        {
                if((S>=700)||flag==1) //超出測(cè)量范圍顯示“-”
                {        
                        Feng=0;                    //蜂鳴器報(bào)警
                        flag=0;
                        disbuff[0]=10;           //“-”
                        disbuff[1]=10;           //“-”
                        disbuff[2]=10;           //“-”
                }
                else
                {
                        //距離小于報(bào)警距
                        if(S<=BJS)
                        {
                                Feng=0;        //報(bào)警
                        }
                        else  //大于
                        {
                                Feng=1;                //關(guān)閉報(bào)警        
                        }
                        disbuff[0]=S%1000/100;                 //將距離數(shù)據(jù)拆成單個(gè)位賦值
                        disbuff[1]=S%1000%100/10;
                        disbuff[2]=S%1000%10 %10;
                }
        }
        else
        {
                        Feng=1;
                        disbuff_BJ[0]=BJS%1000/100;
                        disbuff_BJ[1]=BJS%1000%100/10;
                        disbuff_BJ[2]=BJS%1000%10 %10;
        }
}

/**********************************************************************************************************/
//定時(shí)器0
void zd0() interrupt 1                  //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
        flag=1;                                                 //中斷溢出標(biāo)志
}
/**********************************************************************************************************/
//定時(shí)器1
void zd3() interrupt 3                  //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
{
        TH1=0xf8;
        TL1=0x30;                                 //定時(shí)2ms
        Key_();                                        //掃描按鍵
        Display();                                //掃描顯示
        timer++;                                //變量加
        if(timer>=400)                        //400次就是800ms
        {
                timer=0;
                TX=1;                                  //800MS  啟動(dòng)一次模塊
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                TX=0;
        }
}

//主函數(shù)
void main(void)
{  
        TMOD=0x11;                   //設(shè)T0為方式1,GATE=1;
        TH0=0;
        TL0=0;         
        TH1=0xf8;                   //2MS定時(shí)
        TL1=0x30;
        ET0=1;                                //允許T0中斷
        ET1=1;                           //允許T1中斷
        TR1=1;                           //開(kāi)啟定時(shí)器
        EA=1;                                        //開(kāi)啟總中斷
        init_eeprom();  //開(kāi)始初始化保存的數(shù)據(jù)        
        while(1)
        {
                while(!RX);                //當(dāng)RX為零時(shí)等待
                TR0=1;                        //開(kāi)啟計(jì)數(shù)
                while(RX);                //當(dāng)RX為1計(jì)數(shù)并等待
                TR0=0;                        //關(guān)閉計(jì)數(shù)
                Conut();                        //計(jì)算
                HR04_sendstring();                //串口發(fā)送
        }
}

void T_0()interrupt 1
{
        TF0 = 0;
        TL0 = 0x66;
        TH0 = 0xfc;
        count++;
        if(count==18)                                                 //18ms時(shí)清零
        {
          TR0 =0;
          TL0 = 0x66;
          TH0 = 0xfc;
          count = 0;        
        }
}
void T_1()interrupt 3
{
        uchar num;
        TH1=(65536-45872)/256;                                        //計(jì)數(shù)器裝裝數(shù)值
        TL1=(65536-45872)%256;
        num++;
        if(num==10)
        {
        num=0;
        Key_();                                                                         //按鍵掃描函數(shù)

        }
}

void HR04_sendstring()                //串口發(fā)送
{
        if(send_time%20==0)
        {
        EA=0;
        sprintf((char*)Tx_Buff,"Distance:%.1fcm\r\n",S/10.0);
        UART1_SendString(Tx_Buff);
        EA=1;
        }
        send_time++;
}



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

使用道具 舉報(bào)

沙發(fā)
ID:10947 發(fā)表于 2019-5-17 14:29 | 只看該作者
你的藍(lán)牙模塊在哪?
回復(fù)

使用道具 舉報(bào)

板凳
ID:530977 發(fā)表于 2019-5-17 22:56 | 只看該作者
#include "stc15.h"       
#include <intrins.h>
sbit RX1=P2^0;          //小車左側(cè)超聲波HC-SR04接收端
sbit TX1=P2^1;                 //發(fā)送端  
sbit RX2=P2^2;                  
sbit TX2=P2^3;                  
sbit RX3=P2^4;                  
sbit TX3=P2^5;
//定義小車驅(qū)動(dòng)模塊輸入IO口
unsigned char bluetoothdata;
sbit P3_1=P3^1;
sbit P3_0=P3^0;
sbit IN1=P1^3;
sbit IN2=P1^4;
sbit IN3=P1^5;
sbit IN4=P1^6;
sbit ENA=P1^2;
sbit ENB=P1^7;
unsigned int i,cycle=0,T=2048;
void delay_long(unsigned int time)
{
        unsigned int i;
        unsigned int j;
        for(i = 0 ; i < time ; i++)
        {
                for(j = 0; j < 500; j++);
        }
}
/**********z秒延時(shí)函數(shù)**********/
void delay(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
/********微妙延時(shí)*********/
void delay_us(unsigned int aa)
{
        while(aa--);
}
void run()//前進(jìn)
{
                IN1=1;//反轉(zhuǎn)
                IN2=0;
                IN3=0;//正轉(zhuǎn)
                IN4=1;
        for(i=0;i<200;i++)
                {
                        delay(10);//PWI占空比為50%,修改延時(shí)調(diào)整PI脈沖
                        ENA=~ENA;
                        ENB=~ENB;
                }
}
void Backoff()//后退
{
               
        IN1=0;//正轉(zhuǎn)
                IN2=1;
                IN3=1;//反轉(zhuǎn)
                IN4=0;
        for(i=0;i<200;i++)
                {
                        delay(8);//PWI占空比為50%,修改延時(shí)調(diào)整PI脈沖
                ENA=~ENA;
                ENB=~ENB;
                }
}
void rightrun()//左轉(zhuǎn)
{
                IN1=0;//制動(dòng)
                IN2=0;
                IN3=0;//正轉(zhuǎn)
                IN4=1;
        for(i=0;i<200;i++)
                {
                        delay(8);//PWI占空比為50%,修改延時(shí)調(diào)整PI脈沖
                ENA=~ENA;
                ENB=~ENB;
                }
}
void leftrun()//右轉(zhuǎn)
{
                IN1=1;//反轉(zhuǎn)
                IN2=0;
                IN3=0;//制動(dòng)
                IN4=0;
        for(i=0;i<200;i++)
                {
                        delay(8);//PWI占空比為50%,修改延時(shí)調(diào)整PI脈沖
                ENA=~ENA;
                ENB=~ENB;
                }
}
void stoprun()//停止
{
                IN1=0;//制動(dòng)
                IN2=0;
                IN3=0;//正轉(zhuǎn)
                IN4=0;
                for(i=0;i<200;i++)
                {
                delay(10);//PWI占空比為50%,修改延時(shí)調(diào)整PI脈沖
                ENA=0;
                ENB=0;
                }
}
unsigned int  time=0;
unsigned long S1=0;
unsigned long S2=0;
unsigned long S3=0;
        void delay_1ms(unsigned char x)          //1ms延時(shí)函數(shù),100ms以內(nèi)可用
        {
        unsigned char i;
        while(x--)
        for(i=124;i>0;i--);
        }
/********************************************************/
void Automatic_following()
{
        TX1=1;                                 //開(kāi)啟超聲波1探測(cè)
         delay_1ms(1);
         TX1=0;
     while(!RX1);                //當(dāng)RX1為零時(shí)等待
         TR0=1;                            //開(kāi)啟計(jì)數(shù)
         while(RX1);                //當(dāng)RX1為1計(jì)數(shù)并等待
         TR0=0;                                //關(guān)閉計(jì)數(shù)
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;                          
         S1=(time*1.7)/100;    //算出來(lái)是CM       
         TX2=1;
         delay_1ms(1);
         TX2=0;
    while(!RX2);                //當(dāng)RX2為零時(shí)等待
         TR0=1;                            //開(kāi)啟計(jì)數(shù)
         while(RX2);                //當(dāng)RX2為1計(jì)數(shù)并等待
         TR0=0;                                //關(guān)閉計(jì)數(shù)
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;                                                                         
         S2=(time*1.7)/100;     //算出來(lái)是CM                                       
         TX3=1;
         delay_1ms(1);
         TX3=0;         
         while(!RX3);                //當(dāng)RX3為零時(shí)等待
                 TR0=1;                            //開(kāi)啟計(jì)數(shù)
                 while(RX3);                //當(dāng)RX3為1計(jì)數(shù)并等待
                 TR0=0;                                //關(guān)閉計(jì)數(shù)
                 time=TH0*256+TL0;
                 TH0=0;
                 TL0=0;                                         
                 S3=(time*1.7)/100;     //算出來(lái)是CM
                if(S1>15&&S1<120&&S1<S3)
//                if((S1>15&&S1<120&&S2>120&&S3>120)||(S1>15&&S1<120&&S2<120&&S2>15&&S3>120)||(S1<S2<S3))
                {
                        rightrun();//左轉(zhuǎn)
                }
          else if(S3>15&&S3<120&&S3<S1)
//                else if((S3>15&&S3<120&&S1>120&&S2>120)||(S3>15&&S3<120&&S1>120&&S2<120&&S2<15)||(S3<S2<S3))
                {
                   leftrun();        //右轉(zhuǎn)               
                }       
                else if((S2<120&&S2>15)||S1==S3&&S1>15&&S1<120)
//                else if((S2<120&&S2>15&&S1>120&&S3>120)||(S1<120&&S1>15&&S2<120&&S2>15&&S3<120&&S3>15&&S1==S3)||(S2<S1&&S2<S3))
                {
           run();
                }                         
                else if(S1<5||S2<5||S3<5)
                {
                Backoff();       
                }
                else
                 {       
                        stoprun();
                 }                  
}
void Uart1_Init()//串口1初始化9600波特率11.0592MHz
{
        PCON &= 0x7F;//設(shè)置波特率不加倍,即SMOD=0;
        SCON = 0x50; //設(shè)置8位UART,波特率可變,允許串行接收
        AUXR |= 0x40;//定時(shí)器1時(shí)鐘為1T
        AUXR &= 0xFE;//串口1選擇定時(shí)器1為波特率發(fā)生器,即S1ST2=0;
        TMOD &= 0x0F;//清除定時(shí)器1模式位
        TMOD |= 0x20;//設(shè)定定時(shí)器1為8位自動(dòng)重裝方式工作方式2
        TL1 = 0xDC;  //設(shè)定定時(shí)初值
        TH1 = 0xDC;  //設(shè)定定時(shí)器重裝值
        ET1 = 0;     //禁止定時(shí)器1中斷
        TR1 = 1;     //啟動(dòng)定時(shí)器1
        EA = 1;      //開(kāi)總中斷
        ES = 1;      //開(kāi)串口中斷
}
/********************************************************/
      void timer0() interrupt 1                  //T0中斷
  {
   
  }
void usart_receive(void) interrupt 4 //串口中斷程序
{

        if(RI == 1)//收到字符
        {
                RI = 0;//軟件清零
                bluetoothdata = SBUF;//讀取數(shù)據(jù)
        }

       if(TI == 1)//發(fā)送數(shù)據(jù)
        {
                TI = 0;//清零
        }

}
void  usart_service()
{
        switch(bluetoothdata)
        {
                case '1':run();break;
                case '2':leftrun();break;
                case '3':rightrun();break;
                case '4':Backoff();break;
                case '5':stoprun();break;
                case '6':Automatic_following();break;
        }
}
/*********************************************************
**********************************************************/

        void  main(void)
{
                P1M1=0x00;
                P1M0=0x00;
                P2M1=0x00;
                P2M0=0x00;
    TMOD=0x11;                   //設(shè)T0為方式1,GATE=1;
        TH0=0;
        TL0=0;         
        TH1=(65536-1000)/256;         //1ms定時(shí)
        TL1=(65536-1000)%256;
        ET0=1;             //允許T0中斷
        ET1=1;                           //允許T1中斷
        TR1=1;                           //開(kāi)啟定時(shí)器
        EA=1;                           //開(kāi)啟總中斷
        Uart1_Init();//串口1初始化9600波特率11.0592MHz
        P0=0x00;
                ENA=0;
                ENB=0;
        while(1)
        {
                usart_service();
        }
}
回復(fù)

使用道具 舉報(bào)

地板
ID:332702 發(fā)表于 2019-5-18 11:34 | 只看該作者
lfc315 發(fā)表于 2019-5-17 14:29
你的藍(lán)牙模塊在哪?

藍(lán)牙加在了TXD和RXD,這個(gè)圖是還沒(méi)有加的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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