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

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

STM32单片机酒精检测防酒驾系统酒精报警器

08/08 09:43
2376
服务支持:
技术交流群

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

虚拟商品不可退

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

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

STM32单片机酒精检测防酒驾系统酒精报警器(程序+原理图+PCB+视频讲解)

原理图PCBAltium Designer

程序编译器:keil 5

编程语言:C语言

设计编号:C0062

功能描述

本系统由STM32F103C8T6单片机核心板、酒精传感器LCD1602液晶显示、蜂鸣器报警、按键控制及电源组成。

1、通过传感器检测传感器实际值,并将传感器实际值显示在LCD1602液晶上;

2、感器检测采用的是AD数据转换,然后经过运算获得的;

3、三个按键设置阈值,分别为设置键、设置+、设置-,其中设置+、设置-只有在设置模式下才能进行操作;

4、在设置模式下,液晶有对应的显示标志,设置阈值存储到单片机Flash中,具有掉电不丢失,无需重新设置;

5、设置值与采集值实时对比,如果出现异常情况,蜂鸣器报警提醒。

img

原理图

img

STM32系列处理器意法半导体ST公司生产的一种基于ARM 7架构的32位、支持实时仿真和跟踪的微控制器。选择此款控制芯片是因为本系统设计并非追求成本的最低或更小的功耗,而是在实现本设计功能的前提下能够提供更丰富的接口和功能以便于设计实验系统各实验项目所需的外围扩展电路。此款控制芯片在完成单片机课程的学习后上手较为容易,在医疗器械中应用广泛,具有很好的学习、实验研究价值。

一、STM32的主要优点:

(1)使用ARM最新的、先进架构的Cortex-M3内核

(2) 优异的实时性能

(3) 杰出的功耗控制

(4) 出众及创新的外设

(5) 最大程度的集成整合

(6) 易于开发,可使产品快速将进入市场

二、STM32——最佳的平台选项

对于使用同一平台进行多个项目开发而言,STM32是最

佳的选择:

(1) 从仅需少量的存储空间和管脚应用到需要更多的存储空间和管脚的应用

(2) 从苛求性能的应用到电池供电的应用

(3) 从简单而成本敏感的应用到高端应用

(4) 全系列脚对脚、外设及软件的高度兼容性,给您带来全方位的灵活性。您可以在不必修改您原始框架及软件的条件下,将您的应用升级到需要更多存储空间或精简到使用更少存储空间/ 或改用不同的封装的规格。

PCB

img

程序

img

main函数

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include <stdio.h>
#include "timer.h"
#include "key.h"
#include <stdio.h>
#include "lcd1602.h"
#include "adc.h"
#include "stmflash.h"  

//#define BASICS_VAL 36 //用于数据转换的基础值
#define DEFAULT_SET_VAL 100   //第一次下载默认设置值

char dis0[17]; //暂存数组
char dis1[17]; //暂存数组

unsigned int sensorVal = 0; //当前采集值
unsigned int adcx;	 	
long  midData = 0;//中间变量

unsigned int setNum = DEFAULT_SET_VAL; //设置值
unsigned char setMode = 0;//默认手动模式
unsigned char disFlag = 0;//显示标志


#define FLASH_SAVE_ADDR  0X08010000 	// 注意不同芯片 扇区flash地址不一样 设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
//stm32f103R8T6 flash地址范围 0x8010000-0x801FFFF
//stm32f103C8T6 flash地址范围 0x8000000-0x807FFFF

#define SIZE 10	 	//数组长度
unsigned char  setFlashBuf[10];//存储数据'

unsigned char initFlagData;	//初始化数据存读取
/******************把数据保存到单片机内部eepom中******************/
void write_FlashBuf(void)
{
	setFlashBuf[0] = initFlagData;
	setFlashBuf[1] =  setNum / 256;  //重新写入值
	setFlashBuf[2] =  setNum % 256; 
	STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE);		//读取数据	
	
}

/******************把数据从单片机内部eepom中读出来*****************/
void read_FlashBuf(void)
{
	STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)setFlashBuf,SIZE); //读取flash值

	initFlagData = setFlashBuf[0]; //数据初始化读取	
	setNum  = setFlashBuf[1];	//读取高字节
	setNum <<= 8;
	setNum  |= setFlashBuf[2];	 //读取低字节 并合并
}

/**************开机初始化保存的数据*****************/
void init_FlashBuf(void)
{
	read_FlashBuf(); //读取flash值
	if(initFlagData != 0x55)		//新的单片机初始单片机内问eeprom 如果不是0x55重新写入
	{
		setNum =  DEFAULT_SET_VAL;//设置上限
		initFlagData = 0x55;   //修改值
		delay_ms(20);
		write_FlashBuf();		//读取数据
	}	
}


void CheckKey(void);

int main(void)
 { 		
	delay_init();	    	 //延时函数初始化	  
	uart_init(9600);	 	//串口初始化为115200 
  TIM3_Int_Init(499,7199); //定时器初始化
	LED_Init();		  		//初始化接口 	 
	KEY_Init();  
	Adc_Init(); //初始化ad转换
	init_FlashBuf();//初始化读取存储数据 
	buzzer = 1; //蜂鸣器报警一下
	delay_ms(200);
	buzzer = 0;//蜂鸣器 停止报警
	Lcd_GPIO_init();   //液晶接口初始化
	Lcd_Init();		 //液晶配置初始化
	delay_ms(20);	 
		
	 while(1)
	{			
		CheckKey(); //按键处理
		if(disFlag==1)//定时读取标志
		{
			disFlag=0;//清空标志
			adcx=Get_Adc_Average(ADC_Channel_0,5);//读取ad转换值 5次求平均		
			midData = adcx * 450 * 2 / 4096;			//读取的ad值转换
		    midData = midData - 250;              //首先减去零点漂移,一般是1V
			if(midData < 0) 
				midData = 0;	
			sensorVal = midData * 2;             //将mV转变成mg/L,系数需要校准   
								  //电压每升高0.1V,实际被测气体的浓度增加20ppm 
								  //1ppm=1mg/kg=1mg/L=1×10-6 常用来表示气体浓度,或者溶液浓度。  
									//以上根据手册来的
			sprintf(dis0,"nowValue:%03dmg/L",sensorVal);		//打印					
			Lcd_Puts(0,0,(u8 *)dis0);//显示	
			
			if(setMode){
				sprintf(dis1,"setValue:%03d<   ",setNum);		//打印					
			}
			else{
				sprintf(dis1,"setValue:%03d    ",setNum);	
			}
			Lcd_Puts(0,1,dis1);//显示		
			
			if(sensorVal > setNum) //采集值 和 设置值 对比
			{buzzer = !buzzer;}  //蜂鸣器报警
			else {buzzer = 0;} //不报警			
			
		}			
	}											    
}
 
void CheckKey(void)
{ 
	static unsigned  char rekey =0;
	if((key1==0)||(key2==0)||(key3==0))		 //检测到按键按下
	{
		delay_ms(10);   //小抖动
		if(rekey==0)
		{
			if(key1==0)    //检测是否按下
			{
				rekey=1;
				if(setMode){
						setMode = 0; //取消设置
				}
				else {
					setMode = 1; //设置状态
				}								
			}	
			else if(key2==0)//设置值键
			{
				rekey=1;
				if(setMode){ //设置条件下
					if(setNum < 999 ){setNum=setNum+1;} //+1						
				}				
			}
			else if(key3==0)//设置值键
			{
				rekey=1;
				if(setMode){ //设置条件下
					if(setNum > 0 ){setNum=setNum-1;}
				}
			}	
			write_FlashBuf();//存储数据		
		}
	}
	else
	{
	rekey=0;    //防止重复检测到按键
	}
}

资料清单

img

资料下载

  • 设计资料获取联系方式.doc

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
ATXMEGA128D4-CUR 1 Atmel Corporation RISC Microcontroller, 16-Bit, FLASH, AVR RISC CPU, 32MHz, CMOS, PBGA49, 5 X 5 MM, 1 MM HEIGHT, 0.65 MM PITCH, GREEN, VFBGA-49
暂无数据 查看
AT32UC3A0512-ALUT 1 Microchip Technology Inc IC MCU 32BIT 512KB FLASH 144LQFP

ECAD模型

下载ECAD模型
$11.33 查看
ATSAMA5D35A-CUR 1 Microchip Technology Inc IC MCU 32BIT 160KB ROM 324LFBGA
$13.4 查看

相关推荐

电子产业图谱