【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录

  • 一、功能简介
  • 二、软件设计
  • 三、实验现象
  • 联系作者


一、功能简介

本项目使用Proteus8仿真Arduino单片机控制器,使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。

主要功能:
系统运行后,LCD1602显示CO、NOx、HC和PM2.5气体浓度检测值,可通过按键K3进入阈值设置模式,K1和K2调节阈值,K4键确定并返回主界面。
当检测值高于阈值,则蜂鸣器报警,并且相应指示灯点亮。


二、软件设计

/*
作者:嗨小易(QQ技术交流群:570487280)*///系统数据显示
void sys_data_show(void)
{u8 buf[5];while(1){//正常模式显示if(sys_ctrl.mode==0){//co显示buf[0]=sys_ctrl.co/100+0x30;buf[1]='.';buf[2]=sys_ctrl.co%100/10+0x30;buf[3]=sys_ctrl.co%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,0,buf);//nox显示buf[0]=sys_ctrl.nox/100+0x30;buf[1]='.';buf[2]=sys_ctrl.nox%100/10+0x30;buf[3]=sys_ctrl.nox%100%10+0x30;buf[4]='\0';lcd1602_show_string(12,0,buf);//hc显示buf[0]=sys_ctrl.hc/100+0x30;buf[1]='.';buf[2]=sys_ctrl.hc%100/10+0x30;buf[3]=sys_ctrl.hc%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,1,buf);//pm25显示buf[0]=sys_ctrl.pm25/100+0x30;buf[1]='.';buf[2]=sys_ctrl.pm25%100/10+0x30;buf[3]=sys_ctrl.pm25%100%10+0x30;buf[4]='\0';lcd1602_show_string(12,1,buf);}//阈值设置显示else{//co显示buf[0]=sys_ctrl.threshold[0]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[0]%100/10+0x30;buf[3]=sys_ctrl.threshold[0]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,0,buf);//nox显示buf[0]=sys_ctrl.threshold[1]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[1]%100/10+0x30;buf[3]=sys_ctrl.threshold[1]%100%10+0x30;buf[4]='\0';lcd1602_show_string(12,0,buf);//hc显示buf[0]=sys_ctrl.threshold[2]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[2]%100/10+0x30;buf[3]=sys_ctrl.threshold[2]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,1,buf);//pm25显示buf[0]=sys_ctrl.threshold[3]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[3]%100/10+0x30;buf[3]=sys_ctrl.threshold[3]%100%10+0x30;buf[4]='\0';lcd1602_show_string(12,1,buf);switch(sys_ctrl.mode){case 1:lcd1602_show_string(3,0,"    ");delay_ms(100);buf[0]=sys_ctrl.threshold[0]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[0]%100/10+0x30;buf[3]=sys_ctrl.threshold[0]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,0,buf);break;case 2:lcd1602_show_string(12,0,"    ");delay_ms(100);buf[0]=sys_ctrl.threshold[1]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[1]%100/10+0x30;buf[3]=sys_ctrl.threshold[1]%100%10+0x30;buf[4]='\0';lcd1602_show_string(12,0,buf);break;case 3:lcd1602_show_string(3,1,"    ");delay_ms(100);buf[0]=sys_ctrl.threshold[2]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[2]%100/10+0x30;buf[3]=sys_ctrl.threshold[2]%100%10+0x30;buf[4]='\0';lcd1602_show_string(3,1,buf);break;case 4:lcd1602_show_string(12,1,"    ");delay_ms(100);buf[0]=sys_ctrl.threshold[3]/100+0x30;buf[1]='.';buf[2]=sys_ctrl.threshold[3]%100/10+0x30;buf[3]=sys_ctrl.threshold[3]%100%10+0x30;buf[4]='\0';lcd1602_show_string(12,1,buf);break;}}break;			}
}//系统数据设置
void sys_data_set(void)
{u8 key=0;key=key_scan(0);//模式设置if(key==KEY3_PRESS){sys_ctrl.mode++;if(sys_ctrl.mode>4)sys_ctrl.mode=1;}if(sys_ctrl.mode!=0){//在设置模式下,加if(key==KEY1_PRESS){	switch(sys_ctrl.mode){case 1://co sys_ctrl.threshold[0]++;if(sys_ctrl.threshold[0]>100)sys_ctrl.threshold[0]=0;break;case 2://nox sys_ctrl.threshold[1]++;if(sys_ctrl.threshold[1]>100)sys_ctrl.threshold[1]=0;break;case 3://hc sys_ctrl.threshold[2]++;if(sys_ctrl.threshold[2]>100)sys_ctrl.threshold[2]=0;break;case 4://pm25 sys_ctrl.threshold[3]++;if(sys_ctrl.threshold[3]>100)sys_ctrl.threshold[3]=0;break;}				}//在设置模式下,减else if(key==KEY2_PRESS){switch(sys_ctrl.mode){case 1://co sys_ctrl.threshold[0]--;if(sys_ctrl.threshold[0]<0)sys_ctrl.threshold[0]=100;break;case 2://nox sys_ctrl.threshold[1]--;if(sys_ctrl.threshold[1]<0)sys_ctrl.threshold[1]=100;break;case 3://hc sys_ctrl.threshold[2]--;if(sys_ctrl.threshold[2]<0)sys_ctrl.threshold[2]=100;break;case 4://pm25 sys_ctrl.threshold[3]--;if(sys_ctrl.threshold[3]<0)sys_ctrl.threshold[3]=100;break;}}//确定else if(key==KEY4_PRESS){sys_ctrl.mode=0;		}	}
}//系统功能控制
void sys_fun_ctrl(void)
{//正常工作模式下if(sys_ctrl.mode==0){//如果CO浓度超限,报警,指示灯亮if(sys_ctrl.co>sys_ctrl.threshold[0]){LED_CO=0;beep_alarm(1,1000);}else{LED_CO=1;	}//如果nox浓度超限,报警,指示灯亮if(sys_ctrl.nox>sys_ctrl.threshold[1]){LED_NOX=0;beep_alarm(1,1000);}else{LED_NOX=1;	}//如果hc浓度超限,报警,指示灯亮if(sys_ctrl.hc>sys_ctrl.threshold[2]){LED_HC=0;beep_alarm(1,1000);}else{LED_HC=1;	}//如果pm25浓度超限,报警,指示灯亮if(sys_ctrl.pm25>sys_ctrl.threshold[3]){LED_PM25=0;beep_alarm(1,1000);}else{LED_PM25=1;	}				}		
}//应用控制系统
void appdemo_show(void)
{sys_parm_init();//系统参数初始化lcd1602_init();sys_open_show();//系统开机界面显示while(1){	sys_data_get();//系统数据获取sys_data_show();//系统数据显示sys_data_set();//系统数据设置sys_fun_ctrl();//系统功能控制}
}

三、实验现象

B站演示视频:https://space.bilibili.com/444388619
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

联系作者

视频地址:https://space.bilibili.com/444388619/video
专注于51单片机、STM32、国产32、DSP、Proteus、arduino、ESP32、物联网软件开发,PCB设计,视频分享,技术交流。

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

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

相关文章

手机录屏没有声音?让你的录屏有声有色

“有人知道手机录屏怎么录声音吗&#xff1f;今天录制了一个小时的直播视频&#xff0c;后面查看的时候发现没有声音&#xff0c;真的非常崩溃&#xff0c;想问问大家有没有办法&#xff0c;解决这个问题。” 在手机录屏的过程中&#xff0c;有时候我们可能会面临录制视频没有…

使用 Spectrum LSF 设置多集群和作业转发

使用 Spectrum LSF 设置多集群和作业转发 以下示例是有关如何使用 Spectrum LSF设置多集群和作业转发的指南。 此示例说明了集群是本地集群&#xff0c;另一个在云中的常见情况。 此示例假定标注为 “OnPremiseCluster” 的内部部署集群使用子网 192.168.0.0/24 &#xff0c;…

Spring技术内幕笔记之IOC的实现

IOC容器的实现 依赖反转&#xff1a; 依赖对象的获得被反转了&#xff0c;于是依赖反转更名为&#xff1a;依赖注入。许多应用都是由两个或者多个类通过彼此的合作来实现业务逻辑的&#xff0c;这使得每个对象都需要与其合作的对象的引用&#xff0c;如果这个获取过程需要自身…

奇因子之和(C语言)

题意&#xff1a; 一个整数的因子&#xff0c;就是所有可以整除这个数的数。奇数指在整数中&#xff0c;不能被 2 整除的数。所谓整数 Z 的奇因子&#xff0c;就是可以整除 Z 的奇数。 给定 N 个正整数&#xff0c;请你求出它们的第二大奇因子的和。当然&#xff0c;如果该数只…

Amazon API Gateway CORS 实战

Amazon API Gateway提供了一种实现跨域资源共享&#xff08;CORS&#xff09;的方式&#xff0c;以便在Web应用程序中安全地使用API。下面是Amazon API Gateway CORS的实战指南&#xff1a; 创建一个API Gateway REST API并定义资源和方法。在资源上启用CORS&#xff0c;可以通…

程序的重定位

可以理解为编译和链接 过程中产生的地址项都是临时的相对的。编译的时候的地址&#xff0c;在链接时会被修改。最终链接后生成的bin文件的地址项&#xff0c;在加载运行时 也会被修改。 链接器会对所有的输入文件进行扫描&#xff0c;之后就可以确定段的大小&#xff0c;符号定…

从0开始搭建清华ChatGLM3 6b大模型(Windows RTX4090版)

目录 1、硬件及软件说明 2、安装Anaconda 3、安装Git版本控制 ​4、安装pytorch驱动 5、安装ChatGLM3 1、硬件及软件说明 硬件&#xff1a;主要是GPU卡内存要足够&#xff0c;本次搭建使用的RTX4090卡一张&#xff0c;单卡内存24G&#xff0c;为什么选择4090&#xff1f;…

如何在ArcGIS Pro中指定坐标系

在进行制图的时候&#xff0c;为了实现某些特定的效果&#xff0c;需要指定特定的坐标系&#xff0c;但是现有的数据可能不是所需要的坐标系&#xff0c;这时候就需要对现有的数据坐标系进行处理&#xff0c;这里为大家介绍一下ArcGIS Pro中指定坐标系的方法&#xff0c;希望能…

ECMAScript和JavaScript:深入理解它们的关系与区别

ECMAScript和JavaScript&#xff1a;深入理解它们的关系与区别 在讨论ECMAScript和JavaScript之间的关系及其区别时&#xff0c;我们首先需要澄清一些常见的误解。很多人会将这两个术语混为一谈&#xff0c;但实际上&#xff0c;它们指代的是不同的概念。今天&#xff0c;我们…

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0c;其…

蓝牙物联网漏洞攻击的几种方式?

在物联网日益普及的今天&#xff0c;蓝牙技术的广泛应用为我们的生活带来了诸多便利。然而&#xff0c;正如一枚硬币有两面&#xff0c;蓝牙技术的普及也带来了新的安全挑战。近日&#xff0c;一项关于蓝牙物联网漏洞攻击的研究引起了广泛关注。这项研究揭示了蓝牙物联网所面临…

机器视觉在食品安全检测领域的应用与展望

​随着人们生活水平的提高&#xff0c;对食品安全的要求也越来越高。在这种背景下&#xff0c;机器视觉技术作为一种高效、准确的自动化检测手段&#xff0c;在食品安全检测领域扮演着越来越重要的角色。机器视觉系统通过模拟人眼的视觉功能&#xff0c;借助相机和计算机视觉算…

魅族手机怎么录屏?高清视频,轻松录制!

“有人知道魅族手机怎么录屏吗&#xff0c;新买的魅族手机&#xff0c;用了几天感觉挺流畅的&#xff0c;功能也很齐全&#xff0c;最近因为工作原因&#xff0c;需要用到录屏功能&#xff0c;但是我不知道怎么打开&#xff0c;就想问问大家&#xff0c;魅族手机怎么录屏呀。”…

【qt】保存debug到log里

新建一个log.h #ifndef LOG_H #define LOG_H#include <QFile> #include <QTextStream> #include <QDateTime> #include <QMutex> #include <QDir>//选择屏幕打印还是输出到文件可以根据这个宏控制或者控制函数调用位置都可以 //#define _DEBUG …

ARM CCA机密计算架构软件栈简介

本博客描述了Arm机密计算架构(Arm CCA)的固件和软件组件。 在这篇博客中,您将学到如何: 列出组成Arm CCA软件栈的组件集了解Arm CCA引入新软件组件的原因了解监视器和领域管理监视器(RMM)的角色了解如何创建和管理领域1.1 开始之前 我们假设您熟悉AArch64异常模型、AAr…

2024 年 8 款值得收藏的免费 Android 数据恢复软件

如果你发现手机数据全部被删除&#xff0c;先别慌&#xff0c;今天这个视频就来教你如何恢复。 随着市场上数据恢复软件的可用性不断增加&#xff0c;很难选择哪一款是最好的。今天&#xff0c;我们精心挑选了8个最佳免费Android数据恢复软件。他们肯定会帮助你决定最适合你需…

JAVA对象、List、Map和JSON之间的相互转换

JAVA对象、List、Map和JSON之间的相互转换 1.Java中对象和json互转2.Java中list和json互转3.Java中map和json互转 1.Java中对象和json互转 Object obj new Object(); String objJson JSONObject.toJSONString(obj);//java对象转json Object newObj JSONObject.parseObject(…

ECMAScript和JavaScript的区别

ECMAScript 和 JavaScript 之间的区别在于它们各自的定义和用途&#xff1a; ECMAScript 定义&#xff1a; ECMAScript 是 JavaScript 语言的规范。 它是由 Ecma 国际组织的 TC39 委员会开发的标准化脚本语言规范。 作用&#xff1a; ECMAScript 定义了脚本语言的语法、类型、…

引导过程的解析以及教程za

bios加电自检------mbr--------grub-------加载内核文件------启动第一个进程 bios的主要作用&#xff1a;检测硬件是否正常&#xff0c;然后根据bios中的启动项设置&#xff0c;去找内核文件 boot开机启动项顺序&#xff0c;你可以把内核文件放在何处&#xff1f; 1.硬盘 …

Python分支语句

if 语句 if用来根据一个条件判断是否要执行某段逻辑代码&#xff0c;语法是&#xff1a; if 条件:pass这里的条件指的是通过条件运算符和逻辑运算符组成的一个条件表达式&#xff0c;或者就是一个布尔值。有些特殊的使用场景下&#xff0c;也可以直接跟变量名&#xff0c;遵循…