BASIC4MCU | 질문게시판 | 답변 : 8051 마이크로 프로세서 사거리신호등 마지막으로 질문합니다.
페이지 정보
작성자 master 작성일2018-12-11 22:56 조회15,340회 댓글6건본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2018-12-11 오후 10:57:03// by Ok-Hyun Park//#include <reg51.h>//교통신호는 시계방향으로 북 동 남 서// east|north//P1=G G좌 Y R|G G좌 Y R//P1=1.7 1.6 1.5 1.4|1.3 1.2 1.1 1.0// west|south//P3=G G좌 Y R|G G좌 Y R//P3=3.7 3.6 3.5 3.4|3.3 3.2 3.1 3.0//보행자신호는 시계방향으로 동 남 서 북//P2=SW_N SW_N SW_N SW_N|w_m s_m e_m n_m//P2=2.7 2.6 2.5 2.4|2.3 2.2 2.1 2.0//보행자 신호에 사용될 세그먼트는 4511ic를 사용했습니다.//동작은 보행자 신호 led와 같이 동작합니다.// Latch_N,S,W,E|4511 A B C D//P0=N W S E|D C B A//P0=0.7 0.6 0.5 0.4|0.3 0.2 0.1 0.0sbit Latch_E=P0^4; // 4511 동쪽 Latchsbit Latch_S=P0^5; // 4511 남쪽 Latchsbit Latch_W=P0^6; // 4511 서쪽 Latchsbit Latch_N=P0^7; // 4511 북쪽 Latch//void delay(unsigned int ms){unsigned int i,j;for(i=1; i<=ms; i++)for(j=1; j<=125; j++);}//void east_walk(void){ //동쪽 보행자 신호 LED 깜빡임 및 세그먼트 설정signed char number,temp;P0=0xFF; Latch_W=0; Latch_W=1;P0=0xFF; Latch_S=0; Latch_S=1;P0=0xFF; Latch_N=0; Latch_N=1;for(number=9; number>=0; number--){temp=(number&0x0F)|0xF0;P2=0x0e; P0=temp; Latch_E=0; Latch_E=1; delay(500);P2=0x0f; P0=temp; Latch_E=0; Latch_E=1; delay(500);}P0=0xFF; Latch_E=0; Latch_E=1;}//void south_walk(void){ //남쪽 보행자 신호 LED 깜빡임 및 세그먼트 설정signed char number,temp;P0=0xFF; Latch_E=0; Latch_E=1;P0=0xFF; Latch_W=0; Latch_W=1;P0=0xFF; Latch_N=0; Latch_N=1;for(number=9; number>=0; number--){temp=(number&0x0F)|0xF0;P2=0x0d; P0=temp; Latch_S=0; Latch_S=1; delay(500);P2=0x0f; P0=temp; Latch_S=0; Latch_S=1; delay(500);}P0=0xFF; Latch_S=0; Latch_S=1;}//void west_walk(void){ //서쪽 보행자 신호 LED 깜빡임 및 세그먼트 설정signed char number,temp;P0=0xFF; Latch_E=0; Latch_E=1;P0=0xFF; Latch_S=0; Latch_S=1;P0=0xFF; Latch_N=0; Latch_N=1;for(number=9; number>=0; number--){temp=(number&0x0F)|0xF0;P2=0x0b; P0=temp; Latch_W=0; Latch_W=1; delay(500);P2=0x0f; P0=temp; Latch_W=0; Latch_W=1; delay(500);}P0=0xFF; Latch_W=0; Latch_W=1;}//void north_walk(void){ //북쪽 보행자 신호 LED 깜빡임 및 세그먼트 설정signed char number,temp;P0=0xFF; Latch_E=0; Latch_E=1;P0=0xFF; Latch_S=0; Latch_S=1;P0=0xFF; Latch_W=0; Latch_W=1;for(number=9; number>=0; number--){temp=(number&0x0F)|0xF0;P2=0x07; P0=temp; Latch_N=0; Latch_N=1; delay(500);P2=0x0f; P0=temp; Latch_N=0; Latch_N=1; delay(500);}P0=0xFF; Latch_N=0; Latch_N=1;}//void main(void){do{P1=0xe7; P3=0xee; east_walk(); // 북쪽 녹색 직진 // 동,남,서 적색P1=0xed; P3=0xee; P2=0x0f; // 북쪽 황색 대기 // 동,남,서 적색 // 동쪽 보행자 적색delay(2000);P1=0x7e; P3=0xee; south_walk(); // 동쪽 녹색 직진 // 북,남,서 적색P1=0xde; P3=0xee; P2=0x0f; // 동쪽 황색 대기 // 북,남,서 적색 // 남쪽 보행자 적색delay(2000);P1=0xee; P3=0xe7; west_walk(); // 서쪽 녹색 직진 // 동,북,남 적색P1=0xee; P3=0xed; P2=0x0f; // 서쪽 황색 대기 // 동,북.남 적색 // 서쪽 보행자 적색delay(2000);P1=0xee; P3=0x7e; north_walk(); // 남쪽 녹색 직진 // 동,북,서 적색P1=0xee; P3=0xde; P2=0x0f; // 남쪽 황색 대기 // 동,북,서 적색 // 북쪽 보행자 적색delay(2000);} while(1);}
스위치 코드와 좌회전 코드는 아직 안 만들었나보죠?
void main(void){do{P1=0xe7; P3=0xee; east_walk(); // 북쪽 녹색 직진 // 동,남,서 적색P1=0xed; P3=0xee; P2=0x0f; // 북쪽 황색 대기 // 동,남,서 적색 // 동쪽 보행자 적색for(i=0;i<20;i++){ delay(100); sw_check(); } // 딜레이 동안에 스위치를 체크if(북쪽 좌회전?){북쪽 좌회전}P1=0x7e; P3=0xee; south_walk(); // 동쪽 녹색 직진 // 북,남,서 적색P1=0xde; P3=0xee; P2=0x0f; // 동쪽 황색 대기 // 북,남,서 적색 // 남쪽 보행자 적색for(i=0;i<20;i++){ delay(100); sw_check(); } // 딜레이 동안에 스위치를 체크if(동쪽 좌회전?){동쪽 좌회전}P1=0xee; P3=0xe7; west_walk(); // 서쪽 녹색 직진 // 동,북,남 적색P1=0xee; P3=0xed; P2=0x0f; // 서쪽 황색 대기 // 동,북.남 적색 // 서쪽 보행자 적색for(i=0;i<20;i++){ delay(100); sw_check(); } // 딜레이 동안에 스위치를 체크if(서쪽 좌회전?){서쪽 좌회전}P1=0xee; P3=0x7e; north_walk(); // 남쪽 녹색 직진 // 동,북,서 적색P1=0xee; P3=0xde; P2=0x0f; // 남쪽 황색 대기 // 동,북,서 적색 // 북쪽 보행자 적색for(i=0;i<20;i++){ delay(100); sw_check(); } // 딜레이 동안에 스위치를 체크if(남쪽 좌회전?){남쪽 좌회전}} while(1);}
댓글 6
조회수 15,340건전한서포터님의 댓글
건전한서포터 작성일선생님 스위치를 체크하는 코드가 왜 신호체계 코드 밑에 가는지 여쭈어봐도 될까요?
master님의 댓글
master 작성일
직진 다음에 좌회전 아닌가요? (동시 신호일 수도 있지만)
//
스위치 체크는 시간이 많이 걸리는 부분에서 해야 합니다.
walk() 보행자 신호 시간도 길고
delay(2000); 직진 후 딜레이 시간도 길죠
walk() 함수에서는 스위치를 체크하고 있지 않지만 필요하다면 여기서도 스위치를 체크하세요
건전한서포터님의 댓글
건전한서포터 작성일
선생님 제가 하려던 의도는 맨 처음 신호체계에서 스위치의 입력을 확인해서 입력되지 않으면 소스코드의 정상신호가 출력되고 스위치가 입력되면 좌회전 신호 -> 황색 신호 -> 정상신호가 되겠금 하는게 목적이였습니다.
스위치를 좌회전 감응신호로 두고 스위치를 통해 신호체계를 구성하는게 목적이였습니다. 제가 설명을 잘 못한거같아서 죄송합니다.
master님의 댓글
master
처음 신호쳬계를 체크 한다면 스위치 체크를 무한루프 진입하기 전에 하면 될테고요
char flag=0; // 초기값 좌회전 사용안함
if(sw?)flag=1; // 좌회전 사용
while(1){
if(flag){ 북쪽 좌회전 }
북쪽 황색;
북쪽 직진; 동쪽 보행자;
//
if(flag){ 동쪽 좌회전 }
동쪽 황색;
동쪽 직진; 남쪽 보행자;
//
이런식으로 작성하면 되겠죠
건전한서포터님의 댓글
건전한서포터 작성일각 위치의 스위치를 정의할때 sbit를 사용하는게 좋을까요? 아니면 define을 사용하는게 좋을까요? 보행자신호 LED가 P2 포트에 4개가 사용되어서 나머지 4개 포트에 사용되는데 어떤 방법이 더 효율적일까요?
master님의 댓글
master
작성해보면 어느 쪽이 더 효율적인지 스스로 알게 됩니다.
이해하기 쉬운 쪽을 선택하게 되죠