野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12636|回复: 11

GP2Y1051AU0F与野火开发板串口显示PM2.5

[复制链接]
发表于 2016-1-5 22:55:52 | 显示全部楼层 |阅读模式
本帖最后由 海波 于 2017-4-6 23:22 编辑

因为网上没找到二代PM2.5传感器的相关代码,就自己顺手写了一份,代码很简单,各位大神别笑我。
楼下贴代码。2017/4/6更新工程文件,有时候再想为什么有了源码你们还不能写呢?况且还是个这么简单的东西。

PM2.5.rar

3.12 MB, 下载次数: 268

回复

使用道具 举报

 楼主| 发表于 2016-1-5 23:01:19 | 显示全部楼层
usart.c 文件

#include "bsp_usart3.h"
#include <stdarg.h>

//配置USART3接收中断
static void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
    NVIC_InitStructure.NVIC_IRQChannel =  USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/*
* 函数名:USART1_Config
* 描述  :USART1 GPIO 配置,工作模式配置
* 输入  :无
* 输出  : 无
* 调用  :外部调用
*/
void USART1_Config(void)
{
        GPIO_InitTypeDef        GPIO_InitStructure;
        USART_InitTypeDef        USART_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                       //PA9
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //复用推挽输出  //TX初始化       
        GPIO_Init(GPIOA, &GPIO_InitStructure);        
                                  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                     //PA10       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上啦输入       
        GPIO_Init(GPIOA, &GPIO_InitStructure);                              //RX初始化
       
        USART_InitStructure.USART_BaudRate = 2400;                                   //波特率2400       
        USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8       
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                  //停止位1       
        USART_InitStructure.USART_Parity = USART_Parity_No;                    //无奇偶校验       
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制       
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//开启发送接收       
        USART_Init(USART1, &USART_InitStructure);                                          //usart1初始化

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);       
        USART_Cmd(USART1, ENABLE);
}
/*
* 函数名:USART3_Config
* 描述  :USART3 GPIO 配置,工作模式配置
* 输入  :无
* 输出  : 无
* 调用  :外部调用
*/
void USART3_Config(void)
{
  GPIO_InitTypeDef        GPIO_InitStructure;
        USART_InitTypeDef        USART_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3 , ENABLE);
          
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//        GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                       //PB10
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;     //复用推挽输出  //TX初始化       
        GPIO_Init(GPIOB, &GPIO_InitStructure);        
                                  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;                     //PB11       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入       
        GPIO_Init(GPIOB, &GPIO_InitStructure);                                //RX初始化
       
        USART_InitStructure.USART_BaudRate = 2400;                                   //波特率2400       
        USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8       
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                  //停止位1       
        USART_InitStructure.USART_Parity = USART_Parity_No;                    //无奇偶校验       
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制       
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//开启发送接收       
        USART_Init(USART3, &USART_InitStructure);                                          //usart3初始化
  NVIC_Configuration();
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);       
        USART_Cmd(USART3, ENABLE);
}

/*****************  发送一个字符 **********************/
static void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch )
{
        /* 发送一个字节数据到USART1 */
        USART_SendData(pUSARTx,ch);
               
        /* 等待发送完毕 */
        while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);       
}
/*****************  指定长度的发送字符串 **********************/
void Usart_SendStr_length( USART_TypeDef * pUSARTx, uint8_t *str,uint32_t strlen )
{
        unsigned int k=0;
    do
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(k < strlen);
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, uint8_t *str)
{
        unsigned int k=0;
    do
    {
        Usart_SendByte( pUSARTx, *(str + k) );
        k++;
    } while(*(str + k)!='\0');
}
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到USART1 */
                USART_SendData(USART1, (uint8_t) ch);
               
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);               
       
                return (ch);
}
/******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-5 23:02:07 | 显示全部楼层
main.c 文件
/**********天津工业大学********2016.1.5********/
/**
        * 作者:  海波
  * 实验内容M2.5串口读取显示
  * 实验平台:野火 iSO STM32 开发板
  * 接线方式 PM2.5 TXD -----------> PB11
**/

#include "stm32f10x.h"
#include "bsp_usart3.h"
#define N 7  //数据位长度
int i=0;
int n;
float pm;
int pmshow;
unsigned char  cal[7]; //定义接收数组
unsigned char sum;
void senddata(unsigned char dat)  //数据处理函数
{
    if(dat==170) //首位是否为0xAA
        {
                i=0;
                cal[i]=dat;  
        }
        else
        {
                i=i+1;
                cal[i]=dat;
                if(i==6)
                {       
                        sum= cal[1]+cal[2]+cal[3]+cal[4];
                        if(sum == cal[5] && cal[6]==255)
                        {
                                        pm=(int)((cal[1]*256+cal[2])/(1.024));
          pmshow=pm;                               
                        }

                }
         }
}
       
int main(void)
{       

        USART3_Config();
  USART1_Config();
        printf( "这是一个PM2.5数值实时显示实验\n" );
        for(;;);
}

void USART3_IRQHandler(void)
{
        unsigned char  ch;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {        
           ch=USART_ReceiveData(USART3);
                 senddata(ch);
                 printf("M2.5的值为%d\n",pmshow);                               
        }          
}

回复 支持 反对

使用道具 举报

发表于 2016-1-6 08:51:14 | 显示全部楼层
用的是什么传感器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-6 11:33:26 | 显示全部楼层
flyleaf 发表于 2016-1-6 08:51
用的是什么传感器

PM2.5粉尘传感器灰尘传感器二代升级版GP2Y1051AU0F
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-14 18:48:00 | 显示全部楼层
今天刚发现,printf应该写在senddata函数里,不是写在中断里
回复 支持 反对

使用道具 举报

发表于 2016-5-11 23:18:20 | 显示全部楼层
大神能把工程的文件夹发我一份吗
回复 支持 反对

使用道具 举报

发表于 2016-5-30 04:05:06 | 显示全部楼层
请问一下浓度系数是怎么定的?
回复 支持 反对

使用道具 举报

发表于 2016-5-30 04:12:38 | 显示全部楼层
请问为什么写了串口1和串口3
两个串口函数?
回复 支持 反对

使用道具 举报

发表于 2017-4-4 16:20:38 | 显示全部楼层
大神,能否提供一下  总的例程。重金感谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-7 08:58:24 | 显示全部楼层
更新工程文件
回复 支持 反对

使用道具 举报

发表于 2018-12-7 22:10:48 | 显示全部楼层
正好用到
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 21:20 , Processed in 0.043087 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表