程序编译器:keil 5
编程语言:C语言
设计编号:C0081
基于STM32的天然气煤气可燃气体检测报警仿真设计
功能说明:
1、以STM32单片机为控制核心设计可燃气体(天然气 煤气)检测报警设计;
2、通过液晶屏LCD1602显示气体浓度;
3、可以通过拨动开关设置自动或者手动开启风扇,手动模式指示灯亮,自动模式下模式指示灯灭。
4、手动模式通过按键控制风扇开关。自动模式下检测到气体浓度高于2.0mg/L风扇自动启动。
5、监测到气体浓度高于2.0mg/L蜂鸣器报警。
主要硬件设备:STM32F103单片机
以下为本设计资料展示:
整体设计方案
本实验的目的是利用STM32单片机的先进数字模拟转换器(ADC)、通用输入输出(GPIO)和定时器等资源,将软件和硬件有效地结合在一起,以实现对输入模拟天然气煤气传感器的AD值的准确识别,并通过1602液晶显示屏(LCD1602)正确显示相关数据。此外,我们还希望系统能够根据预设的报警值,通过蜂鸣器和风扇等外设进行气体浓度的报警。
在这个实验中,值得注意的是,Proteus软件并没有内置的天然气煤气等有害气体的浓度传感器。因此,为了模拟可燃气体浓度的变化,我们使用了滑动变阻器。虽然这种方式不能直接应用于实际硬件设计,但是对于理解和测试算法的基本行为是非常有用的。对于需要进行实物设计的用户,建议根据实际传感器进行相应的调试和修改。
总的来说,这个实验提供了一个基础的框架,展示了如何利用STM32单片机结合ADC、GPIO和定时器等资源,实现对模拟天然气煤气传感器信号的采集和处理,并通过LCD1602显示和报警装置进行展示和报警。虽然不能直接用于实物设计,但对于理解和掌握相关技术的基本原理和应用,具有很大的价值。
本测试如下所示:
仿真运行情况:
开始仿真后LCD1602实时显示检测到的气体浓度,可以通过滑动变阻器改变测量值。可通过开关选择风扇的运行模式。如果开关闭合,风扇是自动模式工作,气体浓度高于报警值时,风扇启动,低于报警值的时候,风扇不转动。如果风扇是手动模式,通过按键控制风扇的开关。蜂鸣器报警电路在气体浓度高于报警值时启动,有嘟嘟报警声,低于不启动。
下图检测到气体浓度是1.5mg/L,低于报警值2.0mg/L,风扇和蜂鸣器电路不工作。
下图检测到气体浓度是2.0mg/L,大于等于报警值,蜂鸣器报警,风扇转动模拟排气通风。
程序是用keil5 mdk版本打开的,如果打开有问题,核实下keil的版本。程序是固件库版本编写的,有注释可以结合讲解理解。
mian.c代码
#include "stm32f10x.h"
#include "bsp-lcd1602.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#define LED PAout(3)
#define BEEP PAout(4)
#define KEY1 PAin(8)
#define KEY2 PAin(9)
#define KEY3 PAin(10)
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能P端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4; //LED0 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_3); //输出高
GPIO_SetBits(GPIOA,GPIO_Pin_4); //输出高
}
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //上拉输入
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
int main(void)
{
int a,b,c,d;
float temp;
int count;
delay_init(); //延时函数初始化
LCD1602_Init();
ADC1_GPIO_Config();
ADC_Config();
LCD1602_ShowStr(2,0,"Qiti=0.0mg/L",13);
LED_Init(); //风扇控制引脚
KEY_Init(); //按键初始化
while(1)
{
count++;
if(count>5000){//用于计数,防止系统执行转换太频繁
count = 0;
b=ADC_GetConversionValue(ADC1);//获取ADC的值
temp=(float)b*(3.4/4096);//换算ADC的值
a=temp/1;
c=temp*10;
d=c%10;
LCD_ShowNum(7,0,a);
LCD_ShowNum(9,0,d);//显示检测到的AD值
if(KEY3==0){//按键控制
if(temp>2) LED=1;//LED1是风扇控制引脚,1打开 0关闭
else LED=0;
} else{
if(KEY1==0) LED=1;
if(KEY2==0) LED=0;
}
if(temp>2) BEEP=0;//蜂鸣器报警值判断,BEEP==0蜂鸣器报警 1蜂鸣器关闭
else BEEP=1;
delay_ms(10);
}
}
}
0、常见使用问题及解决方法–必读!!!!
1、源程序
2、仿真图
3、功能要求
4、讲解视频
Altium Designer 软件资料
KEIL软件资料
Proteus软件资料
单片机学习资料
答辩技巧
设计报告常用描述
鼠标双击打开查找更多51 STM32单片机课程毕业设计.url
资料下载链接(可点击):