自学内容网 自学内容网

基于单片机汽车驾驶防瞌睡防疲劳报警器自动熄火设计


前言

💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗
👇🏻 精彩专栏 推荐订阅👇🏻
单片机设计精品实战案例
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人

资料获取

文章底部名片,详细资料联系我。

设计介绍

STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
一、STC89C52主要特性如下:
(1)8K字节程序存储空间;
(2)512字节数据存储空间;
(3)内带4K字节EEPROM存储空间;
(4)可直接使用串口下载。
二、STC89C52主要参数如下:
(1)增强型8051单片机,6时钟/机器周期和12 时钟/机器周期可以任意选择,指令代码完全兼容传统8051;
(2)工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机);
(3)工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作 频率可达48MHz;
(4)用户应用程序空间为8K字节;
(5)片上集成512 字节RAM;
(6)通用I/O 口(32个),复位后为:P1/P2/P3 是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O口用时,需加上拉电阻;
(7)ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片;
(8)具有EEPROM功能;
(9)共3个16 位定时器/计数器。即定时器T0、T1、T2;
(10)外部中断4路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒;
(11)通用异步串行口(UART),还可用定时器软件实现多个UART;
(12)工作温度范围:-40~+85℃(工业级)/0~75℃(商业级);
(13)PDIP封装。
三、STC89C52单片机相关引脚说明:
(1)VCC:供电电压。
(2)GND:接地。
(3)P3.0 RXD(串行输入口)
(4)P3.1 TXD(串行输出口)
(5)P3.2 /INT0(外部中断0)
(6)P3.3 /INT1(外部中断1)
(7)P3.4 T0(记时器0外部输入)
(8)P3.5 T1(记时器1外部输入)
(9)P3.6 /WR(外部数据存储器写选通)
(10)P3.7 /RD(外部数据存储器读选通)
(11)RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
(12)ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
(13)/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
(14)/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
(15)XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
(16)XTAL2:来自反向振荡器的输出。

功能介绍

51单片机汽车驾驶防疲劳防瞌睡报警器自动熄火15
本系统由STC89C52单片机、蜂鸣器、ADXL345重力加速度传感器、
继电器控制、按键、指示灯及电源组成。
1、通过按键点亮led灯,代表车辆启动和熄火。
2、车辆启动后,ADXL345采集方向变化,如果3s左右方向无任何
变化,表示司机疲惫没有动方向盘,此时报警并继电器动作。
3、报警后除非系统复位取消报警,否则持续报警,强制司机需要休息。
4、如果车辆没有启动,则不进行检测不会报警。

设计程序

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

sbit buzzer=P1^1;//引脚定义
sbit relay=P1^4;
sbit led=P1^6;
sbit key =P1^5;

unsigned char ReadAdxl345;   //定时读取adxl345数据
xdata char dis0[16]; // 显示暂存 方便调试
xdata unsigned long time_20ms=0; //系统定时计数
xdata float RemeY=0;   //记录上一次加速度值
unsigned char Error0Num;  //异常情况计数
unsigned char DirFlag=0;//方向不变了
bit rekey =0;//防止重复按下
bit ledFlag =0;//led状态标识
void Init_Timer0(void);
void UART_Init(void);
void SendByte(unsigned char dat);
void SendStr(unsigned char *s,unsigned char length);


void main (void)
{     
Init_Timer0();        //定时器0初始化
UART_Init();

Init_ADXL345();  //初始化

if(Single_Read_ADXL345(0X00)==0xe5)//读出的数据为0XE5,表示正确
{
DelayMs(5);
SendStr("ready ok!",9);//显示第二行
}
else
{
DelayMs(3);
}

ReadData_x();//三轴检测函数
RemeY=temp_Y;//记录上次参数值

buzzer=0; //打开
led = 0;
relay = 0;
DelayMs(100);
buzzer=1; //关闭蜂鸣器
relay = 1;//关继电器
led = 1;//关led
ledFlag = 0;   //led标识清零

while (1)         //主循环
{
if(key==0) //检测到按键按下
{
 if(rekey == 0)
{
DelayMs(20); 
if(key==0)//确认按键按下
{
rekey =1;
if(ledFlag==0)//当前led为关闭状态
{led=0;ledFlag=1;}  //打开led 标志位置位
if(ledFlag==0)//当前led为关闭状态
{led=1;ledFlag=0;} //关闭led 标志位清零
}
}
}
else
{rekey =0 ;}//防止重复按下 

if(ledFlag==1) //点火状态
{
    if(ReadAdxl345==1)   //定时读取adxl345数据
    {
ReadAdxl345=0;
ReadData_x();  //三轴检测函数

if((temp_Y<(RemeY-60))||(RemeY>(RemeY+60)))   //左右变化
{
Error0Num=0;//错误次数清零
}
else
{
Error0Num++;
if(Error0Num>=15) //异常情况超过10次报警
{
DirFlag=1;
buzzer = 0;//继电器蜂鸣器动作
relay  = 0;
}
}
RemeY=temp_Y;
sprintf(dis0,"temp_Y:%4.1f",temp_Y);//打印数据
SendStr(dis0,13);//串口发送
SendStr("\n",1);//串口发送回车
    }
}
}
}

void Init_Timer0(void)
{
//**All notes can be deleted and modified**//
  TMOD |= 0x10;  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响     
TH0=(65536-20000)/256;  //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}

void Timer0_isr(void) interrupt 1 
{
TH0=(65536-20000)/256;  //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms%10==0) //定时读取adxl345模块
{
ReadAdxl345=1;
}
}

void UART_Init(void)
{
//**All notes can be deleted and modified**//
    SCON  = 0x05;        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
TL1 = TH1;  
    TR1   = 1;                  // TR1:  timer 1 打开                         
    EA    = 1;                  //打开总中断
    ES    = 1;                  //打开串口中断
}

void SendByte(unsigned char dat)//串口发送单字节数据
{
unsigned char time_out;
time_out=0x00;
SBUF = dat;  //将数据放入SBUF中
while((!TI)&&(time_out<100))  //检测是否发送出去
{time_out++;DelayUs2x(10);}//未发送出去 进行短暂延时
TI = 0;//清除ti标志
}

void SendStr(unsigned char *s,unsigned char length)   //发送定长度字符串
{
unsigned char NUM;
NUM=0x00;
while(NUM<length)//发送长度对比
{
SendByte(*s);  //放松单字节数据
s++;  //指针++
NUM++;  //下一个++
   }
}

具体实现截图

请添加图片描述
请添加图片描述

请添加图片描述
在这里插入图片描述

设计获取

文章下方名片联系我即可~

精彩专栏推荐订阅:在下方专栏👇🏻

毕业设计精品实战案例

收藏关注不迷路!!

🌟文末获取设计🌟


原文地址:https://blog.csdn.net/QQ1928499906/article/details/142419771

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!