用四位数码管显示温度、湿度,二者交替显示,四位数码管通过7个IO口控制,此过程用到74hc595,相当好用。DHT11是我首次接触操作时序对时间要求非常高的原件,编写程序时要相当把握好时间,刚开始一直采集不到数据,最后终于成功。此次运用的硬件完全是自己手工焊接,感觉还可以。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int U8;
typedef unsigned long int U16;
uchar str1[]={" "};
uchar str2[]={" "};
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp;
U8 U8comdata;
U16 U16checkdata_temp,U16checkdata;
sbit RCK=P2^5;
sbit SCK=P2^6;
sbit SI=P2^7;
sbit D1=P1^0;
sbit D2=P1^1;
sbit D3=P1^2;
sbit D4=P1^3;
sbit DQ=P0^0;
sbit a=P0^1;
sbit b=P0^2;
uchar code table0[]={0xaf,0x22,0x9b,0xba,0x36,0xbc,0xbd,0x2a,0xbf,0xbe,0x8d,0x3f};
uchar code table[]={0xef,0x62,0xdb,0xfa,0x76,0xfc,0xfd,0x6a,0xff,0xfe};
void delay_40us()
{
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
_nop_(); _nop_();
}
void delay_ms(uint ms)
{
uchar i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void delay_5us()
{
U8 i;
i--;
i--;
i--;
i--;
i--;
}
void hc595(dat)
{
uchar i;
i=0;
for(i=0;i<8;i++)
{
if((dat<<i)&0x80)
SI=1;
else SI=0;
SCK=0;
_nop_();
_nop_();
SCK=1;
}
RCK=0;
_nop_();
_nop_();
RCK=1;
}
uint COM()
{
U8 i,U8temp=0;
for(i=0;i<8;i++)
{
delay_40us();
if(DQ)
{
U8temp|=0x01;
while(DQ); //把表示“1”的高电平度过
while(!DQ);
}
else
{
while(!DQ); // 把表示“0”的低电平度过
}
if(i<7)
U8temp<<=1;
}
return U8temp;
}
void RH()
{
DQ=0;
delay_ms(20);
DQ=1;
delay_5us(); //延时54us
delay_5us();
if(!DQ) //响应信号
a=0; //响应信号
while(!DQ);
while(DQ);
while(!DQ);
U8RH_data_H_temp=COM(); //采样
U8RH_data_L_temp=COM(); //采样
U8T_data_H_temp=COM(); //采样
U8T_data_L_temp=COM(); //采样
U16checkdata_temp=COM(); //采样
}
void display1()
{
uchar i,j;
j=200;
RH();
while(j--)
{
str1[0] = table0[U8RH_data_H_temp/10];
str1[1] = table[U8RH_data_H_temp%10];
str1[2] = table0[U8RH_data_L_temp/10];
str1[3] = table0[11];
for(i=0;i<4;i++)
{
hc595(str1[i]);
_nop_();
_nop_();
_nop_();
_nop_();
switch (i)
{
case 0: D1=0; D2=1; D3=1; D4=1; break;
case 1: D1=1; D2=0; D3=1; D4=1; break;
case 2: D1=1; D2=1; D3=0; D4=1; break;
case 3: D1=1; D2=1; D3=1; D4=0; break;
}
delay_ms(1);
}
if(i==3)
i=0;
}
}
void display2()
{
uchar i,j;
j=200;
RH();
while(j--)
{
str2[0] = table0[U8T_data_H_temp/10];
str2[1] = table[U8T_data_H_temp%10];
str2[2] = table0[U8T_data_L_temp/10];
str2[3] = table0[10];
for(i=0;i<4;i++)
{
hc595(str2[i]);
_nop_();
_nop_();
_nop_();
_nop_();
switch (i)
{
case 0: D1=0; D2=1; D3=1; D4=1; break;
case 1: D1=1; D2=0; D3=1; D4=1; break;
case 2: D1=1; D2=1; D3=0; D4=1; break;
case 3: D1=1; D2=1; D3=1; D4=0; break;
}
delay_ms(1);
}
if(i==3)
i=0;
}
}
void main()
{
U8RH_data_H_temp=0;
U8RH_data_L_temp=0;
U8T_data_H_temp=0;
U8T_data_L_temp=0;
U16checkdata_temp=0;
DQ=1;
a=1;
b=1;
delay_ms(500);
while(1)
{
RH();
delay_ms(100);
b=!b;
display1();
display2();
}
}