| 
 
初级会员 
 
	积分135金钱135 注册时间2017-4-8在线时间23 小时 | 
 
5金钱 
| 本帖最后由 zsky66 于 2017-10-3 12:27 编辑 
 [mw_shl_code=c,true]#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;
 }
 
 //u8 DHT11_read_temper()
 //{
 //  u8 buf[5];
 //  u8 i;
 //  u8 *temper;
 //  DHT11_start();
 //  if(DHT11_check() == 0)
 //  {
 //    for(i=0;i<5;i++)
 //    {
 //      buf=DHT11_read_byte();
 //    }
 //    if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
 //    {
 //      //*humi = buf[0];
 //      *temper = buf[2];
 //    }
 //  }else return 1;
 //  return *temper;
 //}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 [/mw_shl_code]自己做了一块板子,目的是使用STM8S208驱动DHT11温湿度传感器,但是现在的问题是DHT11复位之后,无法在MCU端口读取到DHT11的低电平响应,检查了很长一段时间也没发现啥问题,所有特来论坛请教。
 
 | 
 
 
 
CAN.rar
 338.23 KB, 下载次数: 163 
 这是程序的源码,编译环境IAR |