加入星計劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權(quán)保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

基于STM32單片機一氧化碳(CO)氣體監(jiān)控系統(tǒng)proteus仿真設(shè)計(程序+原理圖+講解視頻)

08/02 09:06
2483
服務(wù)支持:
技術(shù)交流群

完成交易后在“購買成功”頁面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗、收獲成長和認同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當前內(nèi)容為數(shù)字版權(quán)作品,購買后不支持退換且無法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論
放大
實物圖
相關(guān)方案
  • 方案介紹
    • 資料清單
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

本設(shè)計是基于STM32單片機CO氣體檢測系統(tǒng)仿真設(shè)計(仿真+程序+原理圖+講解視頻)仿真圖proteus 8.9

程序編譯器:keil 5

編程語言:C語言

設(shè)計編號:C0045

主要功能:

1、本系統(tǒng)采用STM32內(nèi)部ADC模塊模擬MQ7傳感器采集CO氣體濃度。

2、通過液晶1602顯示氣體監(jiān)測濃度和報警濃度。

3、可以通過按鍵設(shè)置報警值,氣體超過設(shè)置值,電機啟動,蜂鳴器報警,小于設(shè)定值,電機停止,蜂鳴器待機。

仿真圖(提供源文件)

仿真圖

程序(提供源文件源碼)

image-20220821114502098

STM32驅(qū)動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 ;     //設(shè)置為開漏輸出 
	GPIO_Init(LCD1602_GPIO_PORT,&LCD1602_GPIOStruct);
}

void LCD1602_WaitReady(void) //檢測忙狀態(tài)
{
	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) //寫數(shù)據(jù)
{
	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);  //設(shè)置RAM地址
}

void LCD1602_ShowStr(uint8_t x, uint8_t y, uint8_t *str, uint8_t len)
{
    LCD1602_SetCursor(x, y);	//設(shè)置起始地址
    while (len--)         //連續(xù)寫入len個字符數(shù)據(jù)
    {
        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);	//設(shè)置起始地址
    LCD_ShowChar(x,y,num+'0');
	
} 

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

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



void LCD1602_Init(void)
{
	  LCD1602_GPIO_Config();   //開啟GPIO口
    LCD1602_WriteCmd(0X38);  //16*2顯示,5*7點陣,8位數(shù)據(jù)接口
    LCD1602_WriteCmd(0x0C);  //顯示器開,光標關(guān)閉
    LCD1602_WriteCmd(0x06);  //文字不動,地址自動+1
    LCD1602_WriteCmd(0x01);  //清屏
}

主函數(shù)

#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);					 //根據(jù)設(shè)定參數(shù)初始化
 GPIO_SetBits(GPIOA,GPIO_Pin_13);		
 GPIO_SetBits(GPIOA,GPIO_Pin_12);			
}
 

void KEY_Scan(void)
{	
	   if(KEY4==0)			//讀取K1按鍵狀態(tài)
		{
			delay_ms(10);
			if(KEY4==0)
			{
				while(KEY4==0);
			  th++;
				if(th>33) th=0;
			
			}
		}
		if(KEY5==0)			//讀取K2按鍵狀態(tài)
		{
			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();	    	 //延時函數(shù)初始化	  	
	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內(nèi)部ADC驅(qū)動代碼

#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結(jié)構(gòu)體變量//注意在一個語句快內(nèi)變量的聲明要放在可執(zhí)行語句的前面,否則出錯,因此要放在ADC1_GPIO_Config();前面
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在獨立模式
  ADC_InitStructure.ADC_ScanConvMode =	DISABLE; //使能掃描
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC轉(zhuǎn)換工作在連續(xù)模式
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//由軟件控制轉(zhuǎn)換,不使用外部觸發(fā)
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//轉(zhuǎn)換數(shù)據(jù)右對齊
  ADC_InitStructure.ADC_NbrOfChannel = 1;//轉(zhuǎn)換通道為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); //重置.(復(fù)位).ADC1校準寄存器
//  while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校準重置完成
//  ADC_StartCalibration(ADC1);//開始ADC1校準
//  while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校準完成
//  ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1軟件開始轉(zhuǎn)換
}

原理圖(提供源文件僅供參考)

image-20220821114602672

資料清單

在這里插入圖片描述

  1. 常見使用問題及解決方法–必讀!?。?!
  2. 源程序
  3. proteus仿真
  4. 原理圖
  5. 講解視頻
  6. 功能要求
    Altium Designer 軟件資料
    filename.bat
    KEIL軟件資料
    Proteus軟件資料
    單片機學(xué)習(xí)資料
    目錄清單.txt
    答辯技巧
    設(shè)計報告常用描述
    鼠標雙擊打開查找更多51 STM32單片機課程畢業(yè)設(shè)計.url
  • 設(shè)計資料獲取聯(lián)系方式.doc

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
R5F104MKGFB#50 1 Renesas Electronics Corporation Low Power, High Function, General Purpose Microcontrollers for Motor Control, Industrial and Metering Applications, LQFP, /Tray

ECAD模型

下載ECAD模型
暫無數(shù)據(jù) 查看
MC56F8323VFBE 1 Freescale Semiconductor 16-bit DSC, 56800E core, 32KB Flash, 60MHz, QFP 64

ECAD模型

下載ECAD模型
$14.69 查看
STM32F103VET6 1 STMicroelectronics Mainstream Performance line, Arm Cortex-M3 MCU with 512 Kbytes of Flash memory, 72 MHz CPU, motor control, USB and CAN

ECAD模型

下載ECAD模型
$16.64 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜