0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 单片机酒驾酒精检测系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 项目分享:

https://gitee.com/sinonfin/sharing

在这里插入图片描述

1 主要功能

主要功能有:

  • 1.使用MQ-3检测驾驶人员是否存在酒驾行为。

  • 2.使用LCD1602实时显示驾驶人员体内酒精含量,当驾驶人员体内酒精含量超过了预设阈值,蜂鸣器会自动进行报警,伴随红色指示灯点亮,继电器吸合。

  • 3.单片机:将采集到的酒精含量送至显示屏,并与阀值进行比较,超标报警,未超标绿色指示灯常亮,表示可以通行。

  • 4.阀值设置按键:报警阀值可通过三个按键进行任意调整。

  • 5.继电器:模拟自动熄火装置,当酒精含量超标时,继电器自动吸合,模拟汽车自动熄火。

  • 6.蜂鸣器报警:当检测到酒精含量超标后,蜂鸣器自动报警(并且红色指示灯点亮,表示不可通行)。

本设计主要由酒精探测传感器电路、单片机、灯光报警电路、负载驱动电路、控制程序和编解码程序等组成。

在这里插入图片描述

2 硬件设计(原理图)

在这里插入图片描述

PCB电路

在这里插入图片描述

3 核心软件设计

在这里插入图片描述

关键代码

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "intrins.h"											   

#define     u8  			unsigned char
#define     u16   		unsigned int
#define     uchar  			unsigned char
#define     uint   		unsigned int

uchar yushe_yanwu=45;				//酒驾预设值
uchar yanwu;					 			//用于读取ADC数据

//运行模式  
uchar Mode=0;				 			  =2是设置酒驾阀值	=0是正常监控模式
//管脚声明
sbit LED_yanwu= P1^5;		 //酒驾报警灯
sbit baojing= P3^3;			 //蜂鸣器接口
//按键
sbit Led_Reg		 =P1^5;				 //红灯
sbit Led_Yellow  =P1^4;				 //黄灯
sbit Buzzer    	 =P3^3;				 //蜂鸣器



//void delay(uint z)		   //延时函数大约延时z ms
//{
//	uint i,j;
//	for(i=0;i<z;i++)
//	for(j=0;j<121;j++);
//}
//========================================================================
// 函数: void  delay_ms(u16 ms)
// 描述: 延时函数。
// 参数: ms,要延时的ms数, 这里只支持1~65535ms. 自动适应主时钟.
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 
//========================================================================
void  delay_ms(u16 ms)
{
     u16 i;
	 do{
	      i = 12000000 / 13000;
		  while(--i)	;   //14T per loop
     }while(--ms);
}

/***********************************************************************************************************
LCD1602相关函数
***********************************************************************************************************/

//LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
sbit LCDRS = P1^6;
sbit LCDEN = P1^7;
sbit D0		 = P2^7;
sbit D1		 = P2^6;
sbit D2		 = P2^5;
sbit D3		 = P2^4;
sbit D4		 = P2^3;
sbit D5		 = P2^2;
sbit D6		 = P2^1;
sbit D7		 = P2^0;



//LCD延时
void LCDdelay(uint z)		  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}
void LCD_WriteData(u8 dat)	  
{
	if(dat&0x01)D0=1;else D0=0;
	if(dat&0x02)D1=1;else D1=0;
	if(dat&0x04)D2=1;else D2=0;
	if(dat&0x08)D3=1;else D3=0;
	if(dat&0x10)D4=1;else D4=0;
	if(dat&0x20)D5=1;else D5=0;
	if(dat&0x40)D6=1;else D6=0;
	if(dat&0x80)D7=1;else D7=0;
}
//写命令
void write_com(uchar com)
{
  LCDRS=0;				  
	LCD_WriteData(com);
//  DAT=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
	LCD_WriteData(date);
//  DAT=date;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}

/*------------------------------------------------
              选择写入位置
------------------------------------------------*/
void SelectPosition(unsigned char x,unsigned char y) 
{     
	if (x == 0) 
	{     
		write_com(0x80 + y);     //表示第一行
	}
	else 
	{      
		write_com(0xC0 + y);      //表示第二行
	}        
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{     
	SelectPosition(x,y) ;
	while (*s) 
	{     
		write_data( *s);     
		s ++;     
	}
}
//========================================================================
// 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
// 应用: LCD_Write_Char(0,1,366,4) ;
// 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
// 参数: x:行,y:列,s:要显示的字,l:显示的位数
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 最大显示65535
//========================================================================
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l) 
{     
	SelectPosition(x,y) ;

	if(l>=5)
		write_data(0x30+s/10000%10);	//万位
	if(l>=4)
		write_data(0x30+s/1000%10);		//千位
	if(l>=3)
		write_data(0x30+s/100%10);		//百位
	if(l>=2)
		write_data(0x30+s/10%10);			//十位
	if(l>=1)
		write_data(0x30+s%10);		//个位

}
/*1602指令简介
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x0d);//打开显示 阴影闪烁
  write_com(0x0d);//打开显示 阴影闪烁
*/
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
	
}

void Display_1602(yushe_wendu,yushe_yanwu,c,temp)
{
	//显示预设酒精
	LCD_Write_Char(0,6,yushe_wendu,2) ;
	
	//显示预设酒驾
	LCD_Write_Char(0,13,yushe_yanwu,3) ;
	
	
	//时时酒驾
	LCD_Write_Char(1,13,temp,3) ;
}

4 实现效果

在这里插入图片描述

在这里插入图片描述

5 最后

包含内容

在这里插入图片描述

🧿 项目分享:

https://gitee.com/sinonfin/sharing

Logo

鸿蒙生态一站式服务平台。

更多推荐