DS18b20温度探头
链接: https://pan.baidu.com/s/1-veBK9nC_dEEYNE1uvnu4A 密码:03ke
优质不锈钢管封装 防水 防潮 防生锈
不锈钢外壳(6*50mm),引线长度100cm
3.0V~5.5V供电
9~12位可调分辨率
感温范围宽 -55℃ ~ +125℃
/*
建议改动:
1、初始化下拉电平延长1倍 (以确保初始化的周期大于8*60us=480us)
2、读写一位的周期延长一倍(以确保读写一位的周期大于60us)
3、如以上两步没有效果:读一位的采样时间缩短为现在的一半,请确保读一位的采样时间小于15us)
原因讲解:
任何芯片的参数都会随着温度有变化,18B20内部的通信用的时钟随高低温高低电压而变动,故为了稳定使用,要严格按照1-wire标准来写时序。
下拉总线时会启动内部时钟
复位:芯片复位需要8个内部时钟,所以最少维持8个周期的最大值即8*60us
读: 芯片从下拉开始到一个内部时钟周期内输出信号,所以采样时间必须规定在一个周期最小值之内即:1~15us
写: 芯片从下拉开始在一个内部时钟周期结束时采样总线信号,所以单片机给定信号必须维持一个周期的最大值即:60us
读写:因为芯片从下拉开始至少工作一个内部时钟周期才能进行下一位的操作,所以读写一位的总周期必须大于一个周期的最大值即:60us
*/
//附程序:
//(以下程序适用于用于已经定义了精确的1us延时delayDQ() )
//返回0:初始化成功
unsigned char Init_18B20() {
unsigned char dat;
DQ = 1; delayDQ(10); //恢复时间:>1us
DQ = 0; DelayMs(1); //单片机拉低总线:>480us
DQ = 1; delayDQ(60); //释放总线,在中间位置读取是否有器件响应
dat = DQ; DelayMs(1); //确保单片机释放总线后的全部时间:>480us
return dat;
}
//读byte子程序
unsigned char ReadOneBit() {
unsigned char dat = 0;
DQ = 0; delayDQ(1); //下拉总线:>1us
DQ = 1; delayDQ(9); //释放总线,进行采样, 确保从下拉开始的总共时间:<15us。
dat = DQ; delayDQ(50); //读取DQ,此延时不能少,确保从下拉开始的总共时间:>60us。
DQ = 1; delayDQ(4); //恢复时间:>1us
return(dat);
}
//函数功能:从18B20读一个字节数据
unsigned char ReadOneChar()
{
unsigned char i=0;
unsigned char j=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
dat>>=1; //让从总线上读到的位数据,依次从高位移动到低位。
if(ReadOneBit()) //控制器进行采样
dat|=0x80; //存储读取的位
}
DQ = 1;
return(dat);
}
//写byte子程序
void WriteOneBit(unsigned char dat)
{
DQ = 0; delayDQ(1); //下拉总线:>1us
DQ = dat; delayDQ(59); //确保从下拉开始的总共时间:>60us。
DQ = 1; delayDQ(4); //恢复时间:>1us
}
//函数功能:向18B20写入一个字节数据
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
WriteOneBit(dat&0x01);
dat>>=1;
}
DQ = 1;
}