#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) //复位,初始化
{
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) //读一个字节函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return dat;
}
void tempwritebyte(uchar dat) //写一个字节函数
{
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) //开始获取温度并转换
{
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(); //存放温度值的低字节
b =tempread();
temp=b;
temp<<=8;
temp=temp|a;
temp=temp*0.0625*10+0.5;
return temp;
}
显示程序在主函数
tempchange();//调用温度转换函数
LcdDisplay(get_temp()); //读取温度并显示
void LcdDisplay(int temp) //lcd显示
{
unsigned char datas[] = {0, 0, 0, 0, 0}; //定义数组
float tp;
if(temp< 0) //当温度值为负数
{
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
}
else
{
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
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);
}
|