本帖最后由 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的低电平响应,检查了很长一段时间也没发现啥问题,所有特来论坛请教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#include "delay.h"
#include "iostm8s208c8.h"
u8 temp = 0;
u8 a;
int main(void)
{
CLK_ICKR = 0x01; //启用内部时钟
CLK_SWR = 0xe1; //不分频
CLK_CKDIVR = 0X00;
while(!CLK_ICKR_bit.HSIRDY);
delay_init(16); //延时函数初始化
DHT11_start(); //DHT11初始化
a = DHT11_check();
temp = DHT11_read_byte();
while(1);
}[/mw_shl_code]
一周热门 更多>