基于51单片机甲醛浓度检测设计

基于51单片机甲醛浓度检测设计

(仿真+程序+原理图+PCB+设计报告)

功能介绍

具体功能:

1.甲醛浓度数据经过单片机处理,由LCD1602实时显示。

2.可通过按键设置甲醛报警阈值,并在LCD1602显示。

3.当甲醛浓度超过报警阈值时,进行声光报警。

​演示视频:

基于51单片机甲醛浓度检测设计—串口通信

#include<reg52.h>				 //头文件#include<intrins.h>				 //头文件
#include"eeprom52.h"
#define uchar unsigned char		 //宏定义
#define uint unsigned int
#define LCD1602_dat P0sbit LCD1602_rs=P2^5;//IO 定义
sbit LCD1602_rw=P2^6;
sbit LCD1602_e=P2^7;
sbit beep=P2^0;	   //蜂鸣器IO
sbit led_1=P1^0;	 //指示灯IO
sbit led_2=P1^1;
sbit key_1=P1^2;	//按键控制IO
sbit key_2=P1^3;uint ch2o_H,ch2o;	 //甲醛上限变量,   甲醛浓度变量
uchar bz,ms,sec,UART_dat[10],zhi[2],i;	 //暂存数据切换变量, 50模式 变量,  串口暂存数据数组,甲醛浓度高、低位数组, 循环变量
bit beep1;/********************************************************************
* 名称 : delay()
* 功能 : 小延时。													 
* 输入 : 无
* 输出 : 无
***********************************************************************/void delay(uint T)					  //延时函数
{while(T--);
}/********************************************************************
* 名称 : LCD1602_write(uchar order,dat)
* 功能 : 1602写如数据函数
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_write(uchar order,dat)				  //1602 一个字节  处理
{LCD1602_e=0;LCD1602_rs=order;LCD1602_dat=dat;LCD1602_rw=0;LCD1602_e=1;delay(1);LCD1602_e=0;																								     
}
/********************************************************************
* 名称 : LCD1602_writebye(uchar *prointer)
* 功能 : 1602写入数据函数  指针式
* 输入 : 输入的命令值
* 输出 : 无
***********************************************************************/
void LCD1602_writebyte(uchar *prointer)				   //1602 字符串    处理
{while(*prointer!='\0'){LCD1602_write(1,*prointer);prointer++;}
}
/********************************************************************
* 名称 : LCD1602_cls()
* 功能 : 初始化1602液晶 
* 输入 : 无
* 输出 : 无
***********************************************************************/
void LCD1602_cls()									 //1602 初始化
{LCD1602_write(0,0x01);     //1602 清屏 指令delay(1500);LCD1602_write(0,0x38);     // 功能设置 8位、5*7点阵delay(1500);LCD1602_write(0,0x0c);     //设置 光标   不显示开关、不显示光标、字符不闪烁LCD1602_write(0,0x06);LCD1602_write(0,0xd0);delay(1500);
}void show()			//显示数据
{LCD1602_write(0,0x80);LCD1602_writebyte("CH2O:");  	  //显示当前的甲醛浓度值LCD1602_write(1,0x30+ch2o/10000%10);LCD1602_writebyte(".");LCD1602_write(1,0x30+ch2o/1000%10);LCD1602_write(1,0x30+ch2o/100%10);LCD1602_write(1,0x30+ch2o/10%10);LCD1602_write(1,0x30+ch2o%10);LCD1602_writebyte("mg/m3");LCD1602_write(0,0xc0);LCD1602_writebyte("CH2O_H:");	  //显示甲醛上限值LCD1602_write(1,0x30+ch2o_H/100%10);LCD1602_writebyte(".");LCD1602_write(1,0x30+ch2o_H/10%10);LCD1602_write(1,0x30+ch2o_H%10);LCD1602_writebyte("mg/m3");	  //毫克每立方米
}void proc()   //超限处理
{if(ch2o/100>ch2o_H)  //如果当前甲醛浓度超出甲醛浓度上限{led_1=1;			   //对应指示灯点亮led_2=0;	beep1=1;			  //开启蜂鸣器报警}else	   //否则{led_1=0;	   //对应指示灯点亮led_2=1;beep1=0;	   //关闭蜂鸣器报警}
}void key()
{if(!key_1)   //判断按下{ms=sec=0;delay(888);   //按键延时去抖if(!key_1)  //判断按下{if(ch2o_H<700)ch2o_H++;ms=sec=0;	  //清楚按键按下计时  重新计时while(!key_1)	 //按键判断释放{show();proc();}SectorErase(0x2000);	 //保存上限值byte_write(0x2000,ch2o_H/256);byte_write(0x2001,ch2o_H%256);	}}if(!key_2)    //判断按下{ms=sec=0;delay(888);  //按键延时去抖if(!key_2)  //判断按下{if(ch2o_H>0) ch2o_H--;ms=sec=0;while(!key_2)	//按键判断释放{show();proc();}SectorErase(0x2000);	 //保存上限值byte_write(0x2000,ch2o_H/256);byte_write(0x2001,ch2o_H%256);}}}void main()
{uchar h,l;LCD1602_cls();	  //LCD 1602   调用初始化程序TMOD=0x21;	//配置定时TH0=0x4c;		//50ms  定时赋值TL0=0x00;ET0=1;TR0=1;TH1=0xfd;		//串口波特率定时初始TL1=0xfd;SCON=0x50;	//只发送EA=1;		//打开定时总中断ES=1;		//打开串口中断				TR1=1;h=byte_read(0x2000);l=byte_read(0x2001);   //读取保存的数据ch2o_H=h*256+l;if(ch2o_H>700)ch2o_H=80;while(1){show();		 //显示函数key();		 //按键处理程序proc();		 //超限处理程序}
}void UART_1() interrupt 1 
{TH0=0x4c;TL0=0x00;ms++;if(ms%2==0)   //长按按键计数处理{if(sec>1){if(!key_1)	//设置按键长按处理{if(ch2o_H<700)ch2o_H++;}if(!key_2){if(ch2o_H>0) ch2o_H--;}}}if(ms%10==0){if(beep1==1)	//蜂鸣器报警处理{beep=!beep;}else{beep=1;}}if(ms>19)	   //1s 定时{ms=0;sec++;}
} void UART_4() interrupt 4 //处理接收的串口数据
{if(RI){RI=0;   //RI 置0UART_dat[bz]=SBUF;	  //暂存串口数据switch(bz){case 0:if(UART_dat[bz]==0xFF){bz=1;}else{bz=0; }break;case 1:if(UART_dat[bz]==0x17){bz=2;}else{bz=0; }break;case 2:if(UART_dat[bz]==0x04){bz=3;}else{bz=0;  }break;case 3:if(UART_dat[bz]==0x00){bz=4; }else{bz=0; }break;case 4:bz=5;   break;case 5:bz=6; break;case 6:if(UART_dat[bz]==0x13){bz=7;   }else{bz=0; }break;case 7:if(UART_dat[bz]==0x88){bz=8;  }else{bz=0; }break;case 8:  //校验接收的数据  正确则处理接收的数据if((UART_dat[bz]+UART_dat[1]+UART_dat[2]+UART_dat[3]+UART_dat[4]+UART_dat[5]+UART_dat[6]+UART_dat[7])%256==0){ch2o=UART_dat[4]*256+UART_dat[5];ch2o=ch2o*13.392857;bz=0;}else{bz=0;   }break;}}
}               

硬件设计

使用元器件:

单片机:STC89C52;

(注意:单片机是通用的,无论51还是52、无论stc还是at都一样,引脚功能都一样。程序也是一样的。)

10uf电解电容;30pf瓷片电容;

电源接口;轻触按键;

3mm 绿色led灯;3mm 红色led灯;

5V有源蜂鸣器;4针排针;

LCD1602液晶显示屏+16P插座;

甲醛传感器ZE08-CH2O;

10K排阻;8550三极管;

3K电阻;330欧电阻;

10K电阻;1K电阻;

自锁开关;11.0592M晶振;

STC89C52单片机+DIP40插座;

导线:若干;

流程图:

设计资料

01 仿真图

本设计使用proteus7.8和proteus8.9两个版本设计,向下兼容,无需担心!具体如图!

02 原理图

本系统原理图采用Altium Designer19设计,具体如图!

03 程序

本设计使用软件keil4和keil5两个版本编程设计,无需担心!具体如图!

04 设计报告

七千字设计报告,具体如下!

05 设计资料

        资料获取请关注同名公众号,全部资料包括仿真源文件 、程序(含注释)、AD原理图、pcb电路图、开题报告、参考论文、流程图、任务书、视频讲解等。具体内容如下,全网最全! !

资料获取请观看前面演示视频!

点赞分享一起学习成长。

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

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

相关文章

幂函数计算指令(CODESYS ST语言)

非线性传感器的测量往往需要幂函数计算指令,PLC里往往并没有现成的幂函数指令,需要我们自己构造 1、非线性传感器测量 模拟量采集非线性函数(真空度计算)_plc三菱對真空計算法-CSDN博客文章浏览阅读876次,点赞2次,收藏8次。工业现场大部分传感器都是线性变换关系,关于…

CVE-2023-4427:Out-of-bounds access in ReduceJSLoadPropertyWithEnumeratedKey

文章目录 前言环境搭建for-in && enum cache漏洞分析漏洞利用总结参考 前言 之前分析调试漏洞时&#xff0c;几乎都是对着别人的 poc/exp 调试&#xff0c;感觉对自己的提升不是很大&#xff0c;所以后面分析漏洞时尽可能全面分析&#xff0c;从漏洞产生原理、如何稳定…

HTML 点击图片后悬浮放大图片

引入插件 1.viewer.js 2.引入viewer.css 3.引入jquery-viewer.min.js 4.添加图片点击事件function click(){ $(<img>, {src: 图片url }).viewer(show); } 效果图&#xff1a; 可网上自行下载对应插件&#xff0c;或新建相关命名文件后&#xff0c;把我下文的js代码…

10个热门的AI工具和官网地址(值得收藏)

人工智能 (AI) 发展迅猛&#xff0c;各种AI工具如雨后春笋般涌现&#xff0c;改变着我们的工作和生活方式。从文本生成到图像创作&#xff0c;从视频制作到语音合成&#xff0c;AI工具正在渗透到各个领域&#xff0c;为我们带来前所未有的效率和可能性。准备好迎接AI浪潮了吗&a…

【C++】新的类功能和可变参数模板

目录 一、新的类功能1.1 默认成员函数1.1.1 移动构造函数1.1.2 移动赋值运算符重载 1.2 关键字default1.3 关键字delete 二、可变参数模板2.1 可变参数的函数模板2.2 递归方式展开函数2.3 empalce 一、新的类功能 1.1 默认成员函数 在之前的学习过程中&#xff0c;我们已经知…

深度剖析:计算机集群在大数据体系中的关键角色和技术要点

什么是计算机集群&#xff1f; 计算机集群是一组相互连接的计算机&#xff08;服务器&#xff09;&#xff0c;它们协同工作以完成共同的任务。集群中的每个计算机节点都可以独立运行&#xff0c;但它们通过网络连接在一起&#xff0c;以实现更高的可靠性、性能和可扩展性。 典…

父子页面调用和传值的问题(window.open,iframe)

解决的场景&#xff1a; 当前系统点击列表&#xff0c;打开了新窗口详情页&#xff08;window.open&#xff09;,然后在新窗口详情页进行状态更改操作成功之后&#xff0c;点击原标签页&#xff0c;希望原标签页自动刷新列表更新状态 当然了&#xff0c;父标签页调用子标签页的…

想要成为一名合格的软件测试工程师,你得会些啥?

对于很多新入行或者打算入行&#xff0c;成为软件测试工程师的小伙伴来说&#xff0c;刚开始接触这行&#xff0c;不知道自己究竟该学些什么&#xff0c;或者不知道必须掌握哪些知识&#xff0c;才能成为一名合格的测试工程师。 根据笔者观点&#xff0c;如果你能在学习过程中…

SSM框架学习——MyBatis关联映射

MyBatis关联映射 为什么要关联映射 实际开发中&#xff0c;对数据库操作常常会涉及多张表&#xff0c;所以在OOP中就涉及对象与对象的关联关系。针对多表操作&#xff0c;MyBatis提供关联映射。 关联关系概述 一对一&#xff1a;A类中定义B类的属性b&#xff0c;B类中定义A…

嵌入式硬件中常见的面试问题与实现

1 01 请列举您知道的电阻、电容、电感品牌(最好包括国内、国外品牌) ▶电阻 美国:AVX、VISHAY威世 日本:KOA兴亚、Kyocera京瓷、muRata村田、Panasonic松下、ROHM罗姆、susumu、TDK 台湾:LIZ丽智、PHYCOM飞元、RALEC旺诠、ROYALOHM厚生、SUPEROHM美隆、TA-I大毅、TMT…

【讲解下Gitea】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

vulhub打靶记录——driftingbox

文章目录 主机发现端口扫描目录扫描爆破子域名提权总结 主机发现 使用nmap扫描局域网内存活的主机&#xff0c;命令如下&#xff1a; nmap -sP 192.168.56.0/24192.168.56.1&#xff1a;主机IP&#xff1b;192.168.56.100&#xff1a;DHCP服务器IP&#xff1b;192.168.56.101…