0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机的瓦斯气体PM2.5温度风速检测报警系统

bbxyliyang 来源:bbxyliyang 作者:bbxyliyang 2023-07-31 15:42 次阅读


一、系统方案

本设计采用STC89C52作为主控制器,瓦斯传感器、PM2.5传感器采集数据值送到ADC0832转换,送到单片机处理,液晶1602显示对应测量值,温度DS18B20采集温度值,送到液晶显示,风速传感器采集风速,送到ADC0832转换,送到单片机处理对应测量值,按键设置报警阀值,测量值超过设设定阀值,蜂鸣器报警。

wKgaomTHZb6Aci37AAAYTYJo5oI812.png

二、硬件设计
原理图如下:

wKgaomTHZcWAclj0AAFklRamRQQ496.png

三、单片机软件设计
1、首先是系统初始化:

Lcd1602_Init(); //LCD1602初始化
Delay_function(50); //延时50ms
lcd1602_clean(); //清屏
Delay_function(50); //延时50ms
Ds18b20_Init(); //DS18B20初始化
Delay_function(50); //延时50ms
2、液晶显示程序
/**********************************
包含头文件
**********************************/
#include "lcd1602.h"


/**********************************
函数定义
**********************************/
/****
*******1602检测忙函数
*****/
void lcd1602_check_busy()
{
P0=0xff;
do
{
LCD1602_RS=0;
LCD1602_RW=1;
LCD1602_E=0;
LCD1602_E=1;
} while(LCD1602_BUSY==1);
LCD1602_E=0;
}

/****
*******1602写数据忙函数
*****/
void lcd1602_write_date(uchar date)
{
lcd1602_check_busy();
LCD1602_E=0;
LCD1602_PORT=date;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_E=1;
LCD1602_E=0;
}

/****
*******1602写命令函数
*****/
void lcd1602_write_com(uchar com)
{
lcd1602_check_busy();
LCD1602_E=0;
LCD1602_PORT=com;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_E=1;
LCD1602_E=0;
}

/****
*******LCD1602初始化函数
*****/
void Lcd1602_Init()
{
lcd1602_write_com(0x38);
lcd1602_write_com(0x0c);
lcd1602_write_com(0x06);
lcd1602_write_com(0x01);
}

/****
*******LCD1602显示字符串函数
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* dat:所要显示的字符串,输入格式 " "
*****/
void lcd1602_display_str(uchar hang, uchar add, uchar *dat)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行

while(*dat != '�')
{
lcd1602_write_date(*dat++);
}
}

/****
*******LCD1602清屏函数
*****/
void lcd1602_clean()
{
lcd1602_display_str(1,0," ");
lcd1602_display_str(2,0," ");
}

/****
*******LCD1602显示数字函数(最大4位)
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* num:所要显示的数据,最大4位
*****/
void lcd1602_display_num(uchar hang, uchar add, uint num)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行

if(num > 999)
lcd1602_write_date(num/1000%10+48); //千
if(num > 99)
lcd1602_write_date(num/100%10+48); //百
if(num > 9)
lcd1602_write_date(num/10%10+48); //十
lcd1602_write_date(num/1%10+48); //个
lcd1602_write_date(' ');
lcd1602_write_date(' ');
lcd1602_write_date(' ');
}

/****
*******LCD1602显示温度函数(显示格式:**.*℃)
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* temp:所要显示的温度
*****/
void lcd1602_display_temp(uchar hang, uchar add,uint temp)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行

lcd1602_write_date(temp/100%10+48);
lcd1602_write_date(temp/10%10+48);
lcd1602_write_date('.');
lcd1602_write_date(temp/1%10+48);
lcd1602_write_date(0xdf); //显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码
lcd1602_write_date(0x43); //显示"C"符号,0x43是液晶屏字符库里大写C的地址码
}

/****
*******LCD1602显示风速(显示格式:**.*m/s)
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* wind:所要显示的风速
*****/
void lcd1602_display_wind(uchar hang, uchar add,uint wind)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行

lcd1602_write_date(wind/100%10+48);
lcd1602_write_date(wind/10%10+48);
lcd1602_write_date('.');
lcd1602_write_date(wind/1%10+48);
lcd1602_write_date('m');
lcd1602_write_date('/');
lcd1602_write_date('s');
}

/****
*******LCD1602显示气体浓度(显示格式:000ppm)
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* gas_value:所要显示的气体浓度
*****/
void lcd1602_display_gas(uchar hang, uchar add,uint gas_value)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行

if(gas_value > 999)
lcd1602_write_date(gas_value/1000%10+48);
if(gas_value > 99)
lcd1602_write_date(gas_value/100%10+48);
if(gas_value > 9)
lcd1602_write_date(gas_value/10%10+48);
lcd1602_write_date(gas_value/1%10+48);
lcd1602_write_date('p');
lcd1602_write_date('p');
lcd1602_write_date('m');
lcd1602_write_date(' ');
lcd1602_write_date(' ');
lcd1602_write_date(' ');
}

/****
*******LCD1602显示PM2.5(显示格式:000ug/m3)
*******参量定义: hang:输入显示行数 1 第一行 2 第二行
******* add:偏移量,0-15
******* pm25_value:所要显示的PM2.5
*****/
void lcd1602_display_pm25(uchar hang, uchar add,uint pm25_value)
{
if(hang==1)
lcd1602_write_com(0x80+add); //第一行
else
lcd1602_write_com(0x80+0x40+add); //第二行

if(pm25_value > 999)
lcd1602_write_date(pm25_value/1000%10+48);
if(pm25_value > 99)
lcd1602_write_date(pm25_value/100%10+48);
if(pm25_value >= 9)
lcd1602_write_date(pm25_value/10%10+48);
lcd1602_write_date(pm25_value/1%10+48);
lcd1602_write_date('u');
lcd1602_write_date('g');
lcd1602_write_date('/');
lcd1602_write_date('m');
lcd1602_write_date('3');
lcd1602_write_date(' ');
}

3、按键检测程序
/****
*******按键函数
*****/
void Key_function(void)
{
key_num = Chiclet_Keyboard_Scan(0); //按键扫描
if(key_num != 0) //有按键按下
{
switch(key_num)
{
case 1: //按键1,切换界面
flag_display++;
if(flag_display >= 6)
flag_display = 0;

lcd1602_clean();
break;

case 2: //按键2,不同界面有不同功能
switch(flag_display)
{
case 0: //界面0,切换测量界面
flag_meas_display++;
if(flag_meas_display >= 2)
flag_meas_display = 0;

lcd1602_clean();
break;

case 1: //界面1,温度最大值+1
if(temp_max < 99)
temp_max++;
break;

case 2: //界面2,温度最小值+1
if(temp_min < temp_max-1)
temp_min++;
break;

case 3: //界面3,风速最大值+1
if(wind_max < 99)
wind_max++;
break;

case 4: //界面4,瓦斯最大值+1
if(gas_max < 500)
gas_max++;
break;

case 5: //界面5,PM2.5最大值+1
if(pm25_max < 500)
pm25_max++;
break;

default:
break;
}
break;

case 3: //按键3,不同界面有不同功能
switch(flag_display)
{
case 1: //界面1,温度最大值-1
if(temp_max > temp_min+1)
temp_max--;
break;

case 2: //界面2,温度最小值-1
if(temp_min > 0)
temp_min--;
break;

case 3: //界面3,风速最大值-1
if(wind_max > 0)
wind_max--;
break;

case 4: //界面4,瓦斯最大值-1
if(gas_max > 0)
gas_max--;
break;

case 5: //界面5,PM2.5最大值-1
if(pm25_max > 0)
pm25_max--;
break;

default:
break;
}
break;

default:
break;
}
}
}
4、核心算法程序
void Manage_function(void)
{
if(flag_display == 0) //界面0,即测量界面
{
if(temp_value > temp_max*10 || temp_value < temp_min*10 || wind_value > wind_max*10 || gas_value > gas_max || pm25_value > pm25_max) //测量值不在设置的阈值之内,进行声光报警
{
if(time_num % 10 == 0)
{
LED = ~LED;
BEEP = ~BEEP;
}
}
else //测量值在设置的阈值之内,不进行声光报警
{
LED = 1;
BEEP = 1;
}
}
else //其他界面,即设置界面
{
LED = 1;
BEEP = 1;
}
}

四、proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

wKgaomTHZc6AbYe4AAF-_JBGalE046.png

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15223

    浏览量

    171186
  • 报警系统
    +关注

    关注

    5

    文章

    621

    浏览量

    74651
  • DS18B20
    +关注

    关注

    10

    文章

    765

    浏览量

    80094
  • 单片机
    +关注

    关注

    0

    文章

    168

    浏览量

    16658
收藏 人收藏

    评论

    相关推荐

    基于单片机pm2.5检测系统设计

    求大神解答,pm2.5惠普传感器6个引脚接hot51增强型单片机中AD模块哪个地方。
    发表于 03-23 10:22

    基于51单片机温度湿度PM2.5值测量系统

    请问基于51单片机温度湿度PM2.5值测量系统怎么做,特别是程序部分不是很会。
    发表于 12-02 18:29

    49-基于51单片机PM2.5和温湿度检测报警 精选资料分享

    具体功能:1、LCD1602液晶第一行显示当前的PM2.5值,第二行显示当前的温度和湿度值;2、可以设置PM2.5、温湿度上下限报警值。共4个按键:复位按键、减键、加键、设置键;设定的
    发表于 07-16 07:58

    基于单片机PM2.5检测系统有哪些功能

    设计简介:本设计是基于单片机PM2.5检测系统,主要实现以下功能:可实现LCD1602显示PM2.5的具体数值以及最大数值;可实现通过按键
    发表于 11-19 06:48

    如何去实现基于单片机PM2.5监测系统仿真设计

    044【毕设课设】基于单片机PM2.5监测系统仿真设计,实现的功能是实时检测温度PM2.5值,他可以手动设定
    发表于 11-19 09:19

    基于单片机环境监测温湿度PM2.5系统设计

    基于单片机环境监测温湿度PM2.5系统设计,实时检测环境中的温湿度值,并检测控制的PM2.5颗粒
    发表于 11-19 08:38

    基于51单片机PM2.5检测报警系统相关资料推荐

    系统由STC89C52单片机+ADC0832+GP2Y1010AUPM2.5传感器+按键+LED及蜂鸣器构成。具体功能:1、液晶第一行显示实际PM2.5值,液晶第二行显示
    发表于 11-19 06:19

    怎样去设计基于51单片机的空气质量检测报警

    PM2.5空气质量检测雾霾粉尘检测报警器69本系统由STC89C52单片机、LCD1602液
    发表于 11-19 09:18

    如何实现基于单片机PM2.5监测系统仿真设计?

    如何实现基于单片机PM2.5监测系统仿真设计?
    发表于 01-19 06:24

    怎样去设计一个基于单片机温湿度PM2.5报警设置系统

    036【毕设课设】基于单片机温湿度PM2.5报警设置系统,实时检测温湿度传感器的值,通过LCD液晶作为显示,可以设置温湿度上下限范围,通过L
    发表于 01-27 06:41

    求一种基于单片机的井下安全监测系统设计方案

    设计简介:本设计是基于单片机的井下安全监测系统,主要实现以下功能:可通过LCD1602显示温度风速PM2.5
    发表于 02-18 06:42

    基于单片机PM2.5(灰尘)检测系统

    设计简介:本设计是基于单片机PM2.5检测系统,主要实现以下功能:可实现LCD1602显示PM2.5的具体数值以及最大数值; 可实现通过按
    发表于 11-12 16:06 39次下载
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>PM2.5</b>(灰尘)<b class='flag-5'>检测</b><b class='flag-5'>系统</b>

    6-基于51单片机PM2.5检测报警系统

    系统由STC89C52单片机+ADC0832+GP2Y1010AUPM2.5传感器+按键+LED及蜂鸣器构成。具体功能:1、液晶第一行显示实际PM2.5值,液晶第二行显示
    发表于 11-13 09:21 35次下载
    6-基于51<b class='flag-5'>单片机</b>的<b class='flag-5'>PM2.5</b><b class='flag-5'>检测报警</b><b class='flag-5'>系统</b>

    442【毕设课设】基于51单片机PM2.5空气质量检测雾霾粉尘检测报警

    442【毕设课设】基于51单片机PM2.5空气质量检测雾霾粉尘检测报警
    发表于 11-13 10:06 34次下载
    442【毕设课设】基于51<b class='flag-5'>单片机</b><b class='flag-5'>PM2.5</b>空气质量<b class='flag-5'>检测</b>雾霾粉尘<b class='flag-5'>检测报警</b>器

    基于单片机pm2.5检测仪设计

    人体呼吸道,对人体健康影响极大。因此,研发一种基于单片机PM2.5检测仪成为了当今关注的焦点之一。本文将详细介绍基于单片机PM2.5
    的头像 发表于 12-20 09:18 538次阅读