stc89c51单片机温度计
时间: 2023-09-28 07:07:55 浏览: 106
c51单片机温度计
5星 · 资源好评率100%
STC89C51单片机可以通过外接温度传感器来实现温度测量。常用的温度传感器有热电偶、热敏电阻、半导体温度传感器等。这里以DS18B20半导体温度传感器为例进行说明。
DS18B20是一种数字温度传感器,可以直接与STC89C51单片机相连。具体接法如下:
DS18B20引脚|STC89C51单片机引脚
-|-
VCC|+5V
GND|GND
DQ|P3.4
其中VCC接+5V电源,GND接地,DQ接P3.4口。DS18B20使用1-Wire协议进行通信,STC89C51单片机需要先发送一些指令,然后从DS18B20读取温度值。具体实现可以参考以下C语言代码:
```c
#include <reg51.h>
#define DQ P3_4
void delay_us(unsigned int us) // 微秒级延时函数
{
while (us--);
}
void delay_ms(unsigned int ms) // 毫秒级延时函数
{
while (ms--)
delay_us(1000);
}
void ds18b20_init() // 初始化DS18B20
{
DQ = 1;
delay_us(2);
DQ = 0;
delay_us(480);
DQ = 1;
delay_us(60);
}
void ds18b20_write_byte(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ = 0;
delay_us(2);
DQ = dat & 0x01;
delay_us(60);
DQ = 1;
dat >>= 1;
delay_us(2);
}
}
unsigned char ds18b20_read_byte() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for (i = 0; i < 8; i++)
{
DQ = 0;
delay_us(2);
DQ = 1;
delay_us(8);
dat |= DQ << i;
delay_us(60);
}
return dat;
}
void main()
{
unsigned char temp_data[2];
unsigned int temp;
ds18b20_init();
ds18b20_write_byte(0xcc); // 发送跳过ROM指令
ds18b20_write_byte(0x44); // 发送温度转换指令
delay_ms(750); // 等待750ms,等待温度转换完成
ds18b20_init();
ds18b20_write_byte(0xcc); // 发送跳过ROM指令
ds18b20_write_byte(0xbe); // 发送读取温度指令
temp_data[0] = ds18b20_read_byte(); // 读取LSB
temp_data[1] = ds18b20_read_byte(); // 读取MSB
temp = temp_data[1] << 8 | temp_data[0];
temp = temp * 0.0625; // 转换为实际温度值
// 此处可将温度值temp输出到LCD显示屏或串口等设备上
while (1);
}
```
上述代码中,ds18b20_init函数用于初始化DS18B20,ds18b20_write_byte函数用于向DS18B20写入一个字节,ds18b20_read_byte函数用于从DS18B20读取一个字节。主函数中先发送跳过ROM指令和温度转换指令,然后等待750ms,再发送读取温度指令并将读取到的温度值转换为实际温度值。最后可将温度值输出到LCD显示屏或串口等设备上。
阅读全文