#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char BYTE;
uchar tplsb,tpmsb;
uchar TPHH[10]="00.00 `C "; // 温度值低位、高位字节
uint TEM;
void LCD_Display(); //温度实际值
sbit DQ = P1^0; // 数据通信线DQ
void LCD_Display();
/*serial()interrupt 4 using 1
{
SBUF=tplsb;
TI=0;
} */
void delayus(uint t) //22.1184,延时时间6us
{
for(;t>1;t--);
}
/* 产生复位脉冲初始化DS18B20 */
void TxReset(void)
{
DQ = 0; // 拉低约900us
delayus(75);
DQ = 1; // 产生上升沿延时15 ~ 60us
delayus(4);
}
/* 等待应答脉冲 */
void RxWait(void)
{
//while(DQ);
//while(!DQ); // 检测到应答脉冲
delayus(3);
}
BYTE Read_Byte()
{
BYTE i;
BYTE dat = 0;
for (i=0; i<8; i++) //8位计数器
{
dat >>= 1;
DQ = 0; //开始时间片
_nop_(); //延时等待
_nop_();
DQ = 1; //准备接收
_nop_(); //接收延时
_nop_();
if (DQ) dat |= 0x80; //读取数据
delayus(5); //等待时间片结束
}
return dat;
}
void Write_Byte(BYTE dat)
{
char i;
for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //开始时间片
_nop_(); //延时等待
_nop_();
dat >>= 1; //送出数据
DQ = CY;
delayus(5); //等待时间片结束
DQ = 1; //恢复数据线
}
}
/* 启动温度转换 */
void convert(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delayus(50); // 延时
Write_Byte(0xcc); // skip rom 命令
Write_Byte(0x44); // convert T 命令
}
/* 读取温度值 */
void Read_Temp(void)
{
TxReset(); // 产生复位脉冲,初始化DS18B20
RxWait(); // 等待DS18B20给出应答脉冲
delayus(50); // 延时
Write_Byte(0xcc); // skip rom 命令
Write_Byte(0xbe); // read scratchpad 命令
tplsb = Read_Byte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb = Read_Byte(); // 高位值高位字节(其中高5位为符号位)
if((tpmsb & 0x80) == 0)
{
TEM = (tpmsb * 256 + tplsb) * 0.0625*100;
TPHH[0]=(TEM%10000)/1000+'0';
TPHH[1]=(TEM%1000)/100+'0';
TPHH[3]=(TEM%100)/10+'0';
TPHH[4]=TEM%10+'0';
}
//else
// TPH = (~tpmsb * 256 + ~tplsb + 1) * 0.0625;
}
void main(void)
{
while(1)
{
delayus(50);
convert();
delayus(20000);
Read_Temp();
LCD_Display();
}
}