×
单片机 > 单片机程序设计 > 详情

51单片机的dht11温湿度数码管显示

发布时间:2023-04-07 发布时间:
|


按button1可以切换模式

模式0 只显示温度

模式1 只显示湿度

模式2 动态显示温度和湿度,每5s切换一次



实物如下


温度显示

湿度显示小数

模式选择,自动显示切换湿度和温度,只显示温度,只显示湿度。


单片机源程序如下:

#include


bit DHT_Start();

bit DHT_ByteRead(unsigned char *dat);

void ConfigTimer0(unsigned int ms);

void Display_hum(unsigned char *num);

void Display_temp(unsigned char *num);



unsigned char T0RH = 0; //T0重载值的高字节

unsigned char T0RL = 0; //T0重载值的低字节

unsigned char str=88;

unsigned char DHT[5];


unsigned int tmr1s = 0;

unsigned int tmr10ms = 0;

unsigned char st=0;

unsigned int sdd=0;

unsigned char td=0;

unsigned char mode=0;


bit flag1s = 0;

bit flag10ms = 0;

int x;

sbit button1=P0^0;

sbit dot=P1^3; //数码管小数点



void delay(unsigned char x) //延时ms

{

unsigned char a,b,c;

for(c=x;c>0;c--)

{

for(b=102;b>0;b--)

for(a=3;a>0;a--);

}

}

void main()

{


bit tmp;

dot=0;

EA = 1; //开总中断

ConfigTimer0(10); //T0定时10ms

// M1=0; M1=0;M2=0;M3=0;D1=0;D2=0;

DHT_Start();

delay(5);


while (1)

{



if(flag10ms) //数码管刷新频率

{

if(st==0){

Display_temp(&str);

flag10ms=0;

}

else if(st==1)

{

Display_hum(&str);

flag10ms=0;

}


}

else if (flag1s) //每秒更新一次温度、湿度

{

DHT_Start();

tmp=DHT_ByteRead(&DHT);

if(tmp==1)

{


if(st==0)

{

str = DHT[2] ; //温度

Display_temp(&str);

flag1s =0; //标志位清零

}

else if(st==1){


str = DHT[0] ; //湿度

Display_hum(&str);

flag1s =0; //标志位清零

}



}

}

if(button1==0)

{

delay(2);

if(button1==0)

{

mode++;

switch(mode)

{

case 0: st=0; break;

case 1: st=1; break;

case 2: td=1; break;

default: break;

}

if(mode>=3)

{

td=0;

mode=0;

}

while(button1==0)

{

}



}


}




}

}



/* 配置并启动T0,ms-T0定时时间 */

void ConfigTimer0(unsigned int ms)

{

unsigned long tmp; //临时变量

tmp = 11059200 / 12; //定时器计数频率

tmp = (tmp * ms) / 1000; //计算所需的计数值

tmp = 65536 - tmp; //计算定时器重载值

tmp = tmp + 12; //补偿中断响应延时造成的误差

T0RH = (unsigned char)(tmp>>8); //定时器重载值拆分为高低字节

T0RL = (unsigned char)tmp;

TMOD &= 0xF0; //清零T0的控制位

TMOD |= 0x01; //配置T0为模式1

TH0 = T0RH; //加载T0重载值

TL0 = T0RL;

ET0 = 1; //使能T0中断

TR0 = 1; //启动T0

}

/* T0中断服务函数,完成1秒定时 */

void InterruptTimer0() interrupt 1

{


TH0 = T0RH; //重新加载重载值

TL0 = T0RL;

tmr1s++;

sdd++;

tmr10ms++;


if(tmr10ms>=1) // 数码管刷新频率

{

tmr10ms=0;

flag10ms = 1;

}

if(td==1)

{

if(sdd>=500) //温度显示5s 、湿度显示5s

{

sdd=0;

if(st==0)

{

st=1;

}

else st=0;

}

}

if (tmr1s >= 200) //1s 数据更新频率

{

tmr1s = 0;

flag1s =




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM微处理器的液晶触摸屏接口设计