基于单片机的室内环境检测仪的设计_第1页
基于单片机的室内环境检测仪的设计_第2页
基于单片机的室内环境检测仪的设计_第3页
基于单片机的室内环境检测仪的设计_第4页
基于单片机的室内环境检测仪的设计_第5页
已阅读5页,还剩73页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

题目:基于单片机的室内环境检测仪的设计[1][14]。图3-17按键电路设计3.7报警模块报警模块电路设计如下图2-18所示,在本设计中,通电发光二极管就开始发光,而蜂鸣器是在温湿度、PM2.5任意一项超限后开始报警。将P2.6作为整个报警电路的输出口,当报警信号出现时,蜂鸣器鸣叫,当参数回落至设置的值之后,报警停止。如果能配合智能家居一起使用,可达到无人操作实现环境调节的效果,一起使用可以大大改善环境质量带来的困扰。图3-18报警模块电路设计3.8系统硬件电路图通过对前面几个单元的整理组合,可以得到这个完整的系统硬件电路图,该系统在硬件上能够完全满足设计要求,接下来要做的就是将硬件与软件设计进行完美融合,最终实现设计要求的所有功能。系统硬件电路图如图3-19所示:图3-19系统硬件电路图第4章软件设计4.1软件系统设计主程序自检初始化温湿度采集及处理PM2.5采集及处理报警子程序显示子程序按键子程序系统时间子程序本次设计的软件部分编程采用c语言完成。整体结构呈模块化。分别由主程序、自检程序、DHT22的数据收集及处理、PM2.5数据采集及处理、系统时间程序、报警程序以及显示程序等几个部分组成主程序自检初始化温湿度采集及处理PM2.5采集及处理报警子程序显示子程序按键子程序系统时间子程序图4-1程序模块化结构各程序之间的协调合作和控制是由主程序进行控制完成的。自检初始化程序对按键子程序、显示子程序、报警子程序、系统时间子程序、PM2.5、温湿度传感器程序的工作状态进行自检。数据采集程序主要完成对环境温湿度、PM2.5浓度的数据采集,系统每4秒调用程序对PM2.5进行一次信号采集。报警子程序完成对温湿度、PM2.5浓度超出设定的上限值时的报警功能,在温湿度以及PM2.5浓度恢复正常时,取消报警,此报警程序在任意一项参数超限时都会报警。系统时间子程序将DS1302时钟芯片的信号送到单片机,信号经过处理后再送往显示屏,完成对系统时间的准确显示。显示程序是根据送来的处理过的数据结果,将系统时间、温湿度、PM2.5浓度和位置代码分别送到它们相应的显示位置进行循环显示。按键子程序,根据高低电平的变化触发温湿度、PM2.5上限数值的改变,以此来设置他们报警上限值,同时按钮也具有对系统时间进行改变调节的作用。4.2主程序设计按键处理开始按键处理开始系统初始化有键按下?定时中断时间到?NPM2.5检测程序DHT22温湿度读取子程序报警判断LCD显示YZPH01忙?NYNYDS1302万年历图4-2主程序流程图4.3LCD12864显示模块设计开始检测LCD是开始检测LCD是否忙写命令写数据读取数据设置坐标进行显示返回图4-3显示程序流程图4.4DHT22温湿度传感器程序设计给DHT22上电延时给DHT22上电延时保持高电平检测记录信号输出低电平延时输出高电平数据输出结束信号图4-4温湿度测量程序流程图4.5DS1302万年历程序设计开始变量初始化关闭DS1302写保护复位关闭DS1302地址写入延时开始变量初始化关闭DS1302写保护复位关闭DS1302地址写入延时向该地址写入数据地址增加数据写完否?复位关闭写入DS1302地址延时读地址的数据读出地址增加数据读完否?显示数据NYNY图4-5DS1302万年历程序流程图第5章系统测试本文前面已经阐述了系统的基本工作原理以及软硬件设计,在基本理论完成的基础上进行测试,分模块单独进行测试,最后形成一个完整的系统。由于在进行测试的过程中没有留下图片,这里仅对功能进行一个展示。5.1显示界面此界面能显示包括温湿度、PM2.5浓度、系统时间等所有参数,显示情况如图5-1所示:图5-1显示界面5.2万年历设置界面通过按键跳转此界面时,能通过按键对系统时间进行修改,修改完成后能在主页面进行显示,修改显示界面如图5-2所示:图5-2万年历设置界面5.3温湿度及PM2.5上限报警设置界面(1)同样通过按钮跳转到此界面后,可以通过按钮对要设置的参数设置一个上限报警值,当环境参数超过预设的参数值时,系统进行报警提醒,温度上限值设置显示情况如图5-3所示:图5-3温度上限设置界面(2)湿度上限值设置界面,能对湿度的上限值进行设置,当环境湿度超过预设值时,系统报警。湿度上限值设置页面如图5-4所示:图5-4湿度上限设置界面(3)PM2.5浓度上限值设置界面,能对PM2.5浓度的上限值进行设置,当环境的PM2.5浓度超过预设值时,系统报警。PM2.5浓度上限值设置页面如图5-5所示:图5-5PM2.5上限设置界面第6章结论在本设计中,设计具有模块化、层次化的特点。本次设计的产品本身具有的特点,能够迅速全面、准确的获取PM2.5、环境温湿度等各种环境参数,并完成相应参数以及系统时间的实时显示,显示屏可以获得相关示数,以便使用者可以进行查阅以及调试,就可以根据参数及时调节室内环境,以获得最舒适的生活状态,同时又满足了系统检测的要求。本产品具有显示PM2.5浓度、温湿度系数、系统时间等功能,其具备的功能可以对环境质量进行全面的监控,在有参数超限时进行报警,依照报警的目标对环境进行改变就可以达到及时发现问题并及时改变的效果。不仅可以对人体健康生活产生良好影响,同时对灾难事故的排除也有积极作用。由于时间限制,本产品的功能还不够齐备,还有进一步改进的空间,比如电路设计还可以进一步简化;系统对于环境的检测程序也可以进一步加强,系统目前对于环境参数只具有信息采集、显示、实时报警的功能,只是对于数据进行了一个基本的处理。在这个基础上,本产品还可以增添环境诊断、环境处理等功能,同时还可以将信息推送至使用者的移动设备中,甚至可与智能家具协调合作,互相配合,完成家居环境的自动化调节,让生活环境随时都处于最优状态。如此一来既有助于提高生活质量,节能减排。同时也让产品的使用真正做到了人性化智能化。通过对本次毕业设计的学习与制作,让本来没有学过单片机相关知识的我对于单片机有了长足的了解,对于PM2.5传感器、温湿度传感器、时钟芯片也是从零开始,知识也获得了巨大的提升。不仅如此,本次毕业设计让我在网上查阅资料的能力也发生了质的改变,不再仅仅局限于百度百科。在这个过程中通过对文献资料的查阅、通过对老师同学的不停追问,我的专业知识也有很大的提高。所以此次毕业设计不仅提高了我的理论知识,同时对于我的动手能力也很很大的好处,相信这些都将是我参加工作时非常珍贵的东西,将给予我巨大的帮助。参考文献幸联星.基于单片机的智能家居环境检测系统设计[J].电子技术与软件工程,2020,01:59-61.张恒.基于WIFI的室内环境检测系统设计[D].安徽,安徽科技大学,2019,05:1-78.胡晓芳.基于AVR单片机的室内环境检测系统[J].自动化技术与应用,2014,07:117-119+123.王猛;胡霞.基于单片机的室内防火和环境检测系统[P].安徽,安徽理工大学,2016,09:1-5.欧阳萱霖;郭志浩;王浩翔.基于STC89C54RD+的环境检测系统[J].电子世界,2017,09:191-192.王明霞;杨秀菊;罗刘敏.基于单片机的无线室内环境检测仪设计[J].电脑知识与技术,2018,11:269-270.LiTao,Zhenhuisun.DesigningWirelessTransmissionSystemsfortheDynamicInformationCommunicationofMarineVessels.[J].JournalofCoastalResearch,2018,01:156-162.WeiGuan,ChengWang;YiqiaoCai.Designandimplementationofwirelessmonitoringnetworkfortemperature-humiditymeasurement[J].JournalofAmbientIntelligenceandHumanizedComputing,2016,07:131-138.汤真福;潘运丹;王婷华.基于STM32单片机的环境监测仪的设计与研究[J].电气自动化,2019,01:85-87+98.蔡冬霞.基于单片机的环境检测仪[J].工矿自动化,2012,38(3):84-85.姚营营.基于MSP430单片机的环境监测仪设计[D].辽宁,大连交通大学,2010:1-86.郝光健.基于LabVIEW和单片机的室内环境监测预警系统的设计[D].山东,山东农业大学,2014:1-76.张玲玲.基于51单片机的LCD12864程序设计[J].中小企业管理与科技(中旬刊),2015,231-232.李精华;曹军.基于51单片机控制系统的软件延时程序的分析[J].桂林,桂林航天工业学院,2013,02:123-125.汪凌志.基于51单片机的时间温度显示系统探讨[J].湖北,湖北工程学院新技术学院,2015,10:11.

致谢首先,我要感谢对我帮助非常大的罗乐老师。从选题完成到中期检查,再到论文撰写,罗乐老师一直不予余力的帮助我完成本次设计。他平时工作非常繁忙,但在设计的每个阶段,只要我有疑惑的地方,老师都会悉心指导,使我能够在毫无基础的单片机项目中顺利完成每一阶段的任务。包括很多阶段我出现了很多问题,比如一起论文系统的任务提交总是存在问题,但是老师也是不厌其烦的一遍又一遍的给出修改意见,我对罗乐老师的感激之情溢于言表。其次,我要感谢我的指导老师柏淑红老师,尽管柏老师平日非常忙,常常无法顾及到我们的毕业设计具体做到了哪一步,但是柏老师也会在百忙之中抽出时间拜托其他老师对我的毕业设计进行指导。柏老师的对于工作的不懈态度也给了我强大的警醒,让我在以后的工作中有了学习的榜样。在本次毕业设计的研究进程中,两位老师非常关注我的进度,并根据我的进度以及基础及时做出知道,让我从迷茫中解脱出来。同时又打开我思路,尽心点拨。两位老师严谨而又温和态度让我如沐春风,不仅仅是授我以鱼,同时更是授我以渔,让我能坚持不懈的完成毕业设计,对我以后参加工作也会有着巨大的作用。两位老师严谨的按照手脑并用、学做合一的校训对我展开指导,以高度的敬业精神、诲人不倦的态度对我的精神产生了重要的影响。以深厚的文化底蕴、敏捷的思维、开阔的视野给与了我深深的启迪。在两位老师的领导下,我才逐渐对毕业设计有了思路,最终完成毕业设计的所有内容,在这个过程中也开阔了我的视野,坚定了我进取的心。最后,感谢在大学四年期间我的所有任课老师,感谢我身边所有曾或多或少给予了我帮助的同学们,没有这些老师同学的帮助我就不会有令人骄傲的今天。经过三个多月的努力奋斗,毕业设计终于接近了尾声。作为一个本科生,我在经验上的匮乏难免会使毕业设计存在这样那样的问题,也存在很多欠缺考虑的地方。但是也是我第一次完全独立的完成一个作品,其中存在的不足之处,请老师多多指正,相信经过老师们的点播,就算毕业以后参加工作了,我也能够独立的做好每一项工作。谢谢!附录系统主程序:/*************************************环境检测系统主要功能及硬件:1、功能:环境时钟的显示和调整,硬件:DS13022、功能:温度(单位℃)和湿度(单位H%)显示硬件:DHT223、功能:PM2.5(单位ug/m3)显示硬件:ZPH11串口屏幕:12864B(自带字库)*************************************/#include<reg51.h>#include<lcd12864.h>#include<ds1302.h>#include<add.h>voidshowtime();voidshowweek();voidshowweek1();voidshowTH();voidshowPM();voidUsartinit();unsignedcharRead_SensorData(void);unsignedcharRead_Sensor(void);voidDelay_N10us(unsignedchart);voidDelay_N1ms(unsignedintt);voidform1();voidform2();voiddata1();voidclearping();voidHgarden(intx);//空心圆voidSgarden(intx);//实心圆voidtimesetting(intx);/*******************************************界面文字显示********************************************///第1界面显示unsignedcharcodeCharCode[13]="0123456789.-:";unsignedcharcodeTemperature[]="温度:";unsignedcharcodeTsign[]="℃";unsignedcharcodeHumidity[]="湿度:";unsignedcharcodeHsign[]="RH";unsignedcharcodePM1[]="PM2.5:";unsignedcharcodeTPM1[]="ug/m3";//第2界面显示unsignedcharcodeyear1[]="年";unsignedcharcodemouth1[]="月";unsignedcharcodeday1[]="日";unsignedcharcodehour1[]="时";unsignedcharcodeminute1[]="分";unsignedcharcodesecond1[]="秒";unsignedcharcodeweek3[]="周";unsignedcharcodeweek1[]="星期";//清屏unsignedcharcodeclear[]="";unsignedcharcodeweek2_0[]="日";unsignedcharcodeweek2_1[]="一";unsignedcharcodeweek2_2[]="二";unsignedcharcodeweek2_3[]="三";unsignedcharcodeweek2_4[]="四";unsignedcharcodeweek2_5[]="五";unsignedcharcodeweek2_6[]="六";unsignedintflagkeyup_down=1;unsignedintpage=1;unsignedinti,j,m;unsignedintflag2,flag3;ucharUART_Upload[9];ucharUARTnum[11]={"0123456789."};ucharUARTdata[5];uintpm_rateH,pm_rateL,pm_particle,pm_density;//低脉冲率高位。低脉冲率低位,比率,颗粒,浓度ucharaccord,pm_URV=20,temp_pM;//PM_URVpm上限值ucharSensor_Data[5]={0x00,0x00,0x00,0x00,0x00};ucharSensor_AnswerFlag;//收到起始标志位ucharSensor_ErrorFlag;//读取传感器错误标志ucharSensor_Check; //校验和uintSys_CNT;uintTmp;uintt0;ucharnum;ucharflag;sbitSensor_SDA=P2^6;//温湿度传感器DHT22数据接入uchartimetest[7];/*******************************定义按键:modekey为功能选择按键/确定按键upkey为向上选择/增加按键dowmkey为向下选择/减少按键backkey为返回/取消按键*******************************/sbitmodekey=P1^6;sbitupkey=P1^5;sbitdownkey=P1^4;sbitbackkey=P1^3;/*****************************主函数main*****************************/voidmain(){LCD12864_Init(); //12864屏幕模块的初始化Usartinit(); //串口初始化form1(); //form1为主界面 read_init();while(1){data1(); //加载时钟、DHT22和ZPH01数据 if(modekey==0) //判断是否进入调整时间界面 { longtime=0; Delay_N1ms(5);//消抖处理,防止误判 //用时间的长短来判断 while(modekey==0) { time++; Delay_N1ms(1); if(time>1000)break; } if(time<1000&&time>10)//二次判断,确定按下 { for(i=0;i<8;i++) { timetest[i]=TIME[i];//截取当前时间放入第二界面,这样便于调整时钟 } form2(); //进入时间调整界面 } //增加的fun:warning else { form3(); } }} }/*************************************form1为第一界面即为开机时看到的界面,为了加快运行数度,减少不必要的重复将form1放在main函数主循环的前面*************************************/voidform1(){LCD12864_SetWindow(0,2); //位置坐标显示LCD12864_WriteData(year1[0]);//年LCD12864_WriteData(year1[1]);LCD12864_SetWindow(0,4); //星期for(i=0;i<4;i++) LCD12864_WriteData(week1[i]);LCD12864_SetWindow(1,1); //月LCD12864_WriteData(mouth1[0]);LCD12864_WriteData(mouth1[1]);LCD12864_SetWindow(1,3); //日LCD12864_WriteData(day1[0]);LCD12864_WriteData(day1[1]);LCD12864_SetWindow(1,7); //℃for(i=0;i<2;i++)LCD12864_WriteData(Tsign[i]);LCD12864_SetWindow(2,7); //H%for(i=0;i<2;i++)LCD12864_WriteData(Hsign[i]);LCD12864_SetWindow(3,0); //pm2.5for(i=0;i<6;i++)LCD12864_WriteData(PM1[i]);}/************************************form2为第二界面,即为时间调整界面当按下第一个建,即确定键的时候,进入该界面。************************************/voidform2(){clearping();//清屏函数flag2=1; //界面2标识循环判断,用于退出界面2/******************************本段代码用于显示时、分、秒、年、月、日、周******************************/LCD12864_SetWindow(0,1);for(i=0;i<2;i++)LCD12864_WriteData(hour1[i]);LCD12864_SetWindow(1,1); for(i=0;i<2;i++)LCD12864_WriteData(minute1[i]);LCD12864_SetWindow(2,1);for(i=0;i<2;i++)LCD12864_WriteData(second1[i]);LCD12864_SetWindow(3,1);for(i=0;i<2;i++)LCD12864_WriteData(week3[i]);LCD12864_SetWindow(0,5);for(i=0;i<2;i++)LCD12864_WriteData(year1[i]);LCD12864_SetWindow(1,5);for(i=0;i<2;i++)LCD12864_WriteData(mouth1[i]);LCD12864_SetWindow(2,5);for(i=0;i<2;i++)LCD12864_WriteData(day1[i]);LCD12864_SetWindow(3,5);LCD12864_WriteData(0xc8);LCD12864_WriteData(0xb7);LCD12864_WriteData(0xb6);LCD12864_WriteData(0xa8);/************************************本段代码用于显示进入时间调整界面时的当前时间显示************************************/LCD12864_SetWindow(0,6);//年LCD12864_WriteData(CharCode[timetest[6]/16]);LCD12864_WriteData(CharCode[(timetest[6]&0x0f)]);showweek1();//星期LCD12864_SetWindow(1,6);LCD12864_WriteData(CharCode[timetest[4]/16]); //月LCD12864_WriteData(CharCode[(timetest[4]&0x0f)]);LCD12864_SetWindow(2,6);LCD12864_WriteData(CharCode[timetest[3]/16]); //日LCD12864_WriteData(CharCode[(timetest[3]&0x0f)]);LCD12864_SetWindow(0,2);LCD12864_WriteData(CharCode[timetest[2]/16]); //小时LCD12864_WriteData(CharCode[(timetest[2]&0x0f)]);LCD12864_SetWindow(1,2);LCD12864_WriteData(CharCode[timetest[1]/16]); //分钟LCD12864_WriteData(CharCode[(timetest[1]&0x0f)]);LCD12864_SetWindow(2,2);LCD12864_WriteData(CharCode[timetest[0]/16]); //秒LCD12864_WriteData(CharCode[(timetest[0]&0x0f)]);/***********************************************分隔线此界面为长按设置之后进入的阈值调节界面***********************************************/LCD12864_SetWindow(0,3);LCD12864_WriteData(0xa3);LCD12864_WriteData(0xfc);LCD12864_SetWindow(1,3);LCD12864_WriteData(0xa3);LCD12864_WriteData(0xfc);LCD12864_SetWindow(2,3);LCD12864_WriteData(0xa3);LCD12864_WriteData(0xfc);LCD12864_SetWindow(3,3);LCD12864_WriteData(0xa3);LCD12864_WriteData(0xfc);//while(flag2)//在界面二中进入键盘扫描{Hgarden(flagkeyup_down); //显示按键指针,以便知道在什么位置/****向上************/if(upkey==0) { Delay_N1ms(5);if(upkey==0) { flagkeyup_down--; //按键指针向上运动 if(flagkeyup_down<1)//当按键指针运动到最上时不在运动 { flagkeyup_down=8; } Hgarden(flagkeyup_down); i=0; while((i<40)&&(upkey==0))//检测按键是否松开,如果按着不动,则400ms后自动跳出向下运行 { Delay_N1ms(10); i++; } }} /****向下************/if(downkey==0) { Delay_N1ms(5); if(downkey==0) { flagkeyup_down++; //按键指针向下运动 if(flagkeyup_down>8)//当按键指针运动到最下时不在运动 { flagkeyup_down=1; } Hgarden(flagkeyup_down); i=0; while((i<40)&&(downkey==0)) //检测按键是否松开 { Delay_N1ms(10); i++; } } } /****确定************/ if(modekey==0) //按下确定键后,可以进行时间的修改 { Delay_N1ms(10); if(modekey==0) { i=0; while((i<40)&&(modekey==0)) //检测按键是否松开 { Delay_N1ms(10); i++; } if(flagkeyup_down==8) { timetest[0]++; for(j=0;j<8;j++) TIME[j]=timetest[j]; Ds1302Init(); flag2=0; clearping();//清屏函数 form1(); } else { flag3=1; while(flag3) { Sgarden(flagkeyup_down);timesetting(flagkeyup_down); if(modekey==0) //按下确定键后,可以进行时间的修改 { Delay_N1ms(15); if(modekey==0) { flag3=0; while((i<40)&&(modekey==0)) //检测按键是否松开 { Delay_N1ms(10); i++; } } } } } } } /****返回************/if(backkey==0) //按下确定键后,可以进行时间的修改 { Delay_N1ms(10); if(backkey==0) { i=0; flag2=0; clearping();//清屏函数 form1(); while((i<50)&&(backkey==0)) //检测按键是否松开 { Delay_N1ms(10); i++; } } }}}voidtimesetting(intx){unsignedintd; unsignedintm1,m2,m3,m4,m5,m6,m7; /****加************/if(upkey==0) { Delay_N1ms(5);if(upkey==0) { if(x==1)//小时 { timetest[2]++; if((timetest[2]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[2]=timetest[2]+6; } if(timetest[2]>0x23) { timetest[2]=0; m1=1; } LCD12864_SetWindow(0,2);LCD12864_WriteData(CharCode[timetest[2]/16]); LCD12864_WriteData(CharCode[(timetest[2]&0x0f)]); } elseif(x==2)//分钟 { timetest[1]++; if((timetest[1]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[1]=timetest[1]+6; } if(timetest[1]>0x59) { timetest[1]=0; m2=1; } LCD12864_SetWindow(1,2);LCD12864_WriteData(CharCode[timetest[1]/16]); LCD12864_WriteData(CharCode[(timetest[1]&0x0f)]); } elseif(x==3)//秒 { timetest[0]++; if((timetest[0]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[0]=timetest[0]+6; } if(timetest[0]>0x59) { timetest[0]=0; m3=1; } LCD12864_SetWindow(2,2);LCD12864_WriteData(CharCode[timetest[0]/16]); LCD12864_WriteData(CharCode[(timetest[0]&0x0f)]); } elseif(x==4)//周 { timetest[5]++; if(timetest[5]>0x6) { timetest[5]=0; m4=1; } showweek1(); } elseif(x==5)//年 { timetest[6]++; if((timetest[6]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[6]=timetest[6]+6; } if(timetest[6]>0x90) { timetest[6]=0; m5=1; } LCD12864_SetWindow(0,6);LCD12864_WriteData(CharCode[timetest[6]/16]);LCD12864_WriteData(CharCode[(timetest[6]&0x0f)]); } elseif(x==6)//月 { timetest[4]++; if((timetest[4]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[4]=timetest[4]+6; } if(timetest[4]>0x12) { timetest[4]=0x01; m6=1; } LCD12864_SetWindow(1,6);LCD12864_WriteData(CharCode[timetest[4]/16]);LCD12864_WriteData(CharCode[(timetest[4]&0x0f)]); } elseif(x==7)//日 { if(timetest[4]==0x01||timetest[4]==0x03||timetest[4]==0x05||timetest[4]==0x07||timetest[4]==0x08||timetest[4]==0x10||timetest[4]==0x12) d=0x31; elseif(timetest[4]==0x04||timetest[4]==0x06||timetest[4]==0x09||timetest[4]==0x11) d=0x30; elseif((CharCode[timetest[6]/16]*10+CharCode[(timetest[6]&0x0f)])%4==0) d=0x29; else d=0x28; timetest[3]++; if((timetest[3]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[3]=timetest[3]+6; } if(timetest[3]>d) { timetest[3]=0; m7=1; } LCD12864_SetWindow(2,6);LCD12864_WriteData(CharCode[timetest[3]/16]);LCD12864_WriteData(CharCode[(timetest[3]&0x0f)]); } i=0; while((i<40)&&(upkey==0))//检测按键是否松开,如果按着不动,则400ms后自动跳出向下运行 { Delay_N1ms(10); i++; } }} /****减************/if(downkey==0) { Delay_N1ms(5); if(downkey==0) { if(x==1)//小时 { timetest[2]--; if((timetest[2]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[2]=timetest[2]-6; } if(m1==1) timetest[2]=0x23; if(timetest[2]==0x00) m1=1; elsem1=0; LCD12864_SetWindow(0,2);LCD12864_WriteData(CharCode[timetest[2]/16]); LCD12864_WriteData(CharCode[(timetest[2]&0x0f)]); } elseif(x==2)//分钟 { timetest[1]--; if((timetest[1]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[1]=timetest[1]-6; } if(m2==1) timetest[1]=0x59; if(timetest[1]==0x00) m2=1; elsem2=0; LCD12864_SetWindow(1,2);LCD12864_WriteData(CharCode[timetest[1]/16]); LCD12864_WriteData(CharCode[(timetest[1]&0x0f)]); } elseif(x==3)//秒 { timetest[0]--; if((timetest[0]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[0]=timetest[0]-6; } if(m3==1) timetest[0]=0x59; if(timetest[0]==0x00) m3=1; elsem3=0; LCD12864_SetWindow(2,2);LCD12864_WriteData(CharCode[timetest[0]/16]); LCD12864_WriteData(CharCode[(timetest[0]&0x0f)]); } elseif(x==4)//周 { timetest[5]--; if(m4==1) timetest[5]=0x06; if(timetest[5]==0x00) m4=1; elsem4=0; showweek1(); } elseif(x==5)//年 { timetest[6]--; if((timetest[6]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[6]=timetest[6]-6; } if(m5==1) timetest[6]=0x59; if(timetest[6]==0x00) m5=1; elsem5=0; LCD12864_SetWindow(0,6);LCD12864_WriteData(CharCode[timetest[6]/16]);LCD12864_WriteData(CharCode[(timetest[6]&0x0f)]); } elseif(x==6)//月 { timetest[4]--; if((timetest[4]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[4]=timetest[4]-6; } if(m6==1) timetest[4]=0x12; if(timetest[4]==0x00) m6=1; elsem6=0; LCD12864_SetWindow(1,6);LCD12864_WriteData(CharCode[timetest[4]/16]);LCD12864_WriteData(CharCode[(timetest[4]&0x0f)]); } elseif(x==7)//日 { if(timetest[4]==0x01||timetest[4]==0x03||timetest[4]==0x05||timetest[4]==0x07||timetest[4]==0x08||timetest[4]==0x10||timetest[4]==0x12) d=0x31; elseif(timetest[4]==0x04||timetest[4]==0x06||timetest[4]==0x09||timetest[4]==0x11) d=0x30; elseif((CharCode[timetest[6]/16]*10+CharCode[(timetest[6]&0x0f)])%4==0) d=0x29; else d=0x28; timetest[3]--; if((timetest[3]&0x0f)>9) //换成BCD码,跳过a-e段 { timetest[3]=timetest[3]-6; } if(m7==1) timetest[3]=d; if(timetest[3]==0x00) m7=1; elsem7=0; LCD12864_SetWindow(2,6);LCD12864_WriteData(CharCode[timetest[3]/16]);LCD12864_WriteData(CharCode[(timetest[3]&0x0f)]); } i=0; while((i<40)&&(downkey==0)) //检测按键是否松开 { Delay_N1ms(10); i++; } } }}/*阈值调节*/voidHgarden(intx){if(x==1) { LCD12864_SetWindow(3,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(0,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0); LCD12864_SetWindow(1,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==2) { LCD12864_SetWindow(0,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(1,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0);LCD12864_SetWindow(2,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==3) { LCD12864_SetWindow(1,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(2,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0);LCD12864_SetWindow(3,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==4) { LCD12864_SetWindow(2,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(3,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0);LCD12864_SetWindow(0,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==5) { LCD12864_SetWindow(3,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(0,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0);LCD12864_SetWindow(1,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==6) { LCD12864_SetWindow(0,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(1,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0);LCD12864_SetWindow(2,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==7) { LCD12864_SetWindow(1,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(2,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0);LCD12864_SetWindow(3,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); } elseif(x==8) { LCD12864_SetWindow(0,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(2,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xa0); LCD12864_SetWindow(3,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf0); } }voidSgarden(intx){if(x==1) { LCD12864_SetWindow(0,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==2) { LCD12864_SetWindow(1,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==3) { LCD12864_SetWindow(2,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==4) { LCD12864_SetWindow(3,0); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==5) { LCD12864_SetWindow(0,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==6) { LCD12864_SetWindow(1,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==7) { LCD12864_SetWindow(2,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); } elseif(x==8) { LCD12864_SetWindow(3,4); LCD12864_WriteData(0xa1); LCD12864_WriteData(0xf1); }}voiddata1(){showtime();showTH();showPM(); clock_h_l( (int)((Sensor_Data[2]*256+Sensor_Data[3])/10), (int)((Sensor_Data[0]*256+Sensor_Data[1])/10), (int)(pm_density) );}voidshowtime(){Ds1302ReadTime();LCD12864_SetWindow(0,0);LCD12864_WriteData(CharCode[2]);LCD12864_WriteData(CharCode[0]); //年LCD12864_WriteData(CharCode[TIME[6]/16]);LCD12864_WriteData(CharCode[(TIME[6]&0x0f)]);showweek();//星期LCD12864_SetWindow(1,0);LCD12864_WriteData(CharCode[TIME[4]/16]); //月LCD12864_WriteData(CharCode[(TIME[4]&0x0f)]);LCD12864_SetWindow(1,2);LCD12864_WriteData(CharCode[TIME[3]/16]); //日LCD12864_WriteData(CharCode[(TIME[3]&0x0f)]);LCD12864_SetWindow(2,0);LCD12864_WriteData(CharCode[TIME[2]/16]); //小时LCD12864_WriteData(CharCode[(TIME[2]&0x0f)]);LCD12864_WriteData(CharCode[12]);LCD12864_WriteData(CharCode[TIME[1]/16]); //分钟LCD12864_WriteData(CharCode[(TIME[1]&0x0f)]);LCD12864_WriteData(CharCode[12]);LCD12864_WriteData(CharCode[TIME[0]/16]); //秒LCD12864_WriteData(CharCode[(TIME[0]&0x0f)]);}voidshowweek() //周{uintwek; wek=CharCode[(TIME[5]&0x0f)];LCD12864_SetWindow(0,6);if(wek=='0')for(i=0;i<2;i++)LCD12864_WriteData(week2_0[i]);elseif(wek=='1')for(i=0;i<2;i++)LCD12864_WriteData(week2_1[i]); elseif(wek=='2')for(i=0;i<2;i++)LCD12864_WriteData(week2_2[i]);elseif(wek=='3'){LCD12864_WriteData(0xc8);LCD12864_WriteData(0xfd);}elseif(wek=='4')for(i=0;i<2;i++)LCD12864_WriteData(week2_4[i]);elseif(wek=='5')for(i=0;i<2;i++)LCD12864_WriteData(week2_5[i]);elseif(wek=='6')for(i=0;i<2;i++)LCD12864_WriteData(week2_6[i]);else; }voidshowweek1() //周{uintwek; wek=CharCode[(timetest[5]&0x0f)];LCD12864_SetWindow(3,2);if(wek=='0')for(i=0;i<2;i++)LCD12864_WriteData(week2_0[i]);elseif(wek=='1')for(i=0;i<2;i++)LCD12864_WriteData(week2_1[i]); elseif(wek=='2')for(i=0;i<2;i++)LCD12864_WriteData(week2_2[i]);elseif(wek=='3'){LCD12864_WriteData(0xc8);LCD12864_WriteData(0xfd);}elseif(wek=='4')for(i=0;i<2;i++)LCD12864_WriteData(week2_4[i]);elseif(wek=='5')for(i=0;i<2;i++)LCD12864_WriteData(week2_5[i]);elseif(wek=='6')for(i=0;i<2;i++)LCD12864_WriteData(week2_6[i]);else; }voidshowTH(){Read_Sensor();Tmp=Sensor_Data[2]*256+Sensor_Data[3];LCD12864_SetWindow(1,5);LCD12864_WriteData(CharCode[Tmp/100%10]);LCD12864_WriteData(CharCode[Tmp/10%10]);LCD12864_WriteData(CharCode[10]);LCD12864_WriteData(CharCode[Tmp%10]);Tmp=Sensor_Data[0]*256+Sensor_Data[1];LCD12864_SetWindow(2,5);LCD12864_WriteData(CharCode[Tmp/100%10]);LCD12864_WriteData(CharCode[Tmp/10%10]);LCD12864_WriteData(CharCode[10]);LCD12864_WriteData(CharCode[Tmp%10]);}unsignedcharRead_SensorData(void){ unsignedchari,cnt; unsignedcharbuffer,tmp; buffer=0; for(i=0;i<8;i++) { cnt=0; while(!Sensor_SDA) //检测上次低电平是否结束 { if(++cnt>=300) { break; } } //延时Min=26usMax50us跳过数据"0"的高电平 Delay_N10us(4); //延时30us //判断传感器发送数据位 tmp=0; if(Sensor_SDA) { tmp=1; } cnt=0; while(Sensor_SDA) //等待高电平结束 { if(++cnt>=200) { break; } } buffer<<=1; buffer|=tmp; } returnbuffer;}/********************************************\|*功能:读传感器 *|\********************************************/unsignedcharRead_Sensor(void){ unsignedchari; //主机拉低(Min=800USMax=20Ms)Sensor_SDA=0; Delay_N1ms(10);//延时2Ms //释放总线延时(Min=30usMax=50us) Sensor_SDA=1; Delay_N10us(4);//延时30us //主机设为输入判断传感器响应信号 Sensor_SDA=1; Sensor_AnswerFlag=0;//传感器响应标志 //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行 if(Sensor_SDA==0) { Sensor_AnswerFlag=1;//收到起始信号 Sys_CNT=0; //判断从机是否发出80us的低电平响应信号是否结束 while((!Sensor_SDA)) { if(++Sys_CNT>300)//防止进入死循环 { Sensor_ErrorFlag=1; return0; } } Sys_CNT=0; //判断从机是否发出80us的高电平,如发出则进入数据接收状态 while((Sensor_SDA)) { if(++Sys_CNT>300)//防止进入死循环 { Sensor_ErrorFlag=1; return0; } } //数据接收 传感器共发送40位数据 //即5个字节高位先送5个字节分别为湿度高位湿度低位温度高位温度低位校验和 //校验和为:湿度高位+湿度低位+温度高位+温度低位 for(i=0;i<5;i++) { Sensor_Data[i]=Read_SensorData(); } } else { Sensor_AnswerFlag=0; //未收到传感器响应 } return1;}voidshowPM(){LCD12864_SetWindow(3,3); LCD12864_WriteData(UARTdata[0]); LCD12864_WriteData(UARTdata[1]); LCD12864_WriteData(UARTdata[2]); LCD12864_WriteData(UARTdata[3]); for(i=0;i<5;i++)LCD12864_WriteData(TPM1[i]);}voidUsartinit(){SCON=0x50;//SCON:方式1,8-bitUARTTMOD=0x20;//TMOD:timer1,方式2,8-bit自动重装PCON=0x00;//SMOD=1;串口波特率加倍TH1=0xfd; // TL1=0xfd;//波特率:960011.0592MHzTR1=1;//开定时器1TI=0; RI=0; EA=1;// //开总中断 ES=1;//串行口中断开}voidUsart()interrupt4{if(RI==1) {RI=0;//清除接收中断标志位 UART_Upload[accord]=SBUF;//串口接收一个数据 accord++; if(accord>8) //九个数据为一组 { accord=0; } if(accord==0) //接收一组数据后进行一次校验和 { //校验7为数据位的和取反加一等于校验值 temp_pM=~(UART_Upload[1]+UART_Upload[2]+UART_Upload[3]+UART_Upload[4]+UART_Upload[5]+UART_Upload[6]+UART_Upload[7])+1; //校验和 if(temp_pM=UART_Upload[8]) { pm_rateH=UART_Upload[3]; pm_rateL=UART_Upload[4]; pm_density=(pm_rateH*100+pm_rateL)*5;//颗粒数数据处理 UARTdata[0]=UARTnum[pm_density/1000]; UARTdata[1]=UARTnum[pm_density%1000/100]; UARTdata[2]=UARTnum[pm_density%100/10]; UARTdata[3]=UARTnum[pm_density%10]; } }}}/*清屏*/voidclearping(){LCD1286

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论