加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入

基于STM32单片机一氧化碳(CO)气体监控系统proteus仿真设计(程序+原理图+讲解视频)

08/02 09:06
2480
服务支持:
技术交流群

完成交易后在“购买成功”页面扫码入群,即可与技术大咖们分享疑惑和经验、收获成长和认同、领取优惠和红包等。

虚拟商品不可退

当前内容为数字版权作品,购买后不支持退换且无法转移使用。

加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论
放大
实物图
相关方案
  • 方案介绍
    • 资料清单
  • 相关文件
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

本设计是基于STM32单片机CO气体检测系统仿真设计(仿真+程序+原理图+讲解视频)仿真图proteus 8.9

程序编译器:keil 5

编程语言:C语言

设计编号:C0045

主要功能:

1、本系统采用STM32内部ADC模块模拟MQ7传感器采集CO气体浓度。

2、通过液晶1602显示气体监测浓度和报警浓度。

3、可以通过按键设置报警值,气体超过设置值,电机启动,蜂鸣器报警,小于设定值,电机停止,蜂鸣器待机。

仿真图(提供源文件)

仿真图

程序(提供源文件源码)

image-20220821114502098

STM32驱动LCD1602显示代码

#include "bsp-lcd1602.h"

void LCD1602_GPIO_Config(void)
{
	RCC_APB2PeriphClockCmd(LCD1602_CLK, ENABLE);
	GPIO_InitTypeDef LCD1602_GPIOStruct;
	LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	LCD1602_GPIOStruct.GPIO_Speed = GPIO_Speed_10MHz;
	LCD1602_GPIOStruct.GPIO_Pin =  LCD1602_E | LCD1602_RS | LCD1602_RW ;
	GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
	LCD1602_GPIOStruct.GPIO_Mode = GPIO_Mode_Out_OD;
	LCD1602_GPIOStruct.GPIO_Pin =   DB0 |  DB1 | DB2 |DB3 |  DB4 | DB5|
																	DB6 |  DB7 ;     //设置为开漏输出 
	GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
}

void LCD1602_WaitReady(void) //检测忙状态
{
	uint8_t sta;

	GPIOB->ODR =0x00FF;
	RSO(0);
	RWO(1);
	EO(1);
	SysTick_Delay_Us(1);
	do{
		sta=GPIO_ReadInputDataBit(LCD1602_GPIO_PORT,GPIO_Pin_7);
		EO(0);
	}while(sta);
}

void LCD1602_WriteCmd(uint8_t cmd) //写指令
{
	LCD1602_WaitReady();
	RSO(0);
	RWO(0);
	EO(0);
	SysTick_Delay_Us(1);
	EO(1);
	LCD1602_GPIO_PORT->ODR &= (cmd|0xFF00);
	EO(0);
	SysTick_Delay_Us(400);
}

void LCD1602_WriteDat(uint8_t dat) //写数据
{
	LCD1602_WaitReady();
	RSO(1);
	RWO(0);
	SysTick_Delay_Us(30);
	EO(1);
	LCD1602_GPIO_PORT->ODR &=(dat|0xFF00);
	EO(0);
	SysTick_Delay_Us(400);
}

void LCD1602_SetCursor(uint8_t x, uint8_t y)
{
    uint8_t addr;
    
    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;  //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址从0x40起始
    LCD1602_WriteCmd(addr|0x80);  //设置RAM地址
}

void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
{
    LCD1602_SetCursor(x, y);	//设置起始地址
    while (len--)         //连续写入len个字符数据
    {
        LCD1602_WriteDat(*str++);
    }
}

//??1???
//x,y :????         
//num:??(0~99)         
//-----------------------------*/          
void LCD_ShowNum(uint8_t x, uint8_t y,uint8_t num)
{     

	    LCD1602_SetCursor(x, y);	//设置起始地址
    LCD_ShowChar(x,y,num+'0');
	
} 

void LCD_ShowChar(uint8_t x, uint8_t y,uint8_t dat)
{

	    LCD1602_SetCursor(x, y);	//设置起始地址
        LCD1602_WriteDat(dat);
}



void LCD1602_Init(void)
{
	  LCD1602_GPIO_Config();   //开启GPIO口
    LCD1602_WriteCmd(0X38);  //16*2显示,5*7点阵,8位数据接口
    LCD1602_WriteCmd(0x0C);  //显示器开,光标关闭
    LCD1602_WriteCmd(0x06);  //文字不动,地址自动+1
    LCD1602_WriteCmd(0x01);  //清屏
}

主函数

#include "stm32f10x.h"
#include "bsp-lcd1602.h"
#include "delay.h"
#include "sys.h"
#include "adc.h"
#define KEY4  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_14)	//读取按键K1
#define KEY5  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)	//读取按键K2
int th=10;
#define LED1 PAout(13)
void KEY_Init(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;	//配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;   		//配置为上拉输入
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//初始化
}
//LED IO初始化
void LED_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PC端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_12;				 
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化
 GPIO_SetBits(GPIOA,GPIO_Pin_13);		
 GPIO_SetBits(GPIOA,GPIO_Pin_12);			
}
 

void KEY_Scan(void)
{	
	   if(KEY4==0)			//读取K1按键状态
		{
			delay_ms(10);
			if(KEY4==0)
			{
				while(KEY4==0);
			  th++;
				if(th>33) th=0;
			
			}
		}
		if(KEY5==0)			//读取K2按键状态
		{
			delay_ms(10);
			if(KEY5==0)
			{
				while(KEY5==0);
			  if(th>0) th--;
			
			
			}
		}
	
}
int main(void)
{
   int a,b,c,d;
	int temp;
   LED_Init();
	delay_init();	    	 //延时函数初始化	  	
	LCD1602_Init();
  ADC1_GPIO_Config();
  ADC_Config();  
	LCD1602_ShowStr(0,0,"co:  ppm",8);
	LCD1602_ShowStr(0,1,"AH:  ppm",8);
	KEY_Init();
	while(1)
	{
		b=ADC_GetConversionValue(ADC1);
		temp=b*10*(3.4/4096);
		a=temp/10;

		c=temp%10;
		
		
		LCD_ShowNum(3,0,a);
		
		LCD_ShowNum(4,0,c);
		LCD_ShowNum(3,1,th/10);
		
		LCD_ShowNum(4,1,th%10);
		KEY_Scan();
		if(temp>th) LED1=0;
		else LED1=1;
	}
}




STM32内部ADC驱动代码

#include "adc.h"

void ADC1_GPIO_Config(void){
    GPIO_InitTypeDef GPIO_InitStructure;
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1, ENABLE);	//使能ADC1,GPIOC时钟
 	  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //
  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;	//模拟输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PC4
}


void ADC_Config(void)
{
	

  ADC_InitTypeDef ADC_InitStructure;//ADC结构体变量//注意在一个语句快内变量的声明要放在可执行语句的前面,否则出错,因此要放在ADC1_GPIO_Config();前面
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式
  ADC_InitStructure.ADC_ScanConvMode =	DISABLE; //使能扫描
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由软件控制转换,不使用外部触发
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐
  ADC_InitStructure.ADC_NbrOfChannel = 1;//转换通道为1
  ADC_Init(ADC1, &ADC_InitStructure); //初始化ADC
	
  ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5);
  //ADC1选择信道14,音序等级1,采样时间55.5个周期
//  ADC_DMACmd(ADC1, ENABLE);//使能ADC1模块DMA
  ADC_Cmd(ADC1, ENABLE);//使能ADC1
	ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//  ADC_ResetCalibration(ADC1); //重置.(复位).ADC1校准寄存器
//  while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成
//  ADC_StartCalibration(ADC1);//开始ADC1校准
//  while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成
//  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换
}

原理图(提供源文件仅供参考)

image-20220821114602672

资料清单

在这里插入图片描述

  1. 常见使用问题及解决方法–必读!!!!
  2. 源程序
  3. proteus仿真
  4. 原理图
  5. 讲解视频
  6. 功能要求
    Altium Designer 软件资料
    filename.bat
    KEIL软件资料
    Proteus软件资料
    单片机学习资料
    目录清单.txt
    答辩技巧
    设计报告常用描述
    鼠标双击打开查找更多51 STM32单片机课程毕业设计.url
  • 设计资料获取联系方式.doc

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
DS3234SN#T&R 1 Maxim Integrated Products Real Time Clock, Non-Volatile, 1 Timer(s), CMOS, PDSO20, 0.300 INCH, ROHS COMPLIANT, SOP-20
$8.47 查看
PIC32MX575F512L-80I/PT 1 Microchip Technology Inc 32-BIT, FLASH, 80 MHz, RISC MICROCONTROLLER, PQFP100, 12 X 12 MM, 1 MM HEIGHT, LEAD FREE, PLASTIC, TQFP-100

ECAD模型

下载ECAD模型
$8.67 查看
FT232RL-REEL 1 FTDI Chip USB Bus Controller, CMOS, PDSO28, 10.20 X 5.30 MM, GREEN, SSOP-28

ECAD模型

下载ECAD模型
$4.79 查看

相关推荐

电子产业图谱