标题:
STM32F103C8 GP2Y1010AU0F PM2.5空气质量检测
[打印本页]
作者:
radcat
时间:
2018-7-22 17:14
标题:
STM32F103C8 GP2Y1010AU0F PM2.5空气质量检测
PM2.5空气质量检测程序源码,测试通过
单片机源程序如下:
//=============================================================================
//文件名称:main.h
//功能概要:STM32F103C8核心检测
//调试方式:J-Link OB ARM SW方式 5MHz
//=============================================================================
//头文件
#include "stm32f10x.h"
#include "GPIOLIKE51.h"
#include "USART.h"
#include "DHT11.h"
#include "ADC_DMA.h"
#include "systick.h"
#include <stdio.h>
//=============================================================================
//全局变量定义
//=============================================================================
float gp2y1010auof[100];
//=============================================================================
//函数定义
//=============================================================================
void LED_Init(void);//初始呼吸灯
void TIME_Init(void);//初始初始计时器中断
u32 PM25_Val(void);//pm2.5浓度计算
//=============================================================================
//文件名称:main
//功能概要:主函数
//参数说明:无
//函数返回:int
//=============================================================================
int main(void)
{
u16 RxData = 0x00;
uchar temp[]={"00.00"};
uchar humi[]={"00.00"};
char szbuffer[32];
delay_init();//延时函数初始化
LED_Init();//初始呼吸灯
TIME_Init();//初始计时器中断
USART_Configuration();//USART通迅端口初始化
DHT11_Init();//初始化DHT11
ADC_DMA_Init();//初始化ADC_DMA
while (1)
{
RxData = USART_RECV();
if(RxData == 0x00)
{
USART_SEND("测试连接成功\n");
}
else if(RxData == 0x01)
{
DHT11_GET_CALCULATE(temp, humi);
sprintf(szbuffer, "温度:%s 湿度:%s\n", temp, humi);
USART_SEND(szbuffer);
}
else if(RxData == 0x02)
{
sprintf(szbuffer, "空气质量:%4.2f\n", ADC_DMA_GET_MQ135());
USART_SEND(szbuffer);
}
else if(RxData == 0x03)
{
sprintf(szbuffer, "粉尘浓度:%d\n", PM25_Val());
USART_SEND(szbuffer);
}
}
}
//初始呼吸灯
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
//初始计时器中断
void TIME_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);
//((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒
TIM_TimeBaseStructure.TIM_Period = 89;//10ms
TIM_TimeBaseStructure.TIM_Prescaler = 7199;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3 , &TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM3, ENABLE);
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM3 , ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_IRQHandler(void)
{
static u16 sum = 0;
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
if(sum >= 100)//1秒
{
sum = 0;
PBout(0) = !PBin(0);
}
gp2y1010auof[sum] = ADC_DMA_GET_GP2Y1010AU0F();
sum++;
}
u32 PM25_Val(void)
{
u16 index = 0;
u32 hex_val = 0;
u32 hex_val_old = 0.0f;
for(index = 0; index < 100; index++)
hex_val += (gp2y1010auof[index] / 5) * 500;
hex_val /= 100;
hex_val_old = hex_val;
hex_val = (hex_val + hex_val_old) / 2;
return hex_val;
}
复制代码
全部资料51hei下载地址:
air.rar
(1016.48 KB, 下载次数: 145)
2018-7-22 17:13 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
usb123
时间:
2018-8-2 16:17
麻烦管理员看一下,,这个为什么下载的时候会提示资源错误呢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1