单片机温度湿度控制程序dht11文档格式.docx

上传人:b****6 文档编号:20923749 上传时间:2023-01-26 格式:DOCX 页数:19 大小:17.87KB
下载 相关 举报
单片机温度湿度控制程序dht11文档格式.docx_第1页
第1页 / 共19页
单片机温度湿度控制程序dht11文档格式.docx_第2页
第2页 / 共19页
单片机温度湿度控制程序dht11文档格式.docx_第3页
第3页 / 共19页
单片机温度湿度控制程序dht11文档格式.docx_第4页
第4页 / 共19页
单片机温度湿度控制程序dht11文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

单片机温度湿度控制程序dht11文档格式.docx

《单片机温度湿度控制程序dht11文档格式.docx》由会员分享,可在线阅读,更多相关《单片机温度湿度控制程序dht11文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

单片机温度湿度控制程序dht11文档格式.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1