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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5578|回復: 9
打印 上一主題 下一主題
收起左側(cè)

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

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:242160 發(fā)表于 2017-12-5 09:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
基于51單片機利用藍牙模塊,想用手機接收,但是接收的都是亂碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:242160 發(fā)表于 2017-12-5 09:30 | 只看該作者
想用手機接收單片機上數(shù)碼管顯示的數(shù)字
回復

使用道具 舉報

板凳
ID:128334 發(fā)表于 2017-12-5 18:46 | 只看該作者
兩種可能 一種是波特率不匹配 比較多見 另一種是模塊電平不匹配 有些藍牙模塊帶有232芯片 使用時要注意
這兩種情何況都回導致亂碼
回復

使用道具 舉報

地板
ID:231046 發(fā)表于 2017-12-6 08:19 | 只看該作者
是的,一種是波特率不同,另一種是發(fā)生時序不對,最會產(chǎn)生亂碼的。
回復

使用道具 舉報

5#
ID:242160 發(fā)表于 2017-12-6 09:37 | 只看該作者
langshan 發(fā)表于 2017-12-5 18:46
兩種可能 一種是波特率不匹配 比較多見 另一種是模塊電平不匹配 有些藍牙模塊帶有232芯片 使用時要注意
這 ...

能幫忙看一下是哪里出錯了嗎


#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;//溫度正負標志

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)//延時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//初始化設置//
{
//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)//延時1微秒

{
        while(i--);
}
viod ds18b20rst()/*dx18b20復位*/
{
        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; //給脈沖信號
        dat>>=1;
        DQ = 1; //給脈沖信號
        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) ;//*跳過讀序列號*/

        ds1820wr(0x44) ;//*啟動溫度轉(zhuǎn)換*/
        ds1820rst () ;
        ds1820wr (0xcc) ;//*跳過讀序列號*/
        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) ;//溫度值擴大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;//個位數(shù)
        disdata[3]=tvalue%10+0x30;//小數(shù)位
        disdata [4 ]=0x00 ;
        if(tflag==0)
        flagdat=0x20;//正溫度不顯示符號
        else
        flagdat=0x2d;//負溫度顯示負號:-
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) ;//顯示符號?
wr_com (0xc9) ;
wr_dat disdata[0]) ;//顯示百位
wr_com (Oxca) :
wr_dat(disdata[1]) ;//顯示十位
wr_com(0xcb) ;
wr_dat (disdata[2]) ;//顯示個位
wr_com (0xcc) ;
wr_dat (0x2e) ;//顯示小數(shù)點
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//顯示小數(shù)位

void StartModule()//啟動模塊
{
T=1;      //啟動一次模塊
_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定時方式2 C
        THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
        TLI = Oxfd;//啟動T1
        THO =0;
        TLO =0;
        ES = 1;//開串中斷.


        ETO =1;
        TR1=1;//開總中斷。

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



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

        StartModule();
        while(R) ;//當RX 為零時等待
        TRO=1;//開啟計數(shù)
        while(R) ;//當RX 為1計數(shù)并等待
       
        TRO=0;//關(guān)閉計數(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) //查詢接收標志位(有數(shù)據(jù)發(fā)送過來時置為1)
        {
           RI = 0;
           Rcv =SBUF;
           RxBuf=Rcv ;
           if(RxBuf=='8' ){ TxF1;}
           if(RxBuf==' 0' ){Ax=1; }
        }
}


回復

使用道具 舉報

6#
ID:242160 發(fā)表于 2017-12-6 10:30 | 只看該作者
david888 發(fā)表于 2017-12-6 08:19
是的,一種是波特率不同,另一種是發(fā)生時序不對,最會產(chǎn)生亂碼的。

能幫忙看一下是哪里出錯了嗎


#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;//溫度正負標志

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)//延時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//初始化設置//
{
//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)//延時1微秒

{
        while(i--);
}
viod ds18b20rst()/*dx18b20復位*/
{
        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; //給脈沖信號
        dat>>=1;
        DQ = 1; //給脈沖信號
        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) ;//*跳過讀序列號*/

        ds1820wr(0x44) ;//*啟動溫度轉(zhuǎn)換*/
        ds1820rst () ;
        ds1820wr (0xcc) ;//*跳過讀序列號*/
        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) ;//溫度值擴大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;//個位數(shù)
        disdata[3]=tvalue%10+0x30;//小數(shù)位
        disdata [4 ]=0x00 ;
        if(tflag==0)
        flagdat=0x20;//正溫度不顯示符號
        else
        flagdat=0x2d;//負溫度顯示負號:-
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) ;//顯示符號?
wr_com (0xc9) ;
wr_dat disdata[0]) ;//顯示百位
wr_com (Oxca) :
wr_dat(disdata[1]) ;//顯示十位
wr_com(0xcb) ;
wr_dat (disdata[2]) ;//顯示個位
wr_com (0xcc) ;
wr_dat (0x2e) ;//顯示小數(shù)點
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//顯示小數(shù)位

void StartModule()//啟動模塊
{
T=1;      //啟動一次模塊
_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定時方式2 C
        THI = 0xfd;//波特率9600bps @ fosc = 11.0592MHz
        TLI = Oxfd;//啟動T1
        THO =0;
        TLO =0;
        ES = 1;//開串中斷.


        ETO =1;
        TR1=1;//開總中斷。

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



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

        StartModule();
        while(R) ;//當RX 為零時等待
        TRO=1;//開啟計數(shù)
        while(R) ;//當RX 為1計數(shù)并等待
        
        TRO=0;//關(guān)閉計數(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) //查詢接收標志位(有數(shù)據(jù)發(fā)送過來時置為1)
        {
           RI = 0;
           Rcv =SBUF;
           RxBuf=Rcv ;
           if(RxBuf=='8' ){ TxF1;}
           if(RxBuf==' 0' ){Ax=1; }
        }
}
回復

使用道具 舉報

7#
ID:236125 發(fā)表于 2017-12-6 11:34 | 只看該作者
  THO=0;
   TL0=0;
   你的0和O不分,里面還有這種問題,可能是造成原因之一
回復

使用道具 舉報

8#
ID:242160 發(fā)表于 2017-12-8 14:56 | 只看該作者
一龍大師 發(fā)表于 2017-12-6 11:34
THO=0;
   TL0=0;
   你的0和O不分,里面還有這種問題,可能是造成原因之一

解決了   謝謝
回復

使用道具 舉報

9#
ID:128334 發(fā)表于 2017-12-16 08:45 | 只看該作者
這恐怕連編譯都過不了吧!
編譯5大步驟,如果是這樣的原因你連詞法分析都過不了,何談亂碼?
回復

使用道具 舉報

10#
ID:259619 發(fā)表于 2017-12-16 15:54 | 只看該作者
看比特率是否一致,藍牙模塊若是HC06單片機需要晶振為11.0592才能無誤差,而一般51單片機都是配備的12M晶振,所以誤差很大,做不到你說的操作
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利一区 | av成年人网站 | 中文字幕一页二页 | www.天天操.com | 国产在线视频一区二区董小宛性色 | 做a视频在线观看 | 在线四虎| 日本不卡一区二区三区在线观看 | 日本成人中文字幕 | 亚洲精品视频网站在线观看 | 国产精品视频一区二区三区 | 日韩av一区二区在线 | 日本一二区视频 | 国产精品一区二区三区在线 | 国产精品成人一区二区三区夜夜夜 | 成人婷婷 | 久久久久久国产精品三区 | 成人免费淫片aa视频免费 | 欧美日韩电影一区二区 | 免费黄色录像片 | 希岛爱理在线 | 成人欧美一区二区 | 999久久久久久久 | 91视频一区 | 亚洲自拍偷拍视频 | 精品视频一区二区三区在线观看 | 成人欧美一区二区三区在线播放 | 久久av一区二区三区 | 欧美jizzhd精品欧美巨大免费 | 欧美日韩成人在线 | 免费国产网站 | 国产超碰人人爽人人做人人爱 | www日本在线 | h片在线看 | 亚洲精品一区在线观看 | 亚洲国产成人精品一区二区 | 99日韩 | 成人美女免费网站视频 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 欧美区在线 | 欧美日韩在线免费观看 |