毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

这篇具有很好参考价值的文章主要介绍了毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


0 前言

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

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

🚩 毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

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

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

🧿 项目分享:

https://gitee.com/sinonfin/sharing文章来源地址https://www.toymoban.com/news/detail-492398.html

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

1 主要功能

系统硬件结构框图,主要为STC89C52单片机最小系统,LCD1602显示器集成电路,HC-SR04超声波测距模块,蜂鸣器报警集成电路和按键电路。由图1-1可确定其功能模块的具体设计情况与逻辑关联。
接入5V直流稳压电流,按动自锁按钮给硬件系统上电,首先由超声波测距模块测量距离,单片机将所测的距离数值处理之后显示在LCD1602上。利用按键装置调整报警距离上限,若测量距离小于预先设定值,蜂鸣器发声报警、LED灯闪烁。

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

2 硬件设计(原理图)

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

3 核心软件设计

由上文分析论述可知,超声波传感器基于超声波传播与返回时间实现距离测定功能。在明确时间数据的基础上,结合超声波在空气中的传播速度对距离参数进行计算。其具体的技术原理详见图2-8所示。实现思路:第一种,直接给trig高电平,然后读取ECHO引脚是否为高电平,若为高电平,则开启定时器,然后继续检测等待其为低电平的时候,获取计数器值,然后进行计算。第二种,开启外部中断,先将ECHO配置上升沿中断,当中断来临的时候,在中断函数里面开启定时器,再将其配置为下降沿中断,等待下降沿中断来临的时候,获取计数器值。
其实上面的两种方法,其思路都是通过计算定时器的counter值,来计算距离。

第三种是让定时器一路PWM控制触发以及触发周期,超声波返回信号高电平时间用定时器通道捕捉功能获取。

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

基于上述工作原理,超声波将由发射装置发出长约6mm和频率为40kHz的超声波信号并经目标对象反射之后返回至传感器接收装置进行识别和确定,在此基础上可确定超声波往返一次所需时间。该时间的1/2即超声波在传感器与目标对象之间的传播时间,进而可计算相应的距离数据。

主程序具体负责相关数据的处理和分析工作,并为各个功能模块的正常运行提供必要的程序指令支持和保障。该程序的技术流程详见图

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

关键代码

#include <reg52.h>
#include <intrins.h>

#include <stdio.h>

#define uchar unsigned char	
#define uint  unsigned int	

sfr ISP_DATA  = 0xe2;			
sfr ISP_ADDRH = 0xe3;			
sfr ISP_ADDRL = 0xe4;			
sfr ISP_CMD   = 0xe5;			
sfr ISP_TRIG  = 0xe6;			
sfr ISP_CONTR = 0xe7;			


sbit LcdRs_P   = P2^7;		    
sbit LcdRw_P   = P2^6;		 
sbit LcdEn_P   = P2^5;		
sbit Trig_P    = P2^2;		
sbit Echo_P    = P2^3;		 
sbit KeySet_P  = P3^2;		
sbit KeyDown_P = P3^3;		
sbit KeyUp_P   = P3^4;		
sbit Buzzer_P  = P2^1;	
sbit Led_P     = P2^0;		


uint gAlarm;							



// 单片机内部EEPROM不使能
void ISP_Disable()
{
	ISP_CONTR = 0;
	ISP_ADDRH = 0;
	ISP_ADDRL = 0;
}


// 从单片机内部EEPROM读一个字节,从0x2000地址开始


unsigned char EEPROM_Read(unsigned int add)
{
	ISP_DATA  = 0x00;
	ISP_CONTR = 0x83;
	ISP_CMD   = 0x01;
	ISP_ADDRH = (unsigned char)(add>>8);
	ISP_ADDRL = (unsigned char)(add&0xff);
	// 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效
	ISP_TRIG  = 0x46;	   
	ISP_TRIG  = 0xB9;
	_nop_();
	ISP_Disable();
	return (ISP_DATA);
}


// 往单片机内部EEPROM写一个字节,从0x2000地址开始

void EEPROM_Write(unsigned int add,unsigned char ch)
{
	ISP_CONTR = 0x83;
	ISP_CMD   = 0x02;
	ISP_ADDRH = (unsigned char)(add>>8);
	ISP_ADDRL = (unsigned char)(add&0xff);
	ISP_DATA  = ch;
	ISP_TRIG  = 0x46;
	ISP_TRIG  = 0xB9;
	_nop_();
	ISP_Disable();
}

// 擦除单片机内部EEPROM的一个扇区
// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除

void Sector_Erase(unsigned int add)	  
{
	ISP_CONTR = 0x83;
	ISP_CMD   = 0x03;
	ISP_ADDRH = (unsigned char)(add>>8);
	ISP_ADDRL = (unsigned char)(add&0xff);
	ISP_TRIG  = 0x46;
	ISP_TRIG  = 0xB9;
	_nop_();
	ISP_Disable();
}



// 毫秒级的延时函数,time是要延时的毫秒数

void DelayMs(uint time)
{
	uint i,j;
	for(i=0;i<time;i++)
		for(j=0;j<112;j++);
}


// 1602液晶写命令函数,cmd就是要写入的命令

void LcdWriteCmd(uchar cmd)
{ 
    LcdRs_P = 0;
    LcdRw_P = 0;
    LcdEn_P = 0;
    P0=cmd;
		DelayMs(2);
    LcdEn_P = 1;    
		DelayMs(2);
    LcdEn_P = 0;	
}


// 1602液晶写数据函数,dat就是要写入的命令

void LcdWriteData(uchar dat)
{
    LcdRs_P = 1; 
    LcdRw_P = 0;
    LcdEn_P = 0;
   	P0=dat;
		DelayMs(2);
    LcdEn_P = 1;    
		DelayMs(2);
    LcdEn_P = 0;
}



// 1602液晶初始化函数

void LcdInit()
{
    LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口
    LcdWriteCmd(0x0C);        // 开显示,不显示光标
    LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移
    LcdWriteCmd(0x01);        // 清屏
}


// 液晶光标定位函数

void LcdGotoXY(uchar line,uchar column)
{
	// 第一行
    if(line==0)        
        LcdWriteCmd(0x80+column); 
	 // 第二行
    if(line==1)        
        LcdWriteCmd(0x80+0x40+column); 
}



// 液晶输出字符串函数

void LcdPrintStr(uchar *str)
{
    while(*str!='\0')
        LcdWriteData(*str++);
}

// 液晶输出数字

void LcdPrintNum(uint num)
{
	LcdWriteData(num/100+0x30);				// 百位
	LcdWriteData(num%100/10+0x30);		// 十位
	LcdWriteData(num%10+0x30);				// 个位
}


// 计算测到的距离

uint GetDistance(void)
{
	uint ss;					// 用于记录测得的距离

	TH0=0;
	TL0=0;

	Trig_P=1;					// 给超声波模块一个开始脉冲
	DelayMs(1);
	Trig_P=0;

	while(!Echo_P);		
	TR0=1;						
	while(Echo_P);		
	TR0=0;						

	ss=((TH0*256+TL0)*0.034)/2;		// 距离cm=(时间us * 速度cm/us)/2

	return ss;
}


// 按键扫描

void KeyScanf()
{
	uchar i;
	uchar dat1,dat2;

	if(KeySet_P==0)					// 判断是否有按键按下
	{
		DelayMs(10);								// 消除按键按下的抖动
		while(!KeySet_P);						// 等待按键释放
		DelayMs(10);								// 消除按键松开的抖动
		
		LcdGotoXY(1,2);							// 液晶第二行刷新显示
		LcdPrintStr("alarm=   cm");
		LcdGotoXY(1,8);							
		LcdPrintNum(gAlarm);				

		i=1;

		while(i)
		{							  
			if(KeyDown_P==0)		// 报警值减的处理
			{
				DelayMs(300);
				if(gAlarm>2)
					gAlarm--;
				LcdGotoXY(1,8);
				LcdPrintNum(gAlarm);	
			}

			if(KeyUp_P==0)			// 报警值加的处理
			{
				DelayMs(300);
				if(gAlarm<400)
					gAlarm++;
				LcdGotoXY(1,8);
				LcdPrintNum(gAlarm);
			}
			
			if(KeySet_P==0)			// 再次按下设置键的判断
			{
				DelayMs(10);		  			
				while(!KeySet_P);				
				DelayMs(10);		  				

				LcdGotoXY(1,0);						
				LcdPrintStr("     S=   cm    ");

				i=0;
			}			   
		}
		
		dat1=gAlarm/100;
		dat2=gAlarm%100;
		Sector_Erase(0x2000);
		EEPROM_Write(0x2000,dat1);
		EEPROM_Write(0x2001,dat2);
	}	
}

// 报警判断

void AlarmJudge(uint ss)
{
	uchar i;
	float alr1,alr2,alr3,alr4;

	alr1=gAlarm/4.00*1;
	alr2=gAlarm/4.00*2;
	alr3=gAlarm/4.00*3;
	alr4=gAlarm/4.00*4;


	// 报警频率最快
	if(ss<alr1)			
	{
		for(i=0;i<10;i++)
		{
			Led_P=0;
			Buzzer_P=0;
			DelayMs(50);
			Led_P=1;
			Buzzer_P=1;
			DelayMs(50);
			KeyScanf();
		}
	}
	// 报警频率第二快
	else if(ss<alr2)		
	{
		for(i=0;i<5;i++)
		{
			Led_P=0;
			Buzzer_P=0;
			DelayMs(100);
			Led_P=1;
			Buzzer_P=1;
			DelayMs(100);
			KeyScanf();
		}	
	}
	// 报警频率第三快
	else if(ss<alr3) 	
	{
		for(i=0;i<2;i++)
		{
			Led_P=0;
			Buzzer_P=0;
			DelayMs(200);
			Led_P=1;
			Buzzer_P=1;
			DelayMs(200);
			KeyScanf();
		}	
	}
	// 报警频率最慢
	else if(ss<alr4)	
	{
		for(i=0;i<2;i++)
		{
			Led_P=0;
			Buzzer_P=0;
			DelayMs(300);
			Led_P=1;
			Buzzer_P=1;
			DelayMs(300);
			KeyScanf();
		}	
	}
	// 不报警
	else
	{
		Led_P=1;
		Buzzer_P=1;
		for(i=0;i<100;i++)
		{
			KeyScanf();
			DelayMs(10);
		}	
	}
}


bit busy = 0;

void Uart_Isr() interrupt 4 using 1
{
    if (RI)
    {
        RI = 0;             //Clear receive interrupt flag
    }
//    if (TI)
//    {
//        TI = 0;             //Clear transmit interrupt flag
//        busy = 0;           //Clear transmit busy flag
//    }
}



void Delay150us()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 2;
	j = 153;
	do
	{
		while (--j);
	} while (--i);
}


/*----------------------------
Send a byte data to UART
Input: dat (data to be sent)
Output:None
----------------------------*/
void SendData(unsigned char dat)
{
	
	
   // while (busy);           //Wait for the completion of the previous data is sent
   // ACC = dat;              //
   // busy = 1;
	 // TI = 0;
    SBUF = dat;             //Send data to UART buffer
	
	 //Delay150us();
	   while(!TI);
	  TI = 0;
}

/*----------------------------
Send a string to UART
Input: s (address of string)
Output:None
----------------------------*/
void SendString(char *s)
{
    while (*s)              //Check the end of the string
    {
        SendData(*s++);     //Send current char and increment string ptr
    }
}



#define FOSC 11059200L      //System frequency
#define BAUD 9600       //UART baudrate


volatile unsigned char Dat[16];


// 主函数

void main()
{
	uchar dat1,dat2;
	uint dist;
unsigned short Cnt = 0;
	LcdInit();												// 执行液晶初始化
	TMOD = 0x01;											// 选择定时器0,并且确定是工作方式1(为了超声波模块测量距离计时用的)

	LcdGotoXY(0,0);	    							// 定位到第0行第0列
	LcdPrintStr(" HC-SR04 System ");	// 第0行显示“HC-SR04 System”
	LcdGotoXY(1,0);	    							// 定位到第1行第0列
	LcdPrintStr("     S=   cm    ");	// 第1行显示“S=   cm”

	dat1=EEPROM_Read(0x2000);					// 从EEPROM读取报警值
	dat2=EEPROM_Read(0x2001);
	gAlarm=dat1*100+dat2;

	if((gAlarm==0)||(gAlarm>400))			// 如果读取到的报警值异常
	{
		gAlarm=25;											// 重新赋值报警值为25
	}
	
//	SCON = 0x50;
//	TL2 = RCAP2L = (65536-(FOSC/32/BAUD)); //Set auto-reload vaule
//  TH2 = RCAP2H = (65536-(FOSC/32/BAUD)) >> 8;
//  T2CON = 0x34;           //Timer2 start run
//  ES = 0;                 //Enable UART interrupt
//  EA =1;
//	
	
	//PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	//AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	//AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFD;		//设定定时初值
	TH1 = 0xFD;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	
	//SendData(0XA5);
	while(1)
	{
		dist=GetDistance();							// 通过超声波模块获取距离

		LcdGotoXY(1,7);	    						// 定位到第1行第7列
		LcdPrintNum(dist);							// 将获取到的距离在液晶上面显示
		
		if(++Cnt>=1)
		{
			Cnt = 0;
			sprintf(Dat,"S=%d cm\r\n",(uint) dist);
			SendString(Dat);
		}
		AlarmJudge(dist);								
	}
}

4 实现效果

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

5 最后

包含内容

毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

🧿 项目分享:

https://gitee.com/sinonfin/sharing

到了这里,关于毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2024年02月07日
    浏览(69)
  • 毕业设计 基于51单片机的汽车倒车防撞报警系统 (源码+硬件+论文)

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月09日
    浏览(74)
  • 【51毕业设计案例】【006】波形发生器(正弦波、矩形波、三角波、锯齿波)-基于51单片机

    功能介绍: 1.输出 正弦波、矩形波、三角波、锯齿波 波形 2.设定波形输出频率 3.设定修改频率的步进值 整体功能简述: 通过按键可以修改输出的波形,一共可以输出四种波形,分别是:正弦波、矩形波、三角波、锯齿波 ;波形也可以修改频率,频率范围为50Hz~0.1Hz。并且可

    2024年02月09日
    浏览(67)
  • 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51

    自动跟随小车系统由两部分组成:跟随小车和移动目标携带装置。 工作原理:跟随小车系统通过无线通信模块发送寻找信号,同时超声波接收器开始计时,如果移动目标接收到无线寻找信号,则立即发送超声波信号。这样小车的三角超声波接收器陆续收到超声波信号,CPU通过

    2023年04月08日
    浏览(69)
  • 毕业设计 基于51单片机环境监测设计 光照 PM2.5粉尘 温湿度 2.4G无线通信

    选题之前,同学们要弄明白一件事情,做毕业设计是干什么用的! 这里我告诉大家,毕业设计对于你来说,不是让你去搞研究,掌握运用所学知识的,也不是让你去比谁做的毕业设计多么牛逼,多么厉害。 说白点,它的作用就是一个,让你顺利毕业,能够拿到学位证,毕业

    2023年04月08日
    浏览(179)
  • 【毕业设计】6-基于51单片机的电子称重装置/电子测温/压力测试控制系统设计(原理图+源码+仿真工程+论文+PPT)

    包含此题目毕业设计全套资料: 原理图工程文件 工程源代码工程文件 仿真工程文件 论文(低重复率), 21533字 原理图截图 仿真截图 主要研究内容: 设计一个基于51单片机的电子称重装置,该装置主要由51单片机、传感器、A/D转换器、电源、键盘、LCD、LED显示器等实验器材

    2024年02月03日
    浏览(73)
  • 【毕业设计】58-基于51单片机的智能语音密码锁设计(原理工程+PCB工程+仿真工程+源代码+答辩论文+实物图)

    主要研究内容: 掌握电子密码锁的原理、构造、以及运用51单片机设计出一款简易密码锁,实现相应的一些要求;掌握并且实际运用所学知识,将书中知识转化为实际能力;对密码锁的应用和未来的发展进行分析。 研究方法: 通过相关的书籍和网上资料,查阅相关资料,收集有

    2024年02月05日
    浏览(107)
  • 毕业设计 单片机推箱子游戏(AT89C51)

    一、电路设计 此电路由AT89C51最小系统、LCD12864显示模块、74LS08芯片和四个独立按键组成。 LCD12864显示模块 带中文字库的128X64 是一种具有4 位/8 位并行、2 线或3 线串行多种接口方式,内部含有国标一级、二级简体 中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置

    2024年02月21日
    浏览(72)
  • 基于单片机的毕业设计推荐

    ** ** 1、基于51单片机的多功能门禁系统(低端、功能限制较大)。 2、基于单片机的多功能实时时钟。 3、基于单片机的音乐播放器。 4、基于STM32单片机的多功能门禁系统(高端、没有限制)。 5、基于单片机的智能窗帘系统。 6、基于单片机的智能灯光系统。 7、基于单片机

    2024年02月06日
    浏览(84)
  • 【单片机毕业设计】【mcuclub-jj-011】基于单片机的加湿器的设计

    项目名:加湿器 项目编号:mcuclub-jj-011 单片机类型:STC89C52 具体功能: 1、通过DHT11获取湿度值,当湿度值低于设置最小值,则启动加湿器加湿,大于设置最大值,则停止加湿 2、通过液位检测模块检测加湿器中是否还有水,如果没有,则自动停止加湿、声光提醒 3、通过按键

    2023年04月17日
    浏览(106)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包