52-基于单片机的超声波、温湿度、光照检测分阶段报警

目录

一、主要功能

二、硬件资源

三、程序编程

四、实现现象


一、主要功能

1.通过DHT11模块读取环境温度和湿度:
2.将湿度、障碍物距显示在lcd1602上面,第一行显示温度和湿度,格式为:xx°Cyy%,第二行显示超声波传感器测得的距离,格式为:Distance: zzz CM:
3.判断距离是否超过设定阈值,默认阈值为150cm,当测得距离低于150cm时,蜂鸣器长鸣,LED1(黄灯)闪烁,直至恢复安全距离以上:当湿度大于65%时,蜂鸣器间断报警(需与刚才报警声有明显区别),不对LED1进行操作,如果距离和湿度两个同时满足报警条件时,距离报警优先。
4.LDR模块用于检测环境光亮度,将光敏电阳模拟信号通过ADC0832转换为数字信号传递给单片机,当亮度低于50时自动打开LED2(红色)常亮。
5.设置模块,由三个按键组成,用于修改距离阈值,当点击按键1时进入阈值设置模式,进入设置模式后点击按键2增大阈值,点击按键了减小阈值,每次变化幅度为1,lcd显示实时显示设置情况,Set Distance:sss CM,当设置完毕再次点击按键1会退出设置模式并保存刚才设定的闽值,lcd恢复原来的显示内容

二、硬件资源

基于KEIL5编写C++代码,PROTEUS8.15进行仿真,全部资源在页尾,提供安装包。

三、程序编程

#include <REGX52.H>
#include <intrins.h>
#include <stdio.h>
#include "Delay.h"
#include "LCD1602.h"
#define uchar unsigned char
#define uint unsigned  int
typedef unsigned char u8;
typedef unsigned int  u16;
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
sbit CS=P1^0;      
sbit CLK=P1^1;
sbit DIO=P1^2;
sbit Tr=P3^5;//触发信号
sbit Ec=P3^6;//回响信号
sbit Temp_data=P2^6;  				//DHT11
sbit beep = P1^3;
sbit key1 = P1^4;
sbit key2 = P1^5;
sbit key3 = P1^6;
sbit led = P3^7;static int jlyz = 150;
uchar Recv_Buffer[4];
uint Voltage[]={'0','0','0','0'};
bit bdata IIC_ERROR;
unsigned int distance;
unsigned int Read_value(void);//读值函数
static double u;
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
unsigned int rec_dat[4];	
static int wd,sd;
static int flag1=0,flag2=0,flag = 0;
static int ymflag=0;
static int flag3=0;void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
void DHT11_start();
unsigned char DHT11_rec_byte();
void DHT11_receive();
void Delay10us(void);//10us延时函数
void display();
void canshu();
void ajpd();void Time0_Init()          //定时器初始化
{TMOD = 0x21;TH0 = 0x00;TL0 = 0x00;TR0 = 0;//先关闭定时器0
}void Time0_Int() interrupt 1 //中断程序
{TH0  = 0xfe;             //重新赋值TL0  = 0x33;
}
unsigned int Read_value()
{uint result;Tr=1;//触发引脚发出11us的触发信号(至少10us)Delay10us();Tr=0;while(!Ec);//度过回响信号的低电平TR0=1;//开启定时器0while(Ec);//度过回响信号高电平TR0=0;//关闭定时器0result=((TH0*256+TL0)*0.034)/2;		// 距离cm=(时间us * 速度cm/us)/2return result + 2;	//+2修正补偿	
}//延时ms
void DHT11_delay_ms(unsigned int z)
{unsigned int i,j;for(i=z; i>0; i--)for(j=110; j>0; j--);
}//延时us   --2*n+5us
void DHT11_delay_us(unsigned char n)
{while(--n);
}//DHT11起始信号
void DHT11_start()
{Temp_data=1;DHT11_delay_us(10);Temp_data=0;DHT11_delay_ms(50);//这个延时不能过短,18ms以上,实际在仿真当中要想读到数据延时要在延时参数要在40以上才能出数据Temp_data=1;DHT11_delay_us(30);//这个延时不能过短}//接收一个字节unsigned char DHT11_rec_byte()
{unsigned char i,dat=0;for(i=0; i<8; i++){while(!Temp_data);DHT11_delay_us(8);dat <<=1;if(Temp_data==1){dat +=1;}while(Temp_data);}return dat;
}//接收温湿度数据
void DHT11_receive()
{unsigned int R_H,R_L,T_H,T_L;unsigned char RH,RL,TH,TL,revise;DHT11_start();Temp_data=1;if(Temp_data==0){while(Temp_data==0);   //等待拉高DHT11_delay_us(40);  //拉高后延时80usR_H=DHT11_rec_byte();    //接收湿度高八位R_L=DHT11_rec_byte();    //接收湿度低八位T_H=DHT11_rec_byte();    //接收温度高八位T_L=DHT11_rec_byte();    //接收温度低八位revise=DHT11_rec_byte(); //接收校正位DHT11_delay_us(25);    //结束if((R_H+R_L+T_H+T_L)==revise)      //校正{RH=R_H;RL=R_L;TH=T_H;TL=T_L;}/*数据处理,方便显示*/rec_dat[0]=RH;rec_dat[1]=RL;rec_dat[2]=TH;rec_dat[3]=TL;}}void dht11()
{DHT11_delay_ms(150);DHT11_receive();sprintf(rec_dat_lcd0,"%d",rec_dat[0]);sprintf(rec_dat_lcd1,"%d",rec_dat[1]);sprintf(rec_dat_lcd2,"%d",rec_dat[2]);sprintf(rec_dat_lcd3,"%d",rec_dat[3]);DHT11_delay_ms(100);	 sd = rec_dat[1]*10 + rec_dat[0];wd = rec_dat[3]*10 + rec_dat[2];
}uchar get_AD_Res()            //ADC0832启动读取函数
{uchar i, data1=0, data2=0;CS=0;CLK=0;DIO=1;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); CLK=1;_nop_();CLK=0;DIO=0;_nop_();CLK=1;_nop_();CLK=0;DIO=1;_nop_(); for(i=0; i<8; i++){CLK=1;_nop_();CLK=0;_nop_();data1=(data1<<1)|(uchar)DIO; }for(i=0; i<8; i++){data2=data2|(uchar)DIO<<i;CLK=1;_nop_();CLK=0;_nop_();}CS=1;return(data1 == data2)?data1:0;
}void beep_warning()
{if(distance < jlyz){flag1 = 1;}else{flag1 = 2;}if(sd > 65){flag2 = 3;}else{flag2 = 4;}flag = flag1 * flag2;if(flag == 3 || flag == 4){beep =~ beep;Delay(500);}else if(flag == 6){beep =~ beep;Delay(100);}else if(flag == 8){beep = 1;}if(u>=50){led = 0;}else{led = 1;}
}void main()					  //主函数
{	Tr=0;               //出发引脚首先拉低LCD_Init();         //显示屏初始化Time0_Init();	   //定时初始化beep = 1;led = 0;while(1){canshu();  //参数获取display();  //显示beep_warning();//报警ajpd();  //按键判断}
}void ajpd()
{if(key1==0){Delay(100);if(key1 == 0){LCD_Init();         //显示屏初始化ymflag++;if(ymflag>1){ymflag = 0;}}}if(key2==0){Delay(100);if(key2 == 0){jlyz++;}}if(key3==0){Delay(100);if(key3 == 0){jlyz--;}}
}
void canshu() 
{distance = Read_value();//读值distance+=12;dht11(); //温湿度获取u=get_AD_Res();u = (u/177)*50;}
void display()
{if(ymflag == 0){LCD_ShowNum(2,10,distance,3); //显示距离LCD_ShowNum(1,1,wd,2);LCD_ShowNum(1,7,sd,2);flag3 = 0;}else if(ymflag == 1){LCD_ShowNum(2,1,jlyz,3); //显示距离flag3 = 1;}if(flag3 == 0){LCD_ShowString(2,1,"Distance:"); //显示字符串DistanceLCD_ShowString(2,14,"CM"); //显示字符串DistanceLCD_ShowString(1,3,"C"); //显示字符串DistanceLCD_ShowString(1,9,"%"); //显示字符串Distanceflag3 = 2;}else if (flag3 == 1){LCD_ShowString(1,1,"SetDistance"); //显示字符串DistanceLCD_ShowString(2,4,"CM");flag3 = 2;}
}//	
void Delay10us()
{TL0=0xF5;TH0=0xFF;TR0=1;while (TF0==0);TR0=0;TF0=0;
}

四、实现现象

具体动态效果看B站演示视频:

基于单片机的超声波、温湿度、光照检测分阶段报警_哔哩哔哩_bilibili

全部资料(源程序、仿真文件、安装包、演示视频):

http:// https://pan.baidu.com/s/1nZjWADtV0UnN-OcZPSpc1Q?pwd=rqn5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/480690.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++类的自动转换和强制类型转换

目录 一、类型转换 二、转换函数 一、类型转换 C⽀持内置类型隐式类型转换为类类型对象&#xff0c;需要有相关内置类型为参数的构造函数 简单说就是可以将内置类型转化为自定义类型 示例&#xff1a; class Test { public:Test(int n1 0):num1(n1){}void pr…

w~视觉~合集26

我自己的原文哦~ https://blog.51cto.com/whaosoft/12663170 #InternVL 本文设计了一个大规模的视觉-语言基础模型&#xff08;InternVL&#xff09;&#xff0c;将视觉基础模型的参数扩展到60亿&#xff0c;并逐步与LLM对齐&#xff0c;利用来自不同来源的网络规模的图像-文…

C++优选算法十六 BFS解决最短路问题

1.BFS解决最短路问题的优势与局限 BFS是一种有效的解决最短路问题的算法&#xff0c;特别适用于无权图或边权相等的图。 优势&#xff1a; BFS能够逐层遍历图中的所有节点&#xff0c;直到找到目标节点或遍历完所有可达节点。对于无权图&#xff08;即边权为1的图&#xff0…

服务器创建容器时报错: no main manifest attribute

1.出现问题的原因 springboot项目快速搭建完成以后&#xff0c;打包 > 制作容器 > 启动 在创建完成docker容器以后,启动时出现以下问题 查询了一下百度,说的是没有main文件信息, 2.解决方法 在pom文件里面加入以下代码即可 <plugins><plugin><groupI…

【小白学机器学习34】基础统计2种方法:用numpy的方法np().mean()等进行统计,pd.DataFrame.groupby() 分组统计

目录 1 用 numpy 快速求数组的各种统计量&#xff1a;mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容&#xff0c;显示效果 2 为了验证公式的背后的理解&#xff0c;下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差…

无需插件,如何以二维码网址直抵3D互动新世界?

随着Web技术的飞速发展&#xff0c;一个无需额外插件&#xff0c;仅凭二维码或网址即可直接访问的三维互动时代已经悄然来临。这一变革&#xff0c;得益于WebGL技术与先进web3D引擎的完美融合&#xff0c;它们共同构建了51建模网这样一个既便捷又高效的在线三维互动平台&#x…

【前端】跨域问题与缓存

报错如下&#xff1a; 原因&#xff1a; 浏览器 缓存跨域&#xff0c;顾名思义是由于浏览器的缓存机制导致的一种跨域情况。这种跨域一般会出现在浏览器通过一些无视跨域的标签和css(如img、background-image)缓存了一些图片资源之后&#xff0c;当再次发起图片请求时&#xff…

怎么样才算得上熟悉高并发编程?

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…

大数据新视界 -- 大数据大厂之 Hive 数据质量保障:数据清洗与验证的策略(上)(17/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

MySQL5.6升级MySQL5.7

升级方式介绍 08 数据库服务版本升级方法 5.6 – 5.7 – 8.0 数据库版本升级方法&#xff1a; Inplace-本地升级 步骤一&#xff1a;在同一台服务器中&#xff0c;需要部署高版本数据库服务实例步骤二&#xff1a;低版本数据库中的数据进行备份迁移&#xff0c;迁移到高版本…

添加字符(暴力模拟)

添加字符 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);char[] A in.next().toCharArray();char[] B in.next().toCharArray();int …

关注度上升,交易量直线上涨,Base Season 即将到来?

撰文&#xff1a;Zeneca 编译&#xff1a;Yangz&#xff0c;Techub News 译者按&#xff1a;凭借 AI 发币平台 Clanker 及 Virtuals 的爆火&#xff0c;行业对 Base 生态的关注出现「暴涨」。当地时间 11 月 26 日&#xff0c;Base 上的交易量直线拉升&#xff0c;达到约 1136…

安能物流 All in TiDB 背后的故事与成果

导读 在数字化转型的浪潮中&#xff0c;安能物流通过技术创新不断提升物流效率&#xff0c;迈出了全链路 All in TiDB 的重要一步。本文将深入探讨安能物流如何选择 TiDB 作为核心数据库&#xff0c;以应对高并发、数据处理能力和系统可扩展性等挑战。通过 TiDB 的弹性扩展能力…

《深入理解经典广度优先遍历算法》

广度优先遍历:宽度优先遍历&#xff08;Breadth-First Search, BFS&#xff09;, 图论和树论中基本的查找搜索算法&#xff0c; 是广大图算法的基础.。 前置知识和介绍 数据结构: 队列&#xff0c; 双端队列。 二叉树:经典bfs,按层bfs&#xff08;即树的层序遍历&#xff09;。…

FPGA工具链及功能介绍

一、处理流程 把verilog等源码&#xff0c;变为FPGA中可执行的比特流文件&#xff0c;主要包含这些步骤&#xff1a; 步骤功能转译将verilog代码转化为更详细的语法&#xff0c;增加更多细节内容技术映射将每个vrilog用到的模块&#xff0c;对应到FPGA的物理器件上优化优化冗余…

『python爬虫』使用docling 将pdf或html网页转为MD (保姆级图文)

目录 预览效果安装下载模型测试代码总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 预览效果 支持转化pdf的表格 安装 Docling 本身是专注于文档转换的工具&#xff0c;通常用于将文件&#xff08;如 PDF&…

超详细ensp配置VRRP和MSTP协议

一、简介 1、什么是VRRP&#xff1a; &#xff08;1&#xff09;VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;的概念&#xff1a; VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;指的是一种实现路由器冗余备份的协议&#xff0c;常用于…

【案例学习】如何使用Minitab实现包装过程的自动化和改进

Masimo 是一家全球性的医疗技术公司&#xff0c;致力于开发和生产各种行业领先的监控技术&#xff0c;包括创新的测量、传感器和患者监护仪。在 Masimo Hospital Automation 平台的助力下&#xff0c;Masimo 的连接、自动化、远程医疗和远程监控解决方案正在改善医院内外的护理…

【C语言】结构体、联合体、枚举类型的字节大小详解

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;和联合体&#xff08;union&#xff09; 是常用的复合数据类型&#xff0c;它们的内存布局和字节大小直接影响程序的性能和内存使用。下面为大家详细解释它们的字节大小计算方法&#xff0c;包括对齐规则、内存分配方…

中科亿海微SoM模组——波控处理软硬一体解决方案

本文介绍的波控处理软硬一体解决方案主要是面向相控阵天线控制领域&#xff0c;波控处理通过控制不同天线组件的幅相来调整天线波束的方向和增益&#xff0c;实现高精度角度控制和高增益。本方案由波控处理板、波控处理控制软件算法和上位机软件共同构成。波控处理SoM模组原型样…