/*说明:这个程序需要把data连到P1^0端,然后只有当L8亮起时校验通过,数据准确*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint led[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e }; //p0端0到f,0x7f为点
uint ledx[] = { 0x00,0x0e,0x0d,0x0b,0x07,0xff }; //p2端都亮,到都灭
sbit echo = P1 ^ 0;//定义data端口
unsigned char hum1 = 0, hum2 = 0, tem1 = 0, tem2 = 0;//分别对应湿度整数、小数和温度整数、小数。
uint t1a, t1b; //对应数码管位数
uint t2c, t2d; //对应数码管位数
uint h1a, h1b; //对应数码管位数
uint h2c, h2d; //对应数码管位数
unsigned char check;
sbit checkled = P1 ^ 7; //校验通过则亮灯
sbit k1 = P3 ^ 4; //显示湿度
sbit k2 = P3 ^ 5; //显示温度
uint displaytem = 1; //显示模式,默认显示温度
uint i = 0;
void delay(unsigned int x) //延时 x ms
{
unsigned int i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
void delay_10()//延时10us
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void start()
{
tem1 = 0;
tem2 = 0;
hum1 = 0;
hum2 = 0;
echo = 0;//再将DATA输出为低电平,持续时间大于18ms,此时DHT检测到后从低功耗模式->高速模式
delay(50);
echo = 1;//再拉高
while (echo == 1);
_nop_();
while (echo == 0); //一个应答
_nop_();
while (echo == 1); //标志即将传输数据
_nop_();
}
void read()
{
/*以下是湿度整数部分的数据读入*/
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
hum1 = 1;
while (echo == 1);
}
else if (echo == 0)
{
hum1 = 0;
}
for (i = 2; i <= 8; i++)
{
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
hum1 = hum1 << 1;
hum1 += 1;
while (echo == 1);
continue;
}
else if (echo == 0)
{
hum1 = hum1 << 1;
continue;
}
}
/*以下是湿度小数部分的数据读入*/
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
hum2 = 1;
while (echo == 1);
}
else if (echo == 0)
{
hum2 = 0;
}
for (i = 2; i <= 8; i++)
{
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
hum2 = hum2 << 1;
hum2 += 1;
while (echo == 1);
continue;
}
else if (echo == 0)
{
hum2 = hum2 << 1;
continue;
}
}
/*以下是温度整数部分的数据读入*/
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
tem1 = 1;
while (echo == 1);
}
else if (echo == 0)
{
tem1 = 0;
}
for (i = 2; i <= 8; i++)
{
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
tem1 = tem1 << 1;
tem1 += 1;
while (echo == 1);
continue;
}
else if (echo == 0)
{
tem1 = tem1 << 1;
continue;
}
}
/*以下是温度小数部分的数据读入*/
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
tem2 = 1;
while (echo == 1);
}
else if (echo == 0)
{
tem2 = 0;
}
for (i = 2; i <= 8; i++)
{
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
tem2 = tem2 << 1;
tem2 += 1;
while (echo == 1);
continue;
}
else if (echo == 0)
{
tem2 = tem2 << 1;
continue;
}
}
/*以下是校验部分的数据读入*/
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
check = 1;
while (echo == 1);
}
else if (echo == 0)
{
check = 0;
}
for (i = 2; i <= 8; i++)
{
if (echo == 0)while (echo == 0);
delay_10();
delay_10();
delay_10();
delay_10();
if (echo == 1)
{
check = check << 1;
check += 1;
while (echo == 1);
continue;
}
else if (echo == 0)
{
check = check << 1;
continue;
}
}
if (check == hum1 + hum2 + tem1 + tem2)checkled = 0;
}
void main()
{
echo = 1;//设置DATA引脚为输出状态并输出高电平
delay(1500);//开机等待1.5S的时间稳定
while (1)
{
checkled=1;//校验灯复位
start();
read();
/*温度计算部分,小数位无用*/
t1a = tem1 / 10;
t1b = tem1 - t1a * 10;
t2c = tem2 / 100;
t2d = tem2 / 10 - t2c * 10;
/*湿度计算部分,小数位无用*/
h1a = hum1 / 10;
h1b = hum1 - h1a * 10;
h2c = hum2 / 100;
h2d = hum2 / 10 - h2c * 10;
if (displaytem == 1)
while (1)
{
P0 = led[t1a];
P2 = ledx[1];
delay(5);
P0 = led[t1b];
P2 = ledx[2];
delay(5);
P0 = 0x9C;
P2 = ledx[3];
delay(5);
P0 = 0xC6;
P2 = ledx[4];
delay(5);
if (k1 == 0) { P0 = 0xff; displaytem = 0; break; }
else if (k2 == 0) { P0 = 0xff; displaytem = 1; break; }
}
else if (displaytem == 0)
while (1)
{
P0 = led[h1a];
P2 = ledx[1];
delay(5);
P0 = led[h1b];
P2 = ledx[2];
delay(5);
P0 = 0x9C;
P2 = ledx[3];
delay(5);
P0 = 0x8E;
P2 = ledx[4];
delay(5);
if (k2 == 0) { P0 = 0xff; displaytem = 1; break; }
else if (k1 == 0) { P0 = 0xff; displaytem = 0; break; }
}
delay(1000);//等待18ms
}
}