宋百玲,劉偉學,孫振偉,張紅志,李孟飛,李 沖,張東振
(東北林業大學 交通學院,哈爾濱 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++)
{