按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 =
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』