要求:

1.使用stm32做主控,芯片自选
2.使用LCD1602显示PM2.5的上下限值,并显示PM2.5的当前值
3.使用按键调节上下限的值
4.使用滑动变阻器代替PM2.5吸合传感器
5.使用ADC0832,测量滑动变阻器的电压代表PM2.5的当前值
6.若PM2.5的值低于下限报警(蜂鸣器)高于上限报警并继电器吸合

开发工具

  • 标准库
  • Keil
  • Protues

Protues&&电路图

Protues这个软件好久没用了,很多都忘记了,最近下载了一个8.9版本的,真的挺好看的。
下面说一下,我使用的时候遇到的小问题:

  • 使用STM32,首先就是要画最小系统:晶振电路,复位电路。但是好奇怪,我在芯片上居然看不到电源,后来发现,在工具栏Design里面有一个configure Power Rails里面就可以设置了

  • 点一盏LED灯我点了一个小时还没点亮,这是最基本的东西,应该不会错才对。
    结果发现,LED灯要设置一下不然真的点不亮。双击LED灯会出现如下画面,圈住的那里,如果是I/O口输入高低电平去控制LED的亮灭就一定要选择digital,如果使用继电器去控制的话就改为analog

  • 后面也没有遇到什么问题了,下面是我这个小作品的电路图

程序

  • LCD1602
    LCD1602在学51单片机的时候经常使用,但是用在STM32上和51上还是有点小区别,51的时候可以整个P0/P1/P2口一起操作,可是32我不会整个PA/PB…一起操作所以命令只能单个I/O操作,不过也还好不会太麻烦。
    显示字符的话就去查看ACSII码,然后操作对应的I/O口即可
    以下是部分代码:(太多了不好全部显示)
/*---------------------------------------LCD引脚初始化-----------------------------------*/
void LCD_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(LCD_CLOCK,ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin=LCD_D0_PIN|LCD_D1_PIN|LCD_D2_PIN|LCD_D3_PIN|LCD_D4_PIN|LCD_D5_PIN|LCD_D6_PIN|LCD_D7_PIN|LCD_E_PIN|LCD_RW_PIN|LCD_RS_PIN;GPIO_Init(LCD_GPIO_PORT,&GPIO_InitStruct);
}/*-----------------------------------清屏命令------------------------------------------*/
void LcdCom_0x01(void)
{GPIO_ResetBits(LCD_GPIO_PORT,LCD_RS_PIN);//RS = 0;      选择发送命令GPIO_ResetBits(LCD_GPIO_PORT,LCD_RW_PIN);//RW = 0;   选择写入GPIO_SetBits(LCD_GPIO_PORT,LCD_D0_PIN);GPIO_ResetBits(LCD_GPIO_PORT,LCD_D1_PIN|LCD_D2_PIN|LCD_D3_PIN|LCD_D4_PIN|LCD_  D5_PIN|LCD_D6_PIN|LCD_D7_PIN);Lcd1602_Delay1ms(5);      //等待数据稳定GPIO_SetBits(LCD_GPIO_PORT,LCD_E_PIN);//E = 1;写入时序Lcd1602_Delay1ms(25);   //保持时间GPIO_ResetBits(LCD_GPIO_PORT,LCD_E_PIN);//E = 0;关闭使能
}/*------------------------------字符A---------------------------------*/
void LcdData_A(void)
{GPIO_SetBits(LCD_GPIO_PORT,LCD_RS_PIN);//RS = 1;  选择输入数据GPIO_ResetBits(LCD_GPIO_PORT,LCD_RW_PIN);//RW = 0;   选择写入GPIO_SetBits(LCD_GPIO_PORT,LCD_D0_PIN|LCD_D6_PIN);//写入数据GPIO_ResetBits(LCD_GPIO_PORT,LCD_D4_PIN|LCD_D1_PIN|LCD_D2_PIN|LCD_D3_PIN|LCD_D5_PIN|LCD_D7_PIN);Lcd1602_Delay1ms(5);GPIO_SetBits (LCD_GPIO_PORT,LCD_E_PIN);//E = 1;   //写入时序Lcd1602_Delay1ms(25);   //保持时间GPIO_ResetBits(LCD_GPIO_PORT,LCD_E_PIN);//E = 0;
}
/*-----------------------------初始化LCD---------------------*/
void LCD_Init(void)                       //LCD初始化子程序
{LcdCom_0x38();  //开显示Lcd1602_Delay1ms(25);LcdCom_0x38();Lcd1602_Delay1ms(25);LcdCom_0x38();Lcd1602_Delay1ms(25);LcdCom_0x0C();//LcdWriteCom(0x0c);  //开显示不显示光标LcdCom_0x06();//LcdWriteCom(0x06);  //写一个指针加1LcdCom_0x01();//LcdWriteCom(0x01);  //清屏Lcd1602_Delay1ms(25);LcdCom_0x0C();
}
  • ADC0832
    这块芯片我也第一次用,很多人在51上使用这块芯片,他们都是把DO和DI接在一起,一开始我打算移植一下别人的51的代码就应该可以用,是因为我太懒,后来发现移植了也不可以用,又不知道有什么问题,后来还是自己写了。时许这种东西还是相信自己吧。
  • 51 可以把DO/DI接在一起,共用一个I/O口,可是stm32不可以,因为stm32初始化引脚的时候要设置模式 DI是输出模式,DO是输入模式
    ADC0832的时序:
    1.CS:片选,通信过程中全程保持低电平
    2.CLK第一个脉冲下降前DI必须为低电平,表示起始信号
    3.第二第三个脉冲下降前DI应输入两位数据用于选择通道,CH0=10’b CH1=11’b
    4.第三个脉冲下降后DI无效,此后利用DO进行数据转换读取
    5.第四个脉冲下降后,开始又DO端进行数据转换最高位开始读,随后,每一个脉冲的下降沿,DO都会输出下一位数据,一共八位数据。
    6.最后传输完成后一定要把CS拉高,不然你读完的数据,就会出现有数据变动然后数据变为0,再也不能测数据。
    代码如下:
#ifndef  __ADC0832__H
#define  __ADC0832__H#include "stm32f10x.h"#define AD_CLOCK                           RCC_APB2Periph_GPIOB
#define AD_GPIO_PORT                        GPIOB
#define AD_CS_PIN                           GPIO_Pin_0
#define AD_CLK_PIN                          GPIO_Pin_1
#define AD_DO_PIN                           GPIO_Pin_3
#define AD_DI_PIN                           GPIO_Pin_2#define ADDO_READ()                           GPIO_ReadInputDataBit(AD_GPIO_PORT,AD_DO_PIN)#define ADCLK0                             GPIO_ResetBits(AD_GPIO_PORT,AD_CLK_PIN)
#define ADCLK1                              GPIO_SetBits(AD_GPIO_PORT,AD_CLK_PIN)
#define ADCS0                               GPIO_ResetBits(AD_GPIO_PORT,AD_CS_PIN)
#define ADCS1                               GPIO_SetBits(AD_GPIO_PORT,AD_CS_PIN)
#define ADDO0                               GPIO_ResetBits(AD_GPIO_PORT,AD_DO_PIN)
#define ADDO1                               GPIO_SetBits(AD_GPIO_PORT,AD_DO_PIN)
#define ADDI0                               GPIO_ResetBits(AD_GPIO_PORT,AD_DI_PIN)
#define ADDI1                               GPIO_SetBits(AD_GPIO_PORT,AD_DI_PIN)void DELAY_Us(void);
void ADC0832_Config(void);
void ADC0832_start(void);
uint8_t ADC0832_read(void);#endif
/*-----------------------------ADC0832引脚初始化---------------------------------*/
void ADC0832_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(AD_CLOCK,ENABLE);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Pin=AD_CS_PIN|AD_CLK_PIN|AD_DI_PIN;GPIO_Init(AD_GPIO_PORT,&GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStruct.GPIO_Pin=AD_DO_PIN;GPIO_Init(AD_GPIO_PORT,&GPIO_InitStruct);}/*--------------------------初始化ADC0832---------------------------*/void ADC0832_start(void)
{ADCS0;//片选信号置零,芯片使能ADDO0;//ADDO为高阻态DELAY_Us();DELAY_Us();ADCLK0;DELAY_Us();DELAY_Us();ADDI1;//第一个脉冲下降前,DI必须为1/************起始信号*************/ADCLK1;//第一个脉冲上升沿DELAY_Us();DELAY_Us();ADCLK0;//第一个脉冲下降沿DELAY_Us();DELAY_Us();/**********通道选择**************/ADDI1;ADCLK1;//第二个脉冲上升沿DELAY_Us();DELAY_Us();ADCLK0;//第二个脉冲下降沿DELAY_Us();DELAY_Us();ADDI0;//选择通道0ADCLK1;//第三个脉冲上升沿DELAY_Us();DELAY_Us();ADCLK0;//第三个脉冲下降沿DELAY_Us();DELAY_Us();
}/*-----------------------启动ADC0832进行转换-------------------------------*/uint8_t ADC0832_read(void)
{uint8_t temp=0;uint16_t i;ADC0832_start();ADDI0;//DI转换成高阻态ADDO1;//使DO脱离高阻态
/*通道选择结束开始读取转换后的二进制数*/ADCLK1;//第四个脉冲上升沿DELAY_Us();ADCLK0;//ADCLK=0;//第四个脉冲下降沿,开始读数,一下进行判断和处理,共8次DELAY_Us();for(i=0;i<8;i++){ADCLK1;DELAY_Us();ADCLK0;if(ADDO_READ()==1){temp |=0x01;}else{temp &=0xfe;}temp=temp<<1;DELAY_Us();}ADCS1;ADC_date=temp;return ADC_date;
}
  • 其他的就是普通的控制I/O 没什么特别,这样就完成了,PM2.5报警器

实验效果如下图

Proteus仿真基于stm32的PM2.5报警器相关推荐

  1. 利用Proteus仿真基于stm32的智能家居并上传至阿里云

    学校组织了为期两周的实训,疫情原因只能线上,学习的是stm32,本来利用32制作智能家居并上传阿里云网上的教程很多的,但是仿真并上云暂未发现,这也是我本次实训感觉学到的东西. 实现的东西其实很简单,就 ...

  2. 15、基于STM32的温湿度超限报警器

    15.基于STM32的温湿度超限报警器 引言 1系统概述 1.1设计任务 1.2设计要求 2 方案设计与论证 2.1芯片选择方案 2.2 系统概述 2.3设计要求: 2.4系统总体设计思路 2.5各功 ...

  3. 基于STM32采集PM2.5(ZH03B)传感器数据实验

    本文主要记录利用STM32的USART2串口采集PM2.5传感器数据,并通过USART1串口利用串口调试助手显示PM2.5数值. 一.实验器材 正点原子STM32MINI开发板,炜盛科技PM2.5(Z ...

  4. 51单片机 Proteus仿真 基于单片机的篮球计分器设计 LCD

    基于单片机的篮球计分器设计 设计LCD显示篮球比分牌 通过加分按钮可以给A队或B队加分 设计对调功能,A队和B队分数互换,意味着中场交换场地 显示比赛倒计时功能 创新内容:如显示第几小节

  5. 【Proteus仿真】Arduino UNO+OLED12864 I2C接口跑图形库

    [Proteus仿真]Arduino UNO+OLED12864 I2C接口跑图形库 Proteus仿真 基于VSM Studio代码 主程序代码 /************************* ...

  6. 基于STM32单片机的温湿度检测报警器(数码管)(Proteus仿真+程序)

    编号:27 基于STM32单片机的温湿度检测报警器(数码管) 功能描述: 本设计由STM32F103单片机最小系统+DHT11温湿度传感器+数码管显示模块+声光报警模块+独立按键组成. 1.主控制器是 ...

  7. 基于stm32的DHT11、光照强度、烟雾浓度、振动频率的proteus仿真(全网第一)

    基于stm32的DHT11.光照强度.烟雾浓度.振动频率的proteus仿真 资料下载地址:基于stm32的DHT11.光照强度.烟雾浓度.振动频率的proteus仿真 功能介绍 1.显示采集的DHT ...

  8. 基于stm32的DHT11温湿度采集LCD显示Proteus仿真

    *本设计:* 基于stm32温湿度采集Proteus仿真(仿真+程序) 仿真图protues 8.9 程序编译器:keil 5 编程语言:C语言 *设计编号:C0041* *功能描述:* 通过STM3 ...

  9. 基于STM32单片机的直流电机PWM调速(Proteus仿真+程序)

    编号:9 基于STM32单片机的直流电机PWM调速 功能描述: 由 STM32单片机+液晶1602显示模块+键盘模块+L298N电机驱动模块+直流电机 1.采用STM32F103单片机为主控制器 2. ...

最新文章

  1. 微信 php post json,微信企业号:如何POST JSON数据发送消息给企业号成员
  2. python读取excel日期内容读出来是数字-Python xlrd读取excel日期类型的2种方法
  3. 一步步学习微软InfoPath2010和SP2010--第三章节--表单设计基础:处理InfoPath布局、控件和视图(4)--控件属性功能区...
  4. flutter TabBar 底部导航栏
  5. VSTO学习笔记(四)从SharePoint 2010中下载文件
  6. 没有光芯片,何谈 5G 与 AI !
  7. python汉字排序规则_根据规则对python中的列表进行排序
  8. Java基础篇:什么是线程优先级?
  9. Python数据分析、挖掘常用工具
  10. android渠道编号,Android 不同渠道差异代码
  11. SMILES, a Chemical Language and Information System.【SMILES, 一种化学语言和信息系统。】
  12. java运行速度慢的原因_java运行速度慢的原因 | 学步园
  13. rocket-dashboard安装部署
  14. 针对或者利用计算机网络实施,网络安全合规指引题库:针对或者利用计算机网络实施的犯罪,哪些公安机关不可以管辖?()...
  15. Cubase v5.1.1 macOS (移植版)音乐制作软件下载
  16. 网站seo中期的操作
  17. python中文乱码总结
  18. 【Python】输入圆的半径,根据自定义的方法返回圆的周长/面积等
  19. 基于vue的英语单词App
  20. spring-boot创建项目出现spring-boot-starter-parent版本报红问题

热门文章

  1. 企业使用网络电话,节约通话成本
  2. Java服务器性能监控(一) Metrics
  3. 【转载】串行并行工序混合的生产线数学模型
  4. ALV字段‘‘QUAN‘小数位全为零不显示小数位,不全为零显示小数位
  5. python getattr和getattribute_Python的__getattr__和__getattribute__
  6. JAVA中Set的基本用法
  7. 百鸡百钱问题。公鸡每只3元,母鸡每只5元,小鸡三只一元,用100元钱买100只鸡,公鸡、母鸡、小鸡应各买多少?
  8. linux中ll命令详解
  9. Python中的幸存者实体提取和网络图
  10. vue自定义组件的点击事件失效