




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
我们的爱情,我们的理想,我们的未来,我们的成长,我们的幸福PAGE②我们的爱情,我们的理想,我们的未来,我们的成长,我们的幸福我们的爱情,我们的理想,我们的未来,我们的成长,我们的幸福我们的爱情,我们的理想,我们的未来,我们的成长,我们的幸福第五届“飞兆杯”电子设计竞赛(2014年度)复赛报告项目中文名称:自动喷水系统项目英文名称:Automaticsprinklersystem参赛队员:刘陈砖,何鑫,龙浩指导教师:孙来业参赛院系:自动化学院目录摘要3一、系统整体硬件构成41、整体框架图42、主要器件选择43、主要电路分析5二、系统软件构成71、整体结构图72、主要模块分析8三、电路连接10四、项目计划使用器件列表10中文摘要本次设计的自动喷水系统包括温湿度报警电路、电机驱动电路、电热器驱动电路,其中涉及到单片机AT89S52、DS-18B20数字温度传感器、继电器和M4QA045、电动机、ULN-2003A集成芯片、湿敏电阻,以及LCD1602显示器等元件,从而实现了温室大棚中温度和湿度的控制和报警系统,解决了温室大棚人工控制测试的温度及湿度误差大,且费时费力、效率低等问题。该系统运行可靠,成本低。系统通过对温室内的温度与湿度参量的采集,并根据获得参数实现对温度和湿度的自动调节,达到了温室大棚自动控制的目的。促进了农作物的生长,从而提高温室大棚的产量,带来很好的经济效益和社会效益。[关键词]AT89S52温湿度的采集与显示ULN-2003A自动控制自动检测AbstractSubjectdesigntemperatureandhumidityalarmcircuittheM4QA045motordrivecircuit,heaterdrivecircuit,whichinvolvestoSTC89C52single-chip,theDS-18B20digitaltemperaturesensor,relayandM4QA045ofmotor,theULN-2003Achip,humidityresistance,andLCD1602monitorsandothercomponents,inordertoachievethegreenhousetemperatureandhumiditycontrolandalarmsystems,tosolvethegreenhousetemperatureandhumidityofthemanualcontroltestingerror,andtime-consumingandlowefficiency.Thesystemisreliableandlowcost.Systemthroughthecollection,greenhousetemperatureandhumidityparametersandgettheparameterstoautomaticallyadjustthetemperatureandhumidity,tothepurposeoftheautomaticcontrolofthegreenhouse.Promotethegrowthofcrops,therebyincreasingtheyieldofthegreenhouse,andbringgoodeconomicandsocialbenefits.Keywords:AT89S52,microcontroller,digitaltemperaturesensorinDS-18B20,ULN-2003Achip,greenhouse,automaticcontrol,automaticdetection一、系统硬件构成1、整体框架图2、主要器件选择单片机的选择:电子技术飞速发展,使得计算机不断更新换代。其中单片机更是一枝独秀,广泛应用于各个领域,使其自动化程度大提高。单片机具有体积小,价格低廉,功能强大等优点。基于此次项目选择单片机AT89S52.AT89S52功能特性:兼容MCS51指令系统8k可反复擦写(大于1000次)FlashROM32个双向I/O口256x8bit内部RAM3个16位可编程定时/计数器中断时钟频率0-24MHz2个串行中断,可编程UART串行通道2个外部中断源,共8个中断源2个读写中断口线,3级加密位低功耗空闲和掉电模式,软件设置睡眠和唤醒功能有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。传感器的选择:对于传感器的选择,起初我是选用两个传感器,温度采集使用DS18B20,而湿度采用AM1001。但是,在网上查找资料的过程中发现市场上拥有已将温湿度采集集成在同一片传感器上的AM2301,同时,它是以效准数字信号输出的复合传感器,省去了模数转换的麻烦,节省了硬件资源。综合考虑,我选用了AM2301温湿度传感器。显示器的选择:显示器可采用LED数码管和LCD显示屏,将二者进行比较,LED结构简单,它实际上是由七个发光二极管组成8字形构成的,但实际显示字符种类不多,LCD功能强大,现金的趋势,并且LCD在本系统中就足以发挥作用,加上成本低廉,所以在本次设计中选用LCD显示数据。3、主要电路分析主机和传感器之间可通过三个步骤完成数据读取步骤一:AM2301上电后(AM2301上电后要等待2S以越过不稳定状态,在此期间读取设备不能发送任何指令),测试环境温湿度数据,并记录数据,此后传感器自动转入休眠状态。AM2301的SDA数据线由上拉电阻拉高一直保持高电平,此时AM2301的SDA引脚处于输入状态,时刻检测外部信号。步骤二:微处理器的I/O设置为输出,同时输出低电平,且低电平保持时间不能小于800us,典型值是拉低1MS,然后微处理器的I/O设置为输入状态,释放总线,由于上拉电阻,微处理器的I/O即AM2301的SDA数据线也随之变高,等主机释放总线后,AM2301发送响应信号,即输出80微秒的低电平作为应答信号,紧接着输出80微秒的高电平通知外设准备接收数据。步骤三:AM2301发送完响应后,随后由数据总线SDA连续串行输出40位数据,微处理器根据I/O电平的变化接收40位数据。位数据“0”的格式为:50微秒的低电平加26-28微秒的高电平;位数据“1”的格式为:50微秒的低电平加70微秒的高电平。电磁阀控制电路电磁阀控制电路主要由NPN共集-共射复合管及继电器组成,当单片机P0.7给出高电平,复合管导通,继电器接通,将开关吸合,电磁阀接通开始放水。报警电路设计报警电路设计作为一个独立的模块,采用市面上比较普遍的蜂鸣器电路,结构比较简单,使用AT89S52上的一根口线驱动蜂鸣器发声。硬件电路整体比较简单,电路图这里不多赘诉二、系统软件构成1、整体结构图首先经行初始化,然后按一定频率采样输入,程序执行,刷新输出都比较简单,重点注意温湿度传感器初始化、读写数据的时序问题,运行时中断的处理,PWM的控制2、主要模块分析显示模块:初始化LCD1602显示模块,设置8位格式,2行,5*7矩阵显示,整体显示,关光标,不闪烁设定输入方式,增量不移位,清除屏幕显示,延时等待,将采集到的温湿度数据进行转换,十六进制转换成十进制,然后,判断是否在第一行显示,输入相应的地址数据,延时等待,输入需要显示的数据PWM程序设计:进行中断程序初始化,设置定时器T0中断时间为1ms,中断100次,即100ms作为一个脉冲周期,每中断一次,由变量T0_number进行计数,当变量T0_number大于100时,给变量T0_numbe赋值0,重新开始计数,当变量T0_number小于变量PWM_width_H时,输出高电平,当变量T0_number大于变量PWM_width_H时,输出低电平,以此控制脉宽电路连接四、项目计划使用器件列表器件型号数量用途AT89S521核心元件晶振12M/11.0592M1晶振电路核心元件排阻10K—81按键5独立按键核心元件二极管IN41481下载口ISP-PORT1跳线1电源插座1带锁开关3蜂鸣器1报警电路核心元件三极管90141DS18B201探测温度元件LCD1显示电路电机1散热电路电容若干电阻排阻若干排针若干排孔若干插座DIP—401插座DIP—201插座DIP—161杜邦线若干导线连接附件:程序#include<reg51.h>//包含单片机寄存器的头文件#include<stdlib.h>//包含随机函数rand()的定义文件#include<intrins.h>//包含_nop_()函数定义的头文件unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字unsignedcharcodemode[]={"mode"};unsignedcharcodeon[]={"on"};unsignedcharcodeoff[]={"off"};unsignedcharcodetimee[]={"time:"};unsignedcharcodetempp[]={"temp:"};unsignedcharcodekey[]={"key:"};unsignedcharcount,count1=0;//定义变量统计中断累计次数unsignedcharn0=0,n=0,n1=1,n2=0,n3=0,n4=0,n5=0;//定义按键功能unsignedchars,m,h,time_h=12,time_m,time1_h=12,time1_m;//定义变量储存秒、分钟和小时unsignedchartemp_h=23,temp_l=20;//定义温度设定值unsignedcharTL;//储存暂存器的温度低位unsignedcharTH;//储存暂存器的温度高位unsignedcharTN;//储存温度的整数部分/*******************************************************************************以下是对液晶模块的操作程序*******************************************************************************/sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚sbitS1=P1^4;//将S1位定义为P1.4sbitS2=P1^5;//将S2位定义为P1.5sbitS3=P1^6;//将S3位定义为P1.6sbitS4=P1^7;//将S4位定义为P1.7sbithigh=P1^0;sbitdown=P1^1;/*****************************************************函数功能:延时1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒***************************************************/voiddelay1ms(){unsignedchari,j; for(i=0;i<10;i++) for(j=0;j<33;j++) ; }/*****************************************************函数功能:延时若干毫秒入口参数:n***************************************************/voiddelaynms(unsignedcharn){unsignedchari; for(i=0;i<n;i++) delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。result=1,忙碌;result=0,不忙***************************************************/bitBusyTest(void){bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读写_nop_();//空操作_nop_();_nop_();_nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给resultE=0;//将E恢复低电平returnresult;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/voidWriteInstruction(unsignedchardictate){while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/voidWriteAddress(unsignedcharx){WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/voidWriteData(unsignedchary){while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,//就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_();_nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/voidLcdInitiate(void){delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38);//显示模式设置:16×2显示,5×7点阵,8位数据接口 delaynms(5);//延时5ms,给硬件一点反应时间WriteInstruction(0x38); delaynms(5);//延时5ms,给硬件一点反应时间 WriteInstruction(0x38);//连续三次,确保初始化成功 delaynms(5);//延时5ms,给硬件一点反应时间 WriteInstruction(0x0c);//显示模式设置:显示开,无光标,光标不闪烁 delaynms(5);//延时5ms,给硬件一点反应时间 WriteInstruction(0x06);//显示模式设置:光标右移,字符不移 delaynms(5);//延时5ms,给硬件一点反应时间 WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5);//延时5ms,给硬件一点反应时间}/******************************************************************************函数功能:显示小时******************************************************************************/voidDisplayHour(){unsignedchari,j; i=h/10;//取整运算,求得十位数字 j=h%10;//取余运算,求得各位数字WriteAddress(0x0b);//写显示地址,将十位数字显示在第2行第5列 WriteData(digit[i]);//将十位数字的字符常量写入LCD WriteData(digit[j]);//将个位数字的字符常量写入LCD}/******************************************************************************函数功能:显示分钟******************************************************************************/voidDisplayMinute(){unsignedchari,j;i=m/10;//取整运算,求得十位数字j=m%10;//取余运算,求得各位数字WriteAddress(0x0e);//写显示地址,将十位数字显示在第2行第8列 WriteData(digit[i]);//将十位数字的字符常量写入LCD WriteData(digit[j]);//将个位数字的字符常量写入LCD}/*****************************************************函数功能:显示设定时间时值入口参数:x***************************************************/voiddisplay_time_h(unsignedcharx){unsignedcharj,l;//j,k,l分别储存温度的百位、十位和个位 j=x/10;//取十位 l=x%10;//取个位 WriteAddress(0x4b);//写显示地址,将在第2行第7列开始显示 WriteData(digit[j]);//将百位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}voiddisplay_time1_h(unsignedcharx){unsignedcharj,l;//j,k,l分别储存温度的百位、十位和个位 j=x/10;//取十位 l=x%10;//取个位 WriteAddress(0x45);//写显示地址,将在第2行第7列开始显示 WriteData(digit[j]);//将百位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示设定时间时值入口参数:x***************************************************/voiddisplay_time_m(unsignedcharx){unsignedcharj,l;//j,k,l分别储存温度的百位、十位和个位 j=x/10;//取十位 l=x%10;//取个位 WriteAddress(0x4e);//写显示地址,将在第2行第7列开始显示 WriteData(digit[j]);//将百位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}voiddisplay_time1_m(unsignedcharx){unsignedcharj,l;//j,k,l分别储存温度的百位、十位和个位 j=x/10;//取十位 l=x%10;//取个位 WriteAddress(0x48);//写显示地址,将在第2行第7列开始显示 WriteData(digit[j]);//将百位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示时间:的小数点***************************************************/void display_colon(void){ WriteAddress(0x4d); //写显示地址,将在第2行第10列开始显示 WriteData(':');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 WriteAddress(0x47); //写显示地址,将在第2行第10列开始显示 WriteData(':');//将小数点的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 WriteAddress(0x0d); //写显示地址,将在第2行第10列开始显示 WriteData(':');//将小数点的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间 }void display1_colon(void){WriteAddress(0x0d); //写显示地址,将在第2行第10列开始显示 WriteData(':');//将小数点的字符常量写入LCD delaynms(50); //延时1ms给硬件一点反应时间}void display_gang1(void) { WriteAddress(0x4a); //写显示地址,将在第2行第10列开始显示 WriteData('-');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 }void display_sanre(void) { WriteAddress(0x4b); //写显示地址,将在第2行第10列开始显示 WriteData('-');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 }void display_jiare(void) { WriteAddress(0x46); //写显示地址,将在第2行第10列开始显示 WriteData('+');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 }void display1_sanre(void) { WriteAddress(0x09); //写显示地址,将在第2行第10列开始显示 WriteData('-');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 }void display1_jiare(void) { WriteAddress(0x09); //写显示地址,将在第2行第10列开始显示 WriteData('+');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 }voiddispiay_timee(void){unsignedchari; WriteAddress(0x40);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(timee[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(timee[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }voiddispiay_key(void){unsignedchari; WriteAddress(0x40);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(key[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(key[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }voiddisplay_n1(void) { WriteAddress(0x04); //写显示地址,将在第2行第10列开始显示 WriteData(digit[n1]);//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}voiddispiay_mode(void){unsignedchari; WriteAddress(0x00);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(mode[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(mode[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }voiddispiay_on1(void){unsignedchari; WriteAddress(0x47);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(on[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(on[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }voiddispiay_on(void){unsignedchari; WriteAddress(0x4c);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(on[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(on[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }voiddispiay_off1(void){unsignedchari; WriteAddress(0x47);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(off[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(off[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }voiddispiay_off(void){unsignedchari; WriteAddress(0x4c);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(off[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(off[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }/************************************************************************以下是DS18B20的操作程序************************************************************************/sbitDQ=P3^7;unsignedchartime;//设置全局变量,专门用于严格延时/*****************************************************函数功能:将DS18B20传感器初始化,读取应答信号出口参数:flag***************************************************/bitInit_DS18B20(void) {bitflag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ=1;//先将数据线拉高for(time=0;time<2;time++)//略微延时约6微秒;DQ=0;//再将数据线从高拉低,要求保持480~960usfor(time=0;time<200;time++)//略微延时约600微秒;//以向DS18B20发出一持续480~960us的低电平复位脉冲DQ=1;//释放数据线(将数据线拉高)for(time=0;time<10;time++);//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕;return(flag);//返回检测成功标志}/*****************************************************函数功能:从DS18B20读取一个字节数据出口参数:dat***************************************************/unsignedcharReadOneChar(void){ unsignedchari=0; unsignedchardat;//储存读出的一个字节数据 for(i=0;i<8;i++) { DQ=1;//先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 dat>>=1; _nop_();//等待一个机器周期 DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++);//延时约6us,使主机在15us内采样 if(DQ==1) dat|=0x80;//如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++) ;//延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat);//返回读出的十进制数据}/*****************************************************函数功能:向DS18B20写入一个字节数据入口参数:dat***************************************************/WriteOneChar(unsignedchardat){ unsignedchari=0; for(i=0;i<8;i++) { DQ=1;//先将数据线拉高 _nop_(); //等待一个机器周期 DQ=0;//将数据线从高拉低时即启动写时序 DQ=dat&0x01;//利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1;//释放数据线 for(time=0;time<1;time++);//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1;//将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++);//稍作延时,给硬件一点反应时间} /******************************************************************************以下是与温度有关的显示设置******************************************************************************//*****************************************************函数功能:显示温度的整数部分入口参数:x***************************************************/voiddisplay_temp1(unsignedcharx){unsignedchark,l;//k,l分别储存温度的百位、十位和个位 k=(x%100)/10;//取十位 l=x%10;//取个位 WriteAddress(0x06);//写显示地址,将在第2行第7列开始显示 WriteData(digit[k]);//将十位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示温度最高值入口参数:x***************************************************/voiddisplay_temp_h(unsignedcharx){unsignedchark,l;//k,l分别储存温度的百位、十位和个位 k=(x%100)/10;//取十位 l=x%10;//取个位 WriteAddress(0x4e);//写显示地址,将在第2行第7列开始显示 WriteData(digit[k]);//将十位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}/*****************************************************函数功能:显示温度的最低值入口参数:x***************************************************/voiddisplay_temp_l(unsignedcharx){unsignedchark,l;//j,k,l分别储存温度的百位、十位和个位 k=(x%100)/10;//取十位 l=x%10;//取个位 WriteAddress(0x4b);//写显示地址,将在第2行第7列开始显示 WriteData(digit[k]);//将十位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间}voiddispiay_tempp(void){unsignedchari; WriteAddress(0x40);//写显示地址,将在第2行第13列开始显示 i=0;//从第一个字符开始显示 while(tempp[i]!='\0')//只要没有写到结束标志,就继续写 { WriteData(tempp[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(50);//延时1ms给硬件一点反应时间 } }void display_gang(void) { WriteAddress(0x4d); //写显示地址,将在第2行第10列开始显示 WriteData('-');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 }/*****************************************************函数功能:做好读温度的准备***************************************************/voidReadyReadTemp(void){Init_DS18B20();//将DS18B20初始化 WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 for(time=0;time<100;time++); //温度转换需要一点时间 Init_DS18B20();//将DS18B20初始化 WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0xBE);//读取温度寄存器,前两个分别是温度的低位和高位 }/******************************************************************函数功能:键盘扫描********************************************************************/voidkey_scan(void){ if(S4) { n1++; WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5);//延时5ms,给硬件一点反应时间 high=0; down=0; if(n1==4) n1=1; } if(n1==1) { if(S3) { n++; if(n==2) n=0; } if(n==0) { if(S1)//如果是S2键按下 temp_h++;//分钟加1 if(S2&&temp_h>temp_l)//如果是S3键按下 temp_h--;//小时加 } if(n==1) { if(S1&&temp_l<temp_h)//如果是S2键按下 temp_l++;//分钟加1 if(S2)//如果是S3键按下 temp_l--;//小时加 } } if(n1==2) { if(S3) { n0++; if(n0==4) n0=0; } if(n0==0) { if(S1)//如果是S2键按下 {n4=1;n5=0; display1_jiare();} if(S2)//如果是S3键按下 {n4=0;n5=1; display1_sanre(); } } if(n0==1) { if(S1)//如果是S2键按下 m++;//分钟加1 if(S2)//如果是S3键按下 h++;//小时加1 } if(n0==2) { if(S1)//如果是S2键按下 {time_h++;//分钟加1 if(time_h==24) time_h=0;} if(S2)//如果是S3键按下 {time_m++;//小时加 if(time_m==60) time_m=0;} } if(n0==3) { if(S1)//如果是S2键按下 {time1_h++;//分钟加1 if(time1_h==24) time1_h=0;} if(S2)//如果是S3键按下 {time1_m++;//小时加 if(time1_m==60) time1_m=0;} } }}/******************************************************************函数功能:控制********************************************************************/voidcontrol(void){ if(n1==1) { if(TN>temp_h) {high=1;down=0;} if(TN<temp_l) {high=0;down=1;} if(TN<=temp_h&&TN>=temp_l) {high=0;down=0;} } if(n1==2) { if(n4==1&&n5==0) { if((h>=time1_h&&h<time_h&&m>=time1_m)||(h>=time1_h&&m>=time1_m&&h<=time_h&&m<=time_m)) {down=0; high=1;} else {high=0;} } if(n4==0&&n5==1) {if((h>=time1_h&&h<time_h&&m>=time1_m)||(h>=time1_h&&m>=time1_m&&h<=time_h&&m<=time_m)) {down=1;high=0;} else {down=0;} } } if(n1=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年家庭教育测试试题及答案
- 2025年江苏编制笔试题库及答案
- 2025年科学师范面试试题及答案
- 2025年病理操作面试题及答案
- 2025年初二的测试题及答案
- 2025年生物面试题型及答案高中
- 2025年城管笔试题库及答案
- 2025年新能源品牌测试题及答案
- 2025年十五冶招聘考试试题及答案
- 2025年拗音浊音考试题及答案
- 2023年湖北省生态环保有限公司招聘笔试真题
- 2023年新疆事业单位开展招聘考试真题
- 学校班主任谈心制度实施方案
- 2024年《工会法》知识竞赛题库及答案
- 煤矿事故现场处置管理制度
- 2024年湖南省高考化学试卷真题(含答案解析)
- 上海市精神卫生中心招聘考试试卷及答案
- 2024年大学试题(财经商贸)-国际服务贸易考试近5年真题集锦(频考类试题)带答案
- 投标报价编制委托协议书
- 《掷一掷》(教学设计)-2023-2024学年人教版五年级数学上册
- 小学数学教学中数学文化的渗透与传承
评论
0/150
提交评论