单片机温度湿度控制程序dht11.docx
- 文档编号:7796100
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:19
- 大小:17.87KB
单片机温度湿度控制程序dht11.docx
《单片机温度湿度控制程序dht11.docx》由会员分享,可在线阅读,更多相关《单片机温度湿度控制程序dht11.docx(19页珍藏版)》请在冰豆网上搜索。
单片机温度湿度控制程序dht11
1、温度湿度控制主程序(单片机)
#include
#include"dht11.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitbeep=P2^3;
sbitk1=P3^2;
sbitk2=P3^3;
sbitk3=P3^6;
sbitk4=P3^7;
sbitrs=P3^5;
sbitlcden=P3^4;
uchartable0[]="T:
00.00TM:
00.0";//初始化液晶温度实测值以及门限值缓存
uchartable1[]="H:
00.00HM:
00.0";//初始化液晶湿度实测值以及门限值缓存
uchartable3[]="ThisisT/Htest";//系统开机显示内容初始化缓存
uchartable4[]="Resultiscoming";//系统开机显示内容初始化缓存
staticucharflag;
externinttemp_value,humi_value;
voidDelay_1ms(uintms);
uintTM,HM;
voiddelay(uintx)//
{
uinta,b;
for(a=x;a>0;a--)
for(b=10;b>0;b--);
}
voiddelay1(uintx)//延时程序
{
uinta,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
voidwrite_com(ucharcom)//液晶写指令操作
{
P0=com;
rs=0;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
voidwrite_date(uchardate)//液晶写数据操作
{
P0=date;
rs=1;
lcden=0;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
voidinit()//液晶初始化
{
write_com(0x38);
delay
(1);
write_com(0x0c);
delay
(1);
write_com(0x06);
delay
(1);
write_com(0x01);
delay
(1);
}
voidLCD_Display(ucharbuff1[],ucharbuff2[])//液晶显示程序
{
ucharaa;
init();//液晶初始化
write_com(0x80+16);//写入第一行数据指令
delay
(1);
for(aa=0;aa<16;aa++)//写入第一行待显示数据
{
write_date(buff1[aa]);
}
write_com(0xc0+16);//写入第二行数据指令
for(aa=0;aa<16;aa++)//写入第一行待显示数据
{
write_date(buff2[aa]);
}
for(aa=0;aa<16;aa++)
{
write_com(0x18);
delay
(1);
}
}
voidTem_Ch(ucharAA,ucharnn)//T门限数值替换
{
switch(AA)
{
case0:
table0[nn]='0';
break;
case1:
table0[nn]='1';
break;
case2:
table0[nn]='2';
break;
case3:
table0[nn]='3';
break;
case4:
table0[nn]='4';
break;
case5:
table0[nn]='5';
break;
case6:
table0[nn]='6';
break;
case7:
table0[nn]='7';
break;
case8:
table0[nn]='8';
break;
case9:
table0[nn]='9';
break;
}
}
voidHum_Ch(ucharBB,ucharmm)//H门限数值替换
{
switch(BB)
{
case0:
table1[mm]='0';
break;
case1:
table1[mm]='1';
break;
case2:
table1[mm]='2';
break;
case3:
table1[mm]='3';
break;
case4:
table1[mm]='4';
break;
case5:
table1[mm]='5';
break;
case6:
table1[mm]='6';
break;
case7:
table1[mm]='7';
break;
case8:
table1[mm]='8';
break;
case9:
table1[mm]='9';
break;
}
}
///////////
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;
A3=0;
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);
if(kk3!
=1)//若可开=0且持续一段时间后任然为0,则执行有关操作
{
temp=P3;//按键一操作
TM=TM+1;//提高温度门限值
YZ_Resh();////更新液晶显示缓存的门限值
LCD_Display(table0,table1);//液晶显示数值
}
}
if(kk4!
=1)
{
delay1(100);
if(kk4!
=1)
{
temp=P3;//按键二操作
TM=TM-1;//降低温度门限值
YZ_Resh();////更新液晶显示缓存的门限值
LCD_Display(table0,table1);//液晶显示数值
}
}
k1=1;
k2=0;
k3=1;
k4=1;
kk1=k1;
kk2=k2;
kk3=k3;
kk4=k4;
if(kk3!
=1)
{
delay1(100);
if(kk3!
=1)
{
temp=P3;//按键三操作
HM=HM+1;//提高湿度门限
YZ_Resh();//更新液晶显示缓存的门限值
LCD_Display(table0,table1);//液晶显示数值
}
}
if(kk4!
=1)
{
delay1(100);
if(kk4!
=1)
{
temp=P3;//按键四操作
HM=HM-1;//降低湿度门限
YZ_Resh();//更新液晶显示缓存的门限值
LCD_Display(table0,table1);//液晶显示数值
}
}
}
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();//更新液晶显示缓存中的温度湿度数值
LCD_Display(table0,table1);//显示当前温度湿度实测值以及门限值
}
beep_control();//根据门限值以及实测值进行警报状态设置
}
}
#include
#include"dht11.h"
#defineucharunsignedchar
#defineuintunsignedint
#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>0;x--)
{
for(y=124;y>0;y--);
}
}
staticvoidDelay_10us(void)//10微秒延时
{
uchari;
i--;
i--;
i--;
i--;
i--;
i--;
}
staticucharReadValue(void)//读一个字节数据的程序
{
ucharcount,value=0,i;
status=OK;//设定标志位正常状态
for(i=8;i>0;i--)
{
value<<=1;//高位在前进行接收数据
count=0;
while(dht11==0&&count++ if(count>=NUMBER)//若大于最大数值则出错 { status=ERROR;//设定错误标志 return0;//函数执行过程发生错误就退出函数 } Delay_10us();//进行30us的延时 Delay_10us(); Delay_10us(); if(dht11! =0)//再次检测是否为高电平 { value++;//进入本函数说明信号为1,则进行自加 while(dht11! =0&&count++ { 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 Delay_10us(); Delay_10us(); Delay_10us(); if(dht11! =0)//检测应答信号,应答信号为低电平 { EA=1;//无低电平。 则报错 returnERROR; } else {//有应答信号 while(dht11==0&&count++ if(count>=NUMBER)//若计数大于最大计数值 { dht11=1; EA=1; returnERROR;//读数错误,退出函数 } count=0; dht11=1; while(dht11! =0&&count++ if(count>=NUMBER) { dht11=1; EA=1; returnERROR; } for(i=0;i { value_array[i]=ReadValue();//调用读数据函数 if(status==ERROR) { dht11=1; 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; dht11=1; EA=1; returnOK; } else { EA=1; returnERROR; } } } 2、dht11.c执行文件 #include #include"dht11.h" #defineucharunsignedchar #defineuintunsignedint #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>0;x--) { for(y=124;y>0;y--); } } staticvoidDelay_10us(void)//10微秒延时 { uchari; i--; i--; i--; i--; i--; i--; } staticucharReadValue(void)//读一个字节数据的程序 { ucharcount,value=0,i; status=OK;//设定标志位正常状态 for(i=8;i>0;i--) { value<<=1;//高位在前进行接收数据 count=0; while(dht11==0&&count++ if(count>=NUMBER)//若大于最大数值则出错 { status=ERROR;//设定错误标志 return0;//函数执行过程发生错误就退出函数 } Delay_10us();//进行30us的延时 Delay_10us(); Delay_10us(); if(dht11! =0)//再次检测是否为高电平 { value++;//进入本函数说明信号为1,则进行自加 while(dht11! =0&&count++ { 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 Delay_10us(); Delay_10us(); Delay_10us(); if(dht11! =0)//检测应答信号,应答信号为低电平 { EA=1;//无低电平。 则报错 returnERROR; } else {//有应答信号 while(dht11==0&&count++ if(count>=NUMBER)//若计数大于最大计数值 { dht11=1; EA=1; returnERROR;//读数错误,退出函数 } count=0; dht11=1; while(dht11! =0&&count++ if(count>=NUMBER) { dht11=1; EA=1; returnERROR; } for(i=0;i { value_array[i]=ReadValue();//调用读数据函数 if(status==ERROR) { dht11=1; 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; dht11=1; EA=1; returnOK; } else { EA=1; returnERROR; } } } 3、/*定义DHT11温度湿度头文件*/ #ifndef_DHT11_H_ #define_DHT11_H_ #defineOK1 #defineERROR0 externvoidDelay_1ms(unsignedintms); externunsignedcharReadTempAndHumi(void); #endif
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 温度 湿度 控制程序 dht11