******************建议显示在液晶上******************/
#include char T_H1,T_L1,RH_H1,RH_L1,checkdata1; char T_H2,T_L2,RH_H2,RH_L2,checkdata2; char F16T,F16RH,tshi,tge,rhshi,rhge; sbit DHT11 = P2^1; uchar bdata output; uchar location,j,i,ge,shi; uint num=0,num1,num2; uchar code segment[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, 码表*/ 0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00}; sbit srclk=P4^2; sbit rclk = P4^1; sbit ser = P4^4; sbit out_put= output^7; /*传感器接受数据的响应命令*/ void delay(uint x); void Delay32us(); void Delay22ms(); void Delay500ms(); void shumaguan(uchar wei,uchar duan) { output = wei; for(j=0;j<8;j++) //位码 { ser = out_put; srclk=0;srclk=1;srclk=0; output = _crol_(output,1); } output = duan; //段码 for(j=0;j<8;j++) { /*共阴7段LED段 ser=out_put; srclk=0;srclk=1;srclk=0; output = output<<1; } rclk=0;rclk=1;rclk=0; } void shuru() { num=0; while(num<1000) { shumaguan(0x01,~segment[tshi]); shumaguan(0x02,~segment[tge]); shumaguan(0x10,~segment[rhshi]); shumaguan(0x20,~segment[rhge]); shumaguan(0,~segment[19]); } } char COM(void) { char i,temp,comdata; /**判断信号时0还是1**/ for(i=0;i<8;i++) { while(!DHT11); Delay32us(); temp=0; if(DHT11) { temp=1; } //当DHT11变为低电平时,开始下bit 的传送 comdata = comdata<<1; comdata = comdata|temp; while(DHT11); } return comdata; } /***主机的开始信号 和 从机的响应信号***/ /***********DHT11的主函数*********************/ void getDHT11() { DHT11=0; Delay22ms(); //主机拉低22ms DHT11=1; Delay32us(); //总线由上拉电阻拉高 主机延时20-40us //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 if(!DHT11) //T ! { //判断从机是否发出 80us 的低电平响应信号是否结束 while(!DHT11); //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态 while(DHT11); /*****接收数据的命令 每次传送八位******/ RH_H1 = COM(); RH_L1 = COM(); T_H1 = COM(); T_L1 = COM(); checkdata1 = COM(); if(T_H1+T_L1+RH_H1+RH_L1==checkdata1) { RH_H2 = RH_H1; RH_L2 = RH_L1; T_H2 = T_H1; T_L2 = T_L1; F16RH = RH_H2+RH_L2/1000; F16T = T_H2+T_L2/1000; tshi = F16T/10; tge = F16T%10; rhshi = F16RH/10; rhge = F16RH%10; } } } /************主函数*************/ void main() { EA = 1 ; ET0= 1; TR0 = 1; TMOD = 0X01; TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; while(1) { DHT11=0; getDHT11(); shuru(); } } /**********延时子程序************************/ void time1() interrupt 1 //延时20微秒 { TH0 = (65536-1000)/256; TL0 = (65536-1000)%256; num=num+1; num1=num1+1; num2=num2+1; } void Delay32us() //@12.000MHz { unsigned char i; _nop_(); _nop_(); i = 93; while (--i); } void Delay22ms() //@12.000MHz { unsigned char i, j, k; _nop_(); _nop_(); i = 2; j = 1; k = 201; do { do { while (--k); } while (--j); } while (--i); } /*******************************/ 因篇幅问题不能全部显示,请点此查看更多更全内容