|
图3.2 为DHT11传感器实物图,其性能指标和特性如下: (1)工作电压范围:3.5V-5.5V; (2)工作电流 :平均0.5mA; (3)湿度测量范围:20-90%RH ; (4)温度测量范围:0-50℃ ; (5)湿度分辨率 :1%RH 8位; (6)温度分辨率 :1℃ 8位; (7)采样周期 :1S ; (8)单总线结构 ; (9)与TTL兼容(5V)
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
- typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
- sbit set=P2^2 ;
- // 设置
- sbit setup=P2^1 ;
- // 设置+
- sbit setdown=P2^0 ;
- // 设置-
- sbit speek=P1^0;
- sbit hh=P1^1;
- sbit ll=P1^2;
- sbit LCD_RS=P2^7;
- sbit LCD_RW=P2^6;
- sbit LCD_EN=P2^5;
- sbit P2_0 = P3^7 ;
- sbit P2_1 = P3^1 ;
- //----------------------------------------------//
- //----------------定义区--------------------//
- //----------------------------------------------//
- U8 U8FLAG;
- 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 indata[5];
- U8 count, count_r=0;
- U16 U16temp1,U16temp2;
- uchar settem_h,settem_l,sethum_h,sethum_l,con=0;
- bit sethumbz_h=0,sethumbz_l=0,settembz_h=0,settembz_l=0,setkey;
- uchar i;
- void Delay_1(U16 j)
- {
- U8 i;
- for(;j>0;j--)
- {
- for(i=0;i<127;i++);
- }
- }
- //void elay(unsigned int num)//延时函数
- //{
- // while( --num );
- //}
- void Delay_10us(void)
- {
- U8 i;
- i--;
- i--;
- i--;
- i--;
- i--;
- i--;
- }
-
- /********************************************************************/
- /* */
- /*检查LCD忙状态 */
- /*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
- /* */
- /********************************************************************/
- bit lcd_busy()
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- result = (bit)(P0&0x80);
- LCD_EN = 0;
- return result;
- }
- /********************************************************************/
- /* */
- /*写指令数据到LCD */
- /*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
- /* */
- /********************************************************************/
- void lcd_wcmd(uchar cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 0;
- }
- /********************************************************************/
- /* */
- /*写显示数据到LCD */
- /*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
- /* */
- /********************************************************************/
- void lcd_wdat(uchar dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 1;
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_EN = 0;
- }
- /********************************************************************/
- /* */
- /* LCD初始化设定 */
- /* */
- /********************************************************************/
- void lcd_init()
- {
- lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
- Delay_1(5);
- lcd_wcmd(0x38);
- Delay_1(5);
- lcd_wcmd(0x38);
- Delay_1(5);
- lcd_wcmd(0x0c); //显示开,关光标
- Delay_1(5);
- lcd_wcmd(0x06); //移动光标
- Delay_1(5);
- lcd_wcmd(0x01); //清除LCD的显示内容
- Delay_1(5);
- }
- /********************************************************************/
- /* */
- /* 设定显示位置 */
- /* */
- /********************************************************************/
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
- }
- void LCD1602PutStr(char* s)
- {
- uchar i = 0;
- while (*(i + s)) {
- lcd_wdat(*(i + s));
- i++;
- }
- }
- //串行总线
- void COM(void)
- {
- U8 i;
- for(i=0;i<8;i++)
- {
-
- U8FLAG=2;
- //----------------------
- P2_1=0 ; //T
- P2_1=1 ; //T
- //----------------------
-
- while((!P2_0)&&U8FLAG++);
- Delay_10us();
- Delay_10us();
- // Delay_10us();
- U8temp=0;
- if(P2_0)U8temp=1;
- U8FLAG=2;
- while((P2_0)&&U8FLAG++);
-
- //----------------------
- P2_1=0 ; //T
- P2_1=1 ; //T
- //----------------------
- //超时则跳出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();
- //--------------------------------
- void RH(void)
- {
- //主机拉低18ms
- P2_0=0;
- Delay_1(180);
- P2_0=1;
- //总线由上拉电阻拉高 主机延时20us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- Delay_10us();
- //主机设为输入 判断从机响应信号
- P2_0=1;
- //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!P2_0) //T !
- {
- U8FLAG=2;////////////////////////////////////////////////////
- //判断从机是否发出 80us 的低电平响应信号是否结束
- while((!P2_0)&&U8FLAG++);
- U8FLAG=2;
- //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while((P2_0)&&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;
- P2_0=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
- }//fi
- }
- Disp_Temperature()//显示温度
- {
- //unsigned char n=0;
- // display[4]=temp_data[0]&0x0f;
- // display[0]=ditab[display[4]]; //查表得小数位的值
-
- // display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
- lcd_pos(0x04);
- lcd_wdat('0'+U8RH_data_H/10);
- lcd_wdat('0'+U8RH_data_H%10);
- lcd_pos(0x44);
- lcd_wdat('0'+U8T_data_H/10);
- lcd_wdat('0'+U8T_data_H%10);
- lcd_pos(9);
- lcd_wdat('0' + sethum_h / 10);
- lcd_wdat('0' + sethum_h % 10); /* 显示湿度上限 */
- lcd_pos(13);
- lcd_wdat('0' + sethum_l / 10);
- lcd_wdat('0' + sethum_l % 10); /* 显示湿度下限 */
-
- lcd_pos(0x49);
- lcd_wdat('0' + settem_h / 10);
- lcd_wdat('0' + settem_h % 10); /* 显示温度上限 */
- lcd_pos(0x4d);
- lcd_wdat('0' + settem_l / 10);
- lcd_wdat('0' + settem_l % 10); /* 显示温度下限 */
-
- if (settembz_h)
- {
- lcd_pos(0x4f);
- lcd_wdat(' ');
- lcd_pos(0x0f);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(127);
- }
- if (settembz_l)
- {
- lcd_pos(0x0f);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(' ');
- lcd_pos(0x4f);
- lcd_wdat(127);
- }
- if (sethumbz_h)
- {
- lcd_pos(0x0f);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(' ');
- lcd_pos(0x4f);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(127);
-
- }
- if (sethumbz_l)
- {
- lcd_pos(0x4f);
- lcd_wdat(' ');
- lcd_pos(0x4b);
- lcd_wdat(' ');
- lcd_pos(0x0b);
- lcd_wdat(' ');
- lcd_pos(0x0f);
- lcd_wdat(127);
- }
- }
- void doing()
- {
- uchar xianzhi_mi ,shiduzhi;
- xianzhi_mi=U8T_data_H ;
- shiduzhi=U8RH_data_H;
- if((xianzhi_mi<settem_h)&(xianzhi_mi>settem_l)&(shiduzhi<sethum_h)&(shiduzhi>sethum_l))
- {
- ll=1 ;
- hh=1 ;
- speek=1 ;
- }
- if((xianzhi_mi>settem_h)||(shiduzhi>sethum_h))
- {
- hh=0 ;
- ll=1;
- speek=0;
- }
- if((xianzhi_mi<settem_l)||(shiduzhi<sethum_l))
- {
- hh=1 ;
- ll=0 ;
- speek=0 ;
- }
- }
- void key()
- {
- if(set==0)
- {
- Delay_1(2);
- if(set==0)
- {
- while(!set);
- con++;
- setkey=1;
-
- }
- switch(con)
- {
- case 1:sethumbz_h=1;sethumbz_l=0;;break;
- case 2:sethumbz_h=0;sethumbz_l=1;break;
- case 3:settembz_h=1;settembz_l=0;sethumbz_l=0;break;
- case 4:settembz_h=0;settembz_l=1;break;
- default:sethumbz_h=0;sethumbz_l=0;settembz_h=0;settembz_l=0;con=0;setkey=0;
- }
- }
- if((setup==0)&setkey)
- {
- Delay_1(5);
- while(!setup);
- if(sethumbz_h==1)
- {
- if(sethum_h<=99)
- sethum_h++;
- }
- if(settembz_h==1)
- {
- if(settem_h<=99)
- settem_h++;
- }
- if(sethumbz_l==1)
- {
- if((sethum_l<sethum_h)&(sethum_l<=99))
- sethum_l++;
- }
- if(settembz_l==1)
- {
- if((settem_l<settem_h)&(settem_l<=99))
- settem_l++;
- }
- }
- if((setdown==0)&setkey)
- {
- Delay_1(5);
- while(!setdown);
- if(sethumbz_h==1)
- {
- if((sethum_h>sethum_l)&(sethum_h>=1))
- sethum_h--;
- }
- if(settembz_h==1)
- {
- if((settem_h>settem_l)&(settem_h>=1))
- settem_h--;
- }
- if(settembz_l==1)
- {
- if(settem_l>=1)
- settem_l--;
- }
- if(sethumbz_l==1)
- {
- if(sethum_l>=1)
- sethum_l--;
- }
- }
- }
- void init_time()
- {
- TMOD=0x01 ;
- TH0=(65535-5000)/256;
- TL0=(65535-5000)%256 ;
- TR0=1 ;
- EA=1 ;
- ET0=1 ;
- }
- void main(void)
- {
- P1=0xff;
- settem_h=30 ;
- //设置高温
- settem_l=0 ;
- //设置低温
- sethum_h=70;//湿度上线报警值
- sethum_l=0;//湿度下限报警值
- lcd_init();
- lcd_pos(0);
- LCD1602PutStr("hum:"); /* 第一行显示湿度 */
- lcd_pos(7);
- LCD1602PutStr("H "); /* 上限值 */
- lcd_pos(12);
- LCD1602PutStr("L");
- lcd_pos(0x40);
- LCD1602PutStr("tem:"); /*第二行显示温度*/
- lcd_pos(0x47);
- LCD1602PutStr("H "); /* 下限值 */
- lcd_pos(0x4c);
- LCD1602PutStr("L");
- init_time();
- while(1)
- {
-
- Disp_Temperature();
- key();
- doing();
- }
- }
- time0() interrupt 1
- {
-
- i++;
- if(i==20)
- {
- RH();
- i=0;
- }
- TH0=(65535-5000)/256;
- TL0=(65535-5000)%256;
- }
复制代码
|
评分
-
查看全部评分
|