52单片机DS18B20测温程序
时间: 2024-01-08 18:01:56 浏览: 205
以下是基于C语言的52单片机DS18B20测温程序:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P3_7
unsigned char temperature; // 存储温度值
void delay_us(unsigned int us) // 微秒级延时
{
while(us--)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
void delay_ms(unsigned int ms) // 毫秒级延时
{
while(ms--)
{
delay_us(1000);
}
}
bit DsInit() // 初始化DS18B20
{
bit ack;
DQ = 1; // 总线空闲状态为高电平
delay_us(1);
DQ = 0; // 发送复位脉冲
delay_us(500);
DQ = 1; // 释放总线
delay_us(60);
ack = DQ; // 等待DS18B20发出应答信号
delay_us(500);
return ack; // 返回应答信号
}
void WriteDs18b20(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0; // 发送起始信号
_nop_();
_nop_();
DQ = dat & 0x01; // 发送数据位
delay_us(60);
DQ = 1; // 释放总线
dat >>= 1; // 准备发送下一位数据
}
}
unsigned char ReadDs18b20() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0; // 发送起始信号
_nop_();
_nop_();
DQ = 1; // 释放总线
_nop_();
_nop_();
dat >>= 1; // 准备接收数据位
if(DQ) dat |= 0x80; // 如果数据线为高电平,则将该位设为1
delay_us(60);
}
return dat;
}
void DsStart() // 启动温度转换
{
DsInit(); // 初始化DS18B20
WriteDs18b20(0xCC); // 跳过ROM操作
WriteDs18b20(0x44); // 发送启动温度转换命令
}
unsigned char DsRead() // 读取温度值
{
unsigned char temp1, temp2;
DsInit(); // 初始化DS18B20
WriteDs18b20(0xCC); // 跳过ROM操作
WriteDs18b20(0xBE); // 发送读取温度命令
temp1 = ReadDs18b20(); // 读取温度值的低8位
temp2 = ReadDs18b20(); // 读取温度值的高8位
temperature = (temp2 << 4) | (temp1 >> 4); // 计算温度值,忽略小数部分
return temperature; // 返回温度值
}
void main()
{
while(1)
{
DsStart(); // 启动温度转换
delay_ms(750); // 等待转换完成
DsRead(); // 读取温度值
// 温度值通过串口或LCD等方式输出
}
}
```
上述程序通过DS18B20数字温度传感器实现了对环境温度的实时测量,并通过串口或LCD等方式输出温度值。程序中用到了微秒级和毫秒级的延时函数,需要根据实际情况进行调整。同时,为了方便起见,本程序忽略了温度值的小数部分,实际应用中需要进行相应的处理。
阅读全文