51单片机ds18B20使用程序
时间: 2024-05-05 18:20:04 浏览: 232
以下是一个简单的51单片机使用ds18B20温度传感器的程序示例:
```c
#include <reg51.h>
#define DQ P1_0 // ds18B20的数据线
void DelayUs(unsigned int us)
{
while (us--)
{
// 每个循环大约需要4个指令周期,即1us
}
}
// 初始化ds18B20
unsigned char InitDS18B20(void)
{
unsigned char presence;
DQ = 1; // 先将数据线拉高
DelayUs(2);
DQ = 0; // 拉低数据线
DelayUs(80);
DQ = 1; // 释放数据线
DelayUs(10);
presence = DQ; // 判断ds18B20是否存在
DelayUs(50);
return presence;
}
// 从ds18B20读取一个字节
unsigned char ReadByte(void)
{
unsigned char i, byte = 0;
for (i = 0; i < 8; i++)
{
DQ = 0; // 拉低数据线
DelayUs(2);
DQ = 1; // 释放数据线
DelayUs(2);
byte >>= 1;
if (DQ)
{
byte |= 0x80;
}
DelayUs(50);
}
return byte;
}
// 向ds18B20写入一个字节
void WriteByte(unsigned char byte)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0; // 拉低数据线
DelayUs(2);
if (byte & 0x01)
{
DQ = 1; // 写入1
}
else
{
DQ = 0; // 写入0
}
byte >>= 1;
DelayUs(60);
DQ = 1; // 释放数据线
DelayUs(2);
}
}
// 读取ds18B20的温度值
int ReadDS18B20(void)
{
unsigned char i;
int temp = 0;
InitDS18B20();
WriteByte(0xcc); // 跳过ROM操作
WriteByte(0x44); // 启动温度转换
DelayUs(1000); // 等待转换完成
InitDS18B20();
WriteByte(0xcc); // 跳过ROM操作
WriteByte(0xbe); // 读取温度值
for (i = 0; i < 2; i++) // 读取16位温度值
{
temp |= ReadByte();
temp <<= 8;
}
temp >>= 4; // 除以16,得到实际温度值
return temp;
}
void main()
{
int temp;
while(1)
{
temp = ReadDS18B20(); // 读取温度值
// 处理温度值,例如显示在LCD屏幕上
}
}
```
这个程序使用P1.0作为ds18B20的数据线,可以根据实际情况进行修改。在读取温度值时,程序先启动温度转换,然后等待一段时间后再读取温度值。
阅读全文