|
#include "ds18b20.h"
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //復(fù)位,初始化
{
uint i;
ds=0;
i=103;
while(i>0) i--;
ds=1;
i=4;
while(i>0) i--;
}
bit tempreadbit(void)
{
uint i;
bit dat;
ds=0;
i++;
ds=1;
i++;
i++;
dat=ds;
i=8;
while(i>0)i--;
return dat;
}
uchar tempread(void) //讀一個(gè)字節(jié)函數(shù)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在dat里
}
return dat;
}
void tempwritebyte(uchar dat) //寫(xiě)一個(gè)字節(jié)函數(shù)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;
i++;
ds=1;
i=8;
while(i>0)i--;
}
else
{
ds=0;
i=8;
while(i>0)i--;
ds=1;
i++;
i++;
}
}
}
void tempchange(void) //開(kāi)始獲取溫度并轉(zhuǎn)換
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp(void)
{
uchar a,b;
uint temp;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a =tempread(); //存放溫度值的低字節(jié)
b =tempread();
temp=b;
temp<<=8;
temp=temp|a;
temp=temp*0.0625*10+0.5;
return temp;
}
顯示程序在主函數(shù)
tempchange();//調(diào)用溫度轉(zhuǎn)換函數(shù)
LcdDisplay(get_temp()); //讀取溫度并顯示
void LcdDisplay(int temp) //lcd顯示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
float tp;
if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
{
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
temp=tp*0.0625*100+0.5;
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
write_str("溫度:");
write_data('0'+datas[1]|0x30);
write_data('0'+datas[2]|0x30);
write_data('.');
write_data('0'+datas[3]|0x30);
write_data('0'+datas[4]|0x30);
location(4,6);
write_data(0xA1);
write_data(0xE6);
}
|
|