版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
由可燃性气体传感器对待测气体(液体)进行检测,转换成输出电压信号,以单片机为核心的控制、声光报警电路发送短信以及显示、排气电路。测试仪进行气体检测的基本步骤是单片机先采集MQ-2传感器的响应信号,然后进行转换,储存在数据储存器中,最后单片机通过特定的算法进行气体浓度的识别,同时将分析的值与设定值进行对比,对超出设定值进行报警发送短信,并且将结果输出到LED显示屏幕上。本系统由烟雾传感器,单片机,声音报警,GSM短信,排气扇以及LCD显示等部分组成,在这次的整体设计中详细涉及下面几个方面,其原理框图如图3-1所示:电源电路单片机控制电路电源电路单片机控制电路液晶显示电路液晶显示电路晶振电路烟雾检测电路晶振电路烟雾检测电路复位电路复位电路声光报警电路声光报警电路按键电路按键电路GSM模块电路风扇GSM模块电路风扇电路系统总设计框图3.2硬件设计外围电路3.2.1晶振电路、复位电路设计单片机工作的过程中各指令的微操作在时间上有严格的次序,这种微操作的时间次序称作时序。单片机的时钟信号用来为单片机芯片内部各种微操作提供时间基准。STC89C52的时钟产生方式有两种,一种是内部时钟方式,一种是外部时钟方式。内部时钟方式即在单片机的外部接一个晶振电路与单片机里面的振荡器组合作用产生时钟脉冲信号。外部时钟方式是把外部已有的时钟信号引入到单片机内,此方式常用于多片STC89C52单片机同时工作,以便于各单片机的同步,一般要求外部信号高电平的持续时间大于20ns,且为频率低于12MHz的方波。对于CHMOS工艺的单片机,外部时钟要由XTAL1端引入,而XTAL2端应悬空。本系统中为了尽量降低功耗的原则,采用了内部时钟方式。本设计中复位电路采用的是开关复位电路,开关S9未按下是上电复位电路,上电复位电路在上电的瞬间,由于电容上的电压不能突变,电容处于充电(导通)状态,故RST脚的电压与VCC相同。随着电容的充电,RST脚上的电压才慢慢下降。选择合理的充电常数,就能保证在开关按下时是RST端有两个机器周期以上的高电平从而使STC89C51内部复位。开关按下时是按键手动复位电路,RST端通过电阻与VCC电源接通,通过电阻的分压就可以实现单片机的复位。如图3-3所示:3.2.2报警设计在单片机应用系统中,一般的工作状态可以通过指示灯或数码显示来指示,供操作人员借鉴。但针对某些特定状态,例如系统检测到的错误状态等,为了使操作人员不小心忽视,及时采取措施,必须还需要有某种更能引人注意,提起警觉的报警信号。这种报警信号一般有闪光报警、鸣音报警和语音报警三种类型。其中,前两种报警装置因硬件结构简单,软件编程方便,往往在单片机应用系统中使用。但语音报警虽然警报信息较直接,并且硬件成本高,结构相对复杂,软件量也增加。闪光报警实现单频音报警的接口电路比较简单,只要当值高于警报值的时候给一个低电频就能驱动二极管发光,简单易懂。系统采用声光报警,二极管指示灯点亮,蜂鸣器出声。没有超过上限值时绿灯点亮。电路图如下所示:3.2.2风扇设计当气体浓度超过上限值之后,启动风扇,减小气体的浓度。在未报警的状态下风扇处于静止状态,超过上限之后才会启动。电路部分如下图所示:3.2.3按键设计在设计中可以通过按键调节上限值的大小,k2是上限值加,k3是上限值减。上下值的加减是有掉电存储功能的,设置的数值重新上电之后可以保留之前的数据。电路部分如下图所示:四、系统软件设计4.1主程序流程图主程序实现的功能:与硬件相结合实现便携式气体浓度检测仪的各个功能主要是检测与显示,数据存储功能子函数的调用。流程图图4-1所示:首先开启启动按钮,启动单片机和显示器,同时对单片机内部进行初始化,紧接着初始化显示屏,初始化完毕后显示开机画面显示主菜单。初始化初始化是否触发报警采集MQ-2检测到的数据按键设置警报值开始NY图3.1.1发送端主程序流程图结束声光报警,发送报警短信,打开排气扇按键是否按下Y五、本设计总结与展望此检测仪会向更稳定,更可靠,更快捷等要求发展。工厂,企业到居民家庭,可燃性气体泄露的检测,对居民的人身和财产安全都十分重要且必不可少的。可燃性气体检测仪不仅能实现声光报警,能通过短信告知在外工作的人,或工厂的管理者,将安全隐患扼杀在萌芽状态。现如今,由于人们安全意识增强,对环境安全性和生活适性要求提高。单片机具有受集成限制,片内储存量较小,可靠性好,扩展简单,控制功能强等特点,所以,基于单片机的可燃性气体检测仪的研究和开发生产具有十分广泛的现实市场和潜在的市场需求。针对目前的现状,该系统设计遵循体积小,质量轻,性价比高的原则。软件是C语言编写的,具有很好的可控性、模块化和移植性。本系统的主要模块为传感检测、A/D转换、液晶显示、GSM模块。通过本次电子信息技术比赛,我加深了很多在大学课本上学到的知识,并且用于实践,相信在以后的工作中,这次设计是我宝贵的财富。附录:原理图:PCB图:程序:#include<REGX52.H>#include<intrins.h>#include"LCD1602.h"#include"ADC0832.h"#include"eeprom52.h"#defineuintunsignedint#defineucharunsignedcharsbitkey1=P3^4; //按键sbitkey2=P3^5; sbitbeep=P1^7; //蜂鸣器sbitFan=P3^6; //风扇bitkey1_flag=0; //按键标志位 bitkey2_flag=0;sbitLED0=P1^6; //指示灯sbitLED1=P1^4; ucharsec=0;sec1=0; //长按标志位uchars0=0,temp,temp1,ms;//浓度值,定时时间,浓度上限uintValue=0;uinttemp_h;bitSend_flag=0;bitflag=1;//>GSM相关变量ucharphone[11]=;//手机号数组//>Uart1AndGSMDefinitionunsignedcharxdataUart1_Buff[50];//串口1缓冲数组unsignedcharUart1_Count=0;//串口1累加变量unsignedcharQuest_flag=1; //初始化标志位unsignedintGSM_Send_Time=0; //GSM延时变量unsignedcharGSM_Num=0; //发送指令变量unsignedcharGSM_Send=0; //发送标志位unsignedcharGSM_Send_Num=0;//发送具体短信内容变量bitmemory_flag=0;voiddelay(uintT) //延时程序{ while(T--);}voidmemory() //掉电存储{unsignedcharq=0; if(memory_flag) { memory_flag=0; SectorErase(0x2000); byte_write(0x2000,temp_h/256); byte_write(0x2001,temp_h%256); for(q=0;q<11;q++) { byte_write(0x2100+q,phone[q]); } }}voidread_memory() //上电读存储{unsignedcharq=0; temp_h=byte_read(0x2000)*256+byte_read(0x2001);for(q=0;q<11;q++){phone[q]=byte_read(0x2100+q);} if(temp_h>255||temp_h<0) { temp_h=20; }}voidtimer_init() //定时器初始化{ TMOD=0x01; //定时器0,方式1 TH0=0x3c; //初值50ms TL0=0XB0; TR0=1; ET0=1; EA=1;}voiddisplay() //显示函数{ LCD1602_write(0,0x80); LCD1602_writebyte("NOWGAS:"); if(temp/100==0) { LCD1602_writebyte(""); if(temp%100/10==0) { LCD1602_writebyte(""); } else { LCD1602_write(1,'0'+temp%100/10); } LCD1602_write(1,'0'+temp%10); LCD1602_writebyte("PPM"); } else { LCD1602_write(1,'0'+temp/100); LCD1602_write(1,'0'+temp%100/10); LCD1602_write(1,'0'+temp%10); LCD1602_writebyte("PPM"); } LCD1602_write(0,0xc0); LCD1602_writebyte("WARNING:"); if(temp_h/100==0) { LCD1602_writebyte(""); if(temp_h%100/10==0) { LCD1602_writebyte(""); } else { LCD1602_write(1,'0'+temp_h%100/10); } LCD1602_write(1,'0'+temp_h%10); LCD1602_writebyte("PPM"); } else { LCD1602_write(1,'0'+temp_h/100); LCD1602_write(1,'0'+temp_h%100/10); LCD1602_write(1,'0'+temp_h%10); LCD1602_writebyte("PPM"); }}/*按键操作的方式多种多样,在学校里学到的普遍都是判断按键按下,延时等待一下再次判断按键按下,进行消抖,然后确定按键按下之后执行所要执行的,再死循环等待按键释放。这样写按键自然也行,但是有一个弊端,就是按键如果不松开,程序就会一直卡在那里,所以这里我换了一种书写方式,标志位的方式>按键松开的时候,将标志位置一,按键按下之后,不进行延时消抖再次判断,而是判断标志位是否为1,如果是1,就说明在你按下之前按键是松开的,将标志位清零,执行一下所要执行的操作,下面就算你按键是一直按着不松开的,因为标志位是0,他也不会再次执行所要执行的操作了,只有当按键松开之后将标志位置一。*/voidkeyscan() //按键扫描{ if(!key1) //按键按下 { if(key1_flag)//按键标志为为1 { key1_flag=0; if(temp_h<255)temp_h++; } if(sec==0) //当这个数据为0的时候说明按键一直处于按下的状态,也就是按键长按的效果 { key1_flag=0; if(temp_h<255)temp_h++; } memory_flag=1; //执行按键操作之后将数据写到存储部分 } else { key1_flag=1;//按键没有按下的时候这个数据是2S sec=2; } if(!key2) { if(key2_flag) { key2_flag=0; if(temp_h>0)temp_h--; } if(sec1==0) { key2_flag=0; if(temp_h>0)temp_h--; } memory_flag=1; } else { key2_flag=1; sec1=2; }}voidTimer2_Uart(){ T2CON=0x34; RCAP2H=0xFF; RCAP2L=0xDC; TH2=0xFF; TL2=0xDC; TR2=1; SCON=0x50; ES=1; EA=1;}voidUart1Data(unsignedchardat)//发送一个字节{ SBUF=dat; while(!TI); TI=0;}voidUartData_Byte(char*s)//发送一串数据{while(*s!='\0'){Uart1Data(*s++);}}voidGSM_Init2(){unsignedcharG_Tab[20]=0;if(Quest_flag==1)//开始查询GSM状态//此时还没有初始化完成,首先,先初始化,发AT,能够响应上,关回显,设置短信处理方式 { switch(GSM_Num) { case0:UartData_Byte("AT\r\n");break;//AT case1:UartData_Byte("ATE1\r\n");break;//关回显 case2:UartData_Byte("AT+CNMI=3,2,2,0,1\r\n");break;//设置 case3:UartData_Byte("AT+CMGF=1\r\n");break;//配制 case4:UartData_Byte("AT+COPS?\r\n");break;//查询网络 case5:Quest_flag=0;GSM_Num=0;GSM_Send=0;GSM_Send_Num=0;break;//初始化彻底结束 } GSM_Send_Time=30; } else { GSM_Send_Time=20; if(GSM_Send==1)//发送短信标志 { if(GSM_Send_Num==0)//Num是短信编号,就是发送哪条短信,这个是返回SetEnd的 { switch(GSM_Num) { case0:UartData_Byte("AT+CMGF=1\r\n");break; case1:UartData_Byte("AT+CMGS=\""); Uart1Data(phone[0]); Uart1Data(phone[1]); Uart1Data(phone[2]); Uart1Data(phone[3]); Uart1Data(phone[4]); Uart1Data(phone[5]); Uart1Data(phone[6]); Uart1Data(phone[7]); Uart1Data(phone[8]); Uart1Data(phone[9]); Uart1Data(phone[10]); UartData_Byte("\"\r\n");break;//AT+CMGS= case2:UartData_Byte("SetEnd");GSM_Num=3;break; case3:G_Tab[0]=0x1a; Uart1Data(G_Tab[0]);break; case4:GSM_Num=0;GSM_Send=0;break; } } elseif(GSM_Send_Num==1) { switch(GSM_Num) { case0:UartData_Byte("AT+CMGF=0\r\n");break; case1:UartData_Byte("AT+CMGS=41\r\n");break; case2:UartData_Byte("0011000D9168");G_Tab[0]=phone[1]; G_Tab[1]=phone[0]; G_Tab[2]=phone[3]; G_Tab[3]=phone[2]; G_Tab[4]=phone[5]; G_Tab[5]=phone[4]; G_Tab[6]=phone[7]; G_Tab[7]=phone[6]; G_Tab[8]=phone[9]; G_Tab[9]=phone[8]; G_Tab[10]='F'; G_Tab[11]=phone[10]; UartData_Byte(G_Tab); UartData_Byte("0008A91A");//末尾两位数是发送的短信长度,每个汉字占两个字节(18个字节转16进制为12)UartData_Byte("67095BB36C144F536D535EA68FC79AD8FF0C8BF76CE8610FFF01");//有害气体浓度过高,请注意!GSM_Num=3; break; case3:G_Tab[0]=0x1a; Uart1Data(G_Tab[0]);break; case4: UartData_Byte("AT+CMGF=1\r\n"); delay(666);delay(666); GSM_Send=0; GSM_Num=0; break; } } } elseGSM_Num=0; }}voidSend_message(){ if(Send_flag==1)//短信发送的标志位为1 { if(GSM_Send==0&&GSM_Num==0)//在绑定手机的状态下触发报警会导致发送绑定成功的 { //短信会被覆盖,为了避免这种情况,在没有发送短信的状态下才开始执行报警短信的发送 GSM_Send=1; //打开短信发送的开关 GSM_Send_Num=1; //确定短信发送的内容 Send_flag=0; } }}voidpolice() //超限报警{ if(temp>=temp_h) { if(s0) beep=0; elsebeep=1; Fan=0; if(flag)//短信的标志位 { flag=0; //保证在报警状态下短信只发送一条 Send_flag=1;//短信发送的标志位 } LED0=0; LED1=1; } else { beep=1; Fan=1; flag=1; LED0=1; LED1=0; }}voidmain() //主函数{ ucharnum=0; temp_h=20; //上限赋初值 LCD1602_cls(); //液晶1602初始化 timer_init(); //定时器初始化 Timer2_Uart(); read_memory(); //读存储数据 num=0; while(1) { if(num<80) { Value+=A_D();//将得到的AD值进行累加 num++; } else { num=0; temp=temp*0.5+(Value/80)*0.5;//累加之后的AD值在经过均值处理会得到一个更稳定的数据 //这里是处理AD的得到的浓度值,将已经测得的浓度值和新取得的 //浓度值各取百分之50都是为了保证数据的稳定性 Value=0; } memory(); display(); police(); Send_message(); if(GSM_Send_Time==0)GSM_Init2(); }}voidtimer()interrupt1{ TH0=0x3c;//定时器定时50ms TL0=0XB0; ms++; if(GSM_Send_Time!=0)GSM_Send_Time--; keyscan(); if(ms%10==0)//每500ms执行一次 { s0=~s0; } if(ms%20==0)//每秒执行一次 { if(sec!=0)sec--;//数据每秒减一 if(sec1!=0)sec1--; }}voidUart1()interrupt4{uchari=0;if(RI){ RI=0; Uart1_Buff[Uart1_Count]=SBUF; Uart1_Count=(Uart1_Count+1)%50; Uart1_Buff[Uart1_Count]=0; if(Quest_flag==1)//说明此时在初始化 { if(GSM_Num==0||GSM_Num==1||GSM_Num==2||GSM_Num==3)//这里都是返回的OK { if(Uart1_Count>=4&&Uart1_Buff[Uart1_Count-1]=='\n'&&Uart1_Buff[Uart1_Count-2]=='\r'&&Uart1_Buff[Uart1_Count-3]=='K'&&Uart1_Buff[Uart1_Count-4]=='O') { GSM_Num++; GSM_Send_Time=10; } } elseif(GSM_Num==4)//+COPS:0,0,"CHINAMOBILE" {// if(Uart1_Count>=25&&Uart1_Buff[Uart1_Count-1]=='\n'&&Uart1_Buff[Uart1_Count-2]=='\r'&&Uart1_Buff[Uart1_Count-3]=='"'&&Uart1_Buff[Uart1_Count-4]=='E'&&Uart1_Buff[Uart1_Count-11]=='A') if(Uart1_Count>=4&&Uart1_Buff[Uart1_Count-1]=='\n'&&Uart1_Buff[Uart1_Count-2]=='\r'&&Uart1_Buff[Uart1_Count-3]=='K'&&Uart1_Buff[Uart1_Count-4]=='O') { GSM_Num++; GSM_Send_Time=10; } } } else {
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 44726-2024科技评估人员能力评价规范
- GB/T 44810.3-2024IPv6 网络安全设备技术要求第3部分:入侵防御系统(IPS)
- 2024年度电气设备维护与保养服务合同3篇
- 2024年度物流与供应链管理合同
- 2024年度广告发布合同:品牌宣传与推广服务2篇
- 《vr太阳光设定基础》课件
- 2024年度供应链管理系统开发合同5篇
- 2024年度企业资产转让合同(含市场准入)
- 2024年度大连龙门吊安全检测与维修服务合同
- 2024年度旅游服务合同导游安排与责任
- 便携式气体检测仪使用方法(课堂PPT)
- 高中论文从建构理论看高中化学CAI软件的课题选择
- 安全文明施工设施配置清单
- 圆的旋转问题
- 小学生升学择校个人简历模板
- 幼儿园教研主题30篇
- 十三辙《韵辙表》——合辙押韵必备正式版
- 应用随机过程PPT课件
- 初中美术课说课稿(课堂PPT)
- YY∕T 0106-2021 医用诊断X射线机通用技术条件
- intouch关系数据库-ODBC配置实例教程
评论
0/150
提交评论