找回密码
 立即注册

QQ登录

只需一步,快速开始

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

蓝牙模块与单片机收发数据

  [复制链接]
跳转到指定楼层
楼主
我用BT04蓝牙模块  与  单片机进行成功配对   想通过蓝牙模块将51单片机上DS18B20测得的温度发送到手机端  但是发送的都是乱码   我不知道根据自己的程序在手机端发送什么内容  单品机才能给手机返回温度值   我的程序如下:   希望大家给些解决方案,谢谢。

#include <reg52.h>
#define uchar unsigned char
sbit DQ=P3^6;         //数据传输线接单片机的相应的引脚
unsigned char tempL=0;                 //设全局变量   
unsigned char tempH=0;
unsigned int sdata;                        //测量到的温度的整数部分
unsigned char xiaoshu1;                //小数第一位   
unsigned char xiaoshu2;                //小数第二位     
unsigned char xiaoshu;//两位小数     
unsigned char shi,ge,count;
int num;
unsigned char code table[]="temperature:";
unsigned char code table_1[]="0123456789";
bit fg=1;                                //温度正负标志

/***函数声明***/   
void delay(unsigned char i);
void delay1(uchar i);
void Init_DS18B20(void);
ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);
void send();

void main()
{                                   //初始化定时器  1   和   2
        TMOD=0x20;          //设置定时器T1工作在模式2
        TH1=0xfd;          //为定时器1附初值  1111 1101
        TL1=0xfd;
       
        TR0=1;                   //启动定时器0
        TR1=1;                   //启动定时器1
        SM0=0;
        SM1=1;
        ET1=1;          //允许定时器1中断
        ET0=1;           //允许定时器0中断
        EA=1;                //开总中断
        while(1)
        {       
                ReadTemperature();
                num++;
                if(num>=1000)
                {
                        num=0;
               
                        send();
               
                }
        }
}




void ser()interrupt 4                 //串行口中断
{
       
}

void send()
{
        for(count=0;count<12;count++)
        {
                SBUF=table[count];
                while(!TI);                                                   //   TI为1时    CPU被告知产生了一个串行口中断
                TI=0;         //   串行口中断请求标志位   由软件清零
        }
        SBUF=table_1[shi];
        while(!TI);
        TI=0;

        SBUF=table_1[ge];
        while(!TI);
        TI=0;

        SBUF='.';;
        while(!TI);
        TI=0;

        SBUF=table_1[xiaoshu1];
        while(!TI);
        TI=0;

        SBUF=table_1[xiaoshu2];
        while(!TI);
        TI=0;

        SBUF='\n';
        while(!TI);
        TI=0;
}
void delay(unsigned char i)
{
        for(i;i>0;i--);
}

void delay1(uchar i)
{
        uchar j,k;
        for(j=i;j>0;j--)
                for(k=125;k>0;k--);
}

void Init_DS18B20(void)                         //DS18B20的初始化
{
        unsigned char x=0;
        DQ=1;                                         //DQ先置高
        delay(8);                                 //稍延时
        DQ=0;                                         //发送复位脉冲
        delay(80);                                 //延时(>480us)
        DQ=1;                                         //拉高数据线
        delay(5);                                 //等待(15~60us)
        x=DQ;                                         //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
        delay(20);
}

//读一个字节
ReadOneChar(void)                          //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
        unsigned char i=0;                 //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
        unsigned char dat=0;
        for (i=8;i>0;i--)                 //一个字节有8位
        {
                DQ=1;
                delay(1);
                DQ=0;
                dat>>=1;
                DQ=1;
                if(DQ)
                dat|=0x80;
                delay(4);
        }
        return(dat);
}

//写一个字节
void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;                 //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
        for(i=8;i>0;i--)                 //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
        {
                DQ=0;                                 //在开始另一个写周期前必须有1us以上的高电平恢复期。
                DQ=dat&0x01;
                delay(5);
                DQ=1;
                dat>>=1;
        }
        delay(4);
}

//读温度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{
        Init_DS18B20();                                         //初始化   
        WriteOneChar(0xcc);                                 //跳过读序列号的操作               0xcc  1100 1100
        WriteOneChar(0x44);                                 //启动温度转换                         0x44  0100 0100
        delay(125);                                                 //转换需 要一点时间,延时      
        Init_DS18B20();                                         //初始化     
        WriteOneChar(0xcc);                                 //跳过读序列号的操作   
        WriteOneChar(0xbe);                                 //读温度寄存器(头两个值分别为温度的低位和高位)
        tempL=ReadOneChar();                                 //读出温度的低位LSB      
        tempH=ReadOneChar();                                 //读出温度的高位MSB             
        if(tempH>0x7f)                                      //最高位为1时温度是负     
        {
                tempL=~tempL;                                        //补码转换,取反加一   
                tempH=~tempH+1;      
                fg=0;                                                      //读取温度为负时fg=0     
        }
        sdata = tempL/16+tempH*16; //整数部分     
        shi=sdata/10;
        ge=sdata%10;
        xiaoshu1 = (tempL&0x0f)*10/16;                 //小数第一位     
        xiaoshu2 = (tempL&0x0f)*100/16%10;        //小数第二位   
        xiaoshu=xiaoshu1*10+xiaoshu2;                 //小数两位     
}


评分

参与人数 1黑币 +5 收起 理由
大树下面吃草莓 + 5 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:186936 发表于 2017-8-24 11:37 | 只看该作者
我这个可以,你可以试一试

Screenshot_2017-08-24-11-35-12-499_my.test.png (122.26 KB, 下载次数: 297)

Screenshot_2017-08-24-11-35-12-499_my.test.png

IMG_20170824_113452.jpg (2.19 MB, 下载次数: 72)

IMG_20170824_113452.jpg

LCD1602显示 串口接收温度.rar

61.1 KB, 下载次数: 289

回复

使用道具 举报

板凳
ID:229077 发表于 2017-8-24 15:14 | 只看该作者
好难呀!
回复

使用道具 举报

地板
ID:229137 发表于 2017-8-24 15:33 | 只看该作者
是不是波特率不对?
回复

使用道具 举报

5#
ID:238744 发表于 2017-11-18 17:09 | 只看该作者
wxc19960311 发表于 2017-8-24 11:37
我这个可以,你可以试一试

谢谢分享!很有用
回复

使用道具 举报

6#
ID:261585 发表于 2017-12-21 17:01 | 只看该作者
wxc19960311 发表于 2017-8-24 11:37
我这个可以,你可以试一试

层数有Android方面的源码吗,900024273@qq.com,最近毕设遇到点问题,谢谢了
回复

使用道具 举报

7#
ID:316138 发表于 2018-5-11 10:49 | 只看该作者
wxc19960311 发表于 2017-8-24 11:37
我这个可以,你可以试一试

哥们    我的怎么不通  发出来的还是乱码
回复

使用道具 举报

8#
ID:320566 发表于 2018-5-11 12:34 | 只看该作者
手机上波特率也是9600吗?
回复

使用道具 举报

9#
ID:327562 发表于 2018-5-11 13:54 | 只看该作者
你波特率问题应该
回复

使用道具 举报

10#
ID:334249 发表于 2018-5-20 15:49 | 只看该作者
为什么我蓝牙传输两位16进制的数,低位的可以,高位的不行?也是波特率的问题吗?
回复

使用道具 举报

11#
ID:334673 发表于 2018-5-21 09:59 | 只看该作者
可能是字符格式不对
回复

使用道具 举报

12#
ID:260698 发表于 2018-9-16 11:26 | 只看该作者
你的程序不能给手机发送啊
回复

使用道具 举报

13#
ID:417702 发表于 2018-11-19 09:23 | 只看该作者
wxc19960311 发表于 2017-8-24 11:37
我这个可以,你可以试一试

这个好,学习了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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