1、附录 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=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f; /数码管段码 0-
2、9unsigned char code Tab_Dig8=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/位选第一位到第八位unsigned char code units4=0x39,0x71,0x77,0x76; /单位 C/F/RH/*/* 温湿度采集函数 */*/void getdata() if(start_DHT11() read_DHT11();if(check_sum()Humi_Temp_Tab0=DHT_data.DH_H/10;Humi_Temp_Tab1=DHT_data.DH_H%10;Humi_Temp_Tab2=DHT_data.
3、DH_L/10; /存储湿度数据if(flag = 0)Humi_Temp_Tab4=DHT_data.T_H/10;Humi_Temp_Tab5=DHT_data.T_H%10;Humi_Temp_Tab6=DHT_data.T_L/10;/存储摄氏温度数据elseHumi_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_m
4、s(500); /先进行延时 等待进入稳定状态P0 = 0;P1 = 0x0C; /初始化 P1 口EA = 0;TR1 = 0;TR0 = 0;TMOD = 0x11; /设置定时器 T0 和 T1,且工作方式都为方式 1TH1 = (65536-5000)/256;TL1 = (65536-5000)%256;TH0 = (65536-2000)/256;TL0 = (65536-2000)%256; /设定初值 2msTR1 = 1;TR0 = 1;EA = 1;ET0 = 1; ET1 = 1; /打开中断定时器 T0 和 T1PT1 = 0;PT0 = 1; /强制设置优先级dela
5、y_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;delay_ms(10);bee = 1;delay_ms(10);/*/* 定时器 T0 中断 */*/void T0_timer() interrupt 1unsigned char KData = 0x00;TR0 = 0; /进入 T0 后将 T0 中断关闭TH0 = (65536-2000)/256;TL0 = (65536
6、-2000)%256;switch(numt0)case 0:P0 = 0; Seg_ce = 1; Seg_ce = 0; /段选开关if(flag2 = 1)P0 = Tab_Segrange0/10; /显示湿度下限的十位elseP0 = Tab_SegHumi_Temp_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_Seg
7、range0%10; /显示湿度下限的个位elseP0 = Tab_SegHumi_Temp_Tab1; /显示读取的湿度的个位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;/显示湿度上限的十位elseP0 = units2;/显示单位 RSeg_ce = 1; Seg_ce = 0; P0 = Tab_Dig2; /位选第三位Dig_c
8、e = 1; Dig_ce = 0;numt0+;break;case 3:P0 = 0; Seg_ce = 1; Seg_ce = 0;if(flag2 = 1)P0 = Tab_Segrange1%10; /显示湿度上限的个位elseP0 = units3; /显示单位 HSeg_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; /位选第五位,且同时拉低键盘第四行Dig_ce = 1;
9、 Dig_ce = 0;Key_ce = 0;KData = P0; /扫描键盘第四行switch(KData)case 0xfe: case 0xfd: case 0xfb: case 0xf7: default:break;while(KData != 0xff)KData = P0;Key_ce = 1; if(flag2 = 1)P0 = Tab_Segrange2/10;/显示温度下限的十位elseP0 = Tab_SegHumi_Temp_Tab4; /显示读取的温度的十位Seg_ce = 1; Seg_ce = 0;numt0+;break;case 5:P0 = 0; Seg_
10、ce = 1; Seg_ce = 0;P0 = Tab_Dig5;/位选第六位,且同时拉低键盘第三行Dig_ce = 1; Dig_ce = 0;Key_ce = 0;KData = P0;/扫描键盘第三行switch(KData)case 0xfe:if(range020break; /湿度下限减case 0xfd:if(range00break; /温度下限减case 0xf7:if(range2/*/* 引 脚 定 义 */*/sbit DHT_bus = P20 ; /DHT11 数据传输口sbit Key_ce=P13; /按键输出使能sbit Seg_ce=P10; /段选位sbi
11、t Dig_ce=P11; /位选位sbit bee = P21; /蜂鸣器控制口/*/* 函 数 声 明 */*/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 /高电平维持时间,用于识
12、别“数据 0”和“数据 1”bit flag2 = 0; /设置调节上下限模式转换标志bit flag=0; /设置摄氏和华氏温度模式转换标志/*/* 结 构 体 */*/struct DHT_dataunsigned char DH_H; /湿度整数unsigned char DH_L; /湿度小数unsigned char T_H; /温度整数unsigned char T_L; /温度小数unsigned char Checksum; /校验和DHT_data;#endif#include “DHT11.h“#include /*/* 开始 DHT11 温湿度计 */* 输入:无 */*
13、 输出:应答标志 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();delay_20us(); /拉高 2040uswhile(!DHT_bus)DHT_start = 1; /DHT 应答,DHT 拉低 80us 后拉高 80us,然后开始传输数据/数据(40bit)=8bit 湿度整数+8bit 湿度小数+8bit 温度整数+8
14、bit 温度小数+8bit 校验和while(DHT_bus);return(DHT_start); /应答成功返回 1/*/* 读取 DHT11 温湿度计 */* 读取结果存在 DHT_data 结构体内 */* 输入:无 输出:无 */*/void read_DHT11(void)unsigned char m,n,timer_dht;unsigned char *p;p= /数据放在 DHT_date 的结构体中for(m=0;mDHT_timeover)*p=1;*p|=0x01;else*p=1;*pp+;TR0 = 1;/*/* 20us 精 确 延 时 */* 51 用在 12M
15、hz 晶振下 */* 调用函数使用 LCALL 和 RET 指令,共花费 4 个周期 */* 因此只有 16 个 NOP */*/void delay_20us(void)_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();_nop_ ();/*/* N ms 延 时 */* while()额外占用约 5 周期 */* 因此内层 while(40-)20us 大约 1ms */*
16、 Nms 延时函数(未测试) */*/void 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); /校验正确elsereturn(0); /校验失败