89C51单片机读取DHT11数据并用数码管显示_牛仔1875_新浪博客

前几天发了arduino读取dht11的文章【 arduino读取DHT11温度、湿度数据并串口显示 】,里面DHT11的通信协议已经说明了,这里略过,贴个程序吧。测试过可用的。
晶振11.0592Mhz。
       程序显示有点问题,"<</span>"应该是小于号"<",用的时候记得改一下。

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include  
unsigned   char  num[ 10 ]={0xde,0x82,0xec,0xe6,0xb2,0x76,0x7e,0xc2,0xfe,0xf6}; //数码管段码
unsigned   char  a[ 5 ]={ 0 , 0 , 0 , 0 , 0 }; //存放温度、湿度数据的数组,初始为0
unsigned   char  i,j,t; //for循环的变量
sbit out=P0^ 4 ; //DHT11的数据io接口
void  delay( unsigned   char  x) // 1 ms 延时函数
{
    
unsigned   char  i,j;
    
for (i= 0 ;i
        
for (j= 0 ;j<</span>110;j++);
}


void display(unsigned char a,unsigned char c) //数码管显示函数
{
    
unsigned char i,b,d;
    b=a%
10;//求出温度个位
    a=a/10;//温度十分位
    d=c%10;//湿度个位
    c=c/10;//湿度十分位
    for(i=0;i<</span>200;i++)
            {
            P2=num[a];
//写入段码
            P0=0xfe;//打开第一个数码管
            delay(3);//延时
            P2=num[b];//写入段码
            P0=0xfd;//打开第二个数码管
            delay(3);//延时
            P2=num[c];//。。。。依此类推
            P0=0xfb;
            delay(
3);
            P2=num[d];
            P0=0xf7;
            delay(
3);
            }
}

void begin()//DHT11初始函数
{
  out=
1;
  out=
0;//数据线拉低
  delay(32);  //延时至少28ms
    out=1;//拉高
}

void read1()//读取温、湿度数据函数
{
    
for(t=0;t<</span>3;t++);//延时大约30us
    if(out==0)//判断DHT11是否响应
    {
        
while(out==0);//等待80us的低电平结束
        for(t=0;t<</span>2;t++);//延时若干us
        while(out==1);//等待80us的高电平结束
        for(i=0;i<</span>5;i++)//温度、湿度整数、小数部分以及校验值五个数据
        {
            
for(j=0;j<</span>8;j++)//8位二进制数
            {  
                                
while(out==0);//等待50us的低电平结束
                                a[i]=a[i]<<1;//数据左移1位
                                for(t=0;t<</span>4;t++);//等待大于30us小于70us的时间,这个指令具体延时多少不太确定
                                if(out==1)//如果数据线依然为高电平
                {
                    a[i]=a[i]|0x01;
//说明此位是1
                                        while(out==1);//等待高电平结束进入下一位
                                }
                        }
                }
    }
    
else    //如果DHT11无响应,则数据全为0
    {
        
for(i=0;i<</span>5;i++)  
        {
         a[i]=
0
        }
     }
        
if(a[0]+a[2]!=a[4])//如果校验不通过,则数码管显示8888(因为读取到的小数位为0,这里就直接只取了整数位)
        {
            
for(i=0;i<</span>5;i++)  
        {
         a[i]=
88
        }
        }
}

void main()//主函数
{
    
while(1)
    {
        begin();
        read1();
        out=
1;
        display(a[
2],a[0]);//因为读取到的小数位为0,这里就直接只取了整数值
    }
}

          ***********************转载请注明出处*************




  • 4
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值