找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4774|回复: 9
打印 上一主题 下一主题
收起左侧

手机接收的51单片机驱动蓝牙模块数据都是乱码 求大神助!

[复制链接]
跳转到指定楼层
楼主
ID:242160 发表于 2017-12-5 09:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于51单片机利用蓝牙模块,想用手机接收,但是接收的都是乱码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:242160 发表于 2017-12-5 09:30 | 只看该作者
想用手机接收单片机上数码管显示的数字
回复

使用道具 举报

板凳
ID:128334 发表于 2017-12-5 18:46 | 只看该作者
两种可能 一种是波特率不匹配 比较多见 另一种是模块电平不匹配 有些蓝牙模块带有232芯片 使用时要注意
这两种情何况都回导致乱码
回复

使用道具 举报

地板
ID:231046 发表于 2017-12-6 08:19 | 只看该作者
是的,一种是波特率不同,另一种是发生时序不对,最会产生乱码的。
回复

使用道具 举报

5#
ID:242160 发表于 2017-12-6 09:37 | 只看该作者
langshan 发表于 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()/*读数据*/
{
        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)/*写数据*/
{
        unsigned char i=0;
        for (i=8; i>0;i--)
{
        DQ = 0;
        DQ = wdata&0x01;
        delay_18B20(10) ;
        DQ = 1;
        wdata>>=1;
}
}
read_temp ()/*读取温度值并转换*/
{
        uchar a,b;
        ds1820rst () ;
        ds1820wr(0xcc) ;//*跳过读序列号*/

        ds1820wr(0x44) ;//*启动温度转换*/
        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; //百位数
        disdata[1]=tvalue%1000/100+0x30;// 十位数
        disdata[2]=tvalue%100/10+0x30;//个位数
        disdata[3]=tvalue%10+0x30;//小数位
        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) ;//显示小数点
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//显示小数位

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; //待发送的数据写心缓冲区
        while(!TI); //等待发送完成
        TI = 0; //清等发送标志位
}
        /************* 主程序********************/



void main()
{
        UART_Init();
        init_play() ;//初始化显示
        while(l)
        {
                read_tempO);//读取温度

        StartModule();
        while(R) ;//当RX 为零时等待
        TRO=1;//开启计数
        while(R) ;//当RX 为1计数并等待
       
        TRO=0;//关闭计数
        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 //串口中断两数
{
        uchar Rev = 0:
        if(RI) //查询接收标志位(有数据发送过来时置为1)
        {
           RI = 0;
           Rcv =SBUF;
           RxBuf=Rcv ;
           if(RxBuf=='8' ){ TxF1;}
           if(RxBuf==' 0' ){Ax=1; }
        }
}


回复

使用道具 举报

6#
ID:242160 发表于 2017-12-6 10:30 | 只看该作者
david888 发表于 2017-12-6 08:19
是的,一种是波特率不同,另一种是发生时序不对,最会产生乱码的。

能帮忙看一下是哪里出错了吗


#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()/*读数据*/
{
        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)/*写数据*/
{
        unsigned char i=0;
        for (i=8; i>0;i--)
{
        DQ = 0;
        DQ = wdata&0x01;
        delay_18B20(10) ;
        DQ = 1;
        wdata>>=1;
}
}
read_temp ()/*读取温度值并转换*/
{
        uchar a,b;
        ds1820rst () ;
        ds1820wr(0xcc) ;//*跳过读序列号*/

        ds1820wr(0x44) ;//*启动温度转换*/
        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; //百位数
        disdata[1]=tvalue%1000/100+0x30;// 十位数
        disdata[2]=tvalue%100/10+0x30;//个位数
        disdata[3]=tvalue%10+0x30;//小数位
        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) ;//显示小数点
wr_com (Oxcd) ;
wr_dat(disdata[3]) ;//显示小数位

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; //待发送的数据写心缓冲区
        while(!TI); //等待发送完成
        TI = 0; //清等发送标志位
}
        /************* 主程序********************/



void main()
{
        UART_Init();
        init_play() ;//初始化显示
        while(l)
        {
                read_tempO);//读取温度

        StartModule();
        while(R) ;//当RX 为零时等待
        TRO=1;//开启计数
        while(R) ;//当RX 为1计数并等待
        
        TRO=0;//关闭计数
        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 //串口中断两数
{
        uchar Rev = 0:
        if(RI) //查询接收标志位(有数据发送过来时置为1)
        {
           RI = 0;
           Rcv =SBUF;
           RxBuf=Rcv ;
           if(RxBuf=='8' ){ TxF1;}
           if(RxBuf==' 0' ){Ax=1; }
        }
}
回复

使用道具 举报

7#
ID:236125 发表于 2017-12-6 11:34 | 只看该作者
  THO=0;
   TL0=0;
   你的0和O不分,里面还有这种问题,可能是造成原因之一
回复

使用道具 举报

8#
ID:242160 发表于 2017-12-8 14:56 | 只看该作者
一龙大师 发表于 2017-12-6 11:34
THO=0;
   TL0=0;
   你的0和O不分,里面还有这种问题,可能是造成原因之一

解决了   谢谢
回复

使用道具 举报

9#
ID:128334 发表于 2017-12-16 08:45 | 只看该作者
这恐怕连编译都过不了吧!
编译5大步骤,如果是这样的原因你连词法分析都过不了,何谈乱码?
回复

使用道具 举报

10#
ID:259619 发表于 2017-12-16 15:54 | 只看该作者
看比特率是否一致,蓝牙模块若是HC06单片机需要晶振为11.0592才能无误差,而一般51单片机都是配备的12M晶振,所以误差很大,做不到你说的操作
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表