中文数据手册连接:https://www.aliyundrive.com/s/ypXaA8Kb6aw【阿里云盘】
实现效果
温度、湿度轮流显示
湿度15%
?温度 24.2℃
?程序如下
#region//预处理
//Designer 情何以堪i connection out——>P3.7
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
unsigned char code table[]= //数码管字模
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77, 0x7c, 0x59, 0x3e, 0x79, 0x71, 0x6f, 0x76, 0x73, 0x5e, 0x00
//[0-9]->0-9 [10]:A [11]:B [12]:C [13]:D [14]:E [15]:F [16]:G [17]:H [18]:P [19]:U [20]:灭
};
sbit dt = P3^7;//数据引脚
uchar Tem_int = 0;//8位温度整数位
uchar Tem_dec = 0;//8位温度小数位
uchar Hum_int = 0;//8位湿度整数位
uchar Hum_dec = 0;//8位湿度小数位
uchar Check_byte = 0;//8位和校验位
char leds[4]; //数码管四位数
#endregion
void Delay1000ms() //@11.0592MHz 延时1s
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay20ms() //@11.0592MHz 延时0.02s
{
unsigned char i, j;
i = 36;
j = 217;
do
{
while (--j);
} while (--i);
}
void Delay40us() //@11.0592MHz 延时40us
{
unsigned char i;
_nop_();
i = 15;
while (--i);
}
void Read() //读数据
{
int i;
//主机发送工作信号
dt = 0;
//保持时间不小于18ms 这里取20ms
Delay20ms();
//释放总线
dt = 1;
//等待从机拉低总线
while(dt);
//等待从机释放总线
while(!dt);
for(i = 0;i < 8;i++)//8位湿度整数
{
//等待从机拉低总线(数据准备)
while(dt);
//等待从机释放总线 释放后开始的30us-70us间的引脚状态为数据0或1
while(!dt);
//这里等待40us
Delay40us();
//先接收高位 存入最低位 逐次移动至高位
Hum_int <<= 1;
Hum_int |= dt;
//下面4个循环原理同上 不再注释
}
for(i = 0;i < 8;i++)//8位湿度小数
{
while(dt);
while(!dt);
Delay40us();
Hum_dec <<= 1;
Hum_dec |= dt;
}
for(i = 0;i < 8;i++)//8位温度整数
{
while(dt);
while(!dt);
Delay40us();
Tem_int <<= 1;
Tem_int |= dt;
}
for(i = 0;i < 8;i++)//8位温度小数
{
while(dt);
while(!dt);
Delay40us();
Tem_dec <<= 1;
Tem_dec |= dt;
}
for(i = 0;i < 8;i++)//8位校验位
{
while(dt);
while(!dt);
Delay40us();
Check_byte <<= 1;
Check_byte |= dt;
}
}
void handle_Hum() //将湿度数据转换为数码管字模
{
leds[3] = table[17];//第一位显示H字符 表示湿度
leds[2] = table[Hum_int/10];//第二位显示湿度十位
leds[1] = table[Hum_int%10];//第三位显示湿度个位
leds[0] = table[18];//第四位显示字母P 表示百分之
}
void handle_Tem() //将温度数据转换为数码管字模
{
leds[3] = table[14]; //第一位显示字母E 表示温度
leds[2] = table[Tem_int/10];//第二位显示温度十位
leds[1] = table[Tem_int%10]| 0x80;//第三位显示温度个位 同时显示小数点
leds[0] = table[Tem_dec];//第四位显示温度小数第一位
}
void show()//显示函数
{
int i,j=100;
//数码管选位
for(i=0;i<4;i++){
switch(i){
case 0:
P2 = 0x07; //0111 共阳数码管第一位 NPN基极拉低导通 下同
break;
case 1:
P2 = 0x0B; //1011
break;
case 2:
P2 = 0x0D; //1101
break;
case 3:
P2 = 0x0E; //1110
break;
}
//将每一位值显示在数码管上
P0 = ~leds[i];
//视觉暂留
while(j--);
//数码管关闭
P0=0xFF;
//重新赋值
j = 100;
}
}
void main()//主函数
{
int j = 900;
//DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令
Delay1000ms();
while(1)
{
Read();
handle_Hum();
while(j--)
{
show();
}
handle_Tem();
j = 900;
while(j--)
{
show();
}
j = 900;
}
}
|