当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域。
(资料图)
在本项目中,使用了51单片机作为主控芯片,SHT30传感器作为温湿度传感器,LCD显示屏作为数据显示模块。通过51单片机的GPIO口模拟IIC通信协议,实现了与SHT30传感器的数据通信。
二、硬件设计2.1 硬件构成本次设计所需的硬件主要包括以下部分:
STC89C52单片机SHT30温湿度传感器串口通信模块LCD1602显示屏电源模块杜邦线等连接线2.2 硬件接口及信号本次设计使用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(); stop(); temp = ((temp_h< <8)+temp_l)*175.0/0xffff - 45.0; // 温度值转换公式 return temp; } float measure_humi(void) { uchar humi_h, humi_l, crc; float humi; start(); write_byte(0x80); // 主机发送写地址 write_byte(0x2C); // 选择开始湿度测量命令 write_byte(0x06); stop(); delay(15); // 延时等待湿度测量完成 start(); write_byte(0x81); // 主机发送读地址 humi_h=read_byte(); ack(); humi_l=read_byte(); ack(); crc=read_byte(); stop(); humi = ((humi_h< <8)+humi_l)*100.0/0xffff; // 湿度值转换公式 return humi; } void main() { float temp, humi; init_sht30(); // SHT30 初始化 TMOD=0x20; // 定时器0工作方式2,8位定时器,用于波特率设置 TH1=0xfd; // 波特率9600 TL1=0xfd; TR1=1; // 启动定时器0 SCON=0x50; // 设置串口工作方式1,允许接收,允许接收中断 ES=1; // 允许串口中断 while(1) { temp = measure_temp(); humi = measure_humi(); printf("Temperature: %.1fC, Humidity: %.1f%\\n", temp, humi); delay(500); // 间隔时间500ms } } void ser() interrupt 4 using 2 { if(RI) // 接收到数据 { RI=0; // 清除标志位 } if(TI) // 发送完毕 { TI=0; // 清除标志位 } }
在上面的代码中,定义了两个函数 measure_temp
和 measure_humi
,分别用于测量温度和湿度值,并返回结果。在主函数中,利用这两个函数得到当前的温湿度值,然后通过串口打印出来。
下面代码是LCD1602驱动代码,完成数字字符显示。
#include < REG52.h > #define LCD1602_DB P0 sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay(int n) { int i; while(n--) { for(i=0; i< 120; i++); } } void main() { //LCD 初始化 delay(1000); LCD1602_DB = 0x38; E = 1; delay(5); E = 0; delay(500); LCD1602_DB = 0x08; E = 1; delay(5); E = 0; delay(500); LCD1602_DB = 0x01; E = 1; delay(5); E = 0; delay(500); LCD1602_DB = 0x06; E = 1; delay(5); E = 0; delay(500); LCD1602_DB = 0x0C; E = 1; delay(5); E = 0; while(1) { //向LCD中写入数字12345 RS = 0; //选择指令寄存器 LCD1602_DB = 0x80; //设置地址为第一行的第一个字符位置(0x80 + 0x00) E = 1; delay(5); E = 0; RS = 1; //选择数据寄存器 LCD1602_DB = 0x31; //写入数字1 E = 1; delay(5); E = 0; LCD1602_DB = 0x32; //写入数字2 E = 1; delay(5); E = 0; LCD1602_DB = 0x33; //写入数字3 E = 1; delay(5); E = 0; LCD1602_DB = 0x34; //写入数字4 E = 1; delay(5); E = 0; LCD1602_DB = 0x35; //写入数字5 E = 1; delay(5); E = 0; delay(500); //间隔时间为500ms } }
在上面的代码中,定义了函数 delay
用于延时等待,并且实现了LCD1602的初始化和写入操作。在主函数中,执行LCD1602的初始化操作,然后循环不断向LCD中写入数字12345,并且间隔时间为500ms。
#include< reg52.h > #include< intrins.h > #define uchar unsigned char #define uint unsigned int sbit SDA = P2^0; //定义SDA引脚 sbit SCL = P2^1; //定义SCL引脚 sbit CS = P0^3; //定义液晶屏片选引脚 sbit RW = P0^1; //定义液晶屏读/写引脚 sbit RS = P0^0; //定义液晶屏指令/数据引脚 sbit E = P0^2; //定义液晶屏使能引脚 void delay(int n) //延时函数,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() //SHT30初始化 { start(); write_byte(0x80); if(read_byte() != 0x5A) { stop(); return; } write_byte(0xBE); if(read_byte() != 0x08 || read_byte() != 0x00) { stop(); return; } stop(); } void measure() //测量温湿度值 { float humi, temp; uint i; start(); write_byte(0x80); read_byte(); read_byte(); read_byte(); write_byte(0x2C); write_byte(0x06); for(i=0; i< 40000; i++); //等待测量结果 start(); write_byte(0x80); read_byte(); read_byte(); read_byte(); humi = read_byte() * 256; humi += read_byte(); temp = read_byte() * 256; temp += read_byte(); stop(); temp = -45 + (175*temp)/65535; //转化温度 humi = 100 * humi / 65535; //转化湿度 //将温湿度值通过串口发送 printf("Temperature: %.1fC\\n", temp); printf("Humidity: %.1f%%RH\\n", humi); } void init_lcd() //液晶屏初始化 { RW = 0; RS = 0; E = 0; delay(15); write_byte(0x30); delay(15); write_byte(0x30); delay(5); write_byte(0x30); delay(5); write_byte(0x38); write_byte(0x08); write_byte(0x01); write_byte(0x06); write_byte(0x0c); } void display(float temp, float humi) //显示温湿度值 { uchar i; uchar temp_str[5]; uchar humi_str[5]; //转化为字符串 sprintf(temp_str, "%.1f", temp); sprintf(humi_str, "%.1f", humi); //显示温度 RS = 0; E = 1; P1 = 0x80; //第一行第一个字符 E = 0; RS = 1; for(i=0; i< 5; i++) { E = 1; P1 = temp_str[i]; E = 0; } //显示湿度 RS = 0; E = 1; P1 = 0xc0; //第二行第一个字符 E = 0; RS = 1; for(i=0; i< 5; i++) { E = 1; P1 = humi_str[i]; E = 0; } } void main() { init_sht30(); //SHT30初始化 init_lcd(); //液晶屏初始化 while(1) { measure(); //测量温湿度值并通过串口发送 delay(1000); display(temp, humi); //显示温湿度值 } }
审核编辑:汤梓红
标签:
媒体周日报道称,知情人士称透露,制药商阿斯利康正在起草剥离其中国业
1、不是。2、仙魔录65级就开始做。3、即使20级的妖魔道没完成都可以去
6月18日,国务委员兼外长秦刚在北京同美国国务卿布林肯举行会谈。秦刚
直播吧6月19日讯《太阳报》报道,某支英超球队的老板被指控在数年前强
1、小米数字系列中,最高支持55W快充的是小米11。2、小米11支持5W有线
前几天出门散步,和朋友追跑打逗的时候(怪我太皮),手不小心按在灌木
前不久,始终将用户放在心里的奇瑞,以“真诚与厚道”为约,用一场接地
1、失代偿期肝硬化40年能活多久不取决于多少年,主要取决于失代偿期肝
1、《爸爸》着实让我艳惊了一小把,歌词写得细腻,听歌的时候恍惚觉得
6月16日,全球知名轮胎制造商锦湖轮胎在位于天津的中国研发中心举办名
第十三届中国国际商标品牌节在莞举办
文 羊城晚报全媒体记者李洪宝图 羊城晚报全媒体记者王俊伟第十三届中国
福特汽车董事长:美国在电动汽车领域
今年2月,福特宣布计划投资35亿美元(IT之家备注:当前约249 55亿元人
全球热资讯!深圳:抢抓新能源汽车产
2023粤港澳大湾区车展在深圳举办,近千款车型集中亮相文 羊城晚报全媒
世界观速讯丨广州市增城区气象台发布
【增城区正果镇暴雨黄色预警】受加强的雷雨云团影响,预计未来1小时正
今热点:甚至没包含一个首轮签!你认
直播吧6月19日讯 据名记Shams报道,消息人士透露,奇才将比尔交易至太
环球最资讯丨经济日报金观平:确保就
要立足当下,抢抓关键期,稳存量、扩增量、提质量,全力确保就业形势总
热记:比尔也很乐意加盟热火 他没有
直播吧6月19日讯 据名记Shams报道,消息人士透露,奇才将比尔交易至太
大科学装置探索宇宙奥秘
江门中微子实验位于广东省江门开平市,是由中科院和广东省共同建设的大
主题教育进行时|广州市委巡回指导组
主题教育开展以来,市委巡回指导组切实增强做好督促指导工作的思想自觉
环球实时:生物高分子 第4卷_关于生
生物高分子第4卷,关于生物高分子第4卷介绍这个很多人还不知道,我们一
头条:专项计划定向培养中小学教师
专项计划定向培养中小学教师,主流媒体,山西门户。山西新闻网是经国务院
全球速看:生物高分子 第3a卷_关于
生物高分子第3a卷,关于生物高分子第3a卷介绍这个很多人还不知道,我们
全球滚动:“因公益钢琴聚在一起,我
不久前,一名建筑工人在深圳街头即兴弹奏钢琴的视频走红网络。街头为何
交通基础设施网络“补短板”
交通基础设施网络“补短板”,主流媒体,山西门户。山西新闻网是经国务院
【奋发有为推动高质量发展】我省发布
【奋发有为推动高质量发展】我省发布工业领域碳达峰实施方案,主流媒体,
环球速讯:Woj:奇才交易比尔是为开
据名记Shams、Woj报道,消息人士透露,奇才将会将比尔交易至太阳,换回
天天百事通!美记:比尔上周末分别与
直播吧6月19日讯 据名记Shams、Woj报道,消息人士透露,奇才将会将比
生物高分子 第2卷_关于生物高分子
生物高分子第2卷,关于生物高分子第2卷介绍这个很多人还不知道,我们一
生物高分子 第8卷_关于生物高分子
生物高分子第8卷,关于生物高分子第8卷介绍这个很多人还不知道,我们一
世界焦点!推动黄金珠宝时尚产业数字
6月15日,东方意象(中国)时尚盛典开幕。模特们穿戴时尚珠宝走秀。组委
生物高分子:微生物合成的原理与实践
生物高分子:微生物合成的原理与实践,关于生物高分子:微生物合成的原
省公安厅交管局发布端午节假期道路交
省公安厅交管局发布端午节假期道路交通安全提示,主流媒体,山西门户。山
信宜市气象台发布雷雨大风黄色预警【
【信宜雷雨大风黄色预警】预计,受强对流云团影响,我市6时到10时有雷
环球热推荐:美记:需密切关注追梦可
据美媒FiveReasonsSports(热火相关消息较准确)记者EthanJ Skolnick与
我省第九次旅发大会策划与执行采购项
我省第九次旅发大会策划与执行采购项目完成招标,主流媒体,山西门户。山