搜索
您的当前位置:首页正文

DHT11温湿度传感器驱动程序 C51单片机

来源:爱够旅游网
/**************DHT11 简单应用 显示在数码管上(我的数码管是两个74HC595 不懂的可以问我)***************

******************建议显示在液晶上******************/

#include #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); }

/*******************************/

因篇幅问题不能全部显示,请点此查看更多更全内容

Top