|
#include<reg51.h>
#include"nrf24l10out.h"
int t;
uint num;
uchar dat; //讀寫數(shù)據(jù)變量
uchar a=0;
uchar b=0;
sbit DQ=P1^6;
float tep=0; //讀一個(gè)溫度時(shí)的溫度轉(zhuǎn)換中間間
uchar data tempbuf[4]=0;//溫度字型顯示中間變量
uchar tt[]={"444"};
/******************************************************
函數(shù)名稱:delay(uint num)
返回值:無(wú)
參數(shù):uint num
延時(shí)數(shù)據(jù)值
作用:延時(shí)
*******************************************************/
void delay(uint num) // 微秒級(jí)
{
while(num--);
}
/******************************************************
函數(shù)名稱:void Init_DS18B20(void)
返回值:無(wú)
參數(shù):無(wú)
作用:初始化18B20
*******************************************************/
void Init_DS18B20(void)
{
char x=0;
DQ=1;
delay(10);//稍作延時(shí)
DQ=0;
delay(80);//延時(shí)>480us 540us
DQ=1; //拉高總線 15-60us
delay(20);
x=DQ;//讀總線狀態(tài) 為0復(fù)位成功,為1則不成功
delay(30);
DQ=1;//釋放總線
}
/******************************************************
函數(shù)名稱:uchar ReadOneChar(void)
返回值:uchar dat
參數(shù): 無(wú)
作用:讀取1820一個(gè)字節(jié)
*******************************************************/
uchar ReadOneChar(void)
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;//給脈沖
if(DQ)
{dat|=0x80;}//讀1 /// 讀0右移處理
delay(8);//15us內(nèi)讀完一個(gè)數(shù)
}
return(dat);
}
/******************************************************
函數(shù)名稱:void WriteOneChar(uchar dat)
返回值:無(wú)
參數(shù): uchar dat
作用:向1820寫一個(gè)字節(jié)
*******************************************************/
/////****寫DS18B20***/
//寫0 60us讀完,寫1 30us 內(nèi)讀完
void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;//寫所給數(shù)據(jù)最低位
delay(10);
///////////
DQ=1;//給脈沖
dat>>=1;
}
delay(8);
}
/******************************************************
函數(shù)名稱:int ReadOneTemperature(void)
返回值:int t
參數(shù): 無(wú)
作用:讀溫度值
*******************************************************/
int ReadOneTemperature(void)
////////***讀取溫度值***********/
//// 每次讀寫均要先復(fù)位
{
Init_DS18B20();
WriteOneChar(0xcc);//發(fā)跳過(guò)ROM命令
WriteOneChar(0x44);//發(fā)讀開(kāi)始轉(zhuǎn)換命令
Init_DS18B20();
WriteOneChar(0xcc);//發(fā)跳過(guò)ROM命令
WriteOneChar(0xbe);//讀寄存器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值
a=ReadOneChar(); //a存低字節(jié)
b=ReadOneChar(); //b存高字節(jié)
t=b;
t<<=8;//高字節(jié)轉(zhuǎn)換為10進(jìn)制
t=t|a;
tep=t*0.0625;//轉(zhuǎn)換精度為0.0625/LSB
t=tep*10+0.5;//保留1位小數(shù)并四舍五入****后面除10還原正確溫度值)
return(t);
}
/******************************************************
函數(shù)名稱:uint Temperaturepro(void)
返回值:void
參數(shù): void
作用:溫度處理
*******************************************************/
void Temperaturepro(void)
{
int temp;
temp=ReadOneTemperature();
tempbuf[3]=temp/1000;//百位
tempbuf[2]=temp/100%10;//十位
tempbuf[1]=temp%100/10; //個(gè)位
tempbuf[0]=temp%10; //小數(shù)
}
void initUart(void)
{
TMOD|=0x20;// 初始化定時(shí)器1為8位自動(dòng)重裝模式
SCON=0x50;// 配置串口工作模式,使能了串口接收中斷
TH1=0xfd;// 配置波特率
TL1=0xfd;
TR1=1;// 啟動(dòng)定時(shí)器1
ES=1;// 打開(kāi)串口中斷允許
TI=1;
}
void main()
{
int temp;
// uchar str[4]="1234";
init_io();
// initUart();
while(1)
{
temp=ReadOneTemperature(); //獲取溫度值
tempbuf[3]=temp/1000;//百位
tempbuf[0]=temp/100%10;//十位
tempbuf[1]=temp%100/10; //個(gè)位
tempbuf[2]=temp%10; //小數(shù)
//printf("sfkjsfks\n");
}
|
|