<div>自己做了一块板子,目的是使用STM8S208驱动DHT11温湿度传感器,但是现在的问题是DHT11复位之后,无法在MCU端口读取到DHT11的低电平响应,检查了很长一段时间也没发现啥问题,所有特来论坛请教</div><div><b> </b></div><div> </div><div>#include "DHT11.h" #include "delay.h" #include "iostm8s208c8.h" /* PB7设置位推挽输出模式 */ void DQ_out() { PB_DDR_bit.DDR7 = 1; PB_CR1_bit.C17 = 1; PB_CR2_bit.C27 = 0; } /* PB7设置为浮空输入模式 */ void DQ_in() { PB_DDR_bit.DDR7 = 0; PB_CR1_bit.C17 = 0; PB_CR2_bit.C27 = 0; } /* DHT11起始信号 */ void DHT11_start(void) { DQ_out(); //PB7设置为输出模式 PB_ODR_bit.ODR7 = 0; //拉低PB7 delay_ms(18); //延时18ms PB_ODR_bit.ODR7 = 1; //拉高延时30us delay_us(30); } /*DHT11响应函数 返回1:接受失败 返回0:成功 */ u8 DHT11_check() { u8 retry = 0; DQ_in(); //PB7设置为浮空输入模式 while(PB_IDR_bit.IDR7 && retry<100) //在此等待DHT11拉低总线电平 { retry++; delay_us(1); } if(retry>=100) return 1; else retry = 0; while(!PB_IDR_bit.IDR7 && retry<100) //等待DHT11拉高总线电平 { retry++; delay_us(1); } if(retry>=100) return 1; return 0; } /*DHT11读取一个位*/ u8 DHT11_read_bit() { u8 retry = 0; while(PB_IDR_bit.IDR7 && retry<100) { retry++; delay_us(1); } retry = 0; while(!PB_IDR_bit.IDR7 && retry<100) { retry++; delay_us(1); } delay_us(40); if(PB_IDR_bit.IDR7)return 1; else return 0; } /*DHT11读取一个字节*/ u8 DHT11_read_byte() { u8 dat = 0; u8 i; for(i=0;i<8;i++) { dat<<=1; dat |= DHT11_read_bit(); } return dat; }</div>
CAN.rar
2017-10-3 12:36 上传
点击文件名下载附件
338.23 KB, 下载次数: 7
程序代码,编译环境IAR
收藏0 举报
一路向北lm 发表于 2017-10-3 14:45 这代码是楼主自己编写的还是参考人家的修改的?
yiy 发表于 2017-10-3 22:38 看看几种IO的模式是不是有错,如果时序没错的情况下。
STM8S [url=home.php?mod=space&uid=72445]@[/url] 16M 定时器定时5ms中断一次 #define _G_DHT11 #include "dht11.h" unsigned char uc_DHT11Value[SIZE]; //全局变量 得到的温湿度值 unsigned int ui_TempValue = 0; unsigned int ui_HumiValue = 0; extern unsigned char uc_20mstimeflag; /************************************************************* 函数名称: 函数功能: 入口参数: 入口参数的类型和含义: 出口参数: 备 注: *************************************************************/ unsigned char s_ComDHT11(void) { unsigned char i,temp,comdata; for(i = 8;i>0;i--) { while(!DHT11_DATA_VALUE); DHT11_Delay_10us(); DHT11_Delay_10us(); DHT11_Delay_10us(); DHT11_Delay_10us(); temp = 0; if(DHT11_DATA_VALUE) { temp =1; } comdata = comdata << 1; comdata = comdata|temp; while(DHT11_DATA_VALUE); } return comdata; } 函数名称: 函数功能: 入口参数: 入口参数的类型和含义: 出口参数: 备 注: *************************************************************/ void g_ReadTempAndHumi(void) { DHT11_DATA_OUT; DHT11_DATA_LOW; //layTime(40);// 至少18MS的延时,在中断计时里实现 uc_20mstimeflag = 1; while(uc_20mstimeflag); DHT11_DATA_HIGH; DHT11_DATA_IN; DHT11_Delay_10us(); DHT11_Delay_10us(); DHT11_Delay_10us(); while(!DHT11_DATA_VALUE); //80us的应答信号 DHT11 TO MCU while(DHT11_DATA_VALUE); //80us的通知信号 DHT11 TO MCU uc_DHT11Value[0] = s_ComDHT11(); uc_DHT11Value[1] = s_ComDHT11(); uc_DHT11Value[2] = s_ComDHT11(); uc_DHT11Value[3] = s_ComDHT11(); uc_DHT11Value[4] = s_ComDHT11(); if((uc_DHT11Value[0] + uc_DHT11Value[1] + uc_DHT11Value[2] + uc_DHT11Value[3]) == uc_DHT11Value[4]) { ui_HumiValue = uc_DHT11Value[0]; ui_TempValue = uc_DHT11Value[2]; } } 函数名称: 函数功能: 入口参数: 入口参数的类型和含义: 出口参数: 备 注: *************************************************************/ void DHT11_Delay_10us(void) { for(unsigned char uc_10us = 0;uc_10us < 34;uc_10us ++); } 头文件部分 #ifndef __DHT11_H #define __DHT11_H #include "iostm8s105c6.h" #ifdef __cplusplus extern "C" { #endif #ifndef _G_DHT11 #define DHT11_extern extern #else #define DHT11_extern #endif /**************宏定义****************/ //#define DATA_DR PA_ODR_ODR6 //OUTPUT //#define DATA_SR PA_IDR_IDR6 //IN STATE #define DHT11_DATA_OUT PE_DDR_DDR3 = 1 //输出
huangcunxiake 发表于 2017-10-4 11:35
冰封小肥牛 发表于 2017-10-4 16:05 问题已经搞定了,是一个小错误,还是谢谢各位
山东电子小菜鸟 发表于 2017-10-5 09:52
冰封小肥牛 发表于 2017-10-3 15:42 前面的起始函数都是我自己编写的,读取的是参照的
gejigeji521 发表于 2017-10-5 11:49 就是断点问题?莫非你一直在调试模式搞的?没有全速跑一个看看?
一路向北lm 发表于 2017-10-5 17:27 原子的,野火都有代码直接用就行了。
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
等级类勋章
发帖类勋章
27
201
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号