PIC单片机读取多个ds18b20温度传感器的程序
时间: 2023-07-28 22:35:47 浏览: 101
以下是一个简单的示例程序,用于读取多个 DS18B20 温度传感器的温度值:
```
#include <pic.h>
#include <stdio.h>
#define OW_PIN RB0 // 数据线连接到 RB0 引脚
#define OW_TRIS TRISB0
#define OW_READ() OW_PIN // 读取数据线状态
#define OW_WRITE(v) OW_PIN = (v) // 写入数据线状态
#define OW_DELAY_US(us) __delay_us(us) // 延时函数
unsigned char ow_reset(void)
{
unsigned char presence;
OW_TRIS = 0; // 配置数据线为输出模式
OW_WRITE(0); // 发送复位脉冲
OW_DELAY_US(480);
OW_WRITE(1);
OW_DELAY_US(60);
presence = !OW_READ(); // 检测从设备的应答信号
OW_DELAY_US(420);
return presence;
}
void ow_write_byte(unsigned char byte)
{
unsigned char i;
OW_TRIS = 0; // 配置数据线为输出模式
for (i = 0; i < 8; i++) {
OW_WRITE(0);
OW_DELAY_US(2);
OW_WRITE(byte & 0x01);
OW_DELAY_US(60);
OW_WRITE(1);
OW_DELAY_US(2);
byte >>= 1;
}
}
unsigned char ow_read_byte(void)
{
unsigned char byte = 0x00;
unsigned char i;
OW_TRIS = 0; // 配置数据线为输出模式
for (i = 0; i < 8; i++) {
OW_WRITE(0);
OW_DELAY_US(2);
OW_WRITE(1);
OW_DELAY_US(2);
byte >>= 1;
if (OW_READ()) byte |= 0x80;
OW_DELAY_US(60);
}
return byte;
}
float ds18b20_read_temperature(void)
{
unsigned char scratchpad[9];
unsigned char i;
float temperature;
ow_reset();
ow_write_byte(0xcc); // 跳过 ROM 操作
ow_write_byte(0x44); // 启动温度转换
__delay_ms(750); // 等待转换完成
ow_reset();
ow_write_byte(0xcc); // 跳过 ROM 操作
ow_write_byte(0xbe); // 读取 scratchpad 数据
for (i = 0; i < 9; i++) scratchpad[i] = ow_read_byte();
temperature = scratchpad[0] | ((unsigned int)scratchpad[1] << 8);
temperature /= 16.0;
return temperature;
}
void main(void)
{
float temperature1, temperature2;
// 初始化串口
// ...
while (1) {
temperature1 = ds18b20_read_temperature();
__delay_ms(10);
temperature2 = ds18b20_read_temperature();
printf("Temperature 1: %.2f C\r\n", temperature1);
printf("Temperature 2: %.2f C\r\n", temperature2);
__delay_ms(1000);
}
}
```
注意,该示例程序仅适用于单总线模式下的 DS18B20 温度传感器。如果您需要读取多个 DS18B20 温度传感器,则需要使用 ROM 操作来选择不同的从设备进行通信。可以根据 DS18B20 的数据手册,修改相应的代码来实现该功能。
阅读全文
相关推荐


















