通信工程毕设 基于单片机的酒驾检测与预防小车(源码+硬件+论文)


0 前言

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

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

🚩 毕业设计 基于单片机的酒驾检测与预防系统(源码+硬件+论文)

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

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

🧿 项目分享:见文末!

在这里插入图片描述

1 主要功能

主要功能: 一款基于51单片机的预防酒后驾驶系统设计。主要使用酒精传感器检查驾驶员有没有酒驾,通过按键可以设置酒精含量的上下限值,使得该设计适用于不同环境;使用红外避障管可以检测驾驶位是否有人,当检测驾驶位有人,且酒精含量高于设置值,车辆被制动;该系统可以通过显示屏直观的检测出驾驶人员的酒精含量;并且小车可通过蓝牙控制,当酒精含量过高时,小车不能启动。

  • 1.使用STC89C52RC单片机做主控制器。

  • 2.使用MQ-3酒精传感器检测是否酒驾。

  • 3.使用LCD1602实时显示酒精含量。

  • 4.使用红外避障模块检测驾驶位是否有人。

  • 5.使用驱动模块驱动小车运行。

  • 6.使用按键可以设置酒精含量的上下限值。

  • 7.使用HC-05蓝牙模块实现手机通讯,可通过手机控制小车。

本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成防酒驾的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机,其主要作用是获取输入的部分数据,经过内部处理,控制输出部分。输入由四部分组成,第一部分是温度采集红外避障模块,通过该模块可以获取当前驾驶位是否有人;第二部分是酒精浓度和A/D转换电路模块,通过改模块检测驾驶位的酒精浓度;第三部分是按键模块,通过该模块切换界面、设置酒精最值等;第四部分是供电模块,通过该模块可给整个系统进行供电。输出由三部分组成,第一部分时LCD1602显示模块,显示检测的酒精浓度及其设置的酒精浓度最值等;第二部分是直流电机驱动模块,通过该模块控制机动车的启动制动,第三部分是蓝牙和手机构成的模块,接收到手机发送的指令“G”控制机动车前行,接收到手机发送的指令“K”控制机动车后行,接收到手机发送的指令“H”控制机动车左转,接收到手机发送的指令“J”控制机动车右转,接收到手机发送的指令“S”控制机动车停止,系统框图如图

在这里插入图片描述

2 硬件设计(原理图)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3 核心软件设计

本设计所用到的编程软件为Keil5,其界面如图

在这里插入图片描述

本设计所使用的编程环境是Keil5,相对于其他软件编程环境,Keil5更加的轻便快捷,操作更加的简单,深受广大嵌入式软件开发者的喜爱。Keil5支持多种芯片,包括51单片机、STM32、HC32、NXP等,生成的HEX文件,可通过烧录器直接烧录到单片机中,非常方便。另外,Keil5编译有三种,一种是单编,一种是部分编译,还有一种是全部编译,这样给开发人员更多的选择,并且编译的结果,显示在界面的最下方,供开发者查找错误。

主程序流程设计

系统的主流程图如图所示;在主程序中,首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,通过按键扫描检测按键是否按下,通过按键进行界面的切换,设置酒精浓度最大值;然后进入第二个函数监测函数,通过酒精检测模块检测酒精浓度;然后进入第三个函数显示,根据不同的显示模式标志位,显示不同的界面;界面0:显示酒精的检测值。界面1,显示设置酒精浓度最大值;然后进入第四个函数处理函数,检测到酒精浓度大于设置的最大值进行声光报警,如果检测到有人且无酒驾,车辆可以启动,否则车辆制动,接收到手机发送的指令“G”控制机动车前行,接收到手机发送的指令“K”控制机动车后行,接收到手机发送的指令“H”控制机动车左转,接收到手机发送的指令“J”控制机动车右转,接收到手机发送的指令“S”控制机动车停止。

在这里插入图片描述

处理状态函数流程设计

处理状态子函数流程图如下图所示,然后进入第四个函数处理函数,检测到酒精浓度大于设置的最大值进行声光报警,如果检测到有人且无酒驾,车辆可以启动,否则车辆制动,接收到手机发送的指令“G”控制机动车前行,接收到手机发送的指令“K”控制机动车后行,接收到手机发送的指令“H”控制机动车左转,接收到手机发送的指令“J”控制机动车右转,接收到手机发送的指令“S”控制机动车停止。

在这里插入图片描述

篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。

关键代码

#define DEBUG 0 // set to 1 to print to serial monitor, 0 to disable
#include <Servo.h>
Servo headservo; //
// Constants
const int EchoPin = 2;       //
const int TrigPin = 3;       //
const int leftmotorpin1 = 4; //
const int leftmotorpin2 = 5;
const int rightmotorpin1 = 6;
const int rightmotorpin2 = 7 const int HeadServopin = 9; //
const int Sharppin = 11;                                 //
const int maxStart = 800;                                // run dec time
// Variables
int isStart = maxStart; //
int currDist = 0;       //
boolean running = false;
void setup()
{
    Serial.begin(9600); //
    pinMode(EchoPin, INPUT);
    pinMode(Sharppin, INPUT);
    for (int pinindex = 3; pinindex < 11; pinindex++)
    {
        pinMode(pinindex, OUTPUT); // set pins 3 to 10 as outputs
    }
    //
    headservo.attach(HeadServopin);
    //
    headservo.write(70);
    delay(2000);
    headservo.write(20);
    delay(2000);
}
void loop()
{
    if (DEBUG)
    {
        Serial.print("running:");
        if (running)
        {
            Serial.println("true");
        }
        else
        {
            Serial.println("false");
        }
    }
    if (isStart <= 0)
    {
        if (running)
        {
            totalhalt(); //
        }
        int findsomebody = digitalRead(Sharppin);
        if (DEBUG)
        {
            Serial.print("findsomebody:");
            Serial.println(findsomebody);
        }
        if (findsomebody > 0)
        {
            isStart = maxStart;
        }
        delay(4000);
        return;
    }
    isStart--;
    delay(100);
    if (DEBUG)
    {
        Serial.print("isStart: ");
        Serial.println(isStart);
    }
    currDist = MeasuringDistance(); //
    if (DEBUG)
    {
        Serial.print("Current Distance: ");
        Serial.println(currDist);
    }
    if (currDist > 30)
    {
        nodanger();
    }
    else if (currDist < 15)
    {
        backup();
        randTrun();
    }
    else
    {
        // whichway();
        randTrun();
    }
}
/
    long MeasuringDistance()
{
    long duration;
    // pinMode(TrigPin, OUTPUT);
    digitalWrite(TrigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(TrigPin, HIGH);
    delayMicroseconds(5);
    digitalWrite(TrigPin, LOW);
    // pinMode(EchoPin, INPUT);
    duration = pulseIn(EchoPin, HIGH) return duration / 29 / 2;
}
//
void nodanger()
{
    running = true;
    digitalWrite(leftmotorpin1, LOW);
    digitalWrite(leftmotorpin2, HIGH);
    digitalWrite(rightmotorpin1, LOW);
    digitalWrite(rightmotorpin2, HIGH);
    return;
}
//
void backup()
{
    running = true;
    digitalWrite(leftmotorpin1, HIGH);
    digitalWrite(leftmotorpin2, LOW);
    digitalWrite(rightmotorpin1, HIGH);
    digitalWrite(rightmotorpin2, LOW);
    delay(1000);
}
//
void whichway()
{
    running = true;
    totalhalt(); // first stop!
    headservo.write(20);
    delay(1000);
    int lDist = MeasuringDistance(); // check left distance
    totalhalt();                     //
    headservo.write(120);            // turn the servo right
    delay(1000);
    int rDist = MeasuringDistance(); // check right distance
    totalhalt();                     //
    if (lDist < rDist)
    {
        body_lturn();
    }
    else
    {
        body_rturn();
    }
    return;
}
//
void totalhalt()
{
    digitalWrite(leftmotorpin1, HIGH);
    digitalWrite(leftmotorpin2, HIGH);
    digitalWrite(rightmotorpin1, HIGH);
    digitalWrite(rightmotorpin2, HIGH);
    headservo.write(70); // set servo to face forward
    running = false;
    return;
    delay(1000);
}
//
void body_lturn()
{
    running = true;
    digitalWrite(leftmotorpin1, LOW);
    digitalWrite(leftmotorpin2, HIGH);
    digitalWrite(rightmotorpin1, HIGH);
    digitalWrite(rightmotorpin2, LOW);
    delay(1500);
    totalhalt();
}
//
void body_rturn()
{
    running = true;
    digitalWrite(leftmotorpin1, HIGH);
    digitalWrite(leftmotorpin2, LOW);
    digitalWrite(rightmotorpin1, LOW);
    digitalWrite(rightmotorpin2, HIGH);
    delay(1500);
    totalhalt();
}
void randTrun()
{
    long randNumber;
    randomSeed(analogRead(0));
    randNumber = random(0, 10);
    if (randNumber > 5)
    {
        body_rturn();
    }
    else
    {
        body_lturn();
    }
}

4 实现效果

在这里插入图片描述

在这里插入图片描述

5 最后

包含内容

在这里插入图片描述

🧿 项目分享:见文末!

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值