DS18B20的读数和编程方法如下:
读数方法
初始化
将数据线置为高电平“1”。
延时一段时间(建议480-960微秒)。
数据线拉到低电平“0”。
延时750微秒。
数据线拉高到高电平“1”。
延时等待(15-60毫秒),直到检测到DS18B20返回的低电平“0”为止。
读操作
将数据线拉高到高电平“1”。
延时2微秒。
数据线拉低到低电平“0”。
延时15微秒。
数据线拉高到高电平“1”。
延时15微秒。
读取数据线的状态,得到1个状态位,并进行数据处理。
延时30微秒。
编程方法
1. 写入一个字节
```c
void WriteOneChar(unsigned char dat) {
unsigned char i = 0;
for (i = 8; i > 0; i--) {
DQ = 0; // 高电平拉至低电平时,写周期的开始
DQ = dat & 0x01; // 数据的最低位先写入
delay_18B20(5); // 60us到120us延时
DQ = 1;
dat >>= 1; // 从最低位到最高位传入
}
}
```
2. 读取一个字节
```c
unsigned char ReadOneChar(void) {
uchar i = 0;
uchar dat = 0;
for (i = 8; i > 0; i--) {
DQ = 0; // 高电平拉成低电平时读周期开始
dat >>= 1;
DQ = 1; // 给脉冲信号
if (DQ) dat |= 0x80;
delay_18B20(4);
}
return(dat);
}
```
3. 读取当前温度(9位模式)
```c
void ReadTemperature9Bit(void) {
WriteOneChar(0x44); // 开始转换命令
delay_18B20(750); // 转换时间
WriteOneChar(0xBE); // 读存储器命令
unsigned char temp = ReadOneChar(); // 读取温度值(低字节)
temp |= (ReadOneChar() << 8); // 读取温度值(高字节)
// 处理温度值
}
```
4. 读取当前温度(12位模式)
```c
void ReadTemperature12Bit(void) {
WriteOneChar(0x44); // 开始转换命令
delay_18B20(93); // 转换时间
WriteOneChar(0xBE); // 读存储器命令
unsigned char temp_low = ReadOneChar(); // 读取温度值(低字节)
unsigned char temp_high = ReadOneChar(); // 读取温度值(高字节)
unsigned int temp = (temp_high << 8) | temp_low; // 组合成12位温度值
// 处理温度值
}
```
注意事项
在进行读写操作时,务必遵循DS18B20的时序要求,否则可能导致读取失败。
延时时间建议根据具体硬件和实际情况进行调整。
编程时使用的库函数或自定义延时函数应确保准确性。
通过以上步骤和代码示例,你可以实现DS18B20的读数和编程。