宋百玲,劉偉學(xué),孫振偉,張紅志,李孟飛,李 沖,張東振
(東北林業(yè)大學(xué) 交通學(xué)院,哈爾濱 150040)
?
汽車(chē)危險(xiǎn)報(bào)警燈與轉(zhuǎn)向燈的隨動(dòng)系統(tǒng)設(shè)計(jì)
宋百玲,劉偉學(xué),孫振偉,張紅志,李孟飛,李沖,張東振
(東北林業(yè)大學(xué) 交通學(xué)院,哈爾濱 150040)
摘要:通過(guò)運(yùn)用AVR單片機(jī)及汽車(chē)電路轉(zhuǎn)換原理設(shè)計(jì)一個(gè)電路系統(tǒng),對(duì)車(chē)燈系統(tǒng)的構(gòu)造進(jìn)行改善,使轉(zhuǎn)向燈打開(kāi)的同時(shí)危險(xiǎn)報(bào)警燈相應(yīng)關(guān)閉,使其他車(chē)輛和行人輕松分辨該車(chē)的轉(zhuǎn)向,從而增強(qiáng)了機(jī)動(dòng)車(chē)的安全性能,將起到避免交通事故的作用。該系統(tǒng)具有功能強(qiáng)、使用靈活、可靠性高、成本低、體積小、面向控制和具有智能化功能的優(yōu)點(diǎn)。
關(guān)鍵詞:AVR單片機(jī);轉(zhuǎn)向燈;危險(xiǎn)報(bào)警燈;隨動(dòng)系統(tǒng)
0引言
隨著汽車(chē)行業(yè)的高速發(fā)展,汽車(chē)的保有量迅速增加。同時(shí),每年因交通事故造成的人民生命財(cái)產(chǎn)損失也不計(jì)其數(shù),汽車(chē)安全性能越來(lái)越受到人們的重視。當(dāng)遇到緊急情況時(shí),汽車(chē)應(yīng)打開(kāi)危險(xiǎn)報(bào)警燈,兩側(cè)閃光燈閃起,以提醒其他車(chē)輛和行人。此時(shí)汽車(chē)若再打開(kāi)轉(zhuǎn)向燈,則失去了轉(zhuǎn)向指示功能,容易引發(fā)交通事故。目前國(guó)內(nèi)外雖然有很多關(guān)于這個(gè)問(wèn)題的研究,但是針對(duì)這個(gè)問(wèn)題的具體解決方案和設(shè)計(jì)仍然沒(méi)有實(shí)現(xiàn)[1-2]。設(shè)計(jì)的汽車(chē)危險(xiǎn)報(bào)警燈與轉(zhuǎn)向燈的隨動(dòng)系統(tǒng)便可以解決這個(gè)問(wèn)題,運(yùn)用AVR單片機(jī)和汽車(chē)電路轉(zhuǎn)換原理設(shè)計(jì),能夠使轉(zhuǎn)向燈打開(kāi)的同時(shí)危險(xiǎn)報(bào)警燈相應(yīng)地關(guān)閉,使其他車(chē)輛和行人輕松辨別其轉(zhuǎn)向,從而達(dá)到增強(qiáng)汽車(chē)安全性,避免交通事故的目的[3]。在原來(lái)的設(shè)計(jì)下,當(dāng)汽車(chē)危險(xiǎn)報(bào)警燈時(shí),兩側(cè)閃光燈同時(shí)閃爍,此時(shí)轉(zhuǎn)向燈開(kāi)關(guān)對(duì)其控制不起作用[4]。
通過(guò)在電路系統(tǒng)中對(duì)單片機(jī)寫(xiě)入相應(yīng)的程序,使不同的按鍵信號(hào)輸出高低不同的電平,從而控制發(fā)光二極管的熄滅和閃爍頻率,從而實(shí)現(xiàn)在打開(kāi)危險(xiǎn)報(bào)警燈時(shí)的轉(zhuǎn)向指示功能。電路圖如圖1所示,左側(cè)為左轉(zhuǎn)向燈、右轉(zhuǎn)向燈、危險(xiǎn)報(bào)警燈開(kāi)關(guān);中間為單片機(jī)控制系統(tǒng):右側(cè)為燈光系統(tǒng)(小燈泡額定電壓為2.5V,正常工作時(shí)電阻為10 Ω,串聯(lián)電阻均為10 Ω)。正常情況下,汽車(chē)左轉(zhuǎn)時(shí)打開(kāi)L開(kāi)關(guān),D1、D3、D5燈閃起;汽車(chē)右轉(zhuǎn)時(shí)打開(kāi)右轉(zhuǎn)向開(kāi)關(guān),D2、D4、D6燈閃起。當(dāng)危險(xiǎn)報(bào)警開(kāi)關(guān)D打開(kāi)后,D1、D2、D3、D4、D5、D6燈同時(shí)閃起。而此時(shí)若右轉(zhuǎn),再打開(kāi)右轉(zhuǎn)向開(kāi)關(guān)R,則D1、D3、D5燈會(huì)立即熄滅,當(dāng)右轉(zhuǎn)向開(kāi)關(guān)R關(guān)閉后又恢復(fù)閃爍;此時(shí)若需左轉(zhuǎn),再打開(kāi)左轉(zhuǎn)向開(kāi)關(guān)L、D2、D4、D6燈會(huì)立即熄滅,當(dāng)左轉(zhuǎn)向開(kāi)關(guān)L關(guān)閉后又恢復(fù)閃爍,從實(shí)現(xiàn)轉(zhuǎn)向功能[5-7]。
圖1 電路設(shè)計(jì)Fig.1 Circuit design
1電路設(shè)計(jì)
單片機(jī)作為一種微型電腦,通過(guò)對(duì)它輸入特定程序,便可實(shí)現(xiàn)相應(yīng)的需求。通過(guò)對(duì)按鍵和發(fā)光二極管的控制來(lái)模擬汽車(chē)危險(xiǎn)報(bào)警和轉(zhuǎn)向燈,AVR單片機(jī)控制原理如圖2所示,S20按鍵控制12345678發(fā)光二極管亮滅,代替危險(xiǎn)報(bào)警燈;S21按鍵控制1234發(fā)光二極管發(fā)光5678發(fā)光二極管熄滅,代替新型右轉(zhuǎn)向燈;S22按鍵控制5678發(fā)光二極管發(fā)光1234發(fā)光二極管熄滅,代替新型左轉(zhuǎn)向燈。
圖2 AVR單片機(jī)控制原理Fig.2 The control principle of AVR single chip microcomputer
發(fā)光二極管工作的基本原理就是通過(guò)給其正負(fù)兩端加上一定的電壓,二極管由正極到負(fù)極有一定電流經(jīng)過(guò),從而發(fā)光。發(fā)光二極管采取灌電流的工作方式,即當(dāng)單片機(jī)向?qū)?yīng)的控制I/O口寫(xiě)入“0”時(shí),與之相連接的二極管發(fā)光,當(dāng)單片機(jī)向?qū)?yīng)的控制I/O口寫(xiě)入“1”時(shí),與之相連接的二極管熄滅[5]。
ATmeaga128A共有53個(gè)I/O口,其中D0-D7連接到PB0-PB7作為8位LED發(fā)光二極管的控制口,S20、S21、S22分別連接到單片機(jī)的PC4、PC5、PD0作為3個(gè)按鍵的控制口[8-9]。通過(guò)將單片機(jī)的PB0-PB7口設(shè)置為輸出狀態(tài),根據(jù)S20、S21、S22三個(gè)按鍵的按下情況,控制不同的發(fā)光二極管點(diǎn)亮或熄滅。
2控制程序設(shè)計(jì)
#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++)
{