使用DS18B20采集温度,并将其显示,精确到一位小数,用c51单片机
时间: 2024-05-09 18:22:03 浏览: 187
好的,我知道了。对于你的问题,你需要使用C语言和C51单片机来实现DS18B20的温度采集和显示。下面是可能的解决方案:
首先,你需要连接DS18B20到你的C51单片机中。这可以通过使用单总线通信协议来实现。具体来说,你需要将DS18B20的VCC引脚连接到单片机的电源线路上,将GND接到单片机的地线上,以及将数据引脚连接到单片机的一个可以进行IO输入/输出的引脚上。
接下来,你需要编写C语言代码来读取温度传感器的输出并将其转换为温度值。这可以通过调用DS18B20的ROM命令集来实现。具体来说,你需要向传感器发送“转换命令”,等待温度转换完成并读取返回的温度值。然后,你需要将这个温度值转换为10进制格式并将其显示。
下面是一个可能的示例程序:
```
#include <reg51.h>
#define DQ P2_0
unsigned char TempL, TempH;
void Delay(unsigned int nTime)
{
unsigned int i, j;
for (i = 0; i < nTime; i++)
for (j = 0; j < 123; j++);
}
void Ds18b20Init(void)
{
DQ = 1;
Delay(8);
DQ = 0;
Delay(80);
DQ = 1;
Delay(5);
}
void Ds18b20Reset(void)
{
DQ = 0;
Delay(480);
DQ = 1;
Delay(60);
}
unsigned char Ds18b20ReadByte(void)
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
dat >>= 1;
DQ = 0;
Delay(6);
DQ = 1;
Delay(4);
if (DQ)
dat |= 0x80;
Delay(50);
}
return dat;
}
void Ds18b20WriteByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
Delay(6);
DQ = dat & 0x01;
Delay(60);
DQ = 1;
dat >>= 1;
}
}
void Ds18b20Convert(void)
{
Ds18b20Reset();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
}
void Ds18b20ReadTemp(void)
{
unsigned int T;
Ds18b20Reset();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
TempL = Ds18b20ReadByte();
TempH = Ds18b20ReadByte();
T = TempH;
T <<= 8;
T |= TempL;
T >>= 4;
printf("Temperature: %d.%01d\n", T / 10, T % 10);
}
void main()
{
Ds18b20Init();
while (1)
{
Ds18b20Convert();
Delay(1000);
Ds18b20ReadTemp();
}
}
```
上述程序通过调用`Ds18b20Convert`函数发送转换命令,等待1秒钟,然后调用`Ds18b20ReadTemp`函数读取温度值并将其转换为10进制格式。最后,温度值通过串口输出显示。
你可以根据你的实际需求进行修改。
阅读全文