前几天发了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,这里就直接只取了整数值 } } |
***********************转载请注明出处*************