基于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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值