单片机设计温湿度传感器的设计程序.docx
GDAIB小远制作Reg5l.h#ifndef_REG51_H_#define_.REG5LH_*BYTERegister*/sfrPO:=0x80;sfrPl:=0x90;sfrP2=OxAO;sfrP3=OxBO;sfrPSW=OxDO;SfrACC=OxEO;sfrB=OxFO;sfrSP=0x81;sfrDPL=0x82;sfrDPH=0x83;sfrPCON=0x87;SfrTCON=0x88;sfrTMOD=0x89;SfrTLO=0x8A;SfrTLl=0x8B;SfrTHO=0x8C;SfrTHl=0x8D;sfrIE=0xA8;sfrIP=0xB8;sfrSCON=0x98;sfrSBUF=0x99;*BITRegister*/*PSW*/sbitCY=0xD7;sbitAC=0xD6;SbitFO=OxD5;sbitRSI=OxD4;sbitRSO=OxD3;sbitOV=0xD2;SbitP=OxDO;*TCON*/SbitTFl=0x8F;SbitTRl=0x8E;sbitTFO=0x8D;sbitTRO=0x8C;sbitIEl=0x8B;sbitITI=0x8A;sbitIEO=0x89;sbitITO=0x88;*IE*/sbitEA=OXAF;sbitES=OxAC;sbitETl=OxAB;sbitEXl=OxAA;sbitETO=0xA9;sbitEXO=0xA8;*IP*/sbitPS=OxBC;sbitPTl=OxBB;sbitPXl=OxBA;sbitPTO=0xB9;sbitPXO=0xB8;*P3:*/sbitRD=0xB7;sbitWR=0xB6;SbitTl=0xB5;sbitTO=OxB4;sbitINTl=0xB3;sbitINTO=0xB2;SbitTXD=OxBl;sbitRXD=OxBO;*SCON*/sbitSMO=0x9F;sbitSMl=0x9E;sbitSM2=0x9D;sbitREN=0x9C;sbitTB8=0x9B;sbitRB8=0x9A;sbitTI=0x99;sbitRI=0x98;#endifMain.h#ifndef_MAIN_H_#define_MAIN_H_#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintvoiddelayIm(uintx);voidRH_founction();/温湿度读取子程序voidinit602(),初始化1602函数voidDHTll_display(ucharadd,ucharshi,ucharge);温湿度显示函数voidkey_shidu();voidkey_wendu();voidalarm_function();voidw_string(ucharadd,uchar*p);#endifMain.c温湿度实时监测显示,超限报警,温度测量范围为0+50°C;湿度测量范围为20%90%;#include"main.hMSbitSI=PIA4;温度sbits2=P13;湿度sbits3=P12;/+sbits4=P11;/-sbits5=P1O;确定sbitalarm=Pl5;蜂鸣器报警externUCharTH,RH;温度整数,湿度整数局部ucharcodewordl16="Myowndesign!");ucharcodeword216=,'Tem=CHum=%");/word24word25Cword213word214%ucharcodehehe16="SetTemperature!");设置温度上下限界面ucharcodehaha16J="SetHumidity!");设置湿度上下限界面ucharcodeword316="up=Cdown=C");ucharcodeword416="up=%down=%";ucharw_up=30;w_down=20;温度上下限uchars_up=60;s_down=40;湿度上下限voidmain()(uinti;init_1602();delaylm(500);延时等待1602稳定RH_founction();while(l)key_wendu();温度上下限调整key_shidu();湿度上下限调整i+;if(i>2000)动态延时读取温湿度值(i=0;RHJbUnCtion();读取温湿度JDHTlLdiSPlay(OXCO+4,TH10+0x30,TH%10+0x30);显示温度DHTl1_display(OxcO+13,RH10+0x30,RH%10+0x30);显示湿度if(TH>w_up)|(TH<w_down)|(RH>s_up)|(RH<s_down)alarm=0;)elsealarm=1;)/=温度上下限调整函数=voidkey_wendu()UChardZ2=0xc3,Oxcd);温度上下限数据在1602上显示的初始地址UCharWei;需要调整的位UCharbUf2;温度上下限缓存,bufO温度上限,buf11温度下限uintCOUnter;用于产生闪烁效果if(!sl)delaylm(3);if(!sl)/进入温度设置alarm=1;while(!s1);wei=O;bufO=w_up;buf1j=w_down;二String(OX8O,hehe);发送字符串到LCD第一行string(OXC0,WOrd3);/此句很重要,不写的话,会显示乱码docounter+;if(counter>4000)counter=0;清零if(counter>2000)DHTlLdiSPIay(dzwei,0x20,0x20);显示空格if(counter<=2000)DHT1l_display(0xc3,buf0/l0+0x30,buf0%l0+0x30);DHT1l_display(Oxcd,bufl110+0x30,bufI%10+0x30);/显示数据if(!sl)继续按下si,调整右移while(!sl);wei+;if(wei>1)(wei=0;)if(!s3)/加1while(!s3);bufwei+;if(bufweiJ>50)buflwei=0;if(!s4)减1while(!s4);bufwei-;if(bufwei=Oxff)bufwei=50;if(buf<=bufl)buf0=30;bufl=20;如果温度上限不大于下限,回到初始状态while(s5);按下s5设置确定w_up=buf0;w_down=bufl;w_string(0x80,Wordl);w_string(OXeO,word2);发送字符串至ILCD第一行湿度上下限调整函数:=voidkey_shidu()UChardZ=0xc3,0xcd;温度上下限数据在1602上显示的初始地址UCharWei;需要调整的位UCharbUf2;/湿度上下限缓存,bufO湿度上限,bufl湿度下限uintcounter;/于产生闪烁效果if(!s2)(delaylm(3);if(!s2)/进入湿度设置(alarm=1;while(!s2);wei=0;buf0=s_up;buf1=s_down;w_string(0x80,haha);发送字符串到LCD第一行w_string(OXCo,word4);/此句很重要,不写的话,会显示乱码do(counter+;if(counter>4000)counter=0;/清零if(counter>2000)DHTILdiSPlay(dzwei,0x20,0x20);显示空格if(counter<=2000)DHT1l_display(0xc3,buf0J/l0+0x30,bufO%10+0x30);DHT1l_display(Oxcd,buf110+0x30,bufI%10+0x30);/显示数据if(!sl)继续按下si,调整右移(while(!sl);wei+;if(wei>l)(wei=0;)if(!s3)/加1(while(!s3);bufwei+;if(bufwei>90)(bufwei=0;)if(!s4)减1(while(!s4);bufwei-;if(bufwei<20)(bufwei=90;)if(buf0<=buHl)bufl0=6(kbuf11=40;"/如果湿度上限不大于下限,回到初始状态while(s5);按下s5设置确定s_up=buf0;s_down=bufl;w_string(0x80,Word1);w_string(OXCo,word2)J/发送字符串到LCD第行/=ms级延时函数=voiddelaylm(uintx)uintk,j;for(k=0;k<x;k+)连数X次,约XmSfor(j=0;j<120;j+);数120次,约ImS)1602.c#include"main.h"#defineshujuP0数据脚sbitrs=P2A7;数据命令选择端sbitrw=P2A6;读写选择端sbiten=P251602使能端sbitbusy=P07;/检测为1,说明1602忙externucharcodeword116;externucharcodeword216;/=读繁忙标记函数=voidread_busy()(shuju=OXff;准备读数据do(rs=0;读状态rw=1;读en=0;en=1;使能1602数据读出)while(busy);en=0;)=写命令函数=voidWrit