之前在树莓派系列的文章中写过DS18B20获取温度数据。当时树莓派有1-wire接口,可以直接以读文件的形式读取到温度。18.树莓派3B+ 1-wire获取DS18B20温度
现在在STC单片机里面没有这个接口,只能使用GPIO模拟单总线的时序来读取DS18B20的温度数据了。
DS18B20的特点
Unique 1-Wire interface requires only oneport pin for communication
Can be powered from data line. Power supplyrange is 3.0V to 5.5V
Measures temperatures from -55°C to+125°C. Fahrenheit equivalent is -67°F to+257°F
Converts 12-bit temperature to digital word in750 ms (max.)
(引用数据超过了300字,就截取了部分)
上面是DS18B20的主要特点。主要概括起来就是:
-
数据读写只需要一个端口; -
电源电压3V~5.5V; -
测量温度范围是-55℃~125℃; -
温度数据可以是9位的,也可以是12位的,12位转换速度最快为750ms;
BS18B20的封装
这里我使用的是To-92封装的,看起来就是一个普通的三极管样子。
关于DS18B20的其他知识大家可以具体去查看数据手册。
DS18B20时序图
1. 复位时序图
主机先发送复位信号,总线拉低,维持480us~960us,再把主机把总线拉高维持15us~60us之后,DS18B20在接收到这个信号之后就会发送一个60us~240us的低电平信号。
2.读写时序
有了上面的复位时序的说明,再看读写数据就好看一点了。需要注意的是哪些是主机发送,哪些是DS18B20发送的。关键的是要注意时间。
// 从DS18B20读1字节数据
u8 DS18B20_ReadByte()
{
u8 i;
u8 dat = 0;
????for?(i=0;?i<8;?i++)???????
{
DQ = 0; //拉低数据线
delayus(4);
dat>>=1; //空出第一位
DQ = 1; //拉高数据线
delayus(10);
if(DQ) //若为高电平,则最高位置一
dat|=0x80;
delayus(45);//延时45us
}
return dat;
}
// 向DS18B20写1字节数据
void DS18B20_WriteByte(u8 dat)
{
u8 i;
for (i=0; i<8; i++) //8位计数器
{
DQ = 0; //数据线拉低
delayus(15);
DQ = dat&0x01; //将数据最低位送入数据线
delayus(60); //延时10us
DQ = 1; //数据线拉高
dat>>=1;
}
}
剩下的就是读取温度数据了。
//读取DS18B20的温度数据
u16 ReadTemp(void)
{
u8 TL,TH; //TL:低八位 TH:高八位
u16 wd;
???????????
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0x44); //开始转换命令
delayus(125);
DS18B20_Reset(); //设备复位
DS18B20_WriteByte(0xCC); //跳过ROM命令
DS18B20_WriteByte(0xBE); //读暂存存储器命令
TL= DS18B20_ReadByte(); //读温度低字节
TH= DS18B20_ReadByte(); //读温度高字节
wd = (b << 8) | a;
wd = wd * 0.0625;
// wd = TL/16+TH*16;
return(wd);
}
?
|