温湿度检测器DHT11程序及显示程序Word下载.docx
- 文档编号:16813222
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:15
- 大小:18.75KB
温湿度检测器DHT11程序及显示程序Word下载.docx
《温湿度检测器DHT11程序及显示程序Word下载.docx》由会员分享,可在线阅读,更多相关《温湿度检测器DHT11程序及显示程序Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
{
Humi_Temp_Tab[4]=DHT_data.T_H/10;
Humi_Temp_Tab[5]=DHT_data.T_H%10;
Humi_Temp_Tab[6]=DHT_data.T_L/10;
//存储摄氏温度数据
}
else
Humi_Temp_Tab[4]=(9*DHT_data.T_H/5+32)/10;
Humi_Temp_Tab[5]=(9*DHT_data.T_H/5+32)%10;
Humi_Temp_Tab[6]=(18*DHT_data.T_H+320)%100%10;
//存储华氏温度数据
}
}
/*主函数*/
/**********************************************/
voidmain()
{
delay_ms(500);
//先进行延时等待进入稳定状态
P0=0;
P1=0x0C;
//初始化P1口
EA=0;
TR1=0;
TR0=0;
TMOD=0x11;
//设置定时器T0和T1,且工作方式都为方式1
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
//设定初值2ms
TR1=1;
TR0=1;
EA=1;
ET0=1;
ET1=1;
//打开中断定时器T0和T1
PT1=0;
PT0=1;
//强制设置优先级
delay_ms(1000);
while
(1)
if(DHT_data.DH_H<
range[0])//湿度小于下限
bee=0;
delay_ms(100);
bee=1;
if(DHT_data.DH_H>
range[1])//湿度大于上限
if(DHT_data.T_H<
range[2])//温度小于下限
delay_ms(10);
if(DHT_data.T_H>
range[3])//温度大于上限
/*定时器T0中断*/
voidT0_timer()interrupt1
unsignedcharKData=0x00;
//进入T0后将T0中断关闭
switch(numt0)
case0:
Seg_ce=1;
Seg_ce=0;
//段选开关
if(flag2==1)
P0=Tab_Seg[range[0]/10];
//显示湿度下限的十位
else
P0=Tab_Seg[Humi_Temp_Tab[0]];
//显示读取的湿度的十位
Seg_ce=1;
P0=Tab_Dig[0];
//位选第一位
Dig_ce=1;
Dig_ce=0;
numt0++;
break;
case1:
P0=Tab_Seg[range[0]%10];
//显示湿度下限的个位
P0=Tab_Seg[Humi_Temp_Tab[1]];
//显示读取的湿度的个位
P0=Tab_Dig[1];
//位选第二位
case2:
P0=Tab_Seg[range[1]/10];
//显示湿度上限的十位
P0=units[2];
//显示单位R
P0=Tab_Dig[2];
//位选第三位
case3:
P0=Tab_Seg[range[1]%10];
//显示湿度上限的个位
P0=units[3];
//显示单位H
Seg_ce=1;
P0=Tab_Dig[3];
//位选第四位
case4:
P0=Tab_Dig[4];
//位选第五位,且同时拉低键盘第四行
Key_ce=0;
KData=P0;
//扫描键盘第四行
switch(KData)
{
case0xfe:
case0xfd:
case0xfb:
case0xf7:
default:
}
while(KData!
=0xff)
KData=P0;
Key_ce=1;
P0=Tab_Seg[range[2]/10];
//显示温度下限的十位
P0=Tab_Seg[Humi_Temp_Tab[4]];
//显示读取的温度的十位
case5:
P0=Tab_Dig[5];
//位选第六位,且同时拉低键盘第三行
//扫描键盘第三行
if(range[0]<
range[1]&
&
flag2==1)
range[0]++;
//湿度下限加
if(range[1]<
90&
flag2==1)range[1]++;
//湿度上限加
if(range[2]<
range[3]&
flag2==1
range[2]++;
//温度下限加
case0xf7:
if(range[3]<
50&
flag2==1)range[3]++;
//温度上限加
P0=Tab_Seg[range[2]%10];
//显示温度下限的个位
P0=Tab_Seg[Humi_Temp_Tab[5]]-0x80;
//显示读取温度的个位(带小数点的)
case6:
P0=Tab_Dig[6];
//位选第七位,且同时拉低键盘第二行
//扫描键盘第二行
if(range[0]>
20&
flag2==1)
range[0]--;
//湿度下限减
range[1]--;
//湿度上限减
if(range[2]>
0&
flag2==1)
range[2]--;
//温度下限减
range[3]--;
//温度上限减
P0=Tab_Seg[range[3]/10];
//显示温度上限的十位
P0=Tab_Seg[Humi_Temp_Tab[6]];
//显示读取温度的小数位的十位
case7:
P0=Tab_Dig[7];
//位选第八位,且同时拉低键盘第一行
Dig_ce=1;
//扫描键盘第一行
flag2=~flag2;
TR1=~TR1;
//进入和退出限制调整模式
flag=~flag;
//进行华氏摄氏温度的转换设置
if(flag==0&
flag2==0)
P0=units[0];
//显示单位C
elseif(flag==1&
P0=units[1];
//显示单位F
elseif(flag2==1)
P0=Tab_Seg[range[3]%10];
//显示温度上限的个位
numt0=0;
default:
numt0=0;
//打开T0
/**********************************************/
/*定时器T1中断*/
voidT1_timer()interrupt3
//关闭T0
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(numt1==25)
getdata();
//采集数据
numt1=0;
else
numt1++;
//打开T0
#ifndef__DHT11_h__
#define__DHT11_h__
REGX52.H>
/*引脚定义*/
sbitDHT_bus=P2^0;
//DHT11数据传输口
sbitKey_ce=P1^3;
//按键输出使能
sbitSeg_ce=P1^0;
//段选位
sbitDig_ce=P1^1;
//位选位
sbitbee=P2^1;
//蜂鸣器控制口
/*函数声明*/
bitstart_DHT11(void);
//开始
voidread_DHT11(void);
//读取
voiddelay_20us(void);
//20us延时
voiddelay_ms(unsignedcharm);
//Nms延时
bitcheck_sum(void);
//和校验
/*宏定义*/
#defineHIGH1
#defineLOW0
/*变量定义*/
#defineDHT_timeover5//高电平维持时间,用于识别“数据0”和“数据1”
bitflag2=0;
//设置调节上下限模式转换标志
bitflag=0;
//设置摄氏和华氏温度模式转换标志
/*结构体*/
structDHT_data
unsignedcharDH_H;
//湿度整数
unsignedcharDH_L;
//湿度小数
unsignedcharT_H;
//温度整数
unsignedcharT_L;
//温度小数
unsignedcharChecksum;
//校验和
}DHT_data;
#endif
DHT11.h"
/*开始DHT11温湿度计*/
/*输入:
无*/
/*输出:
应答标志0:
应答失败1:
应答成功*/
bitstart_DHT11(void)
bitDHT_start;
DHT_start=0;
DHT_bus=HIGH;
DHT_bus=LOW;
//拉低18ms以上
delay_ms(18);
delay_20us();
//拉高20~40us
while(!
DHT_bus)
DHT_start=1;
}//DHT应答,DHT拉低80us后拉高80us,然后开始传输数据
//数据(40bit)=8bit湿度整数+8bit湿度小数+8bit温度整数+8bit
温度小数+8bit校验和
while(DHT_bus){};
return(DHT_start);
//应答成功返回1
/*读取DHT11温湿度计*/
/*读取结果存在DHT_data结构体内*/
无输出:
无*/
voidread_DHT11(void)
unsignedcharm,n,timer_dht;
unsignedchar*p;
p=&
DHT_data.DH_H;
//数据放在DHT_date的结构体中
for(m=0;
m<
5;
m++)
for(n=0;
n<
8;
n++)
while(~DHT_bus);
//DHT拉低12-14us表示1bit数据开始
timer_dht=0x00;
while(DHT_bus)//随后DHT拉高总线,单片机通过高电
平维持的时间判断“数据0”还是“数据1”
{//数据0维持26~28us高电平,数据1维持116~118us高电平
timer_dht++;
//由于此处对延时时间的
长度要求很高,所以采用另一种办法判断
}
if(timer_dht>
DHT_timeover)
{
*p<
<
=1;
*p|=0x01;
else
*p&
=0xfe;
p++;
/*20us精确延时*/
/*51用在12Mhz晶振下*/
/*调用函数使用LCALL和RET指令,共花费4个周期*/
/*因此只有16个NOP*/
voiddelay_20us(void)
_nop_();
_nop_();
/*Nms延时*/
/*while()额外占用约5周期*/
/*因此内层while(40--)20us大约1ms*/
/*Nms延时函数(未测试)*/
/***************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温湿度 检测器 DHT11 程序 显示