基于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 P0


sbit 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 置0
		UART_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电路图、开题报告、参考论文、流程图、任务书、视频讲解等。具体内容如下,全网最全! !

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

点赞分享一起学习成长。

  • 72
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第1章 绪论 1 1.1 引言 1 第2章 概述 3 2.1系统总概述 3 2.2总体方案设计 3 2.3硬件设计 3 2.4软件设计 4 2.5 硬件结构框图2.1 4 2.6 软件结构框图2.2 4 第3章 硬件设计 5 3.1 硬件设计主电路图见附录9.1 5 3.2 硬件选择 5 3.2.1 MCU的选择与简介 5 3.2.2 单片机最小系统的实现 10 3.2.3 数据采集系统 13 3.2.4 模数转换的选择与简介 14 3.2.5 按键选择与简介 16 3.2.6 外围扩充存储器 17 3.2.7 时钟芯片选择与简介 18 3.2.8 上拉电阻 20 3.2.9 液晶显示器简介。 20 3.2.10 报警电路 23 3.2.11 硬件仿真环境介绍 24 第4章 软件设计 26 4.1编写语言的选择 26 4.2 编译软件介绍 27 4.3主程序模块 32 4.4模数转换 33 4.5按键模块 33 4.6时钟模块 34 4.7液晶显示模块 34 第5章 系统仿真 35 第6章 结束语 37 致 谢 38 参考文献 39 附录 40 第1章 绪论 1.1 引言 1.1.1甲醛的特性及危害 甲醛是一种无色,有强烈刺激性气味的气体。易溶于水、醇和醚。甲醛在常温下是气 态,通常以水溶液形式出现。其37%的水溶液称为福尔马林,医学和科研部门常用于标本 的防腐保存。此溶液沸点为19.5 故在室温时极易挥发,随着温度的上升甲醛的挥发速度 加快。在我国有毒化学品优先控制名单中甲醛列居第二位。 1.1.2甲醛的来源 1.室内装修所用的合成板材,如胶合板、细木工板、高密度板、刨花板。这些板材中 甲醛起胶合剂、防腐剂的作用,主要用于加强板材的硬度、防虫、防腐。板材中残留的 和未参与反应的甲醛逐渐向周围环境释放,是室内空气中甲醛的主要来源。 2.用合成板材制造的家具,厂家为了追求利润使用不合格的板材,再粘贴面材料时使 用不合格的胶水,造成家具中甲醛含量超标。 3.含有甲醛成分并有可能向外界散发的各类装饰材料,如壁纸、地毯、油漆。 第2章 概述 2.1系统总概述 本论文主要完成甲醛检测仪软件设计设计内容包括:A/D转换器程序、控制程序、 超标报警、键盘检测、数据显示等。 本系统采用单片机为控制核心,以实现便携式甲醛检测仪的基本控制功能。系统主要 功能内容包括:数据处理、时间设置、开始测量、超标报警、键盘检测、自动休眠:仪 器若不进行称量操作,5分钟后自动进入休眠模式,以降低电源消耗。 本系统设计采用功能模块化的设计思想,系统主要分为总体方案设计、硬件和软件的 设计三大部分。 2.2总体方案设计 室内甲醛污染对人身体健康影响较大,标准规定的方法绝大多数是化学分析法,使用 的手段是实验室分析仪器 主要有比色计、 分光光度计、化学滴定、 气相和液相色谱。但这些方法费力费时、成本高、自动化程度低过程复杂、大多数过程 是人工操作很难做到现场实时控制随着传感器和计算机技术的不断发展,现已有了基于 单片机的便携式甲醛测试仪,并且测试测试范围、分辨率、精度、稳定性已接近标准要 求。因此本设计可选用基于电化学原理的甲醛传感器,其原理是空气中的甲醛在电极下 发生氧化反应,产生的扩散电极电流与空气中的甲醛浓度成正比,通过检测放大电路和 放大倍数的调整经A/D转换后送单片机 、由单片机现场自动控制检测并显示甲醛浓度。由于甲醛含量超量的话,将对人体健康 造成很大的影响。具有民用价值的便携式甲醛检测仪的研制受到了人们的高度重视。设 计能够满足生活需要,携带方便的便携式甲醛检测仪迫在眉睫。针对目前的现状,本系 统设计遵守体积小,质量轻,性价比高的原则。 2.3硬件设计 硬件设计部分主要包括:(MCU、A/D、时钟芯片、LCD、外围扩展数据RAM)等芯片的 选择; 硬件主电路设计、数据采集、模数转换电路设计、液晶显示电路设计、外围扩充存储器 接口电路、时钟电路、复位电路、键盘接口电路等功能模块电路设计。 2.4软件设计 软件设计部分主要包括:编写语言的选择、主程序/子程序流程的设计、功能模块程 序的编写、软/硬件结合调试与演示。主要包括一下功能模块:51驱动、检测、液晶显示 、时钟、键盘、模数软换。 2.5 硬件结构框图2.1 图2.1 2.6 软件结构框图2.2 图2.2 第3章 硬件设计 3.1 硬件设计主电路图见附录9.1 3.2 硬件选择 3.2.1 MCU的选择与简介 1. 单片机的概念和特点 现代社会中,尽管PC机的应用已经相当普遍,但是,在工控领域,在日益追求小而精、 轻而薄的自动化控制器、自动化仪器仪表、家电产品等方面,PC机仍有所不相适宜的地方 。而工业控制、仪器仪表、家电产品等市场广阔,要求PC机技术与之相适应。在这种情 况下,单片机应运而生

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值