当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域。
在本项目中,使用了51单片机作为主控芯片,SHT30传感器作为温湿度传感器,LCD显示屏作为数据显示模块。通过51单片机的GPIO口模拟IIC通信协议,实现了与SHT30传感器的数据通信。
本次设计所需的硬件主要包括以下部分:
本次设计使用51单片机通过IIC总线与SHT30传感器进行通信,同时使用串口与上位机进行数据传输,并使用液晶显示屏显示当前温湿度值。
具体接口和信号定义如下:
(1) 51单片机与SHT30传感器之间的IIC接口:
端口 | 功能 | 说明 |
---|---|---|
P2.0 | SDA | 数据线 |
P2.1 | SCL | 时钟线 |
P2.2 | RESET | 复位线 |
(2) 51单片机与串口通信模块之间的接口:
端口 | 功能 | 说明 |
---|---|---|
P3.0 | TXD | 发送线 |
P3.1 | RXD | 接收线 |
P3.2 | GND | 地线 |
(3) 51单片机与液晶屏之间的接口:
端口 | 功能 | 说明 |
---|---|---|
P1.0-P1.7 | DB0-DB7 | 数据线 |
P0.0 | RS | 指令/数据选择线 |
P0.1 | RW | 读/写选择线 |
P0.2 | E | 使能线 |
P0.3 | CS | 片选线 |
VCC | 电源正极 | 5V |
GND | 电源地 | 地 |
下面代码读取SHT30传感器的值并通过串口打印。
#include < REG52.h >
#include < stdio.h >
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P2^0;
sbit SCL=P2^1;
void delay(int n)
{
int i;
while(n--)
{
for(i=0; i< 120; i++);
}
}
void start()
{
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SDA = 0;
_nop_();
SCL = 0;
_nop_();
}
void stop()
{
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}
void ack()
{
SDA = 0;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
_nop_();
SDA = 1;
_nop_();
}
void nack()
{
SDA = 1;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
_nop_();
}
void write_byte(uchar dat)
{
uchar i;
for(i=0; i< 8; i++)
{
SDA = dat & 0x80;
_nop_();
SCL = 1;
_nop_();
SCL = 0;
_nop_();
dat < <= 1;
}
ack();
}
uchar read_byte()
{
uchar i, dat;
for(i=0; i< 8; i++)
{
dat < <= 1;
SCL = 1;
_nop_();
dat |= SDA;
SCL = 0;
_nop_();
}
return dat;
}
void init_sht30()
{
start();
write_byte(0x80);
if(read_byte() != 0x5A)
{
stop();
return;
}
write_byte(0xBE);
if(read_byte() != 0x08 || read_byte() != 0x00)
{
stop();
return;
}
stop();
}
float measure_temp(void)
{
uchar temp_h, temp_l, crc;
float temp;
start();
write_byte(0x80); // 主机发送写地址
write_byte(0x2C); // 选择开始温度测量命令
write_byte(0x06);
stop();
delay(15); // 延时等待温度测量完成
start();
write_byte(0x81); // 主机发送读地址
temp_h=read_byte();
ack();
temp_l=read_byte();
ack();
crc=read_byte();