STM32驱动DHT11,读出的结果不对,看了好久,还是找不出问题在哪里相关的代码,我是修改51的程序所得
代码如下:
/********************
温湿度传感器DHT11
单总线SPI
DATA--PG11
外接电压5V
**********************/
#include"sys.h"
#include"delay.h"
#include"LCD.h"
#include"DHT11.h"
#define dataout PGout(11)
#define datain PGin(11)
u8 humidity, temperature;
void DataIN()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ////PC8端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOG, &GPIO_InitStructure);
}
void DataOUT()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE); //使能PG端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; ////PC8端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_SetBits(GPIOG, GPIO_Pin_11); //输出高电平
}
//*******初始化DHT11*******/
void initial_DHT11()
{
DataOUT();
delay_ms(1000); //传感器上电后,等待1s越过不稳定状态,在此期间无需发送任何指令
dataout=1; //将数据总线拉高,数据总线默认为高电平,初始化可以不要
delay_us(8);
dataout=0;
delay_us(20);
dataout=1;
delay_us(24);
}
//从DHT11读一个字节的数据
u8 readbyte_DHT11(void)
{
u8 i,k;
u8 readbyte= 0;
for(i=0;i<8;i++)
{
while(!datain);
delay_us(50);
k= datain;
if(k==1) readbyte|= 0x01;
else readbyte&= 0xfe;
while(datain);
readbyte<<= 1;
}
return (readbyte);
}
void Process_DHT11(u8 *p, u8 *q)
{
u8 humi_h, humi_l, tem_h, tem_l, checkdata;
DataOUT();
delay_ms(1000); //传感器上电后,等待1s越过不稳定状态,在此期间无需发送任何指令
dataout=1; //将数据总线拉高,数据总线默认为高电平,初始化可以不要
//首先主机给一个起始信号
delay_ms(20); //最初的高电平持续一段时间,
dataout=0;
delay_ms(20);//总线至少拉低18ms,此处设置为20ms
dataout=1;
delay_us(30); //再将总线拉高20-40us,此处设置为30us
//接着,读取DHT11的响应信号
DataIN();
if(!datain) //判断从机是否低电平应答
{
while(!datain); //判断是否为低电平
while(datain); //判断总线是否拉高
humi_h= readbyte_DHT11(); //湿度高八位
humi_l= readbyte_DHT11(); //湿度低八位
tem_h= readbyte_DHT11(); //温度高八位
tem_l= readbyte_DHT11(); //温度低八位
checkdata= readbyte_DHT11(); //校验和数据
DataOUT();
dataout=0;
delay_us(50);
dataout=1; //释放总线
if(checkdata==(humi_h+humi_l+tem_h+tem_l)) //检验校验是否正确
{
*p= humi_h;
*q= tem_h;
}
}
}
void display_DHT11(void)
{
u8 t=0;
LCD_ShowString(30,150,200,16,16,"Humi: %");
LCD_ShowString(30,170,200,16,16,"Temp: oC");
while(1)
{
if(t%100==0) //仿原子的写法
{
Process_DHT11(&humidity, &temperature);
LCD_ShowNum(30+40,150,humidity,2,16);
LCD_ShowNum(30+40,170,temperature,2,16);
}
delay_ms(20);
t++;
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
http://www.labisart.com/blog/article/75
一周热门 更多>