汽车危险报警灯与转向灯的随动系统设计
2016-04-18宋百玲刘伟学孙振伟张红志李孟飞张东振
宋百玲,刘伟学,孙振伟,张红志,李孟飞,李 冲,张东振
(东北林业大学 交通学院,哈尔滨 150040)
汽车危险报警灯与转向灯的随动系统设计
宋百玲,刘伟学,孙振伟,张红志,李孟飞,李冲,张东振
(东北林业大学 交通学院,哈尔滨 150040)
摘要:通过运用AVR单片机及汽车电路转换原理设计一个电路系统,对车灯系统的构造进行改善,使转向灯打开的同时危险报警灯相应关闭,使其他车辆和行人轻松分辨该车的转向,从而增强了机动车的安全性能,将起到避免交通事故的作用。该系统具有功能强、使用灵活、可靠性高、成本低、体积小、面向控制和具有智能化功能的优点。
关键词:AVR单片机;转向灯;危险报警灯;随动系统
0引言
随着汽车行业的高速发展,汽车的保有量迅速增加。同时,每年因交通事故造成的人民生命财产损失也不计其数,汽车安全性能越来越受到人们的重视。当遇到紧急情况时,汽车应打开危险报警灯,两侧闪光灯闪起,以提醒其他车辆和行人。此时汽车若再打开转向灯,则失去了转向指示功能,容易引发交通事故。目前国内外虽然有很多关于这个问题的研究,但是针对这个问题的具体解决方案和设计仍然没有实现[1-2]。设计的汽车危险报警灯与转向灯的随动系统便可以解决这个问题,运用AVR单片机和汽车电路转换原理设计,能够使转向灯打开的同时危险报警灯相应地关闭,使其他车辆和行人轻松辨别其转向,从而达到增强汽车安全性,避免交通事故的目的[3]。在原来的设计下,当汽车危险报警灯时,两侧闪光灯同时闪烁,此时转向灯开关对其控制不起作用[4]。
通过在电路系统中对单片机写入相应的程序,使不同的按键信号输出高低不同的电平,从而控制发光二极管的熄灭和闪烁频率,从而实现在打开危险报警灯时的转向指示功能。电路图如图1所示,左侧为左转向灯、右转向灯、危险报警灯开关;中间为单片机控制系统:右侧为灯光系统(小灯泡额定电压为2.5V,正常工作时电阻为10 Ω,串联电阻均为10 Ω)。正常情况下,汽车左转时打开L开关,D1、D3、D5灯闪起;汽车右转时打开右转向开关,D2、D4、D6灯闪起。当危险报警开关D打开后,D1、D2、D3、D4、D5、D6灯同时闪起。而此时若右转,再打开右转向开关R,则D1、D3、D5灯会立即熄灭,当右转向开关R关闭后又恢复闪烁;此时若需左转,再打开左转向开关L、D2、D4、D6灯会立即熄灭,当左转向开关L关闭后又恢复闪烁,从实现转向功能[5-7]。
图1 电路设计Fig.1 Circuit design
1电路设计
单片机作为一种微型电脑,通过对它输入特定程序,便可实现相应的需求。通过对按键和发光二极管的控制来模拟汽车危险报警和转向灯,AVR单片机控制原理如图2所示,S20按键控制12345678发光二极管亮灭,代替危险报警灯;S21按键控制1234发光二极管发光5678发光二极管熄灭,代替新型右转向灯;S22按键控制5678发光二极管发光1234发光二极管熄灭,代替新型左转向灯。
图2 AVR单片机控制原理Fig.2 The control principle of AVR single chip microcomputer
发光二极管工作的基本原理就是通过给其正负两端加上一定的电压,二极管由正极到负极有一定电流经过,从而发光。发光二极管采取灌电流的工作方式,即当单片机向对应的控制I/O口写入“0”时,与之相连接的二极管发光,当单片机向对应的控制I/O口写入“1”时,与之相连接的二极管熄灭[5]。
ATmeaga128A共有53个I/O口,其中D0-D7连接到PB0-PB7作为8位LED发光二极管的控制口,S20、S21、S22分别连接到单片机的PC4、PC5、PD0作为3个按键的控制口[8-9]。通过将单片机的PB0-PB7口设置为输出状态,根据S20、S21、S22三个按键的按下情况,控制不同的发光二极管点亮或熄灭。
2控制程序设计
#include “avr/io.h”
#include “stdio.h”
#include “math.h”
#include “string.h”
volatile unsigned char aaa=0;
#define S20_DIR DDRC&=(~(1<<4))
#define S20_IN_MODE PORTC|=(1<<4)
#define S20_CHECK(PINC&(1<<4))
#define S21_DIR DDRC&=(~(1<<5))
#define S21_IN_MODE PORTC|=(1<<5)
#define S21_CHECK(PINC&(1<<5))
#define S22_DIR DDRD&=(~(1<<0))
#define S22_IN_MODE PORTD|=(1<<0)
#define S22_CHECK(PIND&(1<<0))
#define led_dir DDRB=0XFF
#define led_off PORTB=0XFF
#define led_on PORTB=0
#define left_led_on PORTB=0X0F
#define left_led_off PORTB=0XFF
#define right_led_on PORTB=0XF0
#define right_led_off PORTB=0XFF
int main()
{
S20_DIR;
S20_IN_MODE;
S21_DIR;
S21_IN_MODE;
S22_DIR;
S22_IN_MODE;
led_dir;
led_off;
while(1)
{
if(!S20_CHECK)
{
led_on;
while(!S20_CHECK);
aaa++;
if(aaa==2){aaa=0;led_off;}
}
// else
// {led_off;}
if(!S21_CHECK)
{left_led_on;}
// else{left_led_off;}
if(!S22_CHECK)
{right_led_on;}
// else
// {right_led_off;}
}
}
/*volatile signed char aa=0;
volatile unsigned int i,j,val;
volatile unsigned int *p;//=(volatile unsigned int*)(0x0100);
int main()
{
int a[9]={1,8,9,51,0,2,45,8};
/*for(i=0;i<8;i++)
for(j=0;j<8-i;j++)
{