单片机温度控制系统DS18B20.doc
文本预览下载声明
#includereg52.h
#define uchar unsigned char
#define uint unsigned int
uchar bai,shi,ge,xiaoshu,fuhao;
bit sign; //负数的标志位
bit f; //DS18B20初始化成功标志位
sbit DQ=P1^7;
sbit LS138A = P2^0; //定义138译码器的输入A脚由P2.0控制
sbit LS138B = P2^1; //定义138译码器的输入脚B由P2.1控制
sbit LS138C = P2^2; //定义138译码器的输入脚C由P2.2控制
uchar Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40/*负号*/};
void delayms(uint z) //延时大约1ms
{
uchar i,j;
for(i=0;iz;i++)
for(j=0;j115;j++);
}
void delayus(uchar i) //延时大约6us
{
while(i--);
}
void init_ds18b20()
{
DQ=1;
delayus(8);
DQ=0;
delayus(80);
DQ=1;
delayus(8);
delayus(4);
while(DQ==0)
f=1;
}
//写一个字节的数据,低位在前
void write_ds18b20(uchar date)
{
uchar i=0;
for(i=0;i8;i++)
{
DQ=0;
DQ=date0x01;
delayus(4); //延时约48us
DQ=1;
date=1;
}
delayus(4);
}
//读一个字节的数据
uchar read_ds18b20()
{
uchar i=0,dat=0;
for(i=0;i8;i++)
{
DQ=0;
dat=1;
DQ=1;
if(DQ==1)
dat|=0x80;
delayus(4);
}
return dat;
}
//温度的转换,获取温度
uint wendu()
{
uchar temph,templ;
uint temp;
//float t;
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0x44);
delayms(10);
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe);
templ=read_ds18b20();
temph=read_ds18b20();
if((temph0xf8)!=0x00)
{
sign=1; //此时温度为零下,即为负数
temph=~temph;
templ=~templ;
templ+=1;
if(templ255)
temph++;
}
temp=temph;
temp=0x07;
temp=((temph*256)+templ)*0.625+0.5;
return temp;
}
void smg()
{
LS138A=0;
LS138B=0;
LS138C=0;
P0=0;
}
void display()
{
uint LedOut[10],i=4;
uint num;
num=wendu();
bai=num/1000;
shi=num%1000/100;
ge=num%100/10;
xiaoshu=num%10;
fuhao=10;
if(!f)
P0=0x00;
else
{
LedOut[4]=Temp[bai]; //百位
if(bai==0)
{
i=5;
if(sign==1) // 负号
{
i=4;
LedOut[4]=Temp[fuhao];
}
}
LedOut[5]=Temp[shi]; //十位
if(bai==0shi==0)
{
i=6;
if(sign==1) //负号
{
i=5;
LedOut[5]=Temp[fuhao];
}
}
LedOut[6]=Temp[ge]|0x80; //个位带小数点儿
LedOut[7]=Temp[xiaoshu]; //小数位
显示全部