实用智能窗帘控制器的设计-本科毕业设计_第1页
实用智能窗帘控制器的设计-本科毕业设计_第2页
实用智能窗帘控制器的设计-本科毕业设计_第3页
实用智能窗帘控制器的设计-本科毕业设计_第4页
实用智能窗帘控制器的设计-本科毕业设计_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

工作在手动模式工作在手动模式是否按下打开否是电动机正转否是是否按下停止是否按下关闭否是完全打开是电动机反转否是是否按下停止是完全打开否否否否否否图4.3手动模式工作流程图4.2BH1750FVI数字型光强度值读取主要程序写好BH1750FVI的初始化程序后,主要通过Single_Read_BH1750(ucharREG_Address)和voidMultiple_read_BH1750(void)子程序读取光线强度数据。ucharSingle_Read_BH1750(ucharREG_Address)////单字节读取//{ucharREG_data;BH1750_Start();//起始信号//BH1750_SendByte(SlaveAddress);//发送设备地址加写信号//BH1750_SendByte(REG_Address);//发送存储单元地址,从最开始的单元开始// BH1750_Start();BH1750_SendByte(SlaveAddress+1);//发送设备地址加读信号//REG_data=BH1750_RecvByte();//读出寄存器数据// BH1750_SendACK(1); BH1750_Stop();//信号停止//returnREG_data;}voidMultiple_read_BH1750(void)///连续读出BH1750内部数据{uchari; BH1750_Start();///起始信号//BH1750_SendByte(SlaveAddress+1);///发送设备地址加读信号// for(i=0;i<3;i++){BUF[i]=BH1750_RecvByte();if(i==3){BH1750_SendACK(1);//还回NOACK//}else{ BH1750_SendACK(0);//回应ACK//}}BH1750_Stop();////停止信号//Delay5ms();}4.3红外遥控解码程序及工作程序以下是红外遥控数值键解码的工作程序,例如数字0x16为按键0的操作,flag_num为光标的标记,在设置时光标起指示移动之用。voidir_display() {ucharbuf,i;disp[4]=ircode[2];//数字键的数据码从0到9和加减if(disp[4]==0x16||disp[4]==0x18||disp[4]==0x0c||disp[4]==0x5a||disp[4]==0x52||disp[4]==0x42 ||disp[4]==0x5e||disp[4]==0x1c||disp[4]==0x08 ||disp[4]==0x4a) { switch(disp[4]) { case0x16:buf=0;flag_num++;break; case0x0c:buf=1;flag_num++;break; case0x18:buf=2;flag_num++;break; …… } disp[4]=0;//接受下一次做好准备// if(flag_num==1) sum=buf; if(flag_num>2) {flag_num=0; sum=sum*10+buf; } for(i=0;i<4;i++) //关闭接收防止进入死循环// ircode[i]=0; }}gkey()为除数字键咦外的功能键程序。voidgkey(){uchari;receive();disp[4]=ircode[2];if(disp[4]==0x45||disp[4]==0x47||disp[4]==0x46||disp[4]==0x46||disp[4]==0x44||disp[4]==0x43) {switch(disp[4]) {case0x45:kai=1;guan=0;break;//打开// case0x47:kai=0;guan=1;break;//关闭// case0x46:kai=0;guan=0;break;//停止// case0x44:zidong++;break; //手动自动切换// case0x43:wangnianli++;break;//查看万年历// } if(zidong>1) zidong=0; if(wangnianli>1) wangnianli=0; for(i=0;i<4;i++) //关闭接收防止进入死循环// ircode[i]=0; }} 4.4温湿度传感器工作程序voidread_init(){DHT=0; //使DHT11低电平并延时至少18ms// delay_ms(21); DHT=1; //置DHT11高电平20~40us,并等待从机相应// delay_10us(); …… DHT=1; if(!DHT)//从机发出响应信号// {flag=2; while((!DHT)&&flag++);//等待从机发高电平结束// flag=2; while(DHT&&flag++); //开始采集数据// tr_shiZ=read_datadht();//采集湿度整数部分// tr_shiX=read_datadht();//采集湿度小数部分// tr_wenZ=read_datadht();//采集温度整数部分// tr_wenX=read_datadht();//采集温度小数部分// check=read_datadht(); //采集校验位// } DHT=0; delay(20);//采集完数据后// }charread_datadht(){ uchari,num,tempp; num=0; for(i=0;i<8;i++) {flag=2; while((!DHT)&&flag++);//等待50毫秒低电平// delay_10us();//延时判断0还是1// …… if(DHT==1) {tempp=1; flag=2; while(DHT&&flag++); } else tempp=0; num<<=1; num|=tempp; } return(num);}湿度(shiZ)的值和预设定值shidu[0]进行比较,如果在设定的早晚时间之间,当shiZ大于shidu[0]就执行打开窗帘通风。4.5早晚定时开窗主要程序在早晚定时的程序中,如果当前时间不在早晚定时之间,dayflag为0,如果当前时间在早晚定时之间,dayflag为1。程序段为:read_init();//读传感器数据//read_time();//读时间子程序//if((am[0]*10000+am[1]*10)<(shi*10000+fen*10)<(pm[0]*10000+pm[1])*10)dayflag=1;elsedayflag=0;利用dayflag就可以控制while里的程序。while((temp>(SET_guangqiang+20)||(dayflag==0))&&(closeall==0)&&zidong){…...}4.6电动机模块以打开窗帘为例,程序段为:dakai(){inti,j;for(i=0;i<16;i++) for(j=0;j<8;j++) { {P1=(P1&0x0f)|(0xf0&); DelayMS(1); } } …… }其中因为P1的低字节已作为按键使用,所以P1=(P1&0x0f)|(0xf0&FFW[j]使得P1的高字节(FFW[j]的值依j的变化次循环)在不影响P1低字节变化的情况下,去驱动步进电机。同理可以完成关闭窗帘的函数程序guanbi()。4.7红外对管程序控制定义2个全局变量openall(完全打开)、closeall(完全关闭),信号分别从引脚是P1.0和P1.1输入。如果窗帘已完全关闭,则closeall为高电平;如果窗帘已完全打开,则closeall为低电平。例如:intopenall,closeall;while((temp>(SET_guangqiang+20)||(dayflag==0))&&(closeall==0)&&zidong){……}while(((temp<(SET_guangqiang.20)||shiZ>shidu[0])&&(dayflag==1))&&(openall==1)&&zidong){……}只有closeall为低电平才能执行第一个while循环体内容(关闭操作),只有openall为高电平才能执行第一个while循环体内容(打开操作)。4.8系统主程序voidmain(){uintSET_guangqiang;uchari,j;while(1){floattempp; delay_ms(200); //延时200ms lcd_init();//初始化LCD Init_BH1750();//初始化BH1750 timer0init(); int0init();while(1){if(k4flag==1)//如果按下k4即设置键,进入调整时间 {lcd_wcmd(0x80); xianshi("智能窗帘时钟"); lcd_wcmd(0x91); xianshi("20年月日"); lcd_wcmd(0x8A); xianshi("星期"); lcd_wcmd(0x9a); xianshi("00:00:00"); while(k4flag==1) {if(k1==0) { read_time();//读时间子程序 dingwei(); } keyscan(); //设置退出 if(key4==0) {k4flag=0; } } if(key4==0) {k4flag=0; break; } } if(k4flag==0) {read_init();//读传感器数据 read_time();//读时间子程序 //if((am[0]*10000+am[1]*10)<(shi*10000+fen*10)<(pm[0]*10000+pm[1])*10) if((am[0]*10000+am[1]*10)<(shi*10000+fen*10)<(pm[0]*10000+pm[1])*10) dayflag=1; elsedayflag=0; keyscan(); if(key4==0) {k4flag=1; break; } gkey(); if(wangnianli) {cwannianli();//查看万年历 } lcd_wcmd(0x80); xianshi("::"); receive(); if(ircode[2]==0x0d)//光线强度/湿度/早晚开关时间设置 {set(); } SET_guangqiang=guangqiang[0]*100+guangqiang[1]; tempp=tr_shiZ+tr_shiX+tr_wenZ+tr_wenX; if(check==tempp) { shiZ=tr_shiZ; str2[0]=shiZ/10+0x30; str2[1]=shiZ%10+0x30; } k(); while((temp>(SET_guangqiang+20)||(dayflag==0))&&(closeall==0)&&zidong) {guanbi();//晚上(设定值)或者光线小于设定值关闭窗帘 } while(((temp<(SET_guangqiang.20)||shiZ>shidu[0])&&(dayflag==1))&&(openall==1)&&zidong) {dakai();//早上(设定值)或者光线大于设定值打开窗帘 } while(zidong==0&&(kai==1||guan==1))//手动 { gkey(); while(zidong==0&&kai==1&&openall==1)//手动下打开 {gkey(); dakai(); } if(openall==0) break; while(zidong==0&&guan==1&&closeall==0)//手动下关闭 {gkey(); guanbi(); } if(closeall==1) break; } }}} }4.9小结本设计的模块较多,要完成整体设计,必须模块化设计。在开始,写一个简单的液晶12864的程序调试,因为利用它可以调试并显示其他模块的工作情况并显示出来。首先,进行显示界面的规划、进行红外遥控解码、功能键等程序的编写,编写好DS1302的工作程序。然后,进行光线强度传感器、湿度传感器、红外对管程序的设计。最后,把各个模块程序加入的主程序中完成整体程序的设计。5系统调试5.1各模块调试5.1.1电机模块调试电动机模块P1=(P1&0x0f)|(0xf0&FFW[j]使得P1的高字节(FFW[j]的值依j的变化次循环)在不影响P1低字节的变化,去驱动步进电机。调节延时函数即控制电动机转速。FFW数组的值为{0x1f,0x3f,0x2f,0x6f,0x4f,0xcf,0x8f,0x9f},这样满足电动机正转。同理同理可以利用REV数组的值为{0x9f,0x8f,0xcf,0x4f,0x6f,0x2f,0x3f,0x1f}完成电动机反转。5.1.2时钟模块调试经过24小时过5秒的走时,测出和网络时间吻合,如图5.1时钟电路和程序正常。测试前的走时测试前的走时24小时之后的走时图5.1时钟走时测试调试5.1.3湿度模块调试图5.2所示为室内湿度值和向湿度传感器加湿气的比较(湿度值55%RH增加到81%RH),湿度传感器模块工作正常。室内湿度值室内湿度值加湿气后的湿度值图5.2湿度传感器调试5.1.4光线模块调试在对着窗子较强的光线强度和室内灯光调试对比(光线强度由224Lx减少到148Lx)测试图如图5.3所示。图5.3光线强度传感器测试调试图5.3光线强度传感器测试调试5.1.5红外遥控按键解码及调试将遥控器按键面板如图5.4所示的按键解码,其对应的键值为图5.5所示。00FF400FF463900FF473800FF443B00FF403F00FF433C00FF077800FF156A00FF097600FF166900FF199600FF0D7200FF0C7300FF186700FF5E2100FF087700FF1C6300FF5A2500FF432D00FF522D00FF4A35开开停关手/自时间确定0设置123456789图5.4遥控版面重新设计图5.5遥控解码值5.1.6将电路按照图3.12连接起来,测得P00和P01的电压都0.2V,用一张透光性不强的布料穿过红外对管,此时,接收管截止,测得P00和P01的电压都4.6V。2个全局变量openall(完全打开)和closeall(完全关闭)分别为P00和P01的值,用于反馈信号(0.2V为低电平、4.6V为高电平),此时能够使得电动机在窗帘完全打开和完全关闭时停下来。5.2系统整体调试经模块调试,各模块的工作正常。将整体程序烧录,系统整体整体工作如下:首先,程序初始化,其包括单片机、液晶、各传感器等模块的初始化。然后,进入界面后按照DS1302原有的时间进行走时,该界面也提供一个万年历的功能,可以有用遥控查看时间(包括年、月、日、时、分、秒、星期的查看),如果不进行时间调整,就直接进入自动模式和手动模式的任意切换,默认下为自动模式。其中,图5.6为用遥控设置预设值(最适宜的光线强度值、最大湿度值、早晚晚开窗时间)的工作界面;图5.7为自动模式下光强变化工作图片,预设置的最适宜光强为150Lx,室内光强控制在窗帘在150+20Lx,如大于170就关闭窗帘调整,小于130则打开窗帘调整。图5.8是手动模式下关窗工作图片,在此工作模式下,窗帘的开关不受预设值控制,只可以用遥控进行开关或者停等操作。图5.6遥控设置预设值工作图片图5.6遥控设置预设值工作图片图5.7自动模式下光强变化工作图片图5.7自动模式下光强变化工作图片图5.8手动模式下关窗工作图片图5.8手动模式下关窗工作图片5.3小结经过前面几章的工作,调试阶段很顺利的进行。本章节先对显示模块、时钟模块、传感器等功能模块电路分别调试,然后整体调试直到调试成功。该控制器的显示模块、时钟模块、遥控器模块、电动机模和各传感器等都能正常工作,并且设计的功能和结果都达到了预期目的。该设计具体能经行光线强度检测、温湿度检测、红外遥控远程控制;具有时钟定时及万年历功能、各参数(光线强度、湿度、手动和自动工作模式、万年历等)的实时显示功能;以及窗帘完全关闭和打开的自动检测和控制。最实用的是,其可以根据自己设定的光线强度值自动控制窗帘的打开程度;当湿度过大时能打开窗帘;早晚定时开关窗帘。最终在模块化设计和不断调试中完成各项指标和功能。6结束语6.1结论本设计以STC89C54RD+为主控芯片,利用数字光强度、湿度、温度、红外对管等传感器为外围元件,经过信号电量转换送人单片机,然后利用单片机发送控制信号驱动电机的转动,最终完成了以下功能:光线强度检测:通过光线强度传感器实时检测光线强弱,控制窗帘打开的合适程度,为室内提供设定的光线强度;时钟定时及万年历功能:能提供一个简单的万年历功能并能够定时早晚开关窗帘;红外遥控远程控制:可以用遥控进行窗帘的开和关,以及各个参数的设置;湿度检测:能完成湿度检测,当房屋内湿度太大能自动打开窗帘进行通风;各参数(光线强度、湿度、工作模式、万年历等)的实时显示;窗帘的完全关闭和打开的自动检测及控制等。6.2展望本次设计的电动机模块是模拟的有较大力矩的电动机,如果把该设计投入使用,则需要将它换成实际需要的电动机用控制脉冲控制即可。本设计本来是完成智能窗的设计,由于缺少机械的器件,换成了智能窗帘控制部分的设计,如果有需要可以加上滑轮组和玻璃窗即可完成设计。本设计还可以用IOIOforAndroidGoogleIOPIC单片机进行设计,它可以代替本设计中的红外遥控完成无线控制。随着Android设备的快速增加,用手机等Android设备去控制窗帘,可以显得更加智能和方便。由于本学期的时间被耽搁,很遗憾没去整合Android知识,直接用学过的51单片机进行了设计,希望以后有空能完成Android系统的智能窗控制器的设计。参考文献[1]孙向滨.智能家居控制系统展望[J].科协论坛,2012(9):30-31.[2]侯海涛.国内外智能家居发展现状[J].建材发展导向,2004(5):92-93.[3]冯旭升.奥兰AL.CK01的智能窗帘机[J].住宅科技,2003(11):36-37.[4]李胜多,张还,佟春明.基于PLC的多功能智能窗的设计[J].青岛农业大学学报(自然科学版),2010,27(1):84-88.[5]陈海松,夏继媛.基于Zigbee技术的智能窗帘网络化控制系统[J].电子设计工程,2012,20(15):136-138.[6]王俊杰.传感器与检测技术[M].北京:清华大学出版社,2011.[7]陈旦花.单片机最小系统的设计与应用[J].无线互联科技,2012(10):103-104.[8]李伟跃.基于时钟芯片DS1302的万年历的设计[J].技术创新,2012(9):20-21.[9]云中华,白天蕊.基于BH1750FVI的室内光照强度测量仪[J].单片机与嵌入式系统应用,2012,12(6):27-29.[10]倪健,董强.编码解码技术在红外遥控器中的实现[N].中国民航飞行学院学报,2004,15(1):35-36.[11]朱志伟,刘湘云.基AT89S51的红外遥控解码的实现[J].科技信息,2009(34):109-112.[12]郭豫荣.温湿度传感器的原理及应用[J].电子元器件应用,2012,14(11):35-56.[13]王晓明.电动机的单片机控制[M].北京:北京航空航天大学出版社,2002.[14]王兆安,刘进军.电力电子技术[M].北京:机械工程出版社,2011.[15]温子祺.51单片机C语言创新教程[M].北京:航空航天大学出版社,2011.致谢该控制器设计的最终结果达到了预期的目的,在这过程中也遇到很多的困难,在此衷心感谢我的指导老师严文娟的悉心指导,从论文的选题、文献的采集、总体设计、实物的制作、元件的购买、论文结构的布局到论文定稿,从标题到标点,内容到格式,她都费尽了心血。感谢严老师的辛勤栽培和孜孜教诲,在她的支持和帮助下顺利地完本设计系统的设计及论文撰写。在此,还要感谢长江师范学院物理学与电子工程学院和所有老师、同学们的支持,感谢他们在技术上的指导和为我们提供软硬件的支持。特别感谢实验室的各位老师对该设计做PCB由于自身专业水平实际应用能力及经验有限,整篇论文肯定存在尚未发现的缺点和错误。恳请阅读此篇论文的老师、同学,多予指正,不胜感激!附录A原理图、印制板图和实物图原理图:印制板图:实物图及实物工作图:成品图:工作图自动模式自动模式手动模式窗帘打开查看万历年窗帘打开查看万历年参数设置参数设置附录B元件清单CommentValueDesignatorFootprint晶振11.0591MHZB1R38晶振32.768KZB2R38瓷片电容CapacitorC1,C2VP32-3.2电解电容CapacitorC3CAPR5-4X53V电源3VCR2032PCBComponent_1-duplicate-duplicate发光二极管TypicalBLUESiCLEDD13.5X2.8X1.9红外对管发射管-D2,D43.5X2.8X1.9红外对管接收管-D3,D5TO-220_A排阻1KR0HDR1X9电阻1K(R1,R4),10K,4.7K(R5-R8),220(R9,R11),9.1k,(R10,R12)R1,R2,R4,R5,R6,R7,R8,R9,R10,R11,R12AXIAL-0.4电位器1KR3PCBComponent_1-duplicate3按键-S0,S1,S2,S3,S4PCBComponent_1-duplicate4按钮-S5PCBComponent_1-duplicate4单片机STC89C54U1DIP40时钟芯片TrickleChargeTimekeepingChip,DS1302U2DIP8红外接收头和遥控器1838TU3HDR1X3H湿度传感器DHT11U4HDR1X4光线强度传感器BH1750FVIU5HDR1X5电动机驱动芯片ULN2003ADU6D016液晶显示带中文字库12864液晶12864HDR1X20注:不包括电源元件清单附录C使用说明书接上电源后,进行初始化,默认工作在自动模式:通过按键可以调整万年历的时间设置和查看;通过遥控可完成设置改控制器的工作参数(最适宜的光线强度值、最大湿度值、早晚开窗时间等);在12864的界面上能对各参数的实时显示;在自动模式下预设值中,到开窗时间就打开窗帘,到关窗时间就关闭窗帘。有一个最适宜的光强度值,可根据实际的需要设点其值的大小。在开窗和关窗的设定值之间,如果高于设定湿度最大值,就会打开窗帘进行通风。按下遥控的手动和自动键,就可进行手动模式和自动模式的切换,在手动模式下可随意开关窗帘,不受各预设参数的影响,按下“开”就打开,按下“关”就关闭,按下“停”就停止工作。根据需要可以调滑动变阻器的值,改变12864的显示的亮暗程度。本设计包含有电源模块、光线传感器模块、温湿度传感器模块、红外遥控器模块、红外对管模块,必要时可分别对其维护。光线强度可以根据环境照度值(阴天室内:5—50;阴天室外:50—500;晴天室内:100—1000;夏季中午太阳光下的照度:约为10*6次方;阅读书刊时所需的照度:50—60;家用摄像机标准照度:1400)进行设定自己要求。可以根据最有利的防病、治病环境(40%~55%RH;图书、文物保管环境:40%-60%RH;棉毛织品存放:40%-60%RH;糖果、点心存放:50%~60%RH;蔬菜、水果存放:50%~70%RH;粮食存放:50%~70%RH)设定开窗的最大湿度值。附录D程序主要程序:#include<reg52.h> #include<math.h>#include<reg52.h> #include<math.h>#include<stdio.h>#include<INTRINS.H>#defineucharunsignedchar#defineuintunsignedint #define SlaveAddress0x46uchark4flag; uchardayflag;ucharflag_num=0;uchararrows_x=1;ucharline_num=4;ucharrow_num=5;ucharset_flag,kai,guan,shoudong,zidong=1,wangnianli;uintdisp[4];uchark1;ucharplus=0,sub=0;ucharsum=0;ucharnian,yue,ri,xq,shi,fen,miao;ucharnian1,yue1,ri1,xq1,shi1,fen1,miao1;voidxianxq(ucharxq);charread_datadht();/////按键sbitkey3=P1^0;sbitkey2=P1^1;sbitkey1=P1^2;sbitkey4=P1^3;sbitopenall=P0^0;sbitcloseall=P0^1;sbitclk=P3^4;sbitIO=P3^5;sbitrst=P3^6;sbitACC0=ACC^0;sbitACC7=ACC^7;voiddelay(ucharz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}sbitDHT=P3^7;sbitSCL=P3^0;sbitSDA=P3^1;sbitLCD_RS=P0^7;sbitLCD_RW=P0^6; sbitLCD_EN=P0^5;sbitLCD_PSB=P0^4;sbitLCD_RST=P0^3;ucharidatastr1[]={""};//用来存放湿度数据unsignedcharidatastr2[]={""};//用来存放温度数据unsignedcharidatastr3[]={""};//用来存放光强数据unsignedcharidatastr4[]={"自动"};unsignedcharidatastr5[]={"手动"};unsignedcharidataam[3]={7,30,0};unsignedcharidatapm[3]={20,0,0};unsignedcharidatashidu[1]={70};unsignedcharidataguangqiang[2]={1,50};unsignedcharcodedis2[]={"湿度%RH"};unsignedcharcodedis3[]={"光强LX"};unsignedcharcodedis4[]={"窗帘模式:"};unsignedlongidatazao_time_flag;//早上打开窗帘的时间标志unsignedlongidatanow_time_flag;unsignedlongidatawan_time_flag;//晚上打开窗帘的时间标志typedefunsignedcharBYTE;typedefunsignedshortWORD;typedefunsignedcharunint8;typedefunsignedcharunint16;BYTEBUF[8];ucharge,shi2,bai,qian,wan;intdis_data;unint8TH_data,TL_data,RH_data,RL_data,CK_data;unint8TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;unsignedinttemp_s,temp_w;unint8com_data,untemp,temp;unint8respond;ucharshiZ,shiX,wenZ,wenX,check;uchartr_shiZ,tr_shiX,tr_wenZ,tr_wenX;ucharflag;//定义红外解码所用变量charirtime;ucharstartflag,bitnum,irreceok,irprosok,l;ucharidatairdata[32];ucharidataircode[4];ucharidatadis8[8]; voidtimer0init(void)//计时器初始化{TMOD=0X02; TH0=0X00; TL0=0X00; ET0=1; EA=1; TR0=1;}voidint0init(void){IT1=1; EX1=1; EA=1;}voidirpros(void){ uchark,i,j; ucharvalue; k=1; for(j=0;j<4;j++) { for(i=0;i<8;i++) { value=value>>1; if(irdata[k]>6) { value=value|0x80; } k++; } ircode[j]=value; } irprosok=1;}//以下为中断服务程序/////////voidtimer0()interrupt1{ irtime++;}voidint0()interrupt2{ if(startflag) { if(irtime>32) { bitnum=0; } irdata[bitnum]=irtime; irtime=0; bitnum++; if(bitnum==33) { bitnum=0; irreceok=1; } } else { startflag=1; irtime=0; }}/*****************************延时程序***********************************/voiddelayNOP(){_nop_();_nop_();_nop_();_nop_();}voiddelay_ms(unsignedcharms){unsignedchari;while(ms--){for(i=0;i<250;i++){ _nop_(); _nop_();_nop_();_nop_();}}}voiddelay_us(){unint8i;i--; i--; i--; i--; i--;}voiddelay_10us(){ uchari; i--; i--; i--; i--; i--; i--;}voidDelay5us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();}voidDelay5ms(){WORDn=560;while(n--);}/************************延时end****************************//*************12864程序段***********************************/////测试LCD忙碌状态lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。///bitlcd_busy(){ bitresult;LCD_RS=0; LCD_RW=1;LCD_EN=1; Delay5us(); result=(bit)(P0&0x80); LCD_EN=0; return(result);}voidlcd_wcmd(unsignedcharcmd){while(lcd_busy());LCD_RS=0; LCD_RW=0; LCD_EN=0; Delay5us(); P2=cmd; Delay5us(); LCD_EN=1; Delay5us(); LCD_EN=0;}voidlcd_wdata(unsignedchardat){while(lcd_busy()); LCD_RS=1;LCD_RW=0; LCD_EN=0; P2=dat; Delay5us(); LCD_EN=1; Delay5us(); LCD_EN=0;}voidlcd_init()//////LCD初始化设定{LCD_PSB=1;////并口方式LCD_RST=0;Delay5ms();LCD_RST=1;Delay5ms();lcd_wcmd(0x34);Delay5ms();lcd_wcmd(0x30);Delay5ms();lcd_wcmd(0x0C);Delay5ms();}///*/设定LCD显示位置*/////voidlcd_dis_pos(unsignedcharX,unsignedcharY){unsignedcharpos;if(X==1){X=0x80;}elseif(X==2){X=0x90;}elseif(X==3){X=0x88;}elseif(X==4){X=0x98;}pos=X+Y;lcd_wcmd(pos);///////////////显示地址}voidxianshi(uchar*s){while(*s>0) { lcd_wdata(*s); s++; } }voidlcd_pos(unsignedcharX,unsignedcharY){unsignedcharpos;if(X==1){pos=0x80;}elseif(X==2){pos=0x90;}elseif(X==3){pos=0x88;}elseif(X==4){pos=0x98;}lcd_wcmd(Y|pos);}/********************12864end************//*****************BH1750程序段*************/voidBH1750_Start()//起始信号{SDA=1;/////拉高数据线//SCL=1;////拉高时钟线//Delay5us();////延时///SDA=0;//产生下降沿//Delay5us();////延时///SCL=0;/////拉低时钟线///}voidBH1750_Stop()//停止信号{SDA=0;SCL=1;Delay5us();SDA=1;//产生上升沿Delay5us();}voidBH1750_SendACK(bitack)//发送应答信号入口参数:ack(0:ACK1:NAK){SDA=ack;SCL=1;Delay5us();SCL=0;//拉低时钟线Delay5us();}bitBH1750_RecvACK()//接收应答信号{SCL=1;Delay5us();CY=SDA;SCL=0;Delay5us();returnCY;}voidBH1750_SendByte(BYTEdat)//////向IIC总线发送一个字节数据{BYTEi;for(i=0;i<8;i++){dat<<=1;SDA=CY;//送数据口SCL=1;Delay5us();SCL=0;Delay5us();}BH1750_RecvACK();}BYTEBH1750_RecvByte()//////从IIC总线接收一个字节数据{BYTEi;BYTEdat=0;SDA=1;//使能内部上拉,准备读取数据,for(i=0;i<8;i++){dat<<=1;SCL=1;Delay5us();dat|=SDA;SCL=0;Delay5us();}returndat;}voidSingle_Write_BH1750(ucharREG_Address){BH1750_Start();//起始信号BH1750_SendByte(SlaveAddress);BH1750_SendByte(REG_Address);//BH1750_SendByte(REG_data);BH1750_Stop();}//////*/*单字节读取*/*/ucharSingle_Read_BH1750(ucharREG_Address){ucharREG_data;BH1750_Start();BH1750_SendByte(SlaveAddress);BH1750_SendByte(REG_Address);BH1750_Start();BH1750_SendByte(SlaveAddress+1);//发送设备地址+读信号REG_data=BH1750_RecvByte();//读出寄存器数据 BH1750_SendACK(1); BH1750_Stop();returnREG_data;}voidMultiple_read_BH1750(void)//连续读出BH1750内部数据{uchari; BH1750_Start();BH1750_SendByte(SlaveAddress+1); for(i=0;i<3;i++){BUF[i]=BH1750_RecvByte();if(i==3){BH1750_SendACK(1);}else{ BH1750_SendACK(0);////回应ACK}}BH1750_Stop();////停止信号Delay5ms();}voidInit_BH1750()//初始化BH1750{Single_Write_BH1750(0x01);}//*****************BH1750程序段end************//***************DHT11温湿度传感器************voidread_init(){ DHT=0; delay_ms(21); DHT=1; delay_10us(); delay_10us(); delay_10us(); delay_10us(); DHT=1; if(!DHT) { flag=2; while((!DHT)&&flag++); flag=2; while(DHT&&flag++); tr_shiZ=read_datadht(); tr_shiX=read_datadht(); tr_wenZ=read_datadht(); tr_wenX=read_datadht(); check=read_datadht(); } DHT=0; delay(20);//采集完数据后 }charread_datadht(){ uchari,num,tempp; num=0; for(i=0;i<8;i++) { flag=2; while((!DHT)&&flag++); delay_10us();//延时判断0还是1 delay_10us(); delay_10us(); delay_10us(); if(DHT==1) { tempp=1; flag=2; while(DHT&&flag++); } else tempp=0; num<<=1; num|=tempp; } return(num);}voidwrite_sj1(uchardate)//12864时间的划分{ ucharshi2,ge; shi2=date/10; ge=date%10; lcd_wdata(0x30+shi2); lcd_wdata(0x30+ge);}voidconversion(uinttemp_data){wan=temp_data/10000+0x30;temp_data=temp_data%10000; qian=temp_data/1000+0x30;temp_data=temp_data%1000;bai=temp_data/100+0x30;temp_data=temp_data%100;shi2=temp_data/10+0x30;temp_data=temp_data%10;ge=temp_data+0x30; }//***************DHT11温湿度传感器end***//************DS1302及按键时间调整阶****voiddingwei()////12864年月日等的定位{ lcd_wcmd(0x92); write_sj1(nian); lcd_wcmd(0x94); write_sj1(yue); lcd_wcmd(0x96); write_sj1(ri); xianxq(xq); lcd_wcmd(0x9a); write_sj1(shi); lcd_wcmd(0x9c); write_sj1(fen); lcd_wcmd(0x9e); write_sj1(miao);}voidInputByte(ucharbyte1){ uchari; ACC=byte1; for(i=8;i>0;i--) { IO=ACC0; clk=1; clk=0; ACC=ACC>>1; } return;}ucharOutputByte(){ uchari; for(i=8;i>0;i--) { ACC=ACC>>1; ACC7=IO; clk=1; clk=0; } return(ACC);}voidwrite_ds1302(ucharadd,uchardate){ rst=0; _nop_(); clk=0; _nop_(); rst=1; InputByte(add); _nop_(); InputByte(date); clk=1; _nop_(); rst=0;}ucharread_ds1302(ucharadd){ uchardate; rst=0; _nop_(); clk=0; _nop_(); rst=1; InputByte(add); date=OutputByte(); clk=1; _nop_(); rst=0; return(date);}voidBCDTO(ucharnum1,ucharnum2){ num2=((num1&0x70)>>4)*10+(num1&0x0f);// return(num2);}voidTOBCD(ucharnum1,ucharnum2){ num1=((num2/10)<<4|(num2%10));// return(num1);}voidwrite_time(){ write_ds1302(0x8e,0x00); // TOBCD(nian1,nian); nian1=((nian/10)<<4|(nian%10)); write_ds1302(0x8c,nian1); //年// TOBCD(yue1,yue); yue1=((yue/10)<<4|(yue%10)); write_ds1302(0x88,yue1); //月// TOBCD(ri1,ri); ri1=((ri/10)<<4|(ri%10)); write_ds1302(0x86,ri1); //日// TOBCD(xq1,xq); xq1=((xq/10)<<4|(xq%10)); write_ds1302(0x8A,xq1); //星期// TOBCD(shi1,shi); shi1=((shi/10)<<4|(shi%10)); write_ds1302(0x84,shi1); //时// TOBCD(fen1,fen); fen1=((fen/10)<<4|(fen%10)); write_ds1302(0x82,fen1); //分// TOBCD(miao1,miao); miao1=((miao/10)<<4|(miao%10)); write_ds1302(0x80,miao1); //秒 write_ds1302(0x8e,0x80); //写保护寄存器}voidread_time()//读DS1302时间子程序{ miao1=read_ds1302(0x81); //秒寄存器// BCDTO(miao1,miao); miao=((miao1&0x70)>>4)*10+(miao1&0x0f); fen1=read_ds1302(0x83); //分// BCDTO(fen1,fen); fen=((fen1&0x70)>>4)*10+(fen1&0x0f); shi1=read_ds1302(0x85); //时// BCDTO(shi1,shi); shi=((shi1&0x70)>>4)*10+(shi1&0x0f); xq1=read_ds1302(0x8b); // BCDTO(xq1,xq); xq=((xq1&0x70)>>4)*10+(xq1&0x0f);//write_ds1302(0x8a,xq+1); ri1=read_ds1302(0x87); // BCDTO(ri1,ri); ri=((ri1&0x70)>>4)*10+(ri1&0x0f); yue1=read_ds1302(0x89); // BCDTO(yue1,yue); yue=((yue1&0x70)>>4)*10+(yue1&0x0f); nian1=read_ds1302(0x8d); // BCDTO(nian1,nian); nian=((nian1&0xf0)>>4)*10+(nian1&0x0f);}voidxianxq(ucharxq){ lcd_wcmd(0x8e); if(xq==1) xianshi("一"); if(xq==2) xianshi("二"); if(xq==3) xianshi("三"); if(xq==4) xianshi("四"); if(xq==5) xianshi("五"); if(xq==6) xianshi("六"); if(xq==7) xianshi("日");}ucharkeyscan()//键盘控制{ if(key1==0) { delay(45); if(key1==0) { while(!key1); k1++; switch(k1) { case1:lcd_wcmd(0x92);lcd_wcmd(0x0d);break; case2:lcd_wcmd(0x94);break; case3:lcd_wcmd(0x96);break; case4:lcd_wcmd(0x8e);break; case5:lcd_wcmd(0x9a);break; case6:lcd_wcmd(0x9c);break; case7:lcd_wcmd(0x9e);break; case8:k1=0;lcd_wcmd(0x0c); write_time();break; } } } if(k1!=0) { if(key2==0) { delay(45); if(key2==0) { while(!key2); if(k1==1)//nian { nian++; if(nian==100) nian=0; //qiehuan(1,nian); //write_sj(0x92,nian); write_sj1(nian); lcd_wcmd(0x92); } if(k1==2)//yue { yue++; if(yue>=13) yue=0; //qiehuan(1,yue); //write_sj(0x94,yue); write_sj1(yue); lcd_wcmd(0x94); } if(k1==3)//ri { ri++; if(ri==31) ri=0; //write_sj(0x96,ri); //qiehuan(1,ri); write_sj1(ri); lcd_wcmd(0x96); } if(k1==4)//xq { xq++; if(xq==8) xq=1; xianxq(xq); lcd_wcmd(0x8e); } if(k1==5)//shi { shi++; if(shi==24) shi=0; //write_sj(0x9a,shi); //qiehuan(1,shi); write_sj1(shi); lcd_wcmd(0x9a); } if(k1==6)//fen { fen++; if(fen==60) fen=0; //write_sj(0x9c,fen); //qiehuan(1,fen); write_sj1(fen); lcd_wcmd(0x9c); } if(k1==7)//miao { miao++; if(miao==60) miao=0; //write_sj(0x9e,miao); //qiehuan(1,miao); write_sj1(miao); lcd_wcmd(0x9e); } } } if(key3==0) { delay(45); if(key3==0) { while(!key3); if(k1==1)//nian { nian--; if(nian==-1) nian=99; //write_sj(0x92,nian); //qiehuan(2,nian); write_sj1(nian); lcd_wcmd(0x92); } if(k1==2)//yue { yue--; if(yue<=0) yue=12;

温馨提示

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

评论

0/150

提交评论