1.用GD32 Colibri-F190R8开发板采集温湿度值,传感器采用的是常见的DHT11。把采集到的数据通过串口发送到PC端串口助手。传感器链接电源3.3V,数据脚接PA15。LED6(PB9)作为工作指示灯,不停的闪烁。
0
|
|
|
|
2.串口采用USART2,波特率115200.
|
|
|
|
|
3.读取DHT11 数据 dht11.c (这个程序是根据原子哥的教学程序改的)- #include "dht11.h"
- #include "delay.h"
- #include "gd32f1x0_gpio.h"
- //////////////////////////////////////////////////////////////////////////////////
- //////////////////////////////////////////////////////////////////////////////////
- /*******************************************************************************************************
- ** 函 数 名: DHT11_Mode_IPU
- **------------------------------------------------------------------------------------------------------
- ** 函数原型:
- ** 函数功能: 使DHT11-DATA引脚变为输入模式
- ** 入口参数:
- ** 返 回 值:
- ** 作者:
- ********************************************************************************************************/
- static void DHT11_IO_IN(void)
- {
- GPIO_InitPara GPIO_InitStructure; /*定义一个GPIO_InitTypeDef类型的结构体*/
- GPIO_InitStructure.GPIO_Pin = DHT11_DQ; /*选择要控制的GPIOA引脚*/
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IN; /*设置引脚模式为输入*/
- GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; /*设置引脚速率为50MHz */
- GPIO_Init(GPIOA, &GPIO_InitStructure); /*调用库函数,初始化GPIOA*/
- }
- //IO方向设置
- /*******************************************************************************************************
- ** 函 数 名:
- **------------------------------------------------------------------------------------------------------
- ** 函数原型:
- ** 函数功能: 使DHT11-DATA引脚变为输出模式
- ** 入口参数: NONE
- ** 返 回 值: NONE
- ** 作者:
- ********************************************************************************************************/
- static void DHT11_IO_OUT(void)
- {
- GPIO_InitPara GPIO_InitStructure; /*定义一个GPIO_InitTypeDef类型的结构体*/
- GPIO_InitStructure.GPIO_Pin = DHT11_DQ; /*选择要控制的GPIOA引脚*/
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT; /*设置引脚模式为输出*/
- GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; /*设置引脚速率为50MHz */
- GPIO_Init(GPIOA, &GPIO_InitStructure); /*调用库函数,初始化GPIOA*/
- }
- //复位DHT11
- void DHT11_Rst(void)
- {
- DHT11_IO_OUT(); //SET OUTPUT
- GPIO_ResetBits(GPIOA, DHT11_DQ);//拉低DQ
- delay_ms(20); //拉低至少18ms
- GPIO_SetBits(GPIOA, DHT11_DQ); //DQ=1
- delay_us(30); //主机拉高20~40us
- }
- //等待DHT11的回应
- //返回1:未检测到DHT11的存在
- //返回0:存在
- uint8_t DHT11_Check(void)
- {
- uint8_t retry=0;
- DHT11_IO_IN();//SET INPUT
- while (GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//DHT11会拉低40~80us
- {
- retry++;
- delay_us(1);
- };
- if(retry>=100)return 1;
- else retry=0;
- while (!GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//DHT11拉低后会再次拉高40~80us
- {
- retry++;
- delay_us(1);
- };
- if(retry>=100)return 1;
- return 0;
- }
- //从DHT11读取一个位
- //返回值:1/0
- uint8_t DHT11_Read_Bit(void)
- {
- uint8_t retry=0;
- while(GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//等待变为低电平
- {
- retry++;
- delay_us(1);
- }
- retry=0;
- while(!GPIO_ReadInputBit(GPIOA, DHT11_DQ)&&retry<100)//等待变高电平
- {
- retry++;
- delay_us(1);
- }
- delay_us(40);//等待40us
- if(GPIO_ReadInputBit(GPIOA, DHT11_DQ))return 1;
- else return 0;
- }
- //从DHT11读取一个字节
- //返回值:读到的数据
- uint8_t DHT11_Read_Byte(void)
- {
- uint8_t i,dat;
- dat=0;
- for (i=0;i<8;i++)
- {
- dat<<=1;
- dat|=DHT11_Read_Bit();
- }
- return dat;
- }
- //从DHT11读取一次数据
- //temp:温度值(范围:0~50°)
- //humi:湿度值(范围:20%~90%)
- //返回值:0,正常;1,读取失败
- uint8_t DHT11_Read_Data(uint8_t *temp,uint8_t *humi)
- {
- uint8_t buf[5];
- uint8_t i;
- DHT11_Rst();
- if(DHT11_Check()==0)
- {
- for(i=0;i<5;i++)//读取40位数据
- {
- buf=DHT11_Read_Byte();
- }
- if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
- {
- *humi=buf[0];
- *temp=buf[2];
- }
- }else return 1;
- return 0;
- }
- //初始化DHT11的IO口 DQ 同时检测DHT11的存在
- //返回1:不存在
- //返回0:存在
- uint8_t DHT11_Init(void)
- {
- GPIO_InitPara GPIO_InitStructure; /*定义一个GPIO_InitTypeDef类型的结构体*/
- RCC_AHBPeriphClock_Enable( RCC_AHBPERIPH_GPIOA, ENABLE ); /*开启GPIOA的外设时钟*/
- //GPIO_InitPara GPIO_InitStructure; /*定义一个GPIO_InitTypeDef类型的结构体*/
- GPIO_InitStructure.GPIO_Pin = DHT11_DQ; /*选择要控制的GPIOA引脚*/
- GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUT; /*设置引脚模式为输出*/
- GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ; /*设置引脚速率为50MHz */
- GPIO_Init(GPIOA, &GPIO_InitStructure); /*调用库函数,初始化GPIOA*/
- GPIO_SetBits(GPIOA, DHT11_DQ); /* 拉高GPIOA3 */
- DHT11_Rst(); //复位DHT11
- return DHT11_Check(); //等待DHT11的回应
- }
[color=rgb(51, 102, 153) !important]复制代码
4.由于才接触32位单片机,对串口中断不是很明白,程序还有些BUG,程序仅作参考。同时希望有那位大神,拿去改改,重新分享给大家学习。
|
|
|
|
|