51单片机课程设计:基于DHT11的温湿度报警器
51单片机课程设计:基于DHT11的温湿度报警器
本程序适用于51系列单片机,主要用于读取DHT11温湿度模块数值,显示在数码管上,同时还具备温湿度报警功能,当超出预设值,蜂鸣器报警,可在吉林农业大学单片机开发板上完美运行,其他朋友可以修改部分代码移植的其他型号的开发板上。工程文件以及开发板电路图可到附件下载,同时DHT11部分资料在附件也可以下载。
关于粘贴复制乱码的问题:如果程序复制到Keil编译器上出现注释乱码,可以先建一个.c文件,也就是说不在keil里面编辑,然后用记事本打开.c文件,将源码复制进去,再在keil中添加文件即可。
/************************************说明***************************************程序运行时会对模块进行预热保证读取第一个数值的精确预热时间大概为4秒左右程序初始化时将会提示你设置最大温湿度H1最高温度L1最低温度H2最高湿度L2最低湿度按钮K1温度加按钮K2温度减设置完成后按K3即确定按钮开始监控报警(适用于吉农51单片机开发板)2016-12-29----------------------------SWorld********************************************************************************/#include<reg52.h>#defineOK1#defineERROR0#defineNUMBER20#defineSIZE5/*-----------------------------显示部分接线方法-------------------------------*/#defineGPIO_DIGP0sbitWEC=P2^3;//段选sbitDUC=P2^2;//位选/*----------------------------模块引脚连接-------------------------------------*/sbitdht11=P2^0;//dht接口只要接一个就行接dht11data0接口NC不用管/*-----------------------------按键引脚方法------------------------------------*/sbitadd=P2^5;//增加连接K2sbitsub=P2^4;//减少连接K1sbitok=P2^6;//确定连接K3/*----------------------------报警引脚连接-------------------------------------*/sbitbell=P2^7;//蜂鸣器接口连接蜂鸣器/*------------------------------全局变量---------------------------------------*/unsignedcharflag;/*---------------分别代表数码管上的0~9共10位数以及字母L、H----------------------*/unsignedcharcodearray[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76//LH};unsignedcharDisplayData[8];//用来存放要显示的8位数的值unsignedintHTemp,LTemp,HHumi,LHumi,setok;//用来存放最大温湿度以及是否设置好温湿度inttemp_value,humi_value;//温湿度数值存放unsignedcharstatus;unsignedcharvalue_array[5];/*------------------------------函数声明---------------------------------------*/voidDelay_1ms(unsignedintms);unsignedcharReadTempAndHumi(void);voidInitTime(void);voidDelay_1ms(unsignedintms);voidSMG_Display(unsignedintvalue,unsignedintway);//显示部分unsignedcharReadValue(void);/*------------------------------延时函数延时1ms---------------------------------------*/voidDelay_1ms(unsignedintms){unsignedintx,y;for(x=ms;x>0;x--){for(y=124;y>0;y--);}}/*------------------------------延时函数延时10ns---------------------------------------*/voidDelay_10us(void){unsignedchari;i--;i--;i--;i--;i--;i--;}/*------------------------------读取模块数值---------------------------------------*/unsignedcharReadValue(void){unsignedcharcount,value=0,i;status=OK;for(i=8;i>0;i--){value<<=1;count=0;while(dht11==0&&count++<NUMBER);if(count>=NUMBER){status=ERROR;return0;}Delay_10us();Delay_10us();Delay_10us();if(dht11!=0){value++;while(dht11!=0&&count++<NUMBER){dht11=1;}if(count>=NUMBER){status=ERROR;return0;}}}return(value);}/*------------------------------获取模块温湿度---------------------------------------*/unsignedcharReadTempAndHumi(void){unsignedchari=0,check_value=0,count=0;EA=0;dht11=0;Delay_1ms(20);dht11=1;Delay_10us();Delay_10us();Delay_10us();Delay_10us();if(dht11!=0){EA=1;returnERROR;}else{while(dht11==0&&count++<NUMBER);if(count>=NUMBER){dht11=1;EA=1;returnERROR;}count=0;dht11=1;while(dht11!=0&&count++<NUMBER);if(count>=NUMBER){dht11=1;EA=1;returnERROR;}for(i=0;i<SIZE;i++){value_array[i]=ReadValue();if(status==ERROR){dht11=1;EA=1;returnERROR;}if(i!=SIZE-1){check_value+=value_array[i];}}if(check_value==value_array[SIZE-1]){humi_value=value_array[0]*10;temp_value=value_array[2]*10;dht11=1;EA=1;returnOK;}else{EA=1;returnERROR;}}}/**************************************************************键盘扫描子程序**************************************************************/unsignedcharKey_Scan(){unsignedcharkeyValue=0,i;//保存键值//--检测按键1--//if(ok!=1)//检测按键K3是否按下{Delay_1ms(10);//消除抖动if(ok!=1)//再次检测按键是否按下{keyValue=3;i=0;while((i<50)&&(ok!=1))//检测按键是否松开{Delay_1ms(10);i++;}}}//--检测按键1--//if(add!=1)//检测按键K1是否按下{Delay_1ms(10);//消除抖动if(add!=1)//再次检测按键是否按下{keyValue=2;i=0;while((i<50)&&(add!=1))//检测按键是否松开{Delay_1ms(10);i++;}}}//--检测按键1--//if(sub!=1)//检测按键K2是否按下{Delay_1ms(10);//消除抖动if(sub!=1)//再次检测按键是否按下{keyValue=1;i=0;while((i<50)&&(sub!=1))//检测按键是否松开{Delay_1ms(10);i++;}}}returnkeyValue;//将读取到键值的值返回}/********************************************************************************函数名:DigDisplay*函数功能:使用数码管显示*输入:无*输出:无*******************************************************************************/voidDigDisplay(){unsignedchari;unsignedintj;for(i=0;i<8;i++){WEC=1;DUC=0;switch(i)//位选,选择点亮的数码管,{case(0):GPIO_DIG=0x7F;break;//显示第0位case(1):GPIO_DIG=0xBF;break;//显示第1位case(2):GPIO_DIG=0xDF;break;//显示第2位case(3):GPIO_DIG=0xEF;break;//显示第3位case(4):GPIO_DIG=0xF7;break;//显示第4位case(5):GPIO_DIG=0xFB;break;//显示第5位case(6):GPIO_DIG=0xFD;break;//显示第6位case(7):GPIO_DIG=0xFE;break;//显示第7位}WEC=0;DUC=1;GPIO_DIG=DisplayData[i];//发送段码j=50;//扫描间隔时间设定while(j--);GPIO_DIG=0x00;//消隐}}/*------------------------------主函数主函数共分为5部分,有switch语句执行相关操作case1:设置最高温度,完成设置后跳到下一循环case2:设置最低温度,完成设置后跳到下一循环case3:设置最高湿度,完成设置后跳到下一循环case4:设置最低湿度,完成设置后跳到下一循环case5:温湿度监控主循环,当低于后者超过预设值,触发警报。所读取的数值同时显示于数码管---------------------------------------*/voidmain(void){unsignedcharmark=0;Delay_1ms(1000);ReadTempAndHumi();Delay_1ms(3000);InitTime();WEC=0;DUC=0;HTemp=30,LTemp=20;HHumi=100,LHumi=20;bell=1,setok=1;while(1){switch(setok){case1:DisplayData[7]=array[11];DisplayData[6]=array[1];DisplayData[4]=array[HTemp/10];DisplayData[3]=array[HTemp%10];switch(Key_Scan()){case1:HTemp-=2;break;case2:HTemp+=2;break;case3:setok=2;break;}break;case2:DisplayData[7]=array[10];DisplayData[6]=array[1];DisplayData[4]=array[LTemp/10];DisplayData[3]=array[LTemp%10];switch(Key_Scan()){case1:LTemp-=2;break;case2:LTemp+=2;break;case3:setok=3;break;}break;case3:DisplayData[7]=array[11];DisplayData[6]=array[2];DisplayData[4]=array[HHumi/100];DisplayData[3]=array[HHumi%100/10];DisplayData[2]=array[HHumi%10];switch(Key_Scan()){case1:HHumi-=2;break;case2:HHumi+=2;break;case3:setok=4;break;}break;case4:DisplayData[7]=array[10];DisplayData[6]=array[2];DisplayData[4]=array[LHumi/100];DisplayData[3]=array[LHumi%100/10];DisplayData[2]=array[LHumi%10];switch(Key_Scan()){case1:LHumi-=2;break;case2:LHumi+=2;break;case3:setok=5;break;}break;case5:DisplayData[4]=0x00;if(flag==30){flag=0;mark++;ReadTempAndHumi();if(temp_value<LTemp*10||temp_value>HTemp*10||humi_value<LHumi*10||humi_value>HHumi*10){bell=0;}else{bell=1;}}SMG_Display(temp_value,0);SMG_Display(humi_value,1);break;}DigDisplay();}}/*------------------------------定时器初始化---------------------------------------*/voidInitTime(void){TH0=(unsignedchar)((65535U-50000)>>8);TL0=(unsignedchar)(65535U-50000);TMOD=0X01;TR0=1;ET0=1;EA=1;}/*------------------------------数值转换将读取到的数值转换为数码管可显示的数值---------------------------------------*/voidSMG_Display(unsignedintvalue,unsignedintway){unsignedcharge,bai,shi;ge=value%10;shi=value%100/10;bai=value%1000/100;if(way==0){DisplayData[7]=array[bai];DisplayData[6]=array[shi]|0x80;DisplayData[5]=array[ge];}else{DisplayData[3]=array[bai];DisplayData[2]=array[shi]|0x80;DisplayData[1]=array[ge];}}/*------------------------------定时器0---------------------------------------*/voidtimer(void)interrupt1{TH0=(unsignedchar)((65535-50000)>>8);TL0=(unsignedchar)(65535-50000);flag++;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。