|
温湿度检测系统的源程序和原理图,拿来和大家分享
原理图
全部资料(压缩包)下载:
温湿度检测系统资料.zip
(587.95 KB, 下载次数: 82)
下面是部分程序预览(完整版本请下载本帖附件):
dht11程序
- #include "dht.h"
- U8 U8FLAG,k;
- U8 U8count,U8temp;
- U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- U8 U8comdata;
- U8 count, count_r=0;
- void Delay1(U16 j)
- {
- U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<27;i++);
- }
- }
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
- void COM(void)
- {
- U8 i;
- for(i=0;i<8;i++)
- {
- U8FLAG=2;
- while((!DATA)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- Delay_10us();
- U8temp=0;
- if(DATA)U8temp=1;
- U8FLAG=2;
- while((DATA)&&U8FLAG++);
- //超时则跳出for循环
- if(U8FLAG==1)break;
- //判断数据位是0还是1
-
- // 如果高电平高过预定0高电平值则数据位为 1
-
- U8comdata<<=1;
- U8comdata|=U8temp; //0
- }//rof
- }
- //--------------------------------
- //-----温湿度读取子程序 ------------
- //--------------------------------
- //----以下变量均为全局变量--------
- //----温度高8位== U8T_data_H------
- //----温度低8位== U8T_data_L------
- //----湿度高8位== U8RH_data_H-----
- //----湿度低8位== U8RH_data_L-----
- //----校验 8位 == U8checkdata-----
- //----调用相关子程序如下----------
- //---- Delay();, Delay_10us();,COM();
- //--------------------------------
- U8 RH(void)
- {
- //主机拉低18ms
- DATA=0;
- Delay1(180); //原来为5
- DATA=1;
- //总线由上拉电阻拉高 主机延时20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主机设为输入 判断从机响应信号
- DATA=1;
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!DATA) //T !
- {
- U8FLAG=2;
- //判断从机是否发出 80us 的低电平响应信号是否结束
- while((!DATA)&&U8FLAG++);
- U8FLAG=2;
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while((DATA)&&U8FLAG++);
- //数据接收状态
- COM();
- U8RH_data_H_temp=U8comdata;
- COM();
- U8RH_data_L_temp=U8comdata;
- COM();
- U8T_data_H_temp=U8comdata;
- COM();
- U8T_data_L_temp=U8comdata;
- COM();
- U8checkdata_temp=U8comdata;
- DATA=1;
- //数据校验
- U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
- if(U8temp==U8checkdata_temp)
- {
- U8RH_data_H=U8RH_data_H_temp;
- U8RH_data_L=U8RH_data_L_temp;
- U8T_data_H=U8T_data_H_temp;
- U8T_data_L=U8T_data_L_temp;
- U8checkdata=U8checkdata_temp;
- }//fi
- return 1;
- }//fi
- else //传感器不响应
- {
- return 0;
- }
- }
复制代码
温湿度检测系统dht11主程序:
- #include <reg52.h>
- #include <math.h>
- #include "1602.h"
- #include "dht.h"
- #include "DS1302.h"
- //定义管脚
- sbit Key_Up = P3^2;
- sbit Key_Down = P3^5;
- sbit Key_Set = P3^3;
- //定义标识
- volatile bit FlagStartRH = 0; //开始温湿度转换标志
- volatile bit FlagKeyPress = 0; //有键按下标志
- volatile bit FlagAlert = 0; //报警状态标志
- volatile bit FlagReview = 0; //查询标志
- //定义温湿度传感器用外部变量
- extern U8 U8FLAG,k;
- extern U8 U8count,U8temp;
- extern U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
- extern U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
- extern U8 U8comdata;
- extern U8 count, count_r;
- //温湿度传感器用变量
- U16 temp;
- S16 temperature, humidity;
- U16 RHCounter;
- //按键响应用变量
- U8 keyvalue, keyUp, keyDown, keySet;
- U8 FlagSet;
- //DS1302时钟用变量
- SYSTEMTIME CurrentTime;
- uchar year, month, day, hour, minute, second;
- //报警及存储用变量
- //char * pSave;
- //字符串显示用变量
- uchar str1[6] = "000000";
- uchar AlertDate[9]="00-00-00", AlertTime[9]="00:00:00";
- uchar hide;
- //
- //函数声明
- void int2str(int x, char* str);
- void Delay1ms(unsigned int count);
- void Data_Init();
- void Timer0_Init();
- void Timer0_ISR () ;
- void KeyProcess(uint num);
- //整型转字符串的函数,转换范围0--65536
- void int2str(int x, char* str)
- {
- int i=1;
- int tmp=10;
- while(x/tmp!=0)
- {
- i++;
- tmp*=10;
- }
- tmp=x;
- str[i]='\0';
- while(i>1)
- {
- str[--i]='0'+(tmp%10);
- tmp/=10;
- }
- str[0]=tmp+'0';
- }
- void Delay1ms(unsigned int count)
- {
- unsigned int i,j;
- for(i=0;i<count;i++)
- for(j=0;j<120;j++);
- }
- //数据初始化
- void Data_Init()
- {
- RHCounter = 0;
- keyvalue = 0;
- keyUp = 1;
- keyDown = 1;
- keySet = 1;
- FlagSet = 0;
- hide = 0;
- AlertDate[8]='\0';
- AlertTime[8]='\0';
- }
- //定时器0初始化
- void Timer0_Init()
- {
- ET0 = 1; //允许定时器0中断
- TMOD = 1; //定时器工作方式选择
- TL0 = 0x06;
- TH0 = 0xf8; //定时器赋予初值
- TR0 = 1; //启动定时器
- }
- //定时器0中断
- void Timer0_ISR (void) interrupt 1 using 0
- {
- TL0 = 0x06;
- TH0 = 0xf8; //定时器赋予初值
- //每2秒钟启动一次温湿度转换
- RHCounter ++;
- if (RHCounter >= 450)
- {
- FlagStartRH = 1;
- RHCounter = 0;
- //设定闪烁标志
- if (hide == 1) hide = 0;
- else hide = 1;
- }
- }
- void KeyProcess(uint num)
- {
- switch (num)
- {
- case 1: //Up键被按下
- switch (FlagSet)
- {
- case 0:
- case 1:
- break;
- case 2: //年
- if (year<99) year++;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_YEAR,year);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 3: //月
- if (month<12) month++;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_MONTH,month);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 4: //日
- if (day<31) day++;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_DAY,day);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 5: //时
- if (hour<23) hour++;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_HOUR,hour);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 6: //分
- if (minute<60) minute++;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_MINUTE,minute);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 7: //秒
- if (second<60) second++;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_SECOND,second);
- Write1302(0x8e,0x80); //禁止写入
- break;
- }
- break;
- case 2: //Down键被按下
- switch (FlagSet)
- {
- case 0:
- case 1:
- break;
- case 2: //年
- if (year>0) year--;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_YEAR,year);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 3: //月
- if (month>0) month--;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_MONTH,month);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 4: //日
- if (day>0) day--;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_DAY,day);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 5: //时
- if (hour>0) hour--;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_HOUR,hour);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 6: //分
- if (minute>0) minute--;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_MINUTE,minute);
- Write1302(0x8e,0x80); //禁止写入
- break;
- case 7: //秒
- if (second>0) second--;
- Write1302(0x8e,0x00); //写入允许
- DS1302_SetTime(DS1302_SECOND,second);
- Write1302(0x8e,0x80); //禁止写入
- break;
- }
- break;
- case 3: //Set键被按下。FlagSet 0-报警;1-关报警;2-设置年;3-月;4-日;5-时;6-分;7-秒
- if (FlagReview==0) //只有不查询时才能设定
- {
- FlagSet ++;
- if (FlagSet==1)
- {
- L1602_string(2,10," ");
- }
- else
- {
- L1602_string(2,10," ");
- }
- if (FlagSet>=8)
- {
- FlagSet = 0;
- }
- }
- break;
- default:
- break;
- }
- }
- /********************************************************************
- * 名称 : Main()
- * 功能 : 主函数
- ***********************************************************************/
- void main()
- {
- U16 i, j, testnum;
- EA = 0;
- Timer0_Init(); //定时器0初始化
- Data_Init();
- Initial_DS1302();
- EA = 1;
- L1602_init();
- L1602_string(1,1," Welcome to my ");
- L1602_string(2,1," Infra Monitor! ");
- //延时
- for (i=0;i<1000;i++)
- for (j=0;j<1000;j++)
- {;}
- //清屏
- L1602_string(1,1," T C");
- L1602_string(2,1," H %");
-
- while(1)
- {
- //查询报警信号
- //FlagSet=0为报警状态,
- //FlagSet=1为关报警状态,
- //FlagSet=2,3,4,5,6,7依次为设置年,月,日,时,分,秒状态
- if (FlagStartRH == 1)
- {
- //温湿度转换标志检查
- TR0 = 0;
- testnum = RH();
- FlagStartRH = 0;
- TR0 = 1;
- //读出温湿度,只取整数部分
- humidity = U8RH_data_H;
- temperature = U8T_data_H;
- //读出日期时间值
- DS1302_GetTime(&CurrentTime);
- year = CurrentTime.Year;
- month = CurrentTime.Month;
- day = CurrentTime.Day;
- hour = CurrentTime.Hour;
- minute = CurrentTime.Minute;
- second = CurrentTime.Second;
- DateToStr(&CurrentTime);
- TimeToStr(&CurrentTime);
- //如果不处于查询状态则显示当前日期时间温度湿度
- if (FlagReview==0)
- {
- //清屏
- L1602_string(1,1," T C");
- L1602_string(2,1," ");
- L1602_string(2,12,"H %");
- //显示温湿度
- if (temperature<0)
- {
- L1602_string(2,7,"-");
- }
- temperature = abs(temperature);
- int2str(temperature,str1);
- L1602_string(1,14,str1);
- int2str(humidity,str1);
- L1602_string(2,14,str1);
- L1602_string(1,1,CurrentTime.DateString);
- L1602_string(2,1,CurrentTime.TimeString);
- //产生时间设定时的闪烁效果,只在未查询且闪烁标志置位时运行
- if (hide==1)
- {
- switch (FlagSet)
- {
- case 0:
- case 1:
- break;
- case 2: //年
- L1602_string(1,1," ");
- break;
- case 3: //月
- L1602_string(1,4," ");
- break;
- case 4: //日
- L1602_string(1,7," ");
- break;
- case 5: //时
- L1602_string(2,1," ");
- break;
- case 6: //分
- L1602_string(2,4," ");
- break;
- case 7: //秒
- L1602_string(2,7," ");
- break;
- default:
- break;
- }
- }
- }
- }
- //以下为键盘查询,当有按键从按下到弹起时,该按键被响应。
- if ((Key_Up)&&(keyUp==0)) {FlagKeyPress = 1; keyvalue = 1;}
- else if ((Key_Down)&&(keyDown==0)) {FlagKeyPress = 1; keyvalue = 2;}
- else if ((Key_Set)&&(keySet==0)) {FlagKeyPress = 1; keyvalue = 3;}
- if (FlagKeyPress == 1)
- {
- KeyProcess(keyvalue);
- FlagKeyPress = 0;
- }
- if (!Key_Up) keyUp = 0;
- else keyUp = 1;
- if (!Key_Down) keyDown = 0;
- else keyDown = 1;
- if (!Key_Set) keySet = 0;
- else keySet = 1;
- Delay1ms(100);
- }
- }
复制代码
|
评分
-
查看全部评分
|