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

QQ登錄

只需一步,快速開始

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

藍(lán)牙模塊與單片機(jī)收發(fā)數(shù)據(jù)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我用BT04藍(lán)牙模塊  與  單片機(jī)進(jìn)行成功配對(duì)   想通過(guò)藍(lán)牙模塊將51單片機(jī)上DS18B20測(cè)得的溫度發(fā)送到手機(jī)端  但是發(fā)送的都是亂碼   我不知道根據(jù)自己的程序在手機(jī)端發(fā)送什么內(nèi)容  單品機(jī)才能給手機(jī)返回溫度值   我的程序如下:   希望大家給些解決方案,謝謝。

#include <reg52.h>
#define uchar unsigned char
sbit DQ=P3^6;         //數(shù)據(jù)傳輸線接單片機(jī)的相應(yīng)的引腳
unsigned char tempL=0;                 //設(shè)全局變量   
unsigned char tempH=0;
unsigned int sdata;                        //測(cè)量到的溫度的整數(shù)部分
unsigned char xiaoshu1;                //小數(shù)第一位   
unsigned char xiaoshu2;                //小數(shù)第二位     
unsigned char xiaoshu;//兩位小數(shù)     
unsigned char shi,ge,count;
int num;
unsigned char code table[]="temperature:";
unsigned char code table_1[]="0123456789";
bit fg=1;                                //溫度正負(fù)標(biāo)志

/***函數(shù)聲明***/   
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()
{                                   //初始化定時(shí)器  1   和   2
        TMOD=0x20;          //設(shè)置定時(shí)器T1工作在模式2
        TH1=0xfd;          //為定時(shí)器1附初值  1111 1101
        TL1=0xfd;
       
        TR0=1;                   //啟動(dòng)定時(shí)器0
        TR1=1;                   //啟動(dòng)定時(shí)器1
        SM0=0;
        SM1=1;
        ET1=1;          //允許定時(shí)器1中斷
        ET0=1;           //允許定時(shí)器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時(shí)    CPU被告知產(chǎn)生了一個(gè)串行口中斷
                TI=0;         //   串行口中斷請(qǐng)求標(biāo)志位   由軟件清零
        }
        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);                                 //稍延時(shí)
        DQ=0;                                         //發(fā)送復(fù)位脈沖
        delay(80);                                 //延時(shí)(>480us)
        DQ=1;                                         //拉高數(shù)據(jù)線
        delay(5);                                 //等待(15~60us)
        x=DQ;                                         //用X的值來(lái)判斷初始化有沒(méi)有成功,18B20存在的話X=0,否則X=1
        delay(20);
}

//讀一個(gè)字節(jié)
ReadOneChar(void)                          //主機(jī)數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號(hào)
{
        unsigned char i=0;                 //每個(gè)讀周期最短的持續(xù)時(shí)間為60us,各個(gè)讀周期之間必須有1us以上的高電平恢復(fù)期
        unsigned char dat=0;
        for (i=8;i>0;i--)                 //一個(gè)字節(jié)有8位
        {
                DQ=1;
                delay(1);
                DQ=0;
                dat>>=1;
                DQ=1;
                if(DQ)
                dat|=0x80;
                delay(4);
        }
        return(dat);
}

//寫一個(gè)字節(jié)
void WriteOneChar(unsigned char dat)
{
        unsigned char i=0;                 //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號(hào)。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
        for(i=8;i>0;i--)                 //在15~60us之間對(duì)數(shù)據(jù)線進(jìn)行采樣,如果是高電平就寫1,低寫0發(fā)生。
        {
                DQ=0;                                 //在開始另一個(gè)寫周期前必須有1us以上的高電平恢復(fù)期。
                DQ=dat&0x01;
                delay(5);
                DQ=1;
                dat>>=1;
        }
        delay(4);
}

//讀溫度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{
        Init_DS18B20();                                         //初始化   
        WriteOneChar(0xcc);                                 //跳過(guò)讀序列號(hào)的操作               0xcc  1100 1100
        WriteOneChar(0x44);                                 //啟動(dòng)溫度轉(zhuǎn)換                         0x44  0100 0100
        delay(125);                                                 //轉(zhuǎn)換需 要一點(diǎn)時(shí)間,延時(shí)      
        Init_DS18B20();                                         //初始化     
        WriteOneChar(0xcc);                                 //跳過(guò)讀序列號(hào)的操作   
        WriteOneChar(0xbe);                                 //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
        tempL=ReadOneChar();                                 //讀出溫度的低位LSB      
        tempH=ReadOneChar();                                 //讀出溫度的高位MSB             
        if(tempH>0x7f)                                      //最高位為1時(shí)溫度是負(fù)     
        {
                tempL=~tempL;                                        //補(bǔ)碼轉(zhuǎn)換,取反加一   
                tempH=~tempH+1;      
                fg=0;                                                      //讀取溫度為負(fù)時(shí)fg=0     
        }
        sdata = tempL/16+tempH*16; //整數(shù)部分     
        shi=sdata/10;
        ge=sdata%10;
        xiaoshu1 = (tempL&0x0f)*10/16;                 //小數(shù)第一位     
        xiaoshu2 = (tempL&0x0f)*100/16%10;        //小數(shù)第二位   
        xiaoshu=xiaoshu1*10+xiaoshu2;                 //小數(shù)兩位     
}


評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
大樹下面吃草莓 + 5 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:186936 發(fā)表于 2017-8-24 11:37 | 只看該作者
我這個(gè)可以,你可以試一試

Screenshot_2017-08-24-11-35-12-499_my.test.png (122.26 KB, 下載次數(shù): 321)

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

IMG_20170824_113452.jpg (2.19 MB, 下載次數(shù): 95)

IMG_20170824_113452.jpg

LCD1602顯示 串口接收溫度.rar

61.1 KB, 下載次數(shù): 289

回復(fù)

使用道具 舉報(bào)

板凳
ID:229077 發(fā)表于 2017-8-24 15:14 | 只看該作者
好難呀!
回復(fù)

使用道具 舉報(bào)

地板
ID:229137 發(fā)表于 2017-8-24 15:33 | 只看該作者
是不是波特率不對(duì)?
回復(fù)

使用道具 舉報(bào)

5#
ID:238744 發(fā)表于 2017-11-18 17:09 | 只看該作者
wxc19960311 發(fā)表于 2017-8-24 11:37
我這個(gè)可以,你可以試一試

謝謝分享!很有用
回復(fù)

使用道具 舉報(bào)

6#
ID:261585 發(fā)表于 2017-12-21 17:01 | 只看該作者
wxc19960311 發(fā)表于 2017-8-24 11:37
我這個(gè)可以,你可以試一試

層數(shù)有Android方面的源碼嗎,900024273@qq.com,最近畢設(shè)遇到點(diǎn)問(wèn)題,謝謝了
回復(fù)

使用道具 舉報(bào)

7#
ID:316138 發(fā)表于 2018-5-11 10:49 | 只看該作者
wxc19960311 發(fā)表于 2017-8-24 11:37
我這個(gè)可以,你可以試一試

哥們    我的怎么不通  發(fā)出來(lái)的還是亂碼
回復(fù)

使用道具 舉報(bào)

8#
ID:320566 發(fā)表于 2018-5-11 12:34 | 只看該作者
手機(jī)上波特率也是9600嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:327562 發(fā)表于 2018-5-11 13:54 | 只看該作者
你波特率問(wèn)題應(yīng)該
回復(fù)

使用道具 舉報(bào)

10#
ID:334249 發(fā)表于 2018-5-20 15:49 | 只看該作者
為什么我藍(lán)牙傳輸兩位16進(jìn)制的數(shù),低位的可以,高位的不行?也是波特率的問(wèn)題嗎?
回復(fù)

使用道具 舉報(bào)

11#
ID:334673 發(fā)表于 2018-5-21 09:59 | 只看該作者
可能是字符格式不對(duì)
回復(fù)

使用道具 舉報(bào)

12#
ID:260698 發(fā)表于 2018-9-16 11:26 | 只看該作者
你的程序不能給手機(jī)發(fā)送啊
回復(fù)

使用道具 舉報(bào)

13#
ID:417702 發(fā)表于 2018-11-19 09:23 | 只看該作者
wxc19960311 發(fā)表于 2017-8-24 11:37
我這個(gè)可以,你可以試一試

這個(gè)好,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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