【功能介绍】
【原理图】
【PCB】
【实物图】
组件清单】
【源程序】
【原理介绍】
【参考】
【功能介绍】
该系统以单片机为控制核心,实现了便携式温湿度甲醛检测仪的基本控制功能。系统的主要功能包括:数据处理、开始测量、超标报警、键盘检测。系统设计采用功能模块化设计理念,主要分为三个部分:总体方案设计、硬件设计和软件设计。
【原理图】
【PCB】
【实物图】
组件清单】
规格 | 名称 | 标号 | 数量 |
KEY1 | 按键 | K1, K2, K3 | 3 |
S8050 | 三极管 | Q2 | 1 |
10K | 电阻 | R3 | 1 |
1K | 电阻 | R4 | 1 |
10K | 电位器 | RT1, RT3 | 2 |
LCD1602 | 液晶 | U1 | 1 |
POW | 电源 | U2 | 1 |
SWITCH | 开关 | U3 | 1 |
DHT11 | 温湿度传感器 | U4 | 1 |
STM32核 | 单片机 | U5 | 1 |
MQ-2 | 烟雾 | U6 | 1 |
蜂 | 蜂鸣器 | U9 | 1 |
CON4 | 甲醛 | U34 | 1 |
【源程序】
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#include "timer.h"
#include "usart1.h"
#include "usart3.h"
#include "LCD1602.h"
#include "string.h"
#include "stdio.h"
#include "dht11.h"
#include "stmflash.h"
#define WriteFlashAddress ((u32)0x08010000)//读写起始地址
u16 CH20_MAX_val = 100;//甲醛报警值
u16 CH2O_mgvalue = 0;//甲醛
void Change_data_handle(void);
void SHOW_AND_BAOJING_Handle(void);
u8 KEY_SCAN(void); //按键函数
u8 SHOW_BUF[16],SEND_BUF[16];
u8 key,PPM,Temperature,HUM;
u16 PPM_MAX=60,Temperature_MAX=40,HUM_MAX=70;//烟雾温湿度上限初始值
u16 write_buf[5];
///串口相关
extern char RxCounter,Usart1RecBuf[64];//串口1接收数据缓存
extern char bUsart1RecFlag; //串口1收到数据标志位
void save_data()//存储数据
{
write_buf[0]=1111;
write_buf[1]=PPM_MAX;
write_buf[2]=Temperature_MAX;
write_buf[3]=HUM_MAX;
write_buf[4]=CH20_MAX_val;
STMFLASH_Write(WriteFlashAddress,write_buf,5);
}
void read_data()//读取数据
{
static u16 chcek = 0;
STMFLASH_Read(WriteFlashAddress,write_buf,5);
chcek = write_buf[0];
if(chcek != 1111)//单片机第一次使用时,chcek不等于1111,以下则是保存一下数据,再进行读取
{
save_data();
delay_ms(100);
STMFLASH_Read(WriteFlashAddress,write_buf,5);
}
PPM_MAX = write_buf[1];//烟雾上限值
Temperature_MAX = write_buf[2];//温度上限值
HUM_MAX = write_buf[3];//湿度上限值
CH20_MAX_val = write_buf[4];//PM上限值
if(PPM_MAX > 99 || PPM_MAX<0)PPM_MAX=60;
if(Temperature_MAX > 99 || Temperature_MAX<0)Temperature_MAX=40;
if(HUM_MAX > 99 || HUM_MAX<0)HUM_MAX=70;
if(CH20_MAX_val > 999 || CH20_MAX_val<0)CH20_MAX_val=100;
}
void Get_CH2O(void)//获取甲醛
{
char i = 0;
if(Usart1RecBuf[i+5] == Usart1RecBuf[i]+Usart1RecBuf[i+1]+Usart1RecBuf[i+2]+Usart1RecBuf[i+3]+Usart1RecBuf[i+4])//校验
{
CH2O_mgvalue = Usart1RecBuf[1]*256 + Usart1RecBuf[2];//计算甲醛
bUsart1RecFlag = 0;
}
RxCounter = 0;
}
int main(void)
{
u16 test,test_adc;
delay_init(); //延时函数初始化
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
KEY_IO_Init();
Usart1_Init(9600);//串口3初始化,波特率9600
TIM2_Int_Init(1000,72-1); //定时器初始化,定时1MS
read_data();//开机读取一次存储值
delay_ms(300);
DHT11_Init(); //DHT11初始化
BEEP_DISENABLE(); //蜂鸣器初始化
LCD_Init(); // 1602初始化
Adc_Init(); //ADC初始化
while(1)
{
test_adc = Get_Adc_Average(ADC_Channel_9,20);//读取通道9的AD值,20ms读取一次
PPM = test_adc*99/4096;//12位AD,把AD值转换成百分比0~99
PPM = PPM >= 99? 99: PPM;//最大值不能超过99
DHT11_Read_Data(&Temperature,&HUM);//读取温湿度值
Get_CH2O();//获取甲醛值
SHOW_AND_BAOJING_Handle();
Change_data_handle();//按键调节
delay_ms(100);
}
}
extern u8 FLICKER;
void SHOW_AND_BAOJING_Handle(void)
{
unsigned char show_buf[16];//显示缓存区
if(Temperature >= Temperature_MAX)//温度超限
{
if(FLICKER)//超标显示闪烁
{
LCD_Write_String(0,0," ");
}
else
{
sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//转换显示格式为TEMP:00C
LCD_Write_String(0,0,show_buf);//显示
}
}
else
{
sprintf(show_buf,"TEMP:%02dC",(u16)Temperature);//转换显示格式为TEMP:00C
LCD_Write_String(0,0,show_buf);//显示
}
if(HUM >= HUM_MAX)//湿度超限
{
if(FLICKER)//超标显示闪烁
{
LCD_Write_String(9,0," ");
}
else
{
sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//转换显示格式为HUM:00%
LCD_Write_String(9,0,show_buf);//显示
}
}
else
{
sprintf(show_buf,"HUM:%02d%%",(u16)HUM);//转换显示格式为HUM:00%
LCD_Write_String(9,0,show_buf);
}
if(PPM >= PPM_MAX)//烟雾超限
{
if(FLICKER)//超标显示闪烁
{
LCD_Write_String(0,1," ");
}
else
{
sprintf(show_buf,"YW:%02d%%",PPM);//转换显示格式为SMOKE:00%
LCD_Write_String(0,1,show_buf);
}
}
else
{
sprintf(show_buf,"YW:%02d%%",PPM);//转换显示格式为SMOKE:00%
LCD_Write_String(0,1,show_buf);
}
if(CH2O_mgvalue >= CH20_MAX_val && FLICKER)//甲醛超限
{
LCD_Write_String(7,1," ");
}
else
{
LCD_Write_Char(7,1,CH2O_mgvalue/100+'0');
LCD_Write_Char(8,1,'.');
LCD_Write_Char(9,1,CH2O_mgvalue%100/10+'0');
LCD_Write_Char(10,1,CH2O_mgvalue%10+'0');
LCD_Write_Char(11,1,'m');
LCD_Write_Char(12,1,'g');
LCD_Write_Char(13,1,'/');
LCD_Write_Char(14,1,'m');
LCD_Write_Char(15,1,'3');
}
if(Temperature >= Temperature_MAX || HUM >= HUM_MAX || PPM >= PPM_MAX || CH2O_mgvalue >= CH20_MAX_val)//温度湿度烟雾甲醛超限
{
BEEP_ENABLE(); //蜂鸣器报警
}
else
{
BEEP_DISENABLE();
}
}
u8 KEY_SCAN(void)
{
u8 res = 0;
if(!KEY1)
{
delay_ms(10);
if(!KEY1)
{
while(!KEY1);//卡死
res = 1;
}
}
if(!KEY2)
{
delay_ms(10);
if(!KEY2)
{
while(!KEY2);//卡死
res = 2;
}
}
if(!KEY3)
{
delay_ms(10);
if(!KEY3)
{
while(!KEY3);//卡死
res = 3;
}
}
return res;
}
本文介绍了在设计的过程的关键点,供大家参考学习,如果有错误或者不明白的可以直接私信作者,或者添加微信biyezhan007。
其他资料
【原理介绍】
烟雾传感器工作原理:
烟雾传感器用于检测当前场所内的烟雾浓度来实现火灾的预防,烟雾报警器内部采用离子式烟雾传感,广泛应用于各种消防报警系统中,离子烟雾传感器是一种稳定可靠,技术先进的传感器,性能优于气敏电阻类的火灾报警器。
烟雾传感器目前分为2大类,分别是离子式烟雾传感器、光电式烟雾传感器和气敏式烟雾传感器。光电式烟雾传感器又分为减光式和散射光式光电烟雾探测器。本次设计采用的是常见的气敏式烟雾传感器,其工作原理是采用清洁空气中电导率较低的二氧化锡,当传感器所处环境中存在可燃气体时,传感器的电导率和气体浓度成线性化比,通过单片机本身的AD数模转换模块,即可将信号量变换成数字量,输出给单片机,最终显示在LCD1602液晶显示屏上
烟雾传感器也就是MQ-2是一种气体传感器。可以用在家庭或者是工厂等气体检测。通过阅读其相关的芯片资料我们知道可以检测到很多种气体。比如:液化气、酒精、氢气、烟雾等气体。本身具有的优势有响应速度快、使用寿命久、稳定性好、电路设计简单等特性。烟雾传感器是属于二氧化锡的半导体材料。当温度在200到300度时,二氧化锡会吸附空气中的氧气,增加电阻值。当检测到烟雾的时候会导致表面的导电率变化,这样就可以检测到烟雾的值。如果输出的电阻值越低,就代表输出的模拟信号值也就越大。
【参考文献】
[1] 李维提,郭强.《液晶显示应用技术》 北京:电子工业出版社,2000年.
[2] 北京精电蓬远显示技术有限公司.内藏KS0108B/HD61202控制器图形液晶显示模块使用手册.
[3] 赵茂泰.《智能仪器原理及应用》 北京:电子工业出版社,2001。
[4] 赵新民.《智能仪器原理及设计》 哈尔滨工业大学出版社,1995。
[5] 徐爱钧,彭爱华.《单片机高级语言CSTM32应用程序设计》〔M〕.北京工业出版社,1999。
[6] 严蔚敏 吴伟民。《数据结构》 清华大学出版社,1996
[7] 马忠梅等.《单片机的C语言应用程序设计》 北京:北京航空航天大学出版社,1997
[8] 李刚 林凌 王焱 编著 新概念单片机教程. 天津大学出版社,2004年
[9] 华成英. 童诗白. 《模拟电子技术基础第三版》 北京: 高等教育出版社, 2004.4.
[10] 丁元杰. 《单片微机原理及应用》.北京:机械工业出版社,1993
未经作者允许,不得抄袭转载,转载或有问题请私信或微信作者。