command
data
高地位组合即为温度数据
1. 初始化时钟
void Init_DS18B20(void)
{
char CY = 1;
while (CY)
{
DQ_OUT();
DQ_SET_H();
delay_us(20);
DQ_SET_L(); //送出低电平复位信号
delay_us(360); //延时至少480us
delay_us(240);
DQ_SET_H(); //释放数据线
delay_us(50); //等待60us
DQ_IN();
CY = DQ_READ(); //检测存在脉冲
delay_us(240);
}
}
特别注意读写字节数据顺序由低到高,不可弄错
2.主机写入数据
void WriteOneChar(unsigned char dat)
{
DQ_OUT();
unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
for(i=0;i<8;i++) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
DQ_SET_L(); //在开始另一个写周期前必须有1us以上的高电平恢复期。
delay_us(1);
if(dat&0x01)
{
DQ_SET_H();
// delay_us(1);
}
else
DQ_SET_L();
delay_us(60);
DQ_SET_H();
// delay_us(1);
dat>>=1;
}
}
3.读时序
char ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=0;i<8;i++) //一个字节有8位
{
DQ_OUT();
DQ_SET_L(); //低起始
dat>>=1;
//DQ_SET_H();
DQ_IN();
if(DQ_READ()==1)
dat|=0x80;
delay_us(45);
// DQ_OUT();
DQ_SET_H();
}
return(dat);
}
读取温度数据
char ReadTemperature(void)
{
unsigned char tempL=0; //设全局变量
unsigned char tempH=0;
unsigned int TEMPZ;//测量到的温度的整数部分
Init_DS18B20(); //初始化
// while(chack_ds18b20())
// {
// printf("err");
// }
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0x44); //启动温度转换
// chack_ds18b20();
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳过读序列号的操作
WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
tempL=ReadOneChar(); //读出温度的低位LSB
tempH=ReadOneChar(); //读出温度的高位MSB
TEMPZ= ((tempH<<4)|(tempL>>4));
if(TEMPZ>=128)
{
TEMPZ=~TEMPZ+1;
}
return TEMPZ;
}
感谢大佬的分享
https://blog.csdn.net/weixin_47457689/article/details/124081703