温湿度传感器DHT11

用四位数码管显示温度、湿度,二者交替显示,四位数码管通过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();		 
	}
}


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值