void delay1(uint t)
{
while(--t);
}
void init_18b20()
{
uchar flag;
DQ=1;
delay1(10); //延时
DQ=0;
delay1(500); //*延时,要求精度,要求大于480us*
DQ=1;
delay1(200); //*延时,要求精度,要求大于15us*
flag=DQ; //DQ管脚送出60-240us的0脉冲,以示初始化成功
delay1(10); //延时
}
//**************************************************************************************************
//写一个字节函数
//**************************************************************************************************
void write_byte(uchar t)
{
uchar i;
for(i=0;i<8;i++) //循环8次写入1字节
{
DQ=0; //数据线置低
delay1(10); //延时
DQ=t&0x01; //发送1位数据,最低位开始
delay1(50); //*延时,要求精度*
DQ=1; //数据线置高
t=t>>1; //右移1位
}
}
//**************************************************************************************************
//读一个字节函数
//**************************************************************************************************
uchar read_byte()
{
uchar i,value=0;;
for(i=0;i<8;i++) //循环8次读取1字节
{
value=value>>1; //右移1位
DQ=0; //数据线置低
delay1(10); //延时
DQ=1; //数据线置高
delay1(10); //延时
if(DQ==1)value=value|0x80;//判断接收的1位数据是否为1
delay1(50); //*延时,要求精度*
}
return(value);
}
//**************************************************************************************************
//数据处理子函数
//**************************************************************************************************
//**************************************************************************************************
//温度采集函数
//**************************************************************************************************
uint get_temp()
{
uint dat;
uchar wenl,wenh;
init_18b20(); //复位
write_byte(0xcc); //不进行编号匹配
write_byte(0x44); //进行温度转换
init_18b20(); //复位
write_byte(0xcc); //不进行编号匹配
write_byte(0xbe); //发读命令
wenl=read_byte(); //温度低八位
wenh=read_byte(); //温度高八位
dat=(wenh<<8)+wenl; //数据高低8位合并
return(dat); //返回测量结果
}
void chuli(uint temp)
{
uint y,t;
uchar ge,shi;
if(temp&0x8000) //判断是否为负数
{
temp=~temp+1;//取反加1
LCD_PutString(180,40,"-",0x0000,0x7FFF);
t=(int)(temp*0.0625);
}
else
{
LCD_PutString(180,40,"+",0x0000,0x7FFF);
t=(int)(temp*0.0625+0.05);
}
}
|