K_Ag256 2024-04-21 20:33 采纳率: 100%
浏览 2
已结题

stm32读取GP2Y1051没数据

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

  • 写回答

2条回答 默认 最新

  • K_Ag256 2024-04-21 21:38
    关注

    被自己蠢哭了.....
    GP2Y.c文件的第71行改成:
    USART_VOUT=VOUT*180;
    即可

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月21日