基于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电路图、开题报告、参考论文、流程图、任务书、视频讲解等。具体内容如下,全网最全! !
资料获取请观看前面演示视频!
点赞分享一起学习成长。