基于单片机的汽车前照灯远近光自动切换系统
2015-11-09徐泽谢天怡
徐泽++谢天怡
摘 要: 考虑到汽车的安全性能,设计了一款采用STC89C52单片机为电子控制单元核心的汽车前照灯远近光自动切换系统。该系统主要由光强检测系统和单片机系统组成。详细介绍了系统的基本原理、理论分析及硬件设计,并提出了软件的实现方法。其中,硬件系统模块包括处理器模块、通信模块、传感器模块、显示模块和电源模块。该前照灯系统较智能化,确保了汽车夜间行车的安全性。
关键词: STC89C52; 光敏传感器; 1602液晶显示屏; 灯光自动切换
中图分类号: TN710?34 文献标识码: A 文章编号: 1004?373X(2015)21?0167?04
Microcontroller?based automatic switching system of far
and near light for automobile headlights
XU Ze, XIE Tianyi
(College of Overseas Education, Nanjing University of Posts and Teleconmmunication, Nanjing 210023, China)
Abstract: Considering the safety performance of the vehicle, an automatic switching system of far and near light for automobile headlights was designed, which is taken STC89C52 microcontroller as the core of the electronic control unit. This system is consisted of light intensity detection system and microcontroller system. The fundamental principle, theoretical analysis and hardware design of this system are introduced in detail, and the software implementation method is proposed. The hardware system model is composed of processor module, communication module, sensor module, display module and power module. This headlights system is intelligent, and can ensure the safety performance of the vehicle on night driving.
Keywords: STC89C52; photosensitive sensor; 1602LCD; automatic light switching
0 引 言
随着日益成熟的交通网络的发展,汽车成为了人类出行不可缺少的交通工具。交通事故的频繁发生成为了人们日渐担忧的问题,人们更加关心汽车的安全性能。根据报道的数据显示[1],我国夜间发生的交通事故中,70%左右是由于违章使用氙气灯造成灯光炫目,使驾驶员无法看清前方路况而发生的。照明系统是汽车主动安全的重要组成部分之一,如今汽车前照灯灯光光型单一的传统照明系统已经无法跟上当前汽车安全性能发展的趋势[1];所以,为了减少交通事故的发生,考虑到汽车的人性化设计。本文采用STC89C52单片机设计了一款自动切换远近光的汽车前照灯系统。这种前照灯系统更加智能化,能消除存在的安全隐患。
1 基本原理及理论分析
目前市面上虽然有搭载AFS系统(Adaptive Front?lighting System,自适应前照明系统)的汽车,但其功能仅局限于转向大灯辅助汽车转弯,而不能做到自动切换前照灯的远近光模式。
本文设计的自动切换远近光汽车前照灯系统主要由光强检测系统和单片机系统组成。光强检测系统检测汽车前方环境的光强,当汽车行驶时,汽车前方的灯光将会照射在光强检测系统的接收器上,接收器将感测到的信号转化为可靠的数控直流电源,实现程控的功能,经过A/D转换器转换为模拟电压[2],将该电压送给单片机,通过与内置参数的对比,发送控制指令控制汽车的远近灯光,从而实现最终的汽车前照灯的远近光的自动切换,其原理图如图1所示。
2 硬件设计
整个硬件系统组成包括处理器模块、通信模块、传感器模块、显示模块和电源模块。
2.1 单片机模块
本文设计的智能前照灯系统的监控参数较少,计算不是特别复杂,选择STC89C52单片机完全可以满足系统的要求。STC89C52是一个具有和Atmel公司生产的AT89C52相似结构的微处理器,兼容8051微处理器指令集。 STC89C52是采用CMOS工艺的具有8 KB可编程只读存储(ROM)的低功耗、高效率的微处理器[3]。STC89C52有40个引脚,采用PDIP (双列直插式组件)封装[3]。有32个I/O引脚分为4组,分别为:Port 0(Pin 32 to Pin39),Port 1(Pin0 to Pin7), Port 2(Pin 21 to Pin 28)和Port 3(Pin 10 to Pin 17)。其中Port 3中的所有引脚都有2个功能。STC89C52单片机有6个中断:2个外部中断;3个定时器中断和1个串口中断。每一个中断都可以被单独启用或禁用。该单片机模块不具备I2C总线通信模块。系统的硬件组成原理图及实物图如图2,图3所示。
图3 智能车灯系统实物图
2.2 通信模块
本系统串口通信方面采用RS 232串口通信接口。RS 232是由美国电子工业协会EIA(Electronic Industries Association) 定义的异步传输标准接口,通信装置如图4所示。其特点为近距离传输、稳定。通常以DB?9,即9个引脚的形式出现。
由于STC89C52单片机具有TTL电平特性,即以电平高低表示逻辑状态,而RS 232串口是EIA电平特性,以电压正负来表示其逻辑状态。所以,在此采用MAXIM公司生产的MAX232电平转换芯片实现TTL?EIA电平双向转换[4]。
图4 RS 232串口通信装置
MAX232芯片的特点为功耗低,只需5 V电源供电,片内集成度高,在本系统中仅用了5个片外电容。
2.3 传感器模块
本系统采用的光敏传感器是ROHM公司出品的BH1750FVI光照度传感器,实物图如图5所示。该传感器内部集成A/D转换模块,采用I2C总线通信协议,16位数字输出。该传感器的优点在于分辨率高,其光强测量范围为1~65 535 lx。选用该传感器的一个重要原因在于其拥有接近人眼视觉的光谱灵敏度特性,光源依赖性弱,日光、白炽灯、卤素灯、氙灯都可以,并且几乎不受红外线的影响。
2.4 显示模块
本系统采用的显示器是LCD1602工业字符型液晶,实物图如图6所示。1602液晶显示屏是一种专门用来显示字母、数字、符号等的点阵型液晶模块,采用标准的16脚接口,其中几个编程常用的主要管脚分别是:第4脚寄存器选择(RS),读写信号线(RW)和使能端[5]。在寄存器选择中,高电平1代表选择数据寄存器,低电平0代表选择指令寄存器。在读/写信号中,高电平1进行读操作,低电平0进行写操作。在使能端中,高电平1时读取信息,负跳变时执行指令。
2.5 电源模块
在电源模块上,本系统选用USB接口进行5 V供电。
3 软件设计
整个系统需要程序操作的部件主要有传感器模块、LCD1602液晶显示器及用8个LED灯模拟的汽车前照灯。因此,程序部分主要分为液晶显示部分,传感器驱动部分及LED控制策略及延时函数。
3.1 传感器驱动
模拟I2C通信总线的时钟线与数据线。
void BH1750_Start() //起始信号
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时5 μs
SDA = 0; //产生下降沿
Delay5us(); //延时5 μs
SCL = 0; //拉低时钟线
}
void BH1750_Stop() //停止信号
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时5 μs
SDA = 1; //产生上升沿
Delay5us(); //延时5 μs
}
void BH1750_SendACK(bit ack) //应答信号
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时5 μs
SCL = 0; //拉低时钟线
Delay5us(); //延时5 μs
}
bit BH1750_RecvACK() //接收应答信号
{
SCL = 1; //拉高时钟线
Delay5us(); //延时5 μs
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时5 μs
return CY;
}
void BH1750_SendByte(BYTE dat) //发送数据
{
BYTE i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
BH1750_RecvACK();
}
BYTE BH1750_RecvByte() //接收数据
{
BYTE i;
BYTE dat = 0;
SDA = 1; //使能内部上拉,准备读取数据
for (i=0; i<8; i++)
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时5 μs
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时5 μs
}
return dat;
}
用STC89C52单片机驱动BH1750FVI传感器的主要难点在于该单片机没有I2C总线功能,需要单片机的两个引脚分别充当时钟线与数据线[6],因此需要不停地改变这两个引脚的电平高低来模拟时钟信号与数据信号。
3.2 LCD1602显示程序
控制LCD1602主要分为写命令,写数据,初始化三部分,部分程序如下:
void write_com(uchar com) //写指令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar dat) //写数据
{
lcdrs=1;
P0=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init() //初始化
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
3.3 LED控制策略
系统采用8个LED灯来代表汽车前照灯,在程序中分为5种情况来表示,即8个全亮,亮6个,亮4个,亮2个,全灭。采用if语句实现该控制,部分程序如下:
if(a<=100)
P2=0xff;