51单片机使用DS18B20温度传感器
基于51单片机的DS18B20温度传感器程序
#include <reg51.h>
// 定义DS18B20的接口引脚
sbit DS18B20_GPIO = P3^7;
// 延时函数
void DelayMs(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++) {
for (j = 0; j < 120; j++);
}
}
// DS18B20初始化函数
unsigned char DS18B20_Init(void) {
unsigned char i = 0;
// 发送复位信号
DS18B20_GPIO = 0; // 将总线拉低
i = 50;
while (i--) {} // 延时600us,最少480us
DS18B20_GPIO = 1; // 释放总线
// 等待DS18B20拉低总线
while (DS18B20_GPIO) {
i++;
if (i > 10) return 1; // 失败,大概120us
}
// 等待DS18B20释放总线
while (!DS18B20_GPIO) {
i++;
if (i > 20) return 1; // 失败,大概240us
}
return 0; // 初始化成功
}
// 向DS18B20写入一个字节
void DS18B20_WriteByte(unsigned char byte) {
unsigned char i, j;
for (j = 0; j < 8; j++) {
DS18B20_GPIO = 0; // 拉低总线
i = 1; // 延时1us
while (i--) {}
DS18B20_GPIO = byte & 0x01; // 写入数据
i = 6; // 持续时间最少60us
while (i--) {}
DS18B20_GPIO = 1; // 释放总线
byte >>= 1; // 准备写入下一位
}
}
// 从DS18B20读取一个字节
unsigned char DS18B20_ReadByte(void) {
unsigned char byte = 0;
unsigned char i, j;
for (j = 0; j < 8; j++) {
DS18B20_GPIO = 0; // 拉低总线
i = 1; // 延时1us
while (i--) {}
DS18B20_GPIO = 1; // 释放总线
i = 2; // 至少等待15us
while (i--) {}
byte >>= 1; // 准备读取下一位
if (DS18B20_GPIO) byte |= 0x80; // 读取数据
i = 4; // 读取完之后等待48us
while (i--) {}
}
return byte;
}
// 读取DS18B20的温度值
int DS18B20_ReadTemp(void) {
int temp = 0; // 存放温度数据
unsigned char TH, TL;
// 启动温度转换
DS18B20_Init(); // 发送复位脉冲并检测应答信号
DS18B20_WriteByte(0xCC); // 跳过ROM操作命令
DS18B20_WriteByte(0x44); // 温度转换命令
// 读取温度
DS18B20_Init(); // 发送复位脉冲并检测应答信号
DS18B20_WriteByte(0xCC); // 跳过ROM操作命令
DS18B20_WriteByte(0xBE); // 发送读取温度命令
TL = DS18B20_ReadByte(); // 读取温度值低字节
TH = DS18B20_ReadByte(); // 读取温度值高字节
temp = (TH << 8) | TL; // 合并成16位
return temp;
}
void main(void) {
int temp = 0;
while (1) {
temp = DS18B20_ReadTemp(); // 读取温度
DelayMs(1000); // 延时1秒
}
}