《2022年温湿度检测器DHT程序及显示程序 .pdf》由会员分享,可在线阅读,更多相关《2022年温湿度检测器DHT程序及显示程序 .pdf(14页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 . Word 资料附录 1:#include #include #include DHT11.H #include DHT11.C unsigned char range4=55,75,10,30; / 温湿度上下限初值unsigned char Humi_Temp_Tab8=6,9,0,0,7,8,0,0; / 数码管显示初值unsigned char numt1=0; /T1中断计数标志unsigned char numt0=0; unsigned char code Tab_Seg10=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0
2、x7f,0 x6f; /数码管段码 0-9 unsigned char code Tab_Dig8=0 x7f,0 xbf,0 xdf,0 xef,0 xf7,0 xfb,0 xfd,0 xfe; /位选第一位到第八位unsigned char code units4=0 x39,0 x71,0 x77,0 x76; /单位 C/F/RH /*/ /* 温湿度采集函数 */ /*/ void getdata() if(start_DHT11() read_DHT11(); if(check_sum() Humi_Temp_Tab0=DHT_data.DH_H/10; Humi_Temp_Tab
3、1=DHT_data.DH_H%10; Humi_Temp_Tab2=DHT_data.DH_L/10; / 存储湿度数据if(flag = 0) Humi_Temp_Tab4=DHT_data.T_H/10; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - . Word 资料Humi_Temp_Tab5=DHT_data.T_H%10; Humi_Temp_Tab6=DHT_data.T_L/10; /存储摄氏温度数据 el
4、se Humi_Temp_Tab4=(9*DHT_data.T_H/5+32)/10; Humi_Temp_Tab5=(9*DHT_data.T_H/5+32)%10; Humi_Temp_Tab6=(18*DHT_data.T_H+320)%100%10; /存储华氏温度数据 /*/ /* 主函数 */ /*/ void main() delay_ms(500); / 先进行延时等待进入稳定状态P0 = 0; P1 = 0 x0C; / 初始化 P1 口EA = 0; TR1 = 0; TR0 = 0; TMOD = 0 x11; / 设置定时器 T0 和 T1,且工作方式都为方式1 TH1
5、 = (65536-5000)/256; TL1 = (65536-5000)%256; TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; / 设定初值 2ms 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - . Word 资料TR1 = 1; TR0 = 1; EA = 1; ET0 = 1; ET1 = 1; / 打开中断定时器T0 和 T1 PT1 = 0; PT0 = 1;
6、 / 强制设置优先级delay_ms(1000); while(1) if(DHT_data.DH_Hrange1) / 湿度大于上限 bee = 0; delay_ms(100); bee = 1; delay_ms(100); if(DHT_data.T_Hrange3) / 温度大于上限 bee = 0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - . Word 资料delay_ms(10); bee = 1; de
7、lay_ms(10); /*/ /* 定时器 T0 中断 */ /*/ void T0_timer() interrupt 1 unsigned char KData = 0 x00; TR0 = 0; / 进入 T0 后将 T0 中断关闭TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; switch(numt0) case 0: P0 = 0; Seg_ce = 1; Seg_ce = 0; / 段选开关if(flag2 = 1) P0 = Tab_Segrange0/10; / 显示湿度下限的十位else P0 = Tab_SegHumi_Te
8、mp_Tab0; / 显示读取的湿度的十位Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig0; / 位选第一位Dig_ce = 1; Dig_ce = 0; numt0+;break; case 1: P0 = 0; Seg_ce = 1; Seg_ce = 0; if(flag2 = 1) P0 = Tab_Segrange0%10; / 显示湿度下限的个位else P0 = Tab_SegHumi_Temp_Tab1; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - -
9、- - 第 4 页,共 14 页 - - - - - - - - - . Word 资料 / 显示读取的湿度的个位Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig1; / 位选第二位Dig_ce = 1; Dig_ce = 0; numt0+;break; case 2: P0 = 0; Seg_ce = 1; Seg_ce = 0; if(flag2 = 1) P0 = Tab_Segrange1/10; / 显示湿度上限的十位else P0 = units2; / 显示单位 R Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig2; / 位选第
10、三位Dig_ce = 1; Dig_ce = 0; numt0+;break; case 3: P0 = 0; Seg_ce = 1; Seg_ce = 0; if(flag2 = 1) P0 = Tab_Segrange1%10; / 显示湿度上限的个位else P0 = units3; / 显示单位 H Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig3; / 位选第四位 Dig_ce = 1; Dig_ce = 0; numt0+;break; case 4: P0 = 0; Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig4; / 位选第
11、五位,且同时拉低键盘第四行Dig_ce = 1; Dig_ce = 0; Key_ce = 0; KData = P0; / 扫描键盘第四行switch(KData) case 0 xfe: case 0 xfd: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - . Word 资料case 0 xfb: case 0 xf7: default:break; while(KData != 0 xff) KData = P0; K
12、ey_ce = 1; if(flag2 = 1) P0 = Tab_Segrange2/10; / 显示温度下限的十位else P0 = Tab_SegHumi_Temp_Tab4; / 显示读取的温度的十位Seg_ce = 1; Seg_ce = 0; numt0+;break; case 5: P0 = 0; Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig5; / 位选第六位,且同时拉低键盘第三行Dig_ce = 1; Dig_ce = 0; Key_ce = 0; KData = P0; / 扫描键盘第三行switch(KData) case 0 xfe:if(
13、range0range1&flag2=1) range0+;break; / 湿度下限加case 0 xfd:if(range190&flag2=1) range1+;break; / 湿度上限加case 0 xfb:if(range2range3&flag2=1 range2+;break; / 温度下限加 case 0 xf7:if(range320&flag2=1) range0-;break; / 湿度下限减case 0 xfd:if(range00&flag2=1) range2-;break; / 温度下限减case 0 xf7:if(range2range3&flag2=1) r
14、ange3-;break; / 温度上限减default:break; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 14 页 - - - - - - - - - . Word 资料 while(KData != 0 xff) KData = P0; Key_ce = 1; if(flag2 = 1) P0 = Tab_Segrange3/10; /显示温度上限的十位else P0 = Tab_SegHumi_Temp_Tab6; /显示读取温度的小数位的十位 Seg_
15、ce = 1; Seg_ce = 0; numt0+;break; case 7: P0 = 0; Seg_ce = 1; Seg_ce = 0; P0 = Tab_Dig7; /位选第八位,且同时拉低键盘第一行 Dig_ce = 1; Dig_ce = 0; Key_ce = 0; KData = P0; / 扫描键盘第一行switch(KData) case 0 xfe:flag2 = flag2;TR1 = TR1;break; /进入和退出限制调整模式case 0 xfd:flag = flag;break; /进行华氏摄氏温度的转换设置case 0 xfb: case 0 xf7:
16、default:break; while(KData != 0 xff) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - . Word 资料KData = P0; Key_ce = 1; if(flag = 0&flag2 = 0) P0 = units0; / 显示单位 C else if(flag = 1&flag2 = 0) P0 = units1; / 显示单位F else if(flag2 = 1) P0 = Tab
17、_Segrange3%10; /显示温度上限的个位Seg_ce = 1; Seg_ce = 0; numt0 = 0;break; default:numt0 = 0;break; TR0 = 1; / 打开 T0 /*/ /* 定时器 T1 中断 */ /*/ void T1_timer() interrupt 3 TR1 = 0; / 关闭 T0 TH1 = (65536-50000)/256; TL1 = (65536-50000)%256; if(numt1 = 25) getdata(); / 采集数据numt1 = 0; else numt1+; TR1 = 1; / 打开 T0
18、名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 14 页 - - - - - - - - - . Word 资料#ifndef _DHT11_h_ #define _DHT11_h_ #include /*/ /* 引脚 定 义 */ /*/ sbit DHT_bus = P20 ; /DHT11数据传输口sbit Key_ce=P13; / 按键输出使能sbit Seg_ce=P10; /段选位sbit Dig_ce=P11; /位选位sbit bee = P21; /
19、 蜂鸣器控制口/*/ /* 函数 声 明 */ /*/ bit start_DHT11(void); / 开始void read_DHT11(void); / 读取void delay_20us(void); /20us延时void delay_ms(unsigned char m); /N ms延时bit check_sum(void); /和校验/*/ /* 宏 定义 */ /*/ #define HIGH 1 #define LOW 0 /*/ /* 变量 定 义 */ /*/ #define DHT_timeover 5 / 高电平维持时间,用于识别“数据0”和“数据 1”bit fl
20、ag2 = 0; /设置调节上下限模式转换标志bit flag=0; / 设置摄氏和华氏温度模式转换标志名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - . Word 资料/*/ /* 结 构体 */ /*/ struct DHT_data unsigned char DH_H; /湿度整数 unsigned char DH_L; /湿度小数 unsigned char T_H; /温度整数 unsigned char T_L
21、; /温度小数 unsigned char Checksum; /校验和DHT_data; #endif #include DHT11.h #include /*/ /* 开始 DHT11 温湿度计 */ /* 输入:无 */ /* 输出:应答标志 0 :应答失败 1:应答成功 */ /*/ bit start_DHT11(void) bit DHT_start; DHT_start = 0; DHT_bus = HIGH; DHT_bus = LOW; / 拉低 18ms 以上 delay_ms(18); TR0 = 0; DHT_bus = HIGH; delay_20us(); dela
22、y_20us(); /拉高 2040us while(!DHT_bus) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页 - - - - - - - - - . Word 资料 DHT_start = 1; /DHT应答, DHT 拉低 80us 后拉高 80us ,然后开始传输数据 /数据 (40bit)=8bit湿度整数 +8bit湿度小数 +8bit温度整数 +8bit 温度小数 +8bit校验和 while(DHT_bus); return(DHT_s
23、tart); /应答成功返回1 /*/ /* 读取 DHT11 温湿度计 */ /* 读取结果存在DHT_data结构体内 */ /* 输入:无输出:无 */ /*/ void read_DHT11(void) unsigned char m,n,timer_dht; unsigned char *p; p=&DHT_data.DH_H; / 数据放在 DHT_date的结构体中 for(m=0;m5;m+) for(n=0;nDHT_timeover) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
24、- - - - 第 12 页,共 14 页 - - - - - - - - - . Word 资料 *p=1; *p|=0 x01; else *p=1; *p&=0 xfe; p+; TR0 = 1; /*/ /* 20us 精 确 延 时 */ /* 51用在 12Mhz晶振下 */ /* 调用函数使用LCALL 和 RET 指令,共花费4 个周期 */ /* 因此只有 16 个 NOP */ /*/ void delay_20us(void) _nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ (); _nop_ ();_nop_ ();_nop_ ();
25、_nop_ ();_nop_ (); _nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ (); _nop_ (); /*/ /* N ms 延 时 */ /* while()额外占用约 5 周期 */ /* 因此内层 while(40-)20us 大约 1ms */ /* Nms延时函数 (未测试 ) */ /*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - . Word 资料void
26、delay_ms(unsigned char m) unsigned char n = 38; while(m-) while(n-) delay_20us(); /*/ /* 校 验 和 判 断 */ /* 校验位 = 湿度整数位 + 湿度小数位 + 温度整数位 + 温度小数位之和 */ /* 校验正确返回 :1 失败返回: 0 */ /*/ bit check_sum(void) if(DHT_data.Checksum=(DHT_data.DH_H+DHT_data.DH_L+DHT_data.T_H+DHT_data.T_L) return(1); /校验正确else return(0); /校验失败 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -