DHT11温湿度 传感器设计报告 院系:信息工程与科学学院 电气工程学院 专业:电子信息工程,自动化 年级:2014,2015 学生姓名:文*成,严*喜

二、实物图




五、硬件设计分析以及使用 1、程序通过usb数据线烧写到单片机,单片机凹口靠usb下载口插入单片机底座,数据下载分别与单片机3.0和3.1(TXD和RXD)连接; 2、自锁开关未电源开关,按下通电,按起断电; 3、lcd1604引脚1接口靠usb下载口,对应引脚插入lcd1604液晶,液晶v0引脚接高精度电位器,液晶亮度可旋转电位器调节,液晶DB0到DB7接口连接单片机的P0引脚,RS,RW和E分别连接单片机的P2^5,P2^6和P2^7引脚; 4、8550三极管基极通过100欧电阻后与单片机P2^4引脚连接,发射极接vcc,集电极与蜂鸣器正极连接,蜂鸣器负极接地,当有信号触发三极管懂啊同后,蜂鸣器发出响声,集电极与蜂鸣器之间有跳线帽,拔开跳线帽则与蜂鸣器断开,有无信号蜂鸣器均不会响; 5、DHT11的数据引脚与单片机的P3^6引脚连接,负极与单片机的P3^7引脚连接,且又与电源负极连接,连接之间有跳线帽,拔开后可通过单片机控制DHT11的工作和停止工作,正极与电源正极相连 6、5个电容按键从左到右,从上之下分别是时间设置按键,时间”+”按键,湿度设置按键,湿度”+”按键,系统复位按键。通电后,液晶显示,第一行是时间设置数值,初始值为0,第二行是本产品实际工作时间,第三行是当前湿度以及设定控制湿度值,控制湿度值初始为0,第四行为当前温度值。当时间设置键按下,光标闪烁,工作时间停止,按时间”+”按键设置指定工作时间,按一次进入秒设置,第二次分设置,第三次时设置,第四次设置完成,退出时间设置;同理,湿度设置,按一次进入设置,再按一次设置完毕,退出湿度设置;当时间到了设定值,蜂鸣器则发出响声,当湿度低于设定值,蜂鸣器也会发出响声。
四、程序 - #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define unint unsigned int
- unsigned char code str4[12] ={' ',' ','0','0',':','0','0',':','0','0',' ',' '};
- unsigned char code str1[] ={"alarm:00:00:00"};
- //unsigned char num1[]={""};
- //unsigned char num2[]={""};
- unsigned char code dis1[] = {"RH: "};
- unsigned char code dis2[] = {"T: "};
- uchar numble,count,hour,minute,sound;
- int hours,minutes,sounds,flag,key1num;
- uchar TH_data,TL_data,RH_data,RL_data,CK_data;
- uchar TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
- uchar com_data,untemp,temp;
- uchar respond;
- uchar RH_shu,rhflag,key2num;
-
- sbit TRH = P3^6;//温湿度传感器DHT11数据接入
- sbit LCD_RS = P2^5;
- sbit LCD_RW = P2^6;
- sbit LCD_EN = P2^7;
- sbit key1 = P1^0; //时间调整选择按钮
- sbit key2 = P1^2; //时间加按钮
- sbit key3 = P3^2; //湿度调整选择按钮
- sbit key4 = P3^5; //湿度加按钮
- sbit beep = P2^4; //时间报警
- sbit alarm = P1^1; //湿度报警
- void write_time(uchar time,uchar x);
- void write_time1(uchar time,uchar x);
- /*********************************************************************************/
- void timer() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- count++;
- if(count==20)
- {
- count=0;
- sound++;
- if(sound==60)
- {
- sound=0;
- minute++;
- if(minute==60)
- {
- minute=0;
- hour++;
- if(hour==24)
- {
- hour = 0;
- }
- write_time(hour,4);
- }
- write_time(minute,7);
- }
- write_time(sound,10);
- }
-
- }
- void delay(unint k)
- {
- unint x,y;
- for(x=k;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delayNOP()
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*********************************************************************************/
- /*********************************************************************************/
- // 毫秒级延时子程序
- /*********************************************************************************/
- void delay_ms(unsigned char ms)
- {
- unsigned char i;
- while(ms--)
- {
- for(i = 0; i< 150; i++)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- }
- }
- /*********************************************************************************/
- /*********************************************************************************/
- //5us级延时程序
- /*********************************************************************************/
- void delay_us()
- {
- uchar 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;
- delayNOP();
- result=(bit)(P0&0x80);
- LCD_EN = 0;
- return(result);
- }
- /*******************************************************************************/
- /*******************************************************************************/
- // 写入指令数据到LCD
- /*******************************************************************************/
- void lcd_wcmd(unsigned char cmd)
- {
- while(lcd_busy());
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 0;
- _nop_();
- _nop_();
- P0 = cmd;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /*****************************************************************************/
- /*****************************************************************************/
- //写显示数据到LCD
- //RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
- /*****************************************************************************/
- void lcd_wdata(unsigned char dat)
- {
- while(lcd_busy());
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 0;
- P0 = dat;
- delayNOP();
- LCD_EN = 1;
- delayNOP();
- LCD_EN = 0;
- }
- /****************************************************************************/
- /****************************************************************************/
- //LCD初始化设定
- /****************************************************************************/
- void lcd_init()
- {
- // delay_ms(15);
- lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
- // delay_ms(5);
- lcd_wcmd(0x38);
- // delay_ms(5);
- lcd_wcmd(0x38);
- // delay_ms(5);
- lcd_wcmd(0x0c); //显示开,关光标
- // delay_ms(5);
- lcd_wcmd(0x06); //移动光标
- // delay_ms(5);
- //lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
- //delay_ms(5);
- lcd_wcmd(0x80+0x40+2);
- for(numble=0;numble<10;numble++)
- {
- lcd_wdata(str4[numble]);
- }
- lcd_wcmd(0x80+1);
- for(numble=0;numble<14;numble++)
- {
- lcd_wdata(str1[numble]);
- }
- lcd_wcmd(0x90+11);
- lcd_wdata('0');
- lcd_wdata('0');
- lcd_wdata('%');
- lcd_wdata('R');
- lcd_wdata('H');
- TMOD = 0x01;
- TH0 = (65536-50000)/256;
- TL0 = (65536-50000)%256;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- /****************************************************************************/
- void write_time(uchar time,uchar x)
- {
- uchar shi , ge;
- shi = time/10;
- ge = time%10;
- lcd_wcmd(0x80+0x40+x);
- lcd_wdata(0x30+shi);
- lcd_wdata(0x30+ge);
- }
- void write_time1(uchar time,uchar x)
- {
- uchar shi , ge;
- shi = time/10;
- ge = time%10;
- lcd_wcmd(0x80+x);
- lcd_wdata(0x30+shi);
- lcd_wdata(0x30+ge);
- }
- void write_rh(uchar time,uchar x)
- {
- uchar shi , ge;
- shi = time/10;
- ge = time%10;
- lcd_wcmd(0x90+x);
- lcd_wdata(0x30+shi);
- lcd_wdata(0x30+ge);
- }
- /****************************************************************************/
- void keyscan()
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- key1num++;
- while(!key1);
- switch(key1num)
- {
- case 1:
- TR0 = 0;
- lcd_wcmd(0x80+13);
- lcd_wcmd(0x0f);
- break;
- case 2:
- lcd_wcmd(0x80+10);
- lcd_wcmd(0x0f);
- break;
- case 3:
- lcd_wcmd(0x80+7);
- lcd_wcmd(0x0f);
- break;
- case 4:
- TR0 = 1;
- lcd_wcmd(0x0c);
- key1num = 0;
- flag=1;
- break;
- }
- }
- }
- if(key1num!=0)
- {
- if(key2 == 0)
- {
- delay(5);
- if(key2 == 0)
- {
- while(!key2);
- switch(key1num)
- {
- case 1:
- sounds++;
- if(sounds==60)
- sounds=0;
- write_time1(sounds,13);
- lcd_wcmd(0x80+13);
- break;
- case 2:
- minutes++;
- if(minutes==60)
- minutes=0;
- write_time1(minutes,10);
- lcd_wcmd(0x80+10);
- break;
- case 3:
- hours++;
- if(hours==24)
- hours=0;
- write_time1(hours,7);
- lcd_wcmd(0x80+7);
- break;
- }
- }
- }
- }
- if(hour==hours&&minute==minutes&&sound==sounds&&flag==1)
- {
- beep = 0;
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- key2num++;
- while(!key3);
- switch(key2num)
- {
- case 1:
- lcd_wcmd(0x90+12);
- lcd_wcmd(0x0f);
- break;
- case 2:
- rhflag=1;
- case 3:
- key2num=0;
- lcd_wcmd(0x0c);
- break;
- }
- }
- }
- if(key2num!=0)
- {
- if(key4==0)
- {
- delay(5);
- if(key4==0)
- {
- while(!key4);
- switch(key2num)
- {
- case 1:
- RH_shu++;
- if(RH_shu==100)
- RH_shu=0;
- write_rh(RH_shu,11);
- // rhflag = 1;
- break;
- }
- }
- }
- }
- }
- //设定LCD显示位置
- /****************************************************************************/
- void lcd_dis_pos(unsigned char pos)
- {
- lcd_wcmd(pos | 0x90); //数据指针=80+地址变量
- }
- /****************************************************************************/
- /****************************************************************************/
- //收发信号检测,数据读取
- /****************************************************************************/
- char receive()
- {
- uchar i;
- com_data=0;
- for(i=0;i<=7;i++)
- {
- respond=2;
- while((!TRH)&&respond++);
- delay_us();
- delay_us();
- delay_us();
- if(TRH)
- {
- temp=1;
- respond=2;
- while((TRH)&&respond++);
- }
- else
- temp=0;
- com_data<<=1;
- com_data|=temp;
- }
- return(com_data);
- }
- /****************************************************************************/
- /****************************************************************************/
- //湿度读取子程序
- //温度高8位== TL_data
- //温度低8位== TH_data
- //湿度高8位== RH_data
- //湿度低8位== RH_data
- //校验 8位 == CK_data
- //调用的程序有 delay();, Delay_5us();,RECEIVE();
- /***************************************************************************/
- void read_TRH()
- {
- //主机拉低18ms
- TRH=0;
- delay_ms(18);
- TRH=1;
- //DATA总线由上拉电阻拉高 主机延时20us
- delay_us();
- delay_us();
- delay_us();
- delay_us();
- //delay_us();
- //delay_us();delay_us();delay_us();delay_us();
- //主机设为输入 判断从机响应信号
- TRH=1;
- //判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
- if(!TRH)
- {
- respond=2; //判断DHT11发出 80us 的低电平响应信号是否结束
- while((!TRH)&& respond++);
- respond=2; //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
- while(TRH && respond++); //数据接收状态
- RH_temp = receive();
- RL_temp = receive();
- TH_temp = receive();
- TL_temp = receive();
- CK_temp = receive();
- TRH=1; //数据校验
- untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
- if(untemp==CK_temp)
- {
- RH_data = RH_temp;
- RL_data = RL_temp;
- TH_data = TH_temp;
- TL_data = TL_temp;
- CK_data = CK_temp;
- }
- }
- }
- void lcd_display()
- {
- lcd_dis_pos(0x03);
- lcd_wdata(0x30+RH_data/10);
- lcd_dis_pos(0x04);
- lcd_wdata(0x30+RH_data%10);
- lcd_dis_pos(0x05);
- lcd_wdata(0x2e);
- lcd_dis_pos(0x06);
- lcd_wdata(0x30+RL_data%10);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码 完整的Word格式文档51黑下载地址:
DHT11设计报告.docx
(1.15 MB, 下载次数: 154)
|