单片机温度湿度控制程序dht11文档格式.docx
《单片机温度湿度控制程序dht11文档格式.docx》由会员分享,可在线阅读,更多相关《单片机温度湿度控制程序dht11文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![单片机温度湿度控制程序dht11文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/24/6f4e79aa-f9d1-49bd-81ba-ba17d3b8c537/6f4e79aa-f9d1-49bd-81ba-ba17d3b8c5371.gif)
voiddelay(uintx)//
{
uinta,b;
for(a=x;
a>
0;
a--)
for(b=10;
b>
b--);
}
voiddelay1(uintx)//延时程序
for(b=100;
voidwrite_com(ucharcom)//液晶写指令操作
P0=com;
rs=0;
lcden=0;
delay(10);
lcden=1;
voidwrite_date(uchardate)//液晶写数据操作
P0=date;
rs=1;
voidinit()//液晶初始化
write_com(0x38);
delay
(1);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
voidLCD_Display(ucharbuff1[],ucharbuff2[])//液晶显示程序
ucharaa;
init();
//液晶初始化
write_com(0x80+16);
//写入第一行数据指令
for(aa=0;
aa<
16;
aa++)//写入第一行待显示数据
{
write_date(buff1[aa]);
}
write_com(0xc0+16);
//写入第二行数据指令
for(aa=0;
write_date(buff2[aa]);
aa++)
write_com(0x18);
delay
(1);
}
voidTem_Ch(ucharAA,ucharnn)//T门限数值替换
switch(AA)
case0:
table0[nn]='
0'
break;
case1:
1'
case2:
2'
case3:
3'
case4:
4'
case5:
5'
case6:
6'
case7:
7'
case8:
8'
case9:
9'
}
voidHum_Ch(ucharBB,ucharmm)//H门限数值替换
switch(BB)
table1[mm]='
///////////
voidYZ_Resh()//门限值更新
ucharA1,A2,A3;
A1=TM/10;
//取十位
A2=TM%10;
//取个位
A3=0;
Tem_Ch(A1,11);
//写入对应的液晶显示缓存
Tem_Ch(A2,12);
Tem_Ch(A3,14);
A1=HM/10;
A2=HM%10;
Hum_Ch(A1,11);
Hum_Ch(A2,12);
Hum_Ch(A3,14);
voidkey_test()//按键检测
/*根据按键的检测结果进行温度湿度门限值的设定*/
bitkk1;
bitkk2;
bitkk3;
bitkk4;
uchartemp;
k1=0;
k2=1;
k3=1;
k4=1;
kk1=k1;
kk2=k2;
kk3=k3;
kk4=k4;
if(kk3!
=1)
delay1(100);
=1)//若可开=0且持续一段时间后任然为0,则执行有关操作
temp=P3;
//按键一操作
TM=TM+1;
//提高温度门限值
YZ_Resh();
////更新液晶显示缓存的门限值
LCD_Display(table0,table1);
//液晶显示数值
if(kk4!
//按键二操作
TM=TM-1;
//降低温度门限值
LCD_Display(table0,table1);
k1=1;
k2=0;
//按键三操作
HM=HM+1;
//提高湿度门限
//更新液晶显示缓存的门限值
//按键四操作
HM=HM-1;
//降低湿度门限
voidTempAndHumi_Resh()//更新液晶显示缓存中的温度湿度数值
/*根据测得的结果将液晶显示缓存中的数据进行替换*/
ucharge,shi,bai;
ge=temp_value%10;
shi=temp_value%100/10;
bai=temp_value%1000/100;
Tem_Ch(bai,2);
Tem_Ch(shi,3);
Tem_Ch(ge,5);
ge=humi_value%10;
shi=humi_value%100/10;
bai=humi_value%1000/100;
Hum_Ch(bai,2);
Hum_Ch(shi,3);
Hum_Ch(ge,5);
voidbeep_control()//警报状态控制函数
/*如果实测温度超过门限值则报警*/
if(temp_value>
(TM*10))
beep=0;
else
if(humi_value>
(HM*10))
{
beep=0;
else
beep=1;
voidmain()
{
uintm=0;
TM=25;
//设定温度初始门限值:
25°
C
HM=50;
//设定湿度初始门限值:
50%
YZ_Resh();
beep=1;
//关闭蜂鸣器
LCD_Display(table3,table4);
//显示系统本系统信息
while
(1)
key_test();
//监测按键状态,并根据对应按键改变温度湿度门限值,并显示
if(m<
100)//循环计时,3秒钟
m++;
Delay_1ms(30);
else//当m=100时即为3秒时间到,则进行温度湿度数据采集
{
m=0;
ReadTempAndHumi();
//采集温度湿度数据
TempAndHumi_Resh();
//更新液晶显示缓存中的温度湿度数值
//显示当前温度湿度实测值以及门限值
beep_control();
//根据门限值以及实测值进行警报状态设置
#include<
#defineNUMBER20
#defineSIZE5
sbitdht11=P2^2;
staticucharstatus;
staticucharvalue_array[SIZE];
//定义存放DHT11采集的5个字节的数组
inttemp_value,humi_value;
staticucharReadValue(void);
externvoidDelay_1ms(uintms)//毫秒延时,延时时间为ms毫秒
uintx,y;
for(x=ms;
x>
x--)
for(y=124;
y>
y--);
staticvoidDelay_10us(void)//10微秒延时
uchari;
i--;
staticucharReadValue(void)//读一个字节数据的程序
ucharcount,value=0,i;
status=OK;
//设定标志位正常状态
for(i=8;
i>
i--)
value<
<
=1;
//高位在前进行接收数据
count=0;
while(dht11==0&
&
count++<
NUMBER);
if(count>
=NUMBER)//若大于最大数值则出错
status=ERROR;
//设定错误标志
return0;
//函数执行过程发生错误就退出函数
Delay_10us();
//进行30us的延时
if(dht11!
=0)//再次检测是否为高电平
value++;
//进入本函数说明信号为1,则进行自加
while(dht11!
=0&
NUMBER)
{
dht11=1;
}
if(count>
=NUMBER)
status=ERROR;
return0;
return(value);
//返回读取的结果
externucharReadTempAndHumi(void)//读取一次温度湿度数据,共5个字节
uchari=0,check_value=0,count=0;
EA=0;
dht11=0;
//拉低数据线20ms
Delay_1ms(20);
dht11=1;
//释放数据线,以用于检测低电平应答信号
Delay_10us();
//延时40us
if(dht11!
=0)//检测应答信号,应答信号为低电平
EA=1;
//无低电平。
则报错
returnERROR;
{//有应答信号
//等待应答信号结束
=NUMBER)//若计数大于最大计数值
dht11=1;
EA=1;
returnERROR;
//读数错误,退出函数
dht11=1;
while(dht11!
for(i=0;
i<
SIZE;
i++)//开始读取湿度值、温度值
value_array[i]=ReadValue();
//调用读数据函数
if(status==ERROR)
EA=1;
returnERROR;
if(i!
=SIZE-1)
check_value+=value_array[i];
//进行数据累加用于数据校验
if(check_value==value_array[SIZE-1])//若校验数据正确,则输出数据
//扩大温度湿度10倍数值
humi_value=value_array[0]*10;
temp_value=value_array[2]*10;
returnOK;
2、dht11.c执行文件
3、/*定义DHT11温度湿度头文件*/
#ifndef_DHT11_H_
#define_DHT11_H_
#defineOK1
#defineERROR0
externvoidDelay_1ms(unsignedintms);
externunsignedcharReadTempAndHumi(void);
#endif