#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^2; //定义输入输出端口
sbit duanl=P2^6;
sbit weil=P2^7;
sbit br=P2^3;
void delay(uint); //延时函数
void buzzer(void); //蜂鸣器
uchar DS18B20_init(void); //DS18B20初始化
void DS18B20_write(uchar); //DS18B20写数据函数
uchar DS18B20_read(void); //读取数据程序
void get_temper(void); //读取温度程序
void display(void); //显示温度函数
uchar temp; //温度寄存器
bit T_sign; // 温度正负
bit flag; // 18B20存在标志,1---存在 0---不存在
uchar table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //字段转换表
void main()
{
while(1)
{
get_temper();
delay(200);
display();
delay(200);
}
}
uchar DS18B20_init(void)
{
DQ=1;_nop_();_nop_();
DQ=0; //主机发出复位低脉冲
delay(100); //延时480us-960us
DQ=1;
delay(6);
if(DQ==0)
flag=1; //初始化成功
else
{
flag=0;
buzzer();
} //初始化失败。
delay(45); //延时60us-240us
DQ=1;
return(flag);
}
void DS18B20_write(uchar wd)
{
uchar i;
for(i=0;i<8;i++)
{ DQ=1;_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=wd&0x01;
delay(6); //延时30us
wd= _cror_(wd,1);
DQ=1;
}
}
uchar DS18B20_read(void)
{
uchar j;uchar dat=0;
for(j=0;j<8;j++)
{
DQ=1;_nop_();_nop_();
dat=_cror_(dat,1);
DQ=0;_nop_();_nop_();
DQ=1;
if(DQ==1)
dat|=0x80;
delay(4); //延时20us
_nop_();
}
return(dat);
}
void delay(uint t)
{
while(t--);
}
void buzzer(void)
{
uchar n=1;
while(n--)
{
br=0;
delay(1000);
br=1;
delay(1000);
}
}
void get_temper(void)
{
uchar k,T_sign,T_L,T_H;
DS18B20_init();
if(flag)
{
DS18B20_write(0xcc); // 跳过ROM匹配
DS18B20_write(0x44); //发出温度转换命令
delay(200);
DS18B20_init(); //DS18B20初始化
if(flag)
{
DS18B20_write(0xcc); //跳过ROM匹配
DS18B20_write(0xbe); //发出读温度命令
T_L=DS18B20_read(); //数据读出
T_H=DS18B20_read();
k=T_H&0xf8;
if(k==0xf8)
{
T_sign=1; //温度是负数
temp=((~T_H*256+~T_L)+0x01)*0.625;
}
else
{
T_sign=0; //温度是正数
T_H=T_H&0x07;
temp=(T_H*256+T_L)*0.625;
}
}
}
}
void display(void)
{
if(T_sign==0)
{
weil=1;P0=0x7f;weil=0;
duanl=1;
P0=table[temp/1000]; //百位输出
duanl=0;
delay(200);
weil=1;P0=0xbf;weil=0;
duanl=1;
P0=table[(temp%1000)/100]; //十位输出
duanl=0;
delay(200);
weil=1;P0=0xdf;weil=0;
duanl=1;
P0=0x7f&table[((temp%100)/10)]; //个位输出
duanl=0;
delay(200);
weil=1;P0=0xef;weil=0;
duanl=1;
P0=table[temp%10]; //小数部分输出
duanl=0;
delay(200);
}
else
{ weil=1;P0=0x7f;weil=0;
duanl=1;
P0=0xbf;
duanl=0;
delay(200);
weil=1;P0=0xbf;weil=0;
duanl=1;
P0=table[temp/100]; //十位输出
duanl=0;
delay(200);
weil=1;P0=0xdf;weil=0;
duanl=1;
P0=0x7f&table[((temp%100)/10)]; //个位输出
duanl=0;
delay(200);
weil=1;P0=0xef;weil=0;
duanl=1;
P0=table[temp%10]; //小数部分输出
duanl=0;
delay(200);
}
}
评论0