|
我用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)分
-
查看全部評(píng)分
|