GP2Y.c文件
#include "stm32f10x.h" // Device header
u8 USART_Data[6]; //用来存储六位数据
u8 USART_CL; //函数计算位
unsigned int USART_VOUT; //VOUT的值
void Usart2_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitTypeDefs;
GPIO_InitTypeDefs.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitTypeDefs.GPIO_Pin=GPIO_Pin_9;
GPIO_InitTypeDefs.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitTypeDefs);
GPIO_InitTypeDefs.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitTypeDefs.GPIO_Pin=GPIO_Pin_10;
GPIO_InitTypeDefs.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitTypeDefs);
//串口参数初始化
USART_InitTypeDef USART_InitTypeDefs;
USART_InitTypeDefs.USART_BaudRate=2400;
USART_InitTypeDefs.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制,设置为不使用
USART_InitTypeDefs.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; //发送和接收都使能
USART_InitTypeDefs.USART_Parity=USART_Parity_No; // 无奇偶校验
USART_InitTypeDefs.USART_StopBits=USART_StopBits_1; //停止位设置为1
USART_InitTypeDefs.USART_WordLength=USART_WordLength_8b; //数据位为8
USART_Init(USART1,&USART_InitTypeDefs);
//开启串口中断并初始化
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//设置为接收中断,因为我们要接收模块传来的数据
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置串口的中断的抢占优先级和响应优先级
NVIC_InitTypeDef NVIC_InitTypeDefs;
NVIC_InitTypeDefs.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitTypeDefs.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitTypeDefs.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitTypeDefs.NVIC_IRQChannelSubPriority=0;
NVIC_Init(&NVIC_InitTypeDefs);
USART_Cmd(USART1,ENABLE);//开启串口
}
//写中断服务函数
void USART1_IRQHandler(void)
{
u8 res;
static int i=0;
static u8 USART_i;
float VOUT;
unsigned int Vout;
if(USART_GetITStatus(USART1,USART_IT_RXNE))
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //接收完一次,清除中断标志位,等待下次中断到来
res=USART_ReceiveData(USART1);
if(res==0xaa) USART_i=1;
if((USART_i==1)&&(res != 0xAA))
{
USART_Data[i]=res;
i++;
if(i==6)
{
i=0;
USART_i=0;
USART_CL=1;
}
if(USART_CL)
{
Vout=((USART_Data[0])*256+USART_Data[1]);
VOUT=Vout/1024.0;
VOUT *= 5;
USART_VOUT *=180; //换算单位为ug/m^3
USART_CL=0;
}
}
}
}
GP2Y.h文件
#define __GP2Y_H
void Usart2_Init(void);
main.c文件
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "GP2Y.h"
extern int USART_VOUT;
int main(void)
{
int OLED_PM=0;
OLED_Init();
Usart2_Init();
OLED_ShowString(3,1,"PM2.5:");
OLED_ShowString(3,11,"ug/m^3");
while (1)
{
//PM2.5浓度
if(OLED_PM!=USART_VOUT)
{
OLED_PM=USART_VOUT;
OLED_ShowNum(3,7,USART_VOUT,4);
}
else OLED_ShowNum(3,7,USART_VOUT,4);
}
}
GP2Y1051数据手册https://www.taiwaniot.com.tw/wp-content/uploads/2016/04/GP2Y1051AU0F_ch_data.pdf