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

QQ登錄

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

搜索
查看: 5723|回復(fù): 9
收起左側(cè)

手機(jī)接收的51單片機(jī)驅(qū)動(dòng)藍(lán)牙模塊數(shù)據(jù)都是亂碼 求大神助!

[復(fù)制鏈接]
ID:242160 發(fā)表于 2017-12-5 09:27 | 顯示全部樓層 |閱讀模式
基于51單片機(jī)利用藍(lán)牙模塊,想用手機(jī)接收,但是接收的都是亂碼
回復(fù)

使用道具 舉報(bào)

ID:242160 發(fā)表于 2017-12-5 09:30 | 顯示全部樓層
想用手機(jī)接收單片機(jī)上數(shù)碼管顯示的數(shù)字
回復(fù)

使用道具 舉報(bào)

ID:128334 發(fā)表于 2017-12-5 18:46 | 顯示全部樓層
兩種可能 一種是波特率不匹配 比較多見(jiàn) 另一種是模塊電平不匹配 有些藍(lán)牙模塊帶有232芯片 使用時(shí)要注意
這兩種情何況都回導(dǎo)致亂碼
回復(fù)

使用道具 舉報(bào)

ID:231046 發(fā)表于 2017-12-6 08:19 | 顯示全部樓層
是的,一種是波特率不同,另一種是發(fā)生時(shí)序不對(duì),最會(huì)產(chǎn)生亂碼的。
回復(fù)

使用道具 舉報(bào)

ID:242160 發(fā)表于 2017-12-6 09:37 | 顯示全部樓層
langshan 發(fā)表于 2017-12-5 18:46
兩種可能 一種是波特率不匹配 比較多見(jiàn) 另一種是模塊電平不匹配 有些藍(lán)牙模塊帶有232芯片 使用時(shí)要注意
這 ...

能幫忙看一下是哪里出錯(cuò)了嗎


#include<REG52.H>
#include<math.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^2 ;
sbit RS=P3^5;
sbit RW=P3^6 ;
sbit EN=P3^4 ;
sbit R=P2^ 7 ;
sbit T=P2^6 ;
unsigned int  time=0;
unsigned long S=0;
bit   flag =0;
unsigned char disbuff[4] ={ 0,0,0,0,};
unsigned char code str1[]={"range   temp"}
float RxBuf,disdata[5] ;
uint tvalue;//溫度值
uchar tflag;//溫度正負(fù)標(biāo)志

unsigned   char   code    ASCII [15]=
{'0','1','2','3','4','5','6','7','8','9','.','-','M'};     
uchar   Tx,Ax;

/*********1cd1602 程序*********/
Void delay lms(unsigned int ms)//延時(shí)1毫秒(不夠精確的)

{
        unsigned int i,j;
        for(i=0;i > ms;i++);
        for(j=0;j > 100;j++);
}
void wr_com(unsi gned char com)//寫指令//
{
delaylms(1) ;
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1) ;
EN=1;
delay1ms(1);
EN=0;
}

void lcd_init 0//初始化設(shè)置//
{
//BLK=0 ;

delay1ms(15) ;
wr_com(0x38) ;
delaylms(5)
wr_com(0x08) ;delay1ms(5) ;
wr_com(0x01) ;delaylms(5) ;
wr_com(0x06) ;delay1ms(5) ;
wr_com(0x0c) ;delay1ms(5) ;
}
void display(unsigned char *p)//顯示//
{
while(*p!='\0')
{
wr_dat (*p);
p++;
//delaylms(1) ;
}
}
init_play()//初始化顯示
{
lcd_initO ;
wr_com(0x80)
display(strl) ;
}
/***************************ds18b20程序**************/
void delay_18B20(unsigned int i)//延時(shí)1微秒

{
        while(i--);
}
viod ds18b20rst()/*dx18b20復(fù)位*/
{
        unsigned char x=0;
        DQ = 1;
        delay_18B20(4);
        DQ=0;
        delay_18B20(100);
        DQ=1;
        delay_18B20(40);
}

uchar ds1820rd()/*讀數(shù)據(jù)*/
{
        unsigned char i=0;
        unsigned char dat 中0:
        for (i=8;i>0;i--)
{
        DQ = 0; //給脈沖信號(hào)
        dat>>=1;
        DQ = 1; //給脈沖信號(hào)
        if(DQ)
        dat |=0x80;
        delay_18B20(10) ;
}

        return(dat);
}

void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
{
        unsigned char i=0;
        for (i=8; i>0;i--)
{
        DQ = 0;
        DQ = wdata&0x01;
        delay_18B20(10) ;
        DQ = 1;
        wdata>>=1;
}
}
read_temp ()/*讀取溫度值并轉(zhuǎn)換*/
{
        uchar a,b;
        ds1820rst () ;
        ds1820wr(0xcc) ;//*跳過(guò)讀序列號(hào)*/

        ds1820wr(0x44) ;//*啟動(dòng)溫度轉(zhuǎn)換*/
        ds1820rst () ;
        ds1820wr (0xcc) ;//*跳過(guò)讀序列號(hào)*/
        ds1820wr (0xbe) ;//*讀取溫度*/
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b ;
        tvalue<<=8;
        tvalue=tvalue|a;
        if(tvalue<0xOfff)
        tflag=0;
        else
        {
                tvalue=~tvalue+1;
                tflag=1;
        }
        tvalue=tvalue*(0.625) ;//溫度值擴(kuò)大10 倍,精確到1位小?
        tvalue=tvalue-15;
        return(tvalue);
}
/***************************水****水*水水米*水***********/

void show()//溫度值顯示
{
        uchar flagdat;
        time=TH0*256+TLO;
        THO=0;
        TL0=0;
        S=(time*1.7)/100;
        disdata[0]=tvalue/1000+0x30; //百位數(shù)
        disdata[1]=tvalue%1000/100+0x30;// 十位數(shù)
        disdata[2]=tvalue%100/10+0x30;//個(gè)位數(shù)
        disdata[3]=tvalue%10+0x30;//小數(shù)位
        disdata [4 ]=0x00 ;
        if(tflag==0)
        flagdat=0x20;//正溫度不顯示符號(hào)
        else
        flagdat=0x2d;//負(fù)溫度顯示負(fù)號(hào):-
if(disdata[0]==0x30)
{
        disdata[0]=0x20;//如果百位為0,不顯示
        if(disdata[1]=0x30)
        {
        disdata[11=0x20;//如果百位為0,十位為0 也不顯示
        }
}

disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
disbuff[3]=S%10000%1000 %100;
wr_com (0xcO) ;
wr_dat (ASCII [disbuff[O]]) ;//顯示百位
wr_com(Oxc1) ;
wr_dat(ASCII [10]) ;
wr_com(0 x c2) ;
wr_dat (ASCII[disbuff[1]]) ;
wr_com(0xc3)
wr_dat(ASCII [disbuff[2]]) ;
wr_com(0xc4) ;
wr_dat(ASCII[12]) :
wr_com (0xc8)
wr_dat(flagdat) ;//顯示符號(hào)?
wr_com (0xc9) ;
wr_dat disdata[0]) ;//顯示百位
wr_com (Oxca) :
wr_dat(disdata[1]) ;//顯示十位
wr_com(0xcb) ;
wr_dat (disdata[2]) ;//顯示個(gè)位
wr_com (0xcc) ;
wr_dat (0x2e) ;//顯示小數(shù)點(diǎn)
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//顯示小數(shù)位

void StartModule()//啟動(dòng)模塊
{
T=1;      //啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

T=0;
}
void UART_Init (void) //串口初始化
{
        PCON = 0x00;
        SCON = 0x50; //串口工作方式為1,允許接收.
        TMOD = 0x21; // T1定時(shí)方式2 C
        THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
        TLI = Oxfd;//啟動(dòng)T1
        THO =0;
        TLO =0;
        ES = 1;//開(kāi)串中斷.


        ETO =1;
        TR1=1;//開(kāi)總中斷。

        EA = 1;
}
void Send (uchar dat)
{
        SBUF = dat; //待發(fā)送的數(shù)據(jù)寫心緩沖區(qū)
        while(!TI); //等待發(fā)送完成
        TI = 0; //清等發(fā)送標(biāo)志位
}
        /************* 主程序********************/



void main()
{
        UART_Init();
        init_play() ;//初始化顯示
        while(l)
        {
                read_tempO);//讀取溫度

        StartModule();
        while(R) ;//當(dāng)RX 為零時(shí)等待
        TRO=1;//開(kāi)啟計(jì)數(shù)
        while(R) ;//當(dāng)RX 為1計(jì)數(shù)并等待
       
        TRO=0;//關(guān)閉計(jì)數(shù)
        show() ;//顯示

        delaylms(80) ;//80M
if(Tx==1)
{
Send('t');
Send('e');
Send('m');
Send('p');
Send('=');
Send(disdata[1]) ;
Send(disdata[2]) ;
Send(C.N);
Send(disdata[3]) ;
Tx=0;
Send ('');
}
if(Ax==1)
{

Send('r');
Send('a');
Send('n');
Send('g');
Send('e');
Send('=');
Send(ASCII[disbuff[0]]) ;
Send('.');
Send(ASCII[disbuff[1]]) ;
Send(ASCII[disbuff[2]]) ;
Send('');
Ax=0
          }
         }
        }
void Uart_INT(void)interrupt 4 //串口中斷兩數(shù)
{
        uchar Rev = 0:
        if(RI) //查詢接收標(biāo)志位(有數(shù)據(jù)發(fā)送過(guò)來(lái)時(shí)置為1)
        {
           RI = 0;
           Rcv =SBUF;
           RxBuf=Rcv ;
           if(RxBuf=='8' ){ TxF1;}
           if(RxBuf==' 0' ){Ax=1; }
        }
}


回復(fù)

使用道具 舉報(bào)

ID:242160 發(fā)表于 2017-12-6 10:30 | 顯示全部樓層
david888 發(fā)表于 2017-12-6 08:19
是的,一種是波特率不同,另一種是發(fā)生時(shí)序不對(duì),最會(huì)產(chǎn)生亂碼的。

能幫忙看一下是哪里出錯(cuò)了嗎


#include<REG52.H>
#include<math.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^2 ;
sbit RS=P3^5;
sbit RW=P3^6 ;
sbit EN=P3^4 ;
sbit R=P2^ 7 ;
sbit T=P2^6 ;
unsigned int  time=0;
unsigned long S=0;
bit   flag =0;
unsigned char disbuff[4] ={ 0,0,0,0,};
unsigned char code str1[]={"range   temp"}
float RxBuf,disdata[5] ;
uint tvalue;//溫度值
uchar tflag;//溫度正負(fù)標(biāo)志

unsigned   char   code    ASCII [15]=
{'0','1','2','3','4','5','6','7','8','9','.','-','M'};     
uchar   Tx,Ax;

/*********1cd1602 程序*********/
Void delay lms(unsigned int ms)//延時(shí)1毫秒(不夠精確的)

{
        unsigned int i,j;
        for(i=0;i > ms;i++);
        for(j=0;j > 100;j++);
}
void wr_com(unsi gned char com)//寫指令//
{
delaylms(1) ;
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1) ;
EN=1;
delay1ms(1);
EN=0;
}

void lcd_init 0//初始化設(shè)置//
{
//BLK=0 ;

delay1ms(15) ;
wr_com(0x38) ;
delaylms(5)
wr_com(0x08) ;delay1ms(5) ;
wr_com(0x01) ;delaylms(5) ;
wr_com(0x06) ;delay1ms(5) ;
wr_com(0x0c) ;delay1ms(5) ;
}
void display(unsigned char *p)//顯示//
{
while(*p!='\0')
{
wr_dat (*p);
p++;
//delaylms(1) ;
}
}
init_play()//初始化顯示
{
lcd_initO ;
wr_com(0x80)
display(strl) ;
}
/***************************ds18b20程序**************/
void delay_18B20(unsigned int i)//延時(shí)1微秒

{
        while(i--);
}
viod ds18b20rst()/*dx18b20復(fù)位*/
{
        unsigned char x=0;
        DQ = 1;
        delay_18B20(4);
        DQ=0;
        delay_18B20(100);
        DQ=1;
        delay_18B20(40);
}

uchar ds1820rd()/*讀數(shù)據(jù)*/
{
        unsigned char i=0;
        unsigned char dat 中0:
        for (i=8;i>0;i--)
{
        DQ = 0; //給脈沖信號(hào)
        dat>>=1;
        DQ = 1; //給脈沖信號(hào)
        if(DQ)
        dat |=0x80;
        delay_18B20(10) ;
}

        return(dat);
}

void ds1820wr(uchar wdata)/*寫數(shù)據(jù)*/
{
        unsigned char i=0;
        for (i=8; i>0;i--)
{
        DQ = 0;
        DQ = wdata&0x01;
        delay_18B20(10) ;
        DQ = 1;
        wdata>>=1;
}
}
read_temp ()/*讀取溫度值并轉(zhuǎn)換*/
{
        uchar a,b;
        ds1820rst () ;
        ds1820wr(0xcc) ;//*跳過(guò)讀序列號(hào)*/

        ds1820wr(0x44) ;//*啟動(dòng)溫度轉(zhuǎn)換*/
        ds1820rst () ;
        ds1820wr (0xcc) ;//*跳過(guò)讀序列號(hào)*/
        ds1820wr (0xbe) ;//*讀取溫度*/
        a=ds1820rd();
        b=ds1820rd();
        tvalue=b ;
        tvalue<<=8;
        tvalue=tvalue|a;
        if(tvalue<0xOfff)
        tflag=0;
        else
        {
                tvalue=~tvalue+1;
                tflag=1;
        }
        tvalue=tvalue*(0.625) ;//溫度值擴(kuò)大10 倍,精確到1位小?
        tvalue=tvalue-15;
        return(tvalue);
}
/***************************水****水*水水米*水***********/

void show()//溫度值顯示
{
        uchar flagdat;
        time=TH0*256+TLO;
        THO=0;
        TL0=0;
        S=(time*1.7)/100;
        disdata[0]=tvalue/1000+0x30; //百位數(shù)
        disdata[1]=tvalue%1000/100+0x30;// 十位數(shù)
        disdata[2]=tvalue%100/10+0x30;//個(gè)位數(shù)
        disdata[3]=tvalue%10+0x30;//小數(shù)位
        disdata [4 ]=0x00 ;
        if(tflag==0)
        flagdat=0x20;//正溫度不顯示符號(hào)
        else
        flagdat=0x2d;//負(fù)溫度顯示負(fù)號(hào):-
if(disdata[0]==0x30)
{
        disdata[0]=0x20;//如果百位為0,不顯示
        if(disdata[1]=0x30)
        {
        disdata[11=0x20;//如果百位為0,十位為0 也不顯示
        }
}

disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%100%10;
disbuff[3]=S%10000%1000 %100;
wr_com (0xcO) ;
wr_dat (ASCII [disbuff[O]]) ;//顯示百位
wr_com(Oxc1) ;
wr_dat(ASCII [10]) ;
wr_com(0 x c2) ;
wr_dat (ASCII[disbuff[1]]) ;
wr_com(0xc3)
wr_dat(ASCII [disbuff[2]]) ;
wr_com(0xc4) ;
wr_dat(ASCII[12]) :
wr_com (0xc8)
wr_dat(flagdat) ;//顯示符號(hào)?
wr_com (0xc9) ;
wr_dat disdata[0]) ;//顯示百位
wr_com (Oxca) :
wr_dat(disdata[1]) ;//顯示十位
wr_com(0xcb) ;
wr_dat (disdata[2]) ;//顯示個(gè)位
wr_com (0xcc) ;
wr_dat (0x2e) ;//顯示小數(shù)點(diǎn)
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//顯示小數(shù)位

void StartModule()//啟動(dòng)模塊
{
T=1;      //啟動(dòng)一次模塊
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();

T=0;
}
void UART_Init (void) //串口初始化
{
        PCON = 0x00;
        SCON = 0x50; //串口工作方式為1,允許接收.
        TMOD = 0x21; // T1定時(shí)方式2 C
        THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
        TLI = Oxfd;//啟動(dòng)T1
        THO =0;
        TLO =0;
        ES = 1;//開(kāi)串中斷.


        ETO =1;
        TR1=1;//開(kāi)總中斷。

        EA = 1;
}
void Send (uchar dat)
{
        SBUF = dat; //待發(fā)送的數(shù)據(jù)寫心緩沖區(qū)
        while(!TI); //等待發(fā)送完成
        TI = 0; //清等發(fā)送標(biāo)志位
}
        /************* 主程序********************/



void main()
{
        UART_Init();
        init_play() ;//初始化顯示
        while(l)
        {
                read_tempO);//讀取溫度

        StartModule();
        while(R) ;//當(dāng)RX 為零時(shí)等待
        TRO=1;//開(kāi)啟計(jì)數(shù)
        while(R) ;//當(dāng)RX 為1計(jì)數(shù)并等待
        
        TRO=0;//關(guān)閉計(jì)數(shù)
        show() ;//顯示

        delaylms(80) ;//80M
if(Tx==1)
{
Send('t');
Send('e');
Send('m');
Send('p');
Send('=');
Send(disdata[1]) ;
Send(disdata[2]) ;
Send(C.N);
Send(disdata[3]) ;
Tx=0;
Send ('');
}
if(Ax==1)
{

Send('r');
Send('a');
Send('n');
Send('g');
Send('e');
Send('=');
Send(ASCII[disbuff[0]]) ;
Send('.');
Send(ASCII[disbuff[1]]) ;
Send(ASCII[disbuff[2]]) ;
Send('');
Ax=0
          }
         }
        }
void Uart_INT(void)interrupt 4 //串口中斷兩數(shù)
{
        uchar Rev = 0:
        if(RI) //查詢接收標(biāo)志位(有數(shù)據(jù)發(fā)送過(guò)來(lái)時(shí)置為1)
        {
           RI = 0;
           Rcv =SBUF;
           RxBuf=Rcv ;
           if(RxBuf=='8' ){ TxF1;}
           if(RxBuf==' 0' ){Ax=1; }
        }
}
回復(fù)

使用道具 舉報(bào)

ID:236125 發(fā)表于 2017-12-6 11:34 | 顯示全部樓層
  THO=0;
   TL0=0;
   你的0和O不分,里面還有這種問(wèn)題,可能是造成原因之一
回復(fù)

使用道具 舉報(bào)

ID:242160 發(fā)表于 2017-12-8 14:56 | 顯示全部樓層
一龍大師 發(fā)表于 2017-12-6 11:34
THO=0;
   TL0=0;
   你的0和O不分,里面還有這種問(wèn)題,可能是造成原因之一

解決了   謝謝
回復(fù)

使用道具 舉報(bào)

ID:128334 發(fā)表于 2017-12-16 08:45 | 顯示全部樓層
這恐怕連編譯都過(guò)不了吧!
編譯5大步驟,如果是這樣的原因你連詞法分析都過(guò)不了,何談亂碼?
回復(fù)

使用道具 舉報(bào)

ID:259619 發(fā)表于 2017-12-16 15:54 | 顯示全部樓層
看比特率是否一致,藍(lán)牙模塊若是HC06單片機(jī)需要晶振為11.0592才能無(wú)誤差,而一般51單片機(jī)都是配備的12M晶振,所以誤差很大,做不到你說(shuō)的操作
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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