基于STM32的环境质量监测系统:毕业设计实现及其源码、原理图及论文分析

文章目录

  • 0 前言
  • 1 设计架构
  • 功能设计
  • 2 原理图
  • 3 软件设计
  • 4 实现效果
  • 5 相关代码
  • 6 最后

  • 0 前言

    🔥
    这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 毕业设计 基于STM32的环境质量监测系统(源码+原理图+论文)

    🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:3分
  • 🧿 项目分享:

    https://gitee.com/sinonfin/sharing

    1 设计架构

    本系统主要由单片机系统、液晶显示、温湿度采集模块、PM2.5采集模块和甲醛模块。采用单片机作为主控芯片,将采集到的温湿度和PM2.5,甲醛浓度显示到LCD1602液晶上,来实现当前环境的采集。

    功能设计

    主要功能: 使用STM32为主控制器,可采集当前环境下的温湿度、甲醛、PM2.5值,当采集值超过预设阀值时,蜂鸣器自动报警。采集到的温湿度、甲醛、PM2.5会显示在LCD1602显示屏上,且自动上传至上位机(手机),可以在手机查收采集到的各种参数。可通过三个按键任意设置报警阀值。

  • 1.使用STM32F103C8T6单片机做主控制器。

  • 2.使用LCD1602显示采集到的温湿度、甲醛、PM2.5值。

  • 3.使用ESP8266上次至手机,采集数据实时上传到手机上。

  • 4.使用DHT11采集当前环境温湿度。

  • 5.使用ZE08-CH2O 采集甲醛值。

  • 6.使用GP2Y1014AU粉尘传感器采集当前环境PM2.5值。

  • 7.三个按键可任意设置报警阀值,当采集值超过了报警阀值后,蜂鸣器会自动报警。

  • 2 原理图

    3 软件设计

    整体流程框图是描述整个系统运行过程的流程图。通过框图可以看出主程序是如何对各个子程序的调用来实现整个系统功能的。根据系统概述的分析,画出系统软件流程图如图

    温度采集模块是本系统的核心模块之一,根据传感器的通信协议规定,DHT11不会主动采集环境温湿度,只有单片机通过I/O口发出激发信号,主动驱动传感器,传感器才会工作,这时,单片机将数据线的控制权交给传感器,由传感器完成数据采集,模数转换,数据发送的任务,而单片机通过对I/O口高低电平的不断检测,来解析出正确的数字信息[15]。根据以上流程,设计DHT11温湿度采集软件流程图如图

    篇幅有限,其他流程不在这里过度复述。。

    4 实现效果

    正面

    反面

    5 相关代码

    #include<stm32.h>   //头文件
    #include<intrins.h>
    #include<stdio.h>
    #include<math.h>    //Keil library
    sbit DATA=P2^4;     //数据
    sbit SCK=P2^3;     //时钟
    #define TEMP_ML   0x03     //000   0001   1 温度命令
    #define HUMI_ML   0x05     //000   0010   1 湿度命令
    unsigned char error;    //全局错误变量
    unsigned char ack;     //全局错误变量
    //float temp_zi;       //全局应答变量
    //float humi_zi;       //全局应答变量
    unsigned char temp_h; //全局应答变量
    unsigned char temp_LL; //全局应答变量
    unsigned char humi_h; 
    unsigned char temp_LL
    #define uchar unsigned char //定义一下方便使用
    #define unit unsigned int
    #define ulong unsigned long
    unsigned int recs=0;//接收次数
    uchar TempBuffer[5];uchar humibuffer[4];
    const unsigned char SHUO[15]=”0123456789.%RH”;
    int xts_zi=0;//温度值
    int xtg_zi=0;//温度个位值
    int xtd_zi=0;//温度点值
    int xss_zi=0;//湿度值
    int xsg_zi=0;//湿度个位值
    int xsd_zi=0;//湿度点值
    sbit soud=P1^4;//声音
    //基本驱动程序
    //系统初始化
    Void start(void)     //启动
    {
    DATA=1; SCK=0;          //数据为1,SCK=0
    _nop_();
    SCK=1;                 //第一个脉冲
    DATA=0;               //数据跌落
    _nop_();
    SCK=0;               //完成一个脉冲
    _nop_(); _nop_();   _nop_();
    SCK=1;              //再一个脉冲
    _nop_();
     DATA=1;           //数据变为1
    _nop_();
    SCK=0;             //变为该脉冲
    }
    Void sht_rest(void)    //复位
    {
    unsigned char I;
    DATA=1;SCK=0;               //数据为1时钟为0
    for(i=0;i<9;i++)            //9个脉冲为复位
    {SCK=1;
    SCK=0;
    }
    Start();                  //启动
    }
    char write(unsigned char value)//写一个字节  返回应答信号
    { 
    Unsigned char I;
    ack=0;
    for(i=0x80;i>0;i/=2)           //释放数据总线
    {if(i&value)DATA=1;           //写入值
    Else DATA=0;
    SCK=1;                     //上升沿写入
    _nop_(); _nop_();   _nop_();   //延时
    SCK=0;
    }DATA=1;                  //释放数据总线
    SCK=1;
    return ack;                 //error=1表示没有应答
    }
    char read()//读一个字节返回应答信号
    {
    Unsigned char I,val=0;
    temp_LL=0;
    temp_h=0;
    DATA=1;                //释放数据总线
    for(i=0x80;i>0;i/=2)    //位移8位
    {SCK=1;                 //上升沿读入
    if(DATA)val=(val|i)        //确定值
    SCK=0;
    }
    DATA=0;                //读应答信号应答为1,应答为0通过CPU下拉为应答
    SCK=1;                 第9个脉冲
    _nop_(); _nop_();   _nop_();   //pulswith approx.5us
    SCK=0;
    DATA=1;                 //释放数据总线
    temp_h=val;
    val=0;
    //低8位
    DATA=1;                 //释放数据总线
    for(i=0x80;i>0;i/=2)        //位移8位
    {SCK=1;                   //上升沿读入
    if(DATA)val=(val|i)        //确定值
    SCK=0;
    }
    DATA=1;//0;              //不需要应答 通过CPU下拉为应答
    SCK=1;                  第9个脉冲
    _nop_(); _nop_();   _nop_();   //pulswith approx.5us
    SCK=0;
    DATA=1;                   //释放数据总线
    temp_LL=val
    return val;
    }
    //测量温度或者是湿度,返回校验值
    text_a(unsigned char ml)
    {
    unsigned int I;
    start();                     //启动
    write(ml);                  //写入测温度
    if(ack==1)
    {
    sht_rest();                 //复位
    write(ml);                  //写入测温度
    }
    //DATA=1;// 释放数据总线
    For(i=0;i<65535;i++)if(DATA==0)break;
    read();//度温度
    }
    text_jishuan_temp()
    {
    float aa=0,bb=0,temp zi;
    int abcd=0;
    aa=(float)temp_h*256+(float)temp_LL;
    temp_zi=0.01*aa-40;
    if  (temp_zi<0)
    {
    temp_zi= -temp_zi;
    }
    temp_zi= temp_zi*10;
    abcd=(int) temp_zi;
    xts_zi=abcd/100;
    abcd=abcd%100;
    xtg_zi=abcd/10;
    abcd=abcd%10;
    xtd_zi=abcd/1;
    }
    text_jishuan_humi()
    {
    float aa=0,bb=0,humi_zi;
    int abcd=0;
    aa=(float)temp_h*256+(float)temp_LL;
    baa*aa*2.8/1000000;
    aa=0.0405*aa;
    aa=aa-4-bb;
    humi_zi= humi_zi*10;
    abcd=(int)humi_zi;
    xss_zi=abcd/100;
    abcd=abcd%100;
    xsg_zi=abcd/10;
    abcd=abcd%10;
    xsd_zi=abcd/1;
    }
    text_jishuan_temp11()
    {
    error=0;
    ack=0;
    sht_rest();          //复位
    text_a(TEMP_ML);
    text_jishuan_temp();
    text_a(HUMI_ML);
    text_jishuan_humi();
    }
    unsigned int wendu,shidu;
    void delay_n10us(unit n)      //延时n个10us@12M晶振
    {
    uint i;
    for(i=n;i>0;i--)
    {
    _nop_(); _nop_();   _nop_();  _nop_(); _nop_();   _nop_();
    }
    

    6 最后

    资料分享,包含内容

    🧿 项目分享:

    https://gitee.com/sinonfin/sharing

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于STM32的环境质量监测系统:毕业设计实现及其源码、原理图及论文分析

    发表评论