基于AT89S52单片机的汽车LED尾灯控制器设计

发布于:2022-10-21 ⋅ 阅读:(914) ⋅ 点赞:(0)

目录
1绪言 5
1.1课题的研究背景与意义 5
1.1.1 汽车灯光简介 5
1.1.2 汽车尾灯介绍 5
1.1.3 尾灯灯泡分类 5
1.2 课题研究的热点及发展概况 5
1.2.1国外研究现状及成果: 6
1.2.2国内研究现状及成果: 6
1.3本次设计的主要任务以及要求 7
1.3.1设计目的及任务 7
1.3.3工作要求 7
3汽车LED尾灯控制器硬件设计 8
3.1硬件设计系统框架 8
3.1.1系统的框架结构图 8
3.1.2系统功能 8
3.2硬件设计 9
3.2.1单片机技术简介 9
3.2.2系统主要芯片和元器件的介绍及应用 10
3.2.3 74HC59驱动8位led电路设计 13
3.3仿真电路设计 15
3.3.1Proteus软件简介 15
3.3.2仿真电路的设计 17
3.4软件设计 18
3.4.1编程软件Keil4的介绍 18
3.4.2程序设计 19
4组装与调试 20
4.1 元器件的选择 20
4.2pcb版的制作 20
4.3软件调试时遇到的问题及解决方法 21
4.4实物图 22
5.总结 22
致谢 23
参考文献 24
附录一: 25
1.3本次设计的主要任务以及要求
1.3.1设计目的及任务
a.通过网上查阅相关资料,充分了解汽车尾灯的工作原理,设计模拟汽车尾灯的电路。
b.复习与巩固“AT89S52单片机原理以及C语言编程设计”,掌握51单片机的I/O口使用以及扩展,能用I/O口控制LED的亮灭,模拟汽车尾灯的控制。
c.了解并运用74HC595的结构功能以及应用。
d.利用Autilum designer软件设计模拟汽车尾灯控制的原理图,做出PCB板,以及后期的焊接与调试。
e.使用Keil4软件编写 C语言程序,在做好的模拟的电路板中下载调试。
f.利用proteus软件画出原理图进行程序仿真。
g.写出此次设计的报告和制作出答辩时的PPT。
1.3.2技术要求
a.采用AT89S52单片机作为整个电路的控制核心,控制8个LED灯的亮灭,以实现模拟汽车尾灯的控制。
b.使用74HC595芯片作为驱动LED灯的驱动电路,可以减少对单片机I/O口的使用。
c.利用6个独立按键模拟汽车尾灯控制器,分别代表着“右转”、“左转”、“危险警示”、“夜间模式切换”、“检查信号”、“刹车”。
1.3.2工作要求
a.构建基于AT89S52单片机的控制系统的总体结构框图;
b.根据开题报告要求,选择购买主要元器件,通过查阅网上资料,并且计算所需的电路参数;设计出模拟汽车尾灯的电路,在学校开放性实验室中做出进行实物的焊接以及调试;
c.根据题目的要求,以及操作功能的需要,确定6个独立按键功能;
d.采用C语言编写电路的程序,进行后期的调试,直到能够完全实现功能。
e.进行电路仿真,调试程序。
F. 写出此次设计的步骤,在实际操作时遇到的困难,以及软件调试直至通过,记录在对模拟电路进行调试分析的结果,写出设计报告和制作答辩所需的PPT。
2汽车LED尾灯控制器硬件设计
2.1硬件设计系统框架
本模拟汽车尾灯控制系统主要以AT89S52单片机为核心,制作出的一款新型LED组合式汽车尾灯控制的电路,并且利用6个独立按键实现左转、右转、刹车、行车、危险警示、检查信号等信号灯的功能并且利用74HC595芯片实现只利用单片机3个I/O口实现多个状态控制。该系统由电源电路、电源指示灯、下载接口、复位电路、74HC595串行输入并行输出控制8个LED灯、振荡电路。
2.1.1系统的框架结构图
在这里插入图片描述

2.1.2系统功能
本系统主要实现模拟汽车行驶状态中尾灯控制的状态并用8个LED灯的组合式亮灭来代表了汽车右转、左转、危险警示、夜间模式切换、检查信号、刹车同时,本系统还实现了白天和夜间两种模式。用户可根据需要按对应的“夜间模式切换”按键切换,本文转载自http://www.biyezuopin.vip/onews.asp?id=12873汽车在白天与夜间的状态以及对应的变化。我们总共设计了6个独立按键S1-S6,下图所示为按键功能介绍:

#include<STC12C2052AD.h>
#include"LCD1602_IIC.c"
#include"DS1302.c"

sbit LED_Left=P3^0;
sbit LED_Right=P3^1;

sbit Key_Left=P3^7;
sbit Key_Right=P1^0;
sbit Key_Stop=P1^1;
sbit Key_Emergency=P1^2;

//运行标志位
bit flag_Key_Left=0;//按键执行标志位
bit flag_Key_Right=0;
bit flag_Key_Stop=0;
bit flag_Key_Emergency=0;
unsigned char Flash_Mode=0;//闪烁模式选择 0:正常待机模式 1:左转 2:右转 3:双闪 4:停止

//运行数组
char LCD1602_Buff[17];
unsigned int T0_Cnt=0;

/*
名称:基于单片机的汽车尾灯控制系统设计
平台:STC12C5202AD,使用内部RC振荡器,大约为13MHz
说明:
	设计包含4个独立按键,两个LED灯代表左右车尾灯。
	使用PCF8574转接板以IIC方式连接LCD1602到单片机。
	时钟电路选用DS1302,仅下载时设定时间。
功能设定:
	待机状态下,显示当前系统时间;
	按下左转按键,左转指示灯闪烁;
	按下右转按键,右转指示灯闪烁;
	按下紧急按键,两指示灯均闪烁;
	任意状态下按住刹车按键,两灯保持常量,松开后还原为原来状态。
	上述4种状态均有文字提示。
	
硬件制作:凌净清河
程序/文档:凌净欣羽
新矿城学习基地#2019
*/

void delay(unsigned long i)
{
	while(i--);
}

void Time_Display()
{
	unsigned char i;
	for(i=0;i<17;i++)
	{
		LCD1602_Buff[i]='\0';//先填充截断符
	}
	LCD1602_Buff[0]=' ';
	LCD1602_Buff[1]=' ';
	LCD1602_Buff[2]=' ';
	LCD1602_Buff[3]=D_year[0]+'0';
	LCD1602_Buff[4]=D_year[1]+'0';
	LCD1602_Buff[5]=D_year[2]+'0';
	LCD1602_Buff[6]=D_year[3]+'0';
	LCD1602_Buff[7]='-';
	LCD1602_Buff[8]=D_month[0]+'0';
	LCD1602_Buff[9]=D_month[1]+'0';
	LCD1602_Buff[10]='-';
	LCD1602_Buff[11]=D_day[0]+'0';
	LCD1602_Buff[12]=D_day[1]+'0';
	LCD1602_Buff[13]=' ';
	LCD1602_Buff[14]=' ';
	LCD1602_Buff[15]=' ';
	LCD1602_Print(0,0,LCD1602_Buff);
	delay(10000);
	for(i=0;i<17;i++)
	{
		LCD1602_Buff[i]='\0';//先填充截断符
	}
	LCD1602_Buff[0]=' ';
	LCD1602_Buff[1]=' ';
	LCD1602_Buff[2]=' ';
	LCD1602_Buff[3]=' ';
	LCD1602_Buff[4]=D_hour[0]+'0';
	LCD1602_Buff[5]=D_hour[1]+'0';
	LCD1602_Buff[6]=':';
	LCD1602_Buff[7]=D_minute[0]+'0';
	LCD1602_Buff[8]=D_minute[1]+'0';
	LCD1602_Buff[9]=':';
	LCD1602_Buff[10]=D_second[0]+'0';
	LCD1602_Buff[11]=D_second[1]+'0';
	LCD1602_Buff[12]=' ';
	LCD1602_Buff[13]=' ';
	LCD1602_Buff[14]=' ';
	LCD1602_Buff[15]=' ';
	LCD1602_Print(0,1,LCD1602_Buff);
}

void Timer0Init(void)		//5毫秒@13MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0x02;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

void sys_init()
{
	//Ds1302Init();//首次上电写入时间
	LED_Left=0;
	LED_Right=0;
	LCD1602_Light_Off();
	LCD1602_Init();
	LCD1602_Print(0,0,"     Ready!     ");
	LCD1602_Light_On();
	Timer0Init();
	EA=1;
	ET0=1;
	LED_Left=1;
	LED_Right=1;
}

void main()
{
	sys_init();
	while(1)
	{
		GetTime();
		if(Flash_Mode==0)Time_Display();
		
		if(!Key_Left&&!flag_Key_Left)
		{
			delay(2000);
			if(!Key_Left)
			{
				flag_Key_Left=1;
				LCD1602_Print(0,0,"   Turn Left    ");
				LCD1602_Print(0,1," LED_Left Flash ");
				if(Flash_Mode==1)
				{
					Flash_Mode=0;
					LED_Left=1;
				}
				else
				{
					LED_Right=1;
					Flash_Mode=1;
				}
			}
		}
		
		if(!Key_Right&&!flag_Key_Right)
		{
			delay(2000);
			if(!Key_Right)
			{
				flag_Key_Right=1;
				LCD1602_Print(0,0,"   Turn Right   ");
				LCD1602_Print(0,1," LED_Right Flash");
				if(Flash_Mode==2)
				{
					Flash_Mode=0;
					LED_Right=1;
				}
				else
				{
					LED_Left=1;
					Flash_Mode=2;
				}
			}
		}
		
		if(!Key_Stop&&!flag_Key_Stop)
		{
			unsigned char Temp_Flash_Mode=0;
			delay(2000);
			if(!Key_Stop)
			{
				
				flag_Key_Stop=1;
				LCD1602_Print(0,0,"     Stop     ");
				LCD1602_Print(0,1," LED_Stop Light ");
				Temp_Flash_Mode=Flash_Mode;//模式备份
				Flash_Mode=4;
				LED_Left=0;
				LED_Right=0;
			}
			while(!Key_Stop);
			LED_Left=1;
			LED_Right=1;
			Flash_Mode=Temp_Flash_Mode;//模式还原
			switch(Flash_Mode)//文字还原
			{
				case 1:
				LCD1602_Print(0,0,"   Turn Left    ");
				LCD1602_Print(0,1," LED_Left Flash ");
				break;
				case 2:
				LCD1602_Print(0,0,"   Turn Right   ");
				LCD1602_Print(0,1," LED_Right Flash");
				break;
				case 3:
				LCD1602_Print(0,0,"    Emergency   ");
				LCD1602_Print(0,1,"  Double Flash  ");
				break;
				default:break;
			}
		}
		
		if(!Key_Emergency&&!flag_Key_Emergency)
		{
			delay(2000);
			if(!Key_Emergency)
			{
				flag_Key_Emergency=1;
				LCD1602_Print(0,0,"    Emergency   ");
				LCD1602_Print(0,1,"  Double Flash  ");
				if(Flash_Mode==3)
				{
					Flash_Mode=0;
					LED_Left=1;
					LED_Right=1;
				}
				else
				{
					LED_Left=0;
					LED_Right=0;
					Flash_Mode=3;
				}
			}
		}
		
		if(Key_Left)flag_Key_Left=0;
		if(Key_Right)flag_Key_Right=0;
		if(Key_Stop)flag_Key_Stop=0;
		if(Key_Emergency)flag_Key_Emergency=0;
	}
}

void Timer0() interrupt 1
{
	if(T0_Cnt==1000)
	{
		T0_Cnt=0;
		switch(Flash_Mode)
		{
			case 1:LED_Left=~LED_Left;break;
			case 2:LED_Right=~LED_Right;break;
			case 3:LED_Left=~LED_Left;LED_Right=~LED_Right;break;
			default:break;
		}
	}
	else
	{
		T0_Cnt++;
	}
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到