基于单片机的酒驾检测与预防系统设计及完整资料分享

文章目录

  • 0 前言
  • 1 主要功能
  • 2 硬件设计(原理图)
  • 3 核心软件设计
  • 4 实现效果
  • 5 最后

  • 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 最后

    包含内容

    🧿 项目分享:见文末!

    作者:单片机项目集合

    物联沃分享整理
    物联沃-IOTWORD物联网 » 基于单片机的酒驾检测与预防系统设计及完整资料分享

    发表回复