본문 바로가기

전자공학/포트폴리오

AVR ATmega128A 를 이용한 신호등 동작 구현 - 1 -


AVR 신호등 완벽 주석정리-고승완.zip




AVR ATmega128A 를 이용한 신호등 동작 구현





* 동작원리


1. 청신호 각방향 10초

2. 노란신호 2초

3. 보행신호 마지막 3초 점멸시키기


STEP1


Traffic2 - 빨간불ON

Traffic3 - 빨간불ON

Traffic4 - 파란불ON

시간 8초


STEP2


Traffic2 - 빨간불ON

Traffic3 - 빨간불ON

Traffic4 - 파란불OFF, 노란불ON

시간 2초


STEP3


Traffic2 - 빨간불OFF, 파란불ON

Traffic3 - 빨간불OFF, 파란불ON

Traffic4 - 노란불OFF, 빨간불ON

시간 7초


STEP4


Traffic2 - 파란불 점멸

Traffic3 - 파란불ON

Traffic4 - 빨간불ON

시간 1초


STEP5


Traffic2 - 파란불 점멸

Traffic3 - 파란불OFF, 노란불ON

Traffic4 - 빨간불ON

시간 2초



* 코드


#define F_CPU 16000000UL  // 16Mhz에서 동작하는 ATmega128A를 실제시간으로 동작을 맞추기 위해 사용

#include <avr/io.h>

#include <util/delay.h>

#define LED_SEL1 (*(volatile unsigned char*)0xA000) //0xA000 -> LED(0~7)를 가리키는 주소

#define LED_SEL2 (*(volatile unsigned char*)0xB000) //0xB000 -> LED(8~15)를 가리키는 주소


unsigned char led1=0x00, led2=0x00;   // 양수범위로 지정하기 위해서 사용


void io_init(void) //입력, 출력 초기화시키는 함수

{

MCUCR|=(1<<SRE)|(1<<SRW10);

XMCRA|=(1<<SRL2)|(0<<SRL1)|(0<<SRL0)|

(1<<SRW01)|(1<<SRW00)|(1<<SRW11);

XMCRB|0x00;

}


// ------------------------------------------------------------------------------트래픽2 함수

void traffic2 (int RED, int GREEN)  //트래픽2(LED 2개짜리) ON OFF 지정하는 함수

{

if(RED) led2 |=0x24;    //16진수임  // 2진수로 나타내면 0b00100100

else    led2 &=~0x24;   //16진수임  // 2진수로 나타내면 0b00100100

if(GREEN) led2 |=0x18;    //16진수임  // 2진수로 나타내면 0b00011000

else    led2 &=~0x18;   //16진수임  // 2진수로 나타내면 0b00011000

LED_SEL2=~led2; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.

}



// ------------------------------------------------------------------------------트래픽3 함수

void traffic3 (int RED, int YELLOW, int GREEN)  //트래픽3(LED 3개짜리) ON OFF 지정하는 함수 // 3개짜리 2세트

{

if(RED)

led1 |=0xc0;   //16진수임  // 2진수로 나타내면 0b11000000

else    

led1 &=~0xc0;  //16진수임  // 2진수로 나타내면 0b11000000

if(YELLOW)

{

led1 |=0x20;   //16진수임  // 2진수로 나타내면 0b00100000

led2 |=0x01;   //16진수임  // 2진수로 나타내면 0b00100000

}

else

{

led1 &=~0x20;   //16진수임  // 2진수로 나타내면 0b00100000

led2 &=~0x01;   //16진수임  // 2진수로 나타내면 0b00100000

}

if(GREEN)

{

led1 |=0x10;    //16진수임  // 2진수로 나타내면 0b00010000

led2 |=0x02;    //16진수임  // 2진수로 나타내면 0b00000010

}

else

{

led1 &=~0x10;   //16진수임  // 2진수로 나타내면 0b00010000

led2 &=~0x02;   //16진수임  // 2진수로 나타내면 0b00000010

}

LED_SEL1=~led1; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.

LED_SEL2=~led2; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.

}



// ------------------------------------------------------------------------------트래픽4 함수

void traffic4 (int RED, int YELLOW, int LEFT, int GREEN) // 트래픽4(LED 4개짜리) ON OFF 지정하는 함수

{

if(RED) led1 |=0x01;  //16진수임  // 2진수로 나타내면 0b00000001  

else    led1 &=~0x01; //16진수임  // 2진수로 나타내면 0b00000001

if(YELLOW) led1 |=0x02;  //16진수임  // 2진수로 나타내면 0b00000010

else    led1 &=~0x02; //16진수임  // 2진수로 나타내면 0b00000010

if(LEFT)   led1 |=0x04;  //16진수임  // 2진수로 나타내면 0b00000100

else    led1 &=~0x04; //16진수임  // 2진수로 나타내면 0b00000100

if(GREEN) led1 |=0x08;  //16진수임  // 2진수로 나타내면 0b00001000

else    led1 &=~0x08; //16진수임  // 2진수로 나타내면 0b00001000

LED_SEL1=~led1; // 회로도에서 신호가 0이 되어야지 LED에 불이 켜지므로 인버팅 시켜주는 것임.

}




/* ------------------------------------------------------------------------------------------------

여기까지가 함수를 정의하는 부분이고, 아래쪽은 정의한 함수를 이용한 동작구현하기


1.청신호 각방향 10초

2.노란신호 2초

3.보행신호 마지막 3초 점멸시키기

*/



//동작 구현하기


int main(void)

{

int i;

io_init();

LED_SEL1=~led1; //led1 변수정의

LED_SEL2=~led2; //led2 변수정의

while(1)

{

traffic2(1,0);         //트래픽2(보행신호)   빨간불

traffic3(1,0,0);       //트래픽3(차량신호)   빨간불

traffic4(0,0,1,1);     //트래픽4(삼거리신호) 초록불,왼쪽불

_delay_ms(8000);      //초록불 유지시간 8초

traffic2(1,0);         //트래픽2(보행신호)   빨간불

traffic4(0,1,0,0);     //트래픽4(삼거리신호) 노란불

_delay_ms(2000);       //노란불 유지시간 2초                 

 //---------------------------------------------------------------------------- 


traffic2(0,1);         //트래픽2(보행신호)   초록불

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(7000);       //초록불 유시시간 (10-3=7) 7 초


//---------------------------------------------------------------------------- 트래픽2 1초 초록불 점멸(주기 0.5초) 동작


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유시시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유시시간 0.25 초


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유시시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유시시간 0.25 초



//---------------------------------------------------------------------------- 트래픽2 2초 초록불 점멸(주기 0.5초) 

//---------------------------------------------------------------------------- 트래픽3 노란불 & 트래픽4 빨간불 동작



traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,1,0);       //트래픽3(차량신호)   노란불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);       //초록불 유시시간 0.25 초

}

return 0;

}







//--------------------------------------------------------------------------

//--------------------------------------------------------------------------



//for문을 이용한 또다른 방법







while(1)

{

traffic2(1,0);         //트래픽2(보행신호)   빨간불

traffic3(1,0,0);       //트래픽3(차량신호)   빨간불

traffic4(0,0,1,1);     //트래픽4(삼거리신호) 초록불,왼쪽불

_delay_ms(8000);      //초록불 유지시간 8초

traffic2(1,0);         //트래픽2(보행신호)   빨간불

traffic4(0,1,0,0);     //트래픽4(삼거리신호) 노란불

_delay_ms(2000);       //노란불 유지시간 2초

//----------------------------------------------------------------------------



traffic2(0,1);         //트래픽2(보행신호)   초록불

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(7000);       //초록불 유지시간 (10-3=7) 7 초



//---------------------------------------------------------------------------- 트래픽2 1초 초록불 점멸(주기 0.5초) 동작


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


traffic2(0,0);         //트래픽2(보행신호)   초록불꺼짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초


traffic2(0,1);         //트래픽2(보행신호)   초록불켜짐

traffic3(0,0,1);       //트래픽3(차량신호)   초록불

traffic4(1,0,0,0);     //트래픽4(삼거리신호) 빨간불

_delay_ms(250);        //초록불 유지시간 0.25 초

//---------------------------------------------------------------------------- 노란불ON & 초록불2초 점멸

traffic3(0,1,0);       //노란불


for(i=0; i<3; i++)     //------------------------------------------------------보행 2초 깜빡

{

traffic2(0,0);

_delay_ms(250);

traffic2(0,1);

_delay_ms(250);

}

}

return 0;

}