dht11传感器c语言程序,数字温湿度传感器DHT11 操作C语言源代码

//IO定义

#define P_DataIN_DHT11 PB0_IN

#define P_DataOUT_DHT11 PB0_OUT

//宏定义

#define BSET_DHT11 P_DataOUT_DHT11 = 1

#define BCLR_DHT11 P_DataOUT_DHT11 = 0

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

// 模块功能:读取DHT11的数据

// 该模块为温湿度传感器 当主机给启动信号后

// 该模块会连续发出5个字节的数据 共耗时约4MS

// 第一二个字节为湿度数据的整数与小数部分

// 第三四个字节为温度数据的整数与小数部分

// 第五个字节为校验码 它是前四个数据相加后的后8位的数值

// 程序带未传感器未连接检测 及读数据超时处理

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

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

// 函数名称:VerificaDHT11Data

// 函数功能:效验DHT11所读的数据是否正确

// 入口参数:

// 出口参数:校验正确返回1 否则返回0

// 备注:

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

uint8 VerificaDHT11Data(uint8 *a)

{

uint8 i ;

uint8 Tmp = 0 ;

uint16 wTmp = 0 ;

for(i=0;i<4;i++)

{

wTmp += a[i] ;

}

Tmp = (uint8)(wTmp & 0x00ff) ; //取低8位数据

if(Tmp == a[4])

{

return 1 ;

}

else

{

return 0 ;

}

}

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

// 函数名称:ReadPinDHT11

// 函数功能:读管脚并滤波

// 入口参数:

// 出口参数:返回管脚状态 Fcpu=16M时 耗时6US

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

uint8 ReadPinDHT11(void)

{

uint8 Tcon = 0 ;

uint8 i ;

for(i=0;i<5;i++) //读5次

{

_asm("nop") ;//延时

_asm("nop") ;

_asm("nop") ;

_asm("nop") ;

_asm("nop") ;

if(P_DataIN_DHT11 == 1)

{

Tcon ++ ;

}

}

if(Tcon >= 3) //读状态为1的次数大于3次

{

return 1 ;

}

else

{

return 0 ;

}

}

//=====读一字节数据======

uint8 ReadDHT11DataByte(uint8 InValue)

{

uint8 Data = 0 ;

uint8 i = 0 ;

uint8 ucTOver = 0 ; //等待超时时间

for(i=0;i<8;i++)

{

ucTOver = 30 ; //200U

while(!ReadPinDHT11()&&(ucTOver--)) ; //等待高电平的到来

Nopt(VT_DLY40U) ; //延时40U

Data <<= 1;

ucTOver = 30 ; //200U

if(ReadPinDHT11()&&(ucTOver--)) //判断IO是否还是被拉高的状态

{

Data |= 0x01 ;

//读最后一BIT数据时 不等待高电平

ucTOver = 30 ; //200U

while(ReadPinDHT11()&&(ucTOver--)) ; //等待IO被外设拉低

}

}

return Data ;

}

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

// 函数名称:ReadDH11Data

// 函数功能:读取DHT

// 入口参数:

// 出口参数:返回读取的数据

// 当读取到数据时 返回1 未读取到数据返回0

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

uint8 ReadDHT11Data(uint8 *a)

{

uint8 i ;

uint8 ucTOver = 0 ; //等待超时时间

Nopt(VT_DLY40U) ; //延时40U

if(ReadPinDH

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于度湿度一体的传感器DHT11 以下是在51单片机上测试成功的代码 #include<at89x52.h> #include<intrins.h>//加上这句下面的 _nop_();就能用 bit xianshiqiehuan; // sbit dht11_dat=P1^6; //开发板用 sbit dht11_dat=P2^0; //使用版用 unsigned char c,count, dht11temp,dht11dat; unsigned char dht11value[5]; unsigned int x,y,z; unsigned char code dat[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,}; delay() { unsigned char a; for(a=200;a>0;a--); } display(unsigned char x) //使用版用 { P0=dat[(x0)/10];//十位 P2_3=0; delay(); P2_3=1; P0=dat[(x0)];//个位 P2_2=0; delay(); P2_2=1; } /*display(unsigned char x) //开发板用 { P0=dat[(x0)/10];//十位 P1_2=0; delay(); P1_2=1; P0=dat[(x0)];//个位 P1_3=0; delay(); P1_3=1; } */ delay_1s() { unsigned int i=50000; while(i--); } delay_10us() //10us { _nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); } void delayms(unsigned char x) //1ms单位延时程序 { unsigned char j; while(x--) { for(j=0;j<123;j++){;} } } read_dht11() { unsigned char i; dht11_dat=1; _nop_(); //起始 dht11_dat=0;//拉低总线 delayms(18);//手册要求大于18ms dht11_dat=1;//拉高总线等待dht11回应 while(dht11_dat); // 等待dht11回应 若有回应 dht11_dat=0;往下执行 while(!dht11_dat);//回应后dht11将总线拉低80us,过后又将总线拉高,进入下一步 while(dht11_dat); //拉高80us 又变低,往下执行 进入50us延时 for(i=0;i<24;i++) { while(!dht11_dat);//50us过后...... dht11_dat=1;往下执行 delay_10us();delay_10us();delay_10us();//延时30us,查看总线是高是低, dht11temp=0; //先默认为0处理 if(dht11_dat) dht11temp=1; //1处理 dht11dat=dht11dat<<1; //必须先移动再或 若先或再移本次数据就移动了 dht11dat=dht11dat|dht11temp; dht11value[i/8]=dht11dat; while(dht11_dat);//如果处理的是1,30us过后总线还是1,那就在此等待总线变为0进入下一个50us低电平,不然会重复进行0处理 } } main() { delay_1s(); //要求上电等1秒,让dht11稳定 EA=1;//开放中断 TMOD=0x01;//设T0 为16位计数方式 ET0=1;//定时0中断允许 TR0=1;//开启TR0 while(1) { if(!xianshiqiehuan) //显示度 display(dht11value[2]) ; else {display(dht11value[0]) ; //显示湿度 P0=0x92&0x7f; //千位显 S.代表湿度 P2_5=0; delay(); P2_5=1; } } } dingshi() interrupt 1 //定时器0服务程序 { TH0=0; TL0=0; count++; if(count==55){count=0;read_dht11();xianshiqiehuan=~xianshiqiehuan; } //在切换显示时采集,以防中断采样带来的显示闪烁 }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值