毕业设计|基于STM32的酒精酒驾检测设计

简介: 毕业设计|基于STM32的酒精酒驾检测设计

1、项目简介

1.1 系统构成

本系统采用stm32f103c8t6单片机+晶振电路+复位电路+电源电路+oled液晶显示电路+酒精检测电路+按键电路构成。

1.2 系统功能

  • 1、stm32检测酒精浓度,并显示在屏幕上
  • 2、正常,酒驾,醉驾,这分为三个等级,显示在屏幕上
  • 3、通过按键设置酒驾,醉驾,正常的标准值
  • 4、能存储几条检测的信息,掉电不丢失

2、部分电路设计

2.1 stm32f103c8t6单片机最小系统电路设计

STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装。

具体参数为:

  • 64K x 8bit的Flash
  • 20K x 8bit的SRAM
  • 37个GPIO,分别为PA0-PA15、PB0-PB15、PC13-PC15、PD0-PD1
  • 2个12bit ADC合计12路通道,外部通道:PA0到PA7以及PB0到PB1
  • 内部通道:温度传感器通道ADC_Channel_16和内部参考电压通道ADC_Channel_17
  • 4个16bit定时器/计数器,分别为TIM1、TIM2、TIM3、TIM4
  • 2个看门狗定时器(独立看门狗IWDG、窗口看门狗WWDG)
  • 1个24bit向下计数的滴答定时器systick
  • 2个IIC,2个SPI,3个USART,1个CAN
  • 内部8MHz时钟HSI最高可倍频到64MHz,外部8MHz时钟HSE最高可倍频到72MHz

Cortex-M3是ARM公司推出的基于ARMv7架构的MCU内核,ST公司在此内核的基础上完成了USART、DMA、GPIO等外围电路的设计。

STM32单片机最小系统电路由复位电路、时钟电路和电源电路。拥有这三部分电路后,单片机即可正常工作。

单片机最小系统原理图如下图所示:

实物图:

2.2 OLED液晶显示电路设计

IIC-OLED模块是一种高品质、高性能的显示屏,采用了有机发光二极管(OLED)技术,通过四个针脚控制电源和信号来实现对显示内容的控制。该模块具有以下特点:

  • 高分辨率和色彩深度:该OLED模块具有高达128x32像素的分辨率和16位色彩深度,可以呈现出细腻、清晰的画面效果。
  • 显示角度广泛:该模块具有178度的广角度,可以在各种角度下提供清晰的图像显示,同时也适用于不同的应用场景。
  • 低功耗:OLED技术具有自发光特性,因此相比其他类型的显示屏,该模块具有更低的功耗,延长了电池寿命。
  • 高可靠性:该模块采用了高品质的材料和工艺,严格把控生产流程,保证了产品的稳定性和可靠性,适用于各种环境下的使用。
  • 简单易用:该模块通过四个针脚进行控制,接口简单,易于集成到各种设备中。

IIC总线的OLED模块是一种高品质、高性能的显示屏,具有广泛的应用前景。

  • 电路设计

  • OLED模块实物图:

2.2 MQ3酒精检测电路设计

  • MQ3酒精传感器主要用于酒精检测,其原理是 使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。当传感器所处环境中存在酒精蒸汽时,传感器的电导率随空气中酒精气体浓度的增加而增大。使用简单的电路即可将电导率的变化转换为与该气体浓度相对应的输出信号。
    特点如下:
  • 1、具有信号输出指示。
  • 2、双路信号输出(模拟量输出及TTL电平输出)
  • 3、TTL输出有效信号为低电平。(当输出低电平时信号灯亮,可直接接单片机)
  • 4、模拟量输出0~5V电压,浓度越高电压越高。
  • 5、对乙醇蒸汽具有很高的灵敏度和良好的选择性。
  • 6、具有长期的使用寿命和可靠的稳定性。
  • 7、快速的响应恢复特性。
  • 酒精传感器输出的是模拟信号,这里需要使用AD模块将模拟信号转换为数字信号给单片机,电路图如下:

  • MQ3酒精检测传感器实物图:

3、部分代码展示

3.1 OLED液晶显示屏初始化

void OLED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(SCL_APB, ENABLE);   //使能端口时钟
  GPIO_InitStructure.GPIO_Pin = SCL_PIN;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;     //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(SCL_PORT, &GPIO_InitStructure);   //初始化引脚
  GPIO_SetBits(SCL_PORT,SCL_PIN);
  RCC_APB2PeriphClockCmd(SDA_APB, ENABLE);   //使能端口时钟
  GPIO_InitStructure.GPIO_Pin = SDA_PIN;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(SDA_PORT, &GPIO_InitStructure);   //初始化引脚
  GPIO_SetBits(SDA_PORT,SDA_PIN);
  OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
  OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
  OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
  OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  OLED_WR_Byte(0x12,OLED_CMD);
  OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  OLED_WR_Byte(0x30,OLED_CMD);//Set VCOM Deselect Level
  OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  OLED_WR_Byte(0x02,OLED_CMD);//
  OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
  OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
  OLED_Clear();
  OLED_WR_Byte(0xAF,OLED_CMD);
}

3.2 OLED显示字符串

void OLED_ShowString(u8 x,u8 y,u8 *chr,u8 size1,u8 mode)
{
  while((*chr>=' ')&&(*chr<='~'))//判断是不是非法字符!
  {
    OLED_ShowChar(x,y,*chr,size1,mode);
    if(size1==8)x+=6;
    else x+=size1/2;
    chr++;
  }
}

3.2 获取MQ3酒精传感器数据

u16 GetMQ3(void)
{
  u16 adcx = 0;
  int16_t temp = 0;
  adcx = Get_Adc_Average(ADC_Channel_1,10);
  temp = adcx * 125 / 4095;
  return temp;
}

3.3 OLED显示酒精数据

static void ShowSampleData(SampleData *sample_data, ShowDataStr *show_data)
{
  //采样数据
  sprintf((char *)show_data->str, "JiuJing %d  ", sample_data->jiujing);
  OLED_ShowString(0,0,show_data->str,8,1);  
  sprintf((char *)show_data->str, "Result %d  ", sample_data->test_result);
  OLED_ShowString(0,8,show_data->str,8,1);  
  //保存的数据
  sprintf((char *)show_data->str, "SJiuJing %d  %d  %d  ", sample_data->read_jiujing[0], sample_data->read_jiujing[1], sample_data->read_jiujing[2]);
  OLED_ShowString(0,16,show_data->str,8,1); 
  sprintf((char *)show_data->str, "SResult %d  %d  %d  ", sample_data->read_result[0], sample_data->read_result[1], sample_data->read_result[2]);
  OLED_ShowString(0,24,show_data->str,8,1); 
  OLED_Refresh();
}
相关文章
|
2月前
|
传感器 编解码 数据处理
毕业设计|基于STM32单片机的水位浑浊度检测设计
毕业设计|基于STM32单片机的水位浑浊度检测设计
628 0
|
2月前
|
传感器 物联网 芯片
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
毕业设计 基于STM32单片机无线ZIGBEE智能大棚土壤湿度光照检测
|
2月前
|
芯片
毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
毕业设计|基于stm32单片机的app视频遥控抽水灭火小车设计
|
2月前
|
传感器 内存技术
毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计
毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计
111 0
|
2月前
|
人工智能 安全 搜索推荐
单片机毕业设计|基于stm32智能快递箱设计
单片机毕业设计|基于stm32智能快递箱设计
100 0
|
2月前
|
机器学习/深度学习 传感器 语音技术
毕业设计|基于STM32单片机的语音识别控制智能停车场设计
毕业设计|基于STM32单片机的语音识别控制智能停车场设计
130 0
|
2月前
|
传感器
毕业设计 基于STM32的单片机智能门禁热释人体感应报警设计
毕业设计 基于STM32的单片机智能门禁热释人体感应报警设计
102 0
|
2月前
|
物联网 芯片
毕业设计 基于STM32的语音RFID卡停车管理系统
毕业设计 基于STM32的语音RFID卡停车管理系统
|
19天前
使用STM32F103标准库实现定时器控制LED点亮和关闭
通过这篇博客,我们学习了如何使用STM32F103标准库,通过定时器来控制LED的点亮和关闭。我们配置了定时器中断,并在中断处理函数中实现了LED状态的切换。这是一个基础且实用的例子,适合初学者了解STM32定时器和中断的使用。 希望这篇博客对你有所帮助。如果有任何问题或建议,欢迎在评论区留言。
63 2
|
19天前
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
65 4