赞
踩
- #include "sys.h"
-
- /*-----------------------------------------------
- 函数名:温湿度模块输出函数
- 参 数:无
- 返回值: 无;
- ------------------------------------------------*/
- void DHT11_IO_OUT (void){
-
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = DHT11_IO; //选择端口号(0~15或all)
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置IO接口速度(2/10/50MHz)
- GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
- }
-
- /*-----------------------------------------------
- 函数名:温湿度模块输入函数
- 参 数:无
- 返回值: 无;
- ------------------------------------------------*/
-
- void DHT11_IO_IN (void){
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin = DHT11_IO; //选择端口号(0~15或all)
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_Init(DHT11_PORT, &GPIO_InitStructure);
- }
-
-
- /*-----------------------------------------------
- 函数名:DHT11端口复位,发出起始信号(IO发送)
- 参 数:无
- 返回值: 无;
- ------------------------------------------------*/
- void DHT11_RST (void){
- DHT11_IO_OUT(); //端口为输出
- GPIO_ResetBits(DHT11_PORT,DHT11_IO); //使总线为低电平
- delay_ms(20); //拉低至少18ms
- GPIO_SetBits(DHT11_PORT,DHT11_IO); //使总线为高电平
- delay_us(30); //主机拉高20~40us
- }
-
- /*-----------------------------------------------
- 函数名:检查DHT11是否正常
- 参 数:无
- 返回值: 返回1:未检测到DHT11,返回0:成功(IO接收)
- ------------------------------------------------*/
- u8 DHT11_Check(void){
- u8 retry=0; //定义临时变量
- DHT11_IO_IN(); //IO到输入状态
- //GPIO端口输入时,配置为上拉输入或者浮空输入,因为外接上拉电阻,所以默认为高电平
- //有负信号输入,GPIO端口为1,当GPIO端口为1且retry小于100,retry自加,否则跳出循环执行下一步
- while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry<100) //DHT11会拉低40~80us
- {
- retry++;
- delay_us(1);
- }
- if(retry>=100)return 1;
- else retry=0;
- //DHT11发来高电平信号,GPIO端口为0,当GPIO端口为0且retry小于100,retry自加,否则跳出循环执行下一步
- while ((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry<100) //DHT11拉低后会再次拉高40~80us
- {
- retry++;
- delay_us(1);
- }
- if(retry>=100)return 1;
- return 0;
- }
-
- /*-----------------------------------------------
- 函数名:DHT11读取一个位
- 参 数:无
- 返回值: 0,表示读取低电平;1,表示读取高电平;
- ------------------------------------------------*/
- u8 DHT11_Read_Bit(void)
- {
- u8 retry = 0;
- while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) && retry < 100) //等待变为低电平
- {
- retry++;
- delay_us(1);
- }
- retry = 0;
- while((GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 0) && retry < 100) //等待变高电平
- {
- retry++;
- delay_us(1);
- }
- delay_us(40);//等待40us
- if(GPIO_ReadInputDataBit(DHT11_PORT,DHT11_IO) == 1) //用于判断高低电平,即数据1或0
- return 1;
- else
- return 0;
- }
-
- /*-----------------------------------------------
- 函数名:DHT11读取一字节
- 参 数:无
- 返回值: 返回一字节值,读到的数据
- ------------------------------------------------*/
- u8 DHT11_Read_Byte(void)
- {
- u8 i, dat;
- dat = 0;
- for (i = 0; i < 8; i++)
- {
- dat <<= 1; //左移运算符,dat左移1位
- dat |= DHT11_Read_Bit(); //"|"表示按位或等于
- }
- return dat;
- }
-
- /*-----------------------------------------------
- 函数名:DHT11读取一次温湿度整数部分 读取5个字节
- 参 数:无
- 返回值: 0,表示成功读取;非0,表示读取不成功;
- temp:温度值(范围:0~50°)
- humi:湿度值(范围:20%~90%)
- 一次完整的数据传输为40bit,高位先出
- 8bit 湿度整数 + 8bit 湿度小数 + 8bit 温度整数 + 8bit 温度小数 + 8bit 校验和
- ------------------------------------------------*/
- u8 DHT11_Read_Data(u8 *temp, u8 *humi)
- {
- u8 buf[5];
- u8 i;
- DHT11_RST(); //DHT11端口复位,发出起始信号
- if(DHT11_Check() == 0) //等待DHT11回应,0为成功回应
- {
- for(i = 0; i < 5; i++) //读取5个字节,40位数据
- {
- buf[i] = DHT11_Read_Byte(); //读出数据
- }
- if((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4]) //校验数据
- {
- *humi = buf[0]; //湿度的16位,将湿度值放入指针humi
- *temp = buf[2]; // 温度的16位,将温度值放入指针temp
- printf("读取数据成功!\r\n");
- return 0;
- }
- else
- printf("数据校验失败!\r\n");
- return 1;
- }
- else
- printf("DHT11初始化未成功!\r\n");
- return 1;
- }
-
- /*-----------------------------------------------
- 函数名:DHT11初始化
- 参 数:无
- 返回值: 返回一字节值;
- ------------------------------------------------*/
- u8 DHT11_Init (void){
- RCC_APB2PeriphClockCmd(DHT11_RCC,ENABLE); //开始DHT11的时钟
- DHT11_RST(); //DHT11端口复位,发出起始信号
- return DHT11_Check(); //等待DHT11回应
- }
-
-
-
-
-
-
-
-
-
-
- #ifndef __DHT11_H_
- #define __DHT11_H_
-
- #include "sys.h"
-
-
- #define DHT11_RCC RCC_APB2Periph_GPIOA //开启引脚RCC,根据具体情况修改
- #define DHT11_PORT GPIOA //定义端口,根据具体情况修改
- #define DHT11_IO GPIO_Pin_5 //定义IO口,根据具体情况修改
-
- void DHT11_IO_OUT (void); //设置IO口为输出模式
- void DHT11_IO_IN(void); //设置IO口为输入模式
- void DHT11_RST (void); //复位DHT11
-
- u8 DHT11_Init (void); //DHT11初始化
- u8 DHT11_Check(void); //检查DHT11是否正常
- u8 DHT11_Read_Bit(void); //读取一位数据
- u8 DHT11_Read_Byte(void); //读取一个字节
- u8 DHT11_Read_Data(u8 *temp, u8 *humi); //DHT11读取数据
-
- #endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。