/***********温度显示函数******************************/
void ds1820rst() /*ds1820复位*/
{
unsigned char x=0;
DQ = 1; //DQ复位
delay_uint(4); //延时
DQ = 0; //DQ拉低
delay_uint(80); //精确延时大于480us 540us
DQ = 1; //拉高总线 15-60us
delay_uint(20);
x=DQ; //读总线状态 为0复位成功,1复位不成功
delay_1ms(30);
DQ=1; //释放总线
}
unsigned char ds1820rd() /*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80; //dat和0x80做“或”运算(最高位1,其他位保持不变)
delay_uint(10);
}
return(dat);
}
void ds1820wr(unsigned char wdata) /*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_uint(10);
DQ = 1;
wdata>>=1;
}
}
read_temp()/*读取温度值并转换*/
{
unsigned char a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
t=b;
t<<=8;
t=t|a;
TM=t*0.625;
t=TM*1+0.5;
return(t);
}
void ds1820disp()//温度值显示
{
disdata[0]=t%1000/100+0x30;//十位数
disdata[1]=t%100/10+0x30;//个位数
disdata[3]=t%10+0x30;//小数位
write_sfm2(1,12,disdata[0]);//显示十位
write_sfm2(1,13,disdata[1]);//显示个位
write_sfm2(1,14,0x2e);//显示小数点
write_sfm2(1,15,disdata[3]);//显示小数位
}
从网上找的温度模块,加入到自己的代码中,但是在lcd显示屏上显示4545,完全不会受ds18b20控制,不知道哪里出了问题
|