目录
【功能介绍】
【原理图】
【PCB】
【实物图】
【元器件清单】
【源程序】
【原理介绍】
【参考资料】
【参考文献】
【功能介绍】本系统采用单片机为控制核心,以实现便携式温湿度甲醛检测仪的基本控制功能。系统主要功能内容包括:数据处理、开始测量、超标报警、键盘检测。本系统设计采用功能模块化的设计思想,系统主要分为总体方案设计、硬件和软件的设计三大部分。
本设计主要实现的功能包括:烟雾、温湿度、甲醛检测、超标报警、键盘检测、数据显示等。
【原理图】
#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
本文介绍了在设计的过程的关键点,供大家参考学习,如需获取实物、或者下载链接失效、对其他单片机硬件设计感兴趣、有不明白的或者错误的,可以添加徽信biyezhan007
郑重声明,此文章提供给大家做参考模板,杜绝一切不良学术不良行为。