跟车辅助提醒装置

在这里插入图片描述

部分核心代码

#include "reg52.h"
#include "delay.h"
#include "lcd1602.h"

sbit Key1 = P0^0;
sbit Key2 = P0^1;
sbit Key3 = P0^2;
sbit Key4 = P1^2;
sbit Key5 = P0^4;

sbit LED = P1^1;//LED
sbit BEEP= P1^0;//蜂鸣器

sbit Echo1 = P1^4;        //HC-SR04 接收端口
sbit Trig1 = P1^3;        //HC-SR04 发射端口

sbit Echo2 = P1^5;        //HC-SR04 接收端口
sbit Trig2 = P1^6;        //HC-SR04 发射端口


u16 time=0,S1=0,S2=0;
float V=346.0;//声音在空气中的速度346m/s


bit Run_Flag=0;
bit Set_Flag=0;
int Anquanjuli=50;//50cm

void Key();//按键
void Celiang();//测量
void Display();//显示
void Alarm();//报警

void main()
{
	TMOD=0x01; //设T0为方式1,GATE=1;
    TH0=0;
    TL0=0;         
    ET0=1; //允许T0中断
	TR0=0;
    EA=1;  //开启总中断
	
	Trig2 = 0;//初始化
	Trig1 = 0;//初始化
	
	LCD_Init();
	while(1)
	{
		Key();//按键检测
		Celiang();
		Display();//显示
		Alarm();
	}
}

void Alarm()
{
	/*---------------报警提示---------------*/
	if(((S1<=Anquanjuli)||(S2<=Anquanjuli))&&(Run_Flag==1))
	{
		LED=1;
		BEEP=0;
		delay_ms(200);
	}
	else
	{
		LED=0;
		BEEP=1;
	}
	
}

void Display()
{
	
	if(Set_Flag==0)
	{
	
		/*--------------------显示前方距离----------------------*/
		LCD_Display_Num(1,7,S1%1000/100);
		LCD_Display_Num(1,8,S1%100/10);
		LCD_Display_Num(1,9,S1%10);

		/*--------------------显示后方距离----------------------*/
		LCD_Display_Num(2,7,S2%1000/100);
		LCD_Display_Num(2,8,S2%100/10);
		LCD_Display_Num(2,9,S2%10);
	}
	else
	{
		LCD_Display_Num(1,11,Anquanjuli%1000/100);
		LCD_Display_Num(1,12,Anquanjuli%100/10);
		LCD_Display_Num(1,13,Anquanjuli%10);
	}
}

void Celiang()
{
	if(Run_Flag==1)
	{
		/*--------------------测量前方距离----------------------*/
		//开始发射超声波
		
		Trig1=1;//启动一次模块
		Delayus(15);
		Trig1=0;
		while(!Echo1);   //当RX为零时等待
		TR0=1;           //开启计数
		while(Echo1);    //当RX为1计数并等待
		TR0=0;           //关闭计数
		time=TH0*256+TL0;//计算时间
		if(time>=60000) time=0;//超出距离
		TH0=0;TL0=0;
		S1=(u16)(time*V/20000);//算出来是mm
		delay_ms(200);

		/*--------------------测量后方距离----------------------*/
		//开始发射超声波
		
		Trig2=1;//启动一次模块
		Delayus(15);
		Trig2=0;
		while(!Echo2);   //当RX为零时等待
		TR0=1;           //开启计数
		while(Echo2);    //当RX为1计数并等待
		TR0=0;           //关闭计数
		time=TH0*256+TL0;//计算时间
		if(time>=60000) time=0;//超出距离
		TH0=0;TL0=0;
		S2=(u16)(time*V/20000);//算出来是mm
		delay_ms(200);
		
	}
}
void Key()
{
	u8 i;
	/*------------开始运行--------------*/
	if((Key1==0)&&(Set_Flag==0))
	{
		delay_ms(10);//按键消抖
		if(Key1==0) Run_Flag=1;
		while(Key1==0);
	}
	/*------------停止运行--------------*/
	if(Key2==0)
	{
		delay_ms(10);//按键消抖
		if(Key2==0) 
		{
			Run_Flag=0;
			S1=0;S2=0;
		}
		while(Key2==0);
	}
	
	
	/*------------设置安全距离--------------*/
	if((Key3==0)&&(Run_Flag==0))
	{
		delay_ms(10);
		if(Key3==0) 
		{
			Set_Flag=~Set_Flag;
			if(Set_Flag==0)
			{
				LCD_Write_Cmd(0x80);//数据指针定位到第一行第一个字处
				for(i=0;i<16;i++)
					LCD_Write_Data(str1[i]);//液晶显示第一行写数据
				LCD_Write_Cmd(0xc0);//数据指针定位到第二行第一个字处
				for(i=0;i<16;i++)
					LCD_Write_Data(str2[i]);//液晶显示第二行写数据
			}
			else
			{
				PutString(1,1,"Safe_Dista:   cm");
				PutString(2,1,"                ");
			}
		}
		while(Key3==0);
	}
	
	/*------------安全距离加--------------*/
	if((Key4==0)&&(Set_Flag==1))
	{
		delay_ms(10);
		if(Key4==0) 
		{
			if(++Anquanjuli>=200) Anquanjuli=200;
		}
		delay_ms(200);
	}
	
	
	/*------------安全距离减--------------*/
	if((Key5==0)&&(Set_Flag==1))
	{
		delay_ms(10);
		if(Key5==0) 
		{
			if((Anquanjuli--)<=0) Anquanjuli=0;
		}
		delay_ms(200);
	}
}


硬件电路图

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值