DS18B20是一种特殊的传输协议,通信只需要一个接线口即可实现
文章目录
- 前言
- 一、DS18B20是什么?
- 二、使用步骤
-
- 1.单总线时序
-
- (1).初始化时序
- (2).写时序
- (3).读时序
- (4).DS18B20暂存器
- (5).单总线访问协议及部分ROM指令表
- (6).DS18B20功能指令表
- 2.代码示例
- 总结
前言
DS18B独特的单线接口只需要一个端口引脚进行通信,这让每个在这里学习的人都感到惊讶。在本文中,我们将学习18B20的数据传输方式是IIC为协议铺路。
提示:以下是本文的文本内容,以下案例可供参考
一、DS18B20是什么?
达拉斯DS18B20 数字温度计是半导体可编程分辨率的单总线
DS18B20 数字温度计提供9-12 由高低电平触发的可编程报警功能不会因电源消失而改变。DS18B在中央处理器和DS18B20 只需要一条连接线(加地线)。其测温范围为-55~+125℃,并且在-10~+85℃精度为±5℃。除此之外,DS18B除了对外部电源的需求外,20能直接从单线通信线吸收能量。 每个 DS18B20 都有独特的64 从而允许多个序列号DS18B20 同时连接到单线总线上;因此,使用微控制器来控制许多覆盖大面积的区域是非常简单的DS18B20.这个特点在HVAC 对建筑物、仪器或机器的温度、过程监测和控制等环境控制非常有用。 清翔51开发板接口: 值得注意的是,即使是18B20接口反向接口不会烧坏模块,但会特别热,不能正常工作。冬季乱手神器
二、使用步骤
1.单总线时序
DS18B20采用1-wire Bus所有数据都在一条线上传输,因此单总线协议对时间要求非常严格,以确保数据的完整性。 单总线信号类型:复位脉冲、存在脉冲、写0、写1、读0、读1。所有这些信号由脉冲除以存在DS18B总线控制器发出20发出的其他信号。数据传输始终从最低有效性开始。
(1).初始化时序
初始化时序包含复位DS18B20和接收DS18B20返回的存在信号。 主机和DS18B在进行任何通信之前,都需要对其进行初始化。在初始化期间,总线控制器降低总线,保持480us上述挂在总线上的设备将被复位,然后释放总线,直到15-60us,此时18B20将返回一个60-240us低电平之间有信号。
(2).写时序
写时序分为0时序和1时序。 总线控制器控制单总线高低电平的持续时间DS18B20中。 为了产生写时序,总线控制器必须将总线拉低至少1us,写0时序时,总线必须保持低电平60~120us之间,然后释放总线,在总线产生写时序后产生写时序15us允许在内部拉高总线。注:两个写作周期之间的间隔至少为1us
(3).读时序
读时序分为读0时序和读1时序。 通过读取总线控制器DS18B20控制总线高低电平接收DS18B20数据。 总线控制器要产生一个读时序,必须将总线拉低至少1us,然后在读取信号开始后释放总线15us内总线控制器采样总线数据,读取至少60个数据us以上注意阅读周期之间至少有1个间隔us
(4).DS18B20暂存器
根据临时存储器,我们可以看到,当我们只测量温度时,我们只需要读取它byte0和1就够了。如果使用温度报警,您可以继续阅读以下数据。温度寄存器的位置默认为85摄氏度。以下是温度寄存器图 温度寄存器的例子:
(5).单总线访问协议及其部分ROM指令表
忽略ROM指令(CCh) 这条指令允许总线控制器不用提供64 位ROM 编码就使用功能指令。例如,总线控制器可以先发出一条忽略ROM 指令,然后发出温度转换指令[44h],从而完成温度转换操作。在单点总线情况下使用该命令,器件无需发回64 位ROM 编码,从而节省了时间。如果总线上有不止一只从机,若发出忽略ROM指令,由于多只从机同时传送信号,总线上就会发生数据冲突。
(6).DS18B20功能指令表
温度转换指令(44h) 读暂存器指令(BEh)
2.代码示例
DS18B20初始化函数:
uchar DS18b20_Init()
{
bit i;
DQ = 1;
Delay_us(1);//6.5us
DQ = 0;
Delay500us();
DQ = 1;
Delay_us(4);//26us
i = DQ;
Delay_us(20);//130us
DQ = 1;
Delay_us(1);//6.5us
return i;
}
不难看到这里的延时数字并不对应,原因是在11.0592MHz的环境下,执行每条指令的时间有区别。可以在调试界面自己调试,也可以用STC下载器自动生成 DS18B20写数据函数
void DS18b20_Write(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
DQ = dat & 0x01;
Delay_us(13);//84.5us
DQ = 1;
_nop_();
dat >>=1;
}
}
这里用到了一个比较重要的与运算,将一个数与上“0x01”,这一句话的意思其实是这样 整个与运算符合这个思路“0&1=0”“1&1=1”“0&0=0”,dat通过右移,在最高位补0,防止与运算时高位出错。就这样重复8次就分离出了0和1发送出去了。也就是说,一般发送数据时,可以用到“dat & 0x01” DS18B20读取函数
uchar DS18b20_Red()
{
uchar i,dat,j;
for(i=0;i<8;i++)
{
DQ = 0;
_nop_();
DQ = 1;
_nop_();
j = DQ;
Delay_us(13);//84.5us
dat = (j<<7)|(dat>>1);
DQ = 1;
_nop_;
}
return dat;
}
这里用到了另外一个比较重要的运算——或运算
或运算的运算思路:“0|0=0”“0|1=1”“1|1=1”,先将总线上的数据赋予给j,然后j左移7位放在最高位上,dat向右移1位位最高位腾出位置。将j和dat进行一次或运算,则达到让DQ的数据放在dat的最高位的目的,而低位与0进行或运算,数据不变。
DS18B20调用函数
float DS18b20()
{
int i;
uchar L,M;
DS18b20_Init();//初始化
DS18b20_Write(0xcc);//跳过ROM,因为只用到了一个DS18B20,不需要操作
DS18b20_Write(0x44);//0x44,温度转换指令
DS18b20_Init();//根据协议,再次初始化
DS18b20_Write(0xcc);
DS18b20_Write(0xbe);//读取暂存器
L = DS18b20_Red();//将暂存器的值赋予给L
M = DS18b20_Red();//将暂存器的值赋予给L
i = M;
i <<= 8;//意思是将M放在高8位
i |= L;//这样就是16位,高八位是M,低八位是L
i = i * 0.0625 * 10 +0.5;//这里*10+0.5的目的是为了取整,所以这里的i其实是真实温度的十倍
return i;
}
这里是我用的延时函数
void Delay500us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 497;
while (--i);
}
void Delay_us(uchar i) //@11.0592MHz
{
while(i--);//一次6.5us
}
想调用DS18B20,可以直接这样完成
int y;
y=DS18b20();
或者
unsigned char XXX函数(int x)
{
...
}
int main(void)
{
XXX函数(DS18b20());
}
总结
以上就是DS18B20的运用,通过这个模块的学习,不仅了解到了该传感器,还简单的了解到了或运算与运算,以及传输协议时序图 欢迎大家关注我 微信公众号:小白写编程 交流群:1033131250