/*******************************************************
* DS18B20温度传感器 *
* 测量范围:-55℃ ~ 125℃ *
* 共阳极数码管显示 *
* *
*******************************************************/
#include"reg51.h"
#include"intrins.h"
#include"math.h"
#define uchar unsigned char
sbit seg1=P3^0;
sbit seg2=P3^1;
sbit seg3=P3^2;
sbit seg4=P3^3;
sbit DQ=P3^4;
sbit LED=P1^0;
uchar datal;
uchar datah;
uchar sseg,gseg,dseg;
float dec=888;
uchar buf[]={0,0,0,0xc6};
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff}; // CA 0 1 2 3 4 5 6 7 8 9 - 熄灭
/*******************************************************
* *
* 显示部分 *
* *
*******************************************************/
/*****毫秒延时*****/
void delay_ms(uchar tms) //一个tms=1ms
{
uchar j;
while(tms--)
{
for(j=112;j>0;j--);
}
}
/*****显示设定*****/
void display(dec)
{
P0=buf[0];
seg1=1;
seg2=0;
seg3=0;
seg4=0;
delay_ms(1);
seg1=0;
delay_ms(1);
P0=buf[1];
seg1=0;
seg2=1;
seg3=0;
seg4=0;
delay_ms(2);
seg2=0;
delay_ms(2);
P0=buf[2];
seg1=0;
seg2=0;
seg3=1;
seg4=0;
delay_ms(2);
seg3=0;
delay_ms(2);
P0=buf[3];
seg1=0;
seg2=0;
seg3=0;
seg4=1;
delay_ms(2);
seg4=0;
delay_ms(2);
}
/*******************************************************
* *
* DS18B20部分 *
* *
*******************************************************/
/*****微秒延时*****/
void delayus(uchar tus)
{
while(tus>0)
tus--;
}
/*****毫秒延时*****/
void delayms(uchar tms) //一个tms=15ms
{
while(tms--)
{
display(dec);
}
}
/*****秒延时*****/
void delays(uchar ts) //一个ts=1s
{
while(ts--)
{
delayms(70);
}
}
/*****18b20初始化*****/
bit ini_1820()
{
bit re;
DQ=0;
delayus(100);
DQ=1;
delayus(4);
re=DQ;
delayus(200);
DQ=1;
return(re);
}
/*****写指令*****/
void wr_1820(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
if(dat&0x01)
{
DQ=0;
_nop_();
DQ=1;
delayus(8);
}
else
{
DQ=0;
delayus(8);
DQ=1;
_nop_();
}
dat>>=1;
}
}
/*****读数据*****/
bit rd_bit()
{
bit rdbit;
DQ=0;
_nop_();
DQ=1;
_nop_();
rdbit=DQ;
delayus(200);
return rdbit;
}
uchar rd_1820()
{
uchar i,dat=0;
bit rdbit;
for(i=0;i<8;i++)
{
dat>>=1;
rdbit=rd_bit();
if(0==rdbit)
dat|=0x00;
else
dat|=0x80;
}
return dat;
}
/*****读取温度*****/
void get_1820()
{
bit re;
LED=1;
display(dec);
re=ini_1820();
if(re)
LED=0;
wr_1820(0xcc);
wr_1820(0x44);
delays(1);
re=ini_1820();
if(re)
LED=0;
wr_1820(0xcc);
wr_1820(0xbe);
datal=rd_1820();
datah=rd_1820();
}
/*****真值转换*****/
float chang_1820()
{
float hex;
float deci;
get_1820();
datah<<=1;
if(0==CY)
{
datah>>=1;
hex=datah*16*16+datal;
deci=hex*0.0625;
}
else
{
datah>>=1;
datah=~datah;
datal=~datal;
datah<<=5;
datah>>=5;
hex=datah*16*16+datal+1;
deci=-hex*0.0625;
}
return(deci);
}
/*****真值处理*****/
void deal_1820()
{
float deci;
deci=chang_1820();
if(deci<0)
{
buf[0]=table[10];
deci=abs(deci);
if(deci<10) //小于0大于-10,典型:-3.33
{
dseg=(deci-(int)deci)*10;
gseg=(int)deci;
buf[1]=table[gseg];
buf[1]&=0x7f;
buf[2]=table[dseg];
}
else //小于等于-10,典型:-10.99
{
dseg=(int)deci%10;
gseg=(int)deci/10;
buf[1]=table[gseg];
buf[2]=table[dseg];
}
}
else
{
if(deci<10) //小于10大于0,典型:3.33
{
buf[0]=table[11];
dseg=(deci-(int)deci)*10;
gseg=(int)deci;
buf[1]=table[gseg];
buf[1]&=0x7f;
buf[2]=table[dseg];
}
else if(deci<100) //大于等于10小于100,典型:10.99
{
dseg=(deci-(int)deci)*10;
gseg=(int)deci%10;
sseg=(int)deci/10;
buf[0]=table[sseg];
buf[1]=table[gseg];
buf[1]&=0x7f;
buf[2]=table[dseg];
}
else
{
dseg=(int)deci%10;
gseg=(int)deci/10%10;
sseg=(int)deci/100;
buf[0]=table[sseg];
buf[1]=table[gseg];
buf[2]=table[dseg];
}
}
}
/*******************************************************
* *
* 主函数 *
* *
*******************************************************/
void main()
{
while(1)
{
deal_1820();
display(dec);
}
}