IT/IT

마이크로프로세서 - MCU 8051 LED 신호등 제어기

김효랑이 2018. 11. 8. 14:07
728x90
반응형

 호야의 블로그 

[IT] 마이크로프로세서 - 8051 기능을 이용한 LED 신호등

8051 키트를 이용한 신호등을 개발하였습니다. LCD 판, DOT(도트 점멸), INT(인터럽트), LED(LED 점멸등), SPK(스피커) 기능을 활용하여 구현하였습니다.


개요 및 기능 소개

인텔 8051은 1980년 발표된 8비트의 마이크로 컨트롤러(MCU)로 MCS 51이라 부릅니다. 8051은 컴퓨터 시스템의 기초적 요소인 CPU와 포트, 타이머/카운터, 시리얼 통신 등과 메모리를 한 칩에 내장한 마이크로 컨트롤러입니다. 

자세한 관련 내용은 아래 링크에 있습니다.


프로그램의 기능 동작은 신호등과 같습니다. 신호등은 녹색 LED가 점멸할 때 LCD에 ‘GREEN' 문구가 출력되며, DOT 매트릭스의 전체 불들이 녹색으로 출력되며 한 행단위로 OFF됩니다. 모두 OFF되면 다음 황색 LED가 점멸하고, LCD에는 'YELLOW'가 출력되며, 일정 타이머 시간이 지나면 적색 LED가 점멸합니다. 적색 LED가 타이머 시간만큼 점멸하는 동안 녹색일 경우와 마찬가지로 DOT 매트릭스가 녹색으로 점멸하였다가 한 행단위로 줄어들고, LCD에는 'RED'가 출력됩니다. 이 루프가 반복 동작하며, INT키 입력 시 LED 모든 등이 점멸하며, SPK에서는 인터럽트 기간 동안 스피커 음이 발생하고, 루프의 동작이 인터럽트 기간 동안 중지합니다.

① LED: 일정 시간 딜레이를 활용하여 적색과 녹색은 4초 동안 동작하며, 녹색과 적색사이의 황색 LED는 1.5초 동안 점멸한다.

② 인터럽트: 인터럽트 기능은 프로그램 루프가 진행되는 동안 입력되는 인터럽트를 인식하여 SPK 음을 발생하고, 루프가 멈추게 설계하였다.

③ LCD: LCD는 각 LED의 점멸 시간동안 동작하며, LED의 색 별로 LCD에 각기 다른 메시지를 출력한다.  

④ DOT 매트릭스: 적색과 녹색의 LED의 점멸시간동안 동작하며, 8X8 매트릭스에 모두 ON된 상태를 시작으로 한 행단위로 딜레이되며 줄어든다. 모든 DOT가 OFF되면 다음 LED를 점멸한다. 황색 LED에서는 동작하지 않게 설계되었다.

⑤ SPK: 스피커는 인터럽트 키가 입력되었을 때 동작하여 키 입력을 알려주는 기능을 한다. 키 입력 단위로 소음이 발생한다.


구현 코드

8051_test.zip

8051 시뮬레이터를 활용하면 동작하는 것을 확인 할 수 있을 것입니다. 저는 이전에 8051 키트를 활용하여 구현하였으며, 코드는 아래와 같습니다.

PPI_A EQU 0C014H PPI_B EQU 0C015H PPI_C EQU 0C016H PPI_CR EQU 0C017H



RED_FONT EQU 30H ;적색 폰트 버퍼 활성화 GREN_FONT EQU 31H ;녹색 폰트 버퍼 활성화 ORG 2000H SPK: EQU 0C010H          ;스피커 부분       JMP START ORG 2003H ;인터럽트 선언 JMP SERVICE ENABLE EQU 30H PPI EQU 0C00BH C825 EQU 0C00AH ;8255 C 포트 ALLCLR: MOV A,#01H SJMP LNXX LN21: MOV A,#0C0H SJMP LNXX LNXX: MOV R5,A ACALL BUSY ;BF 검사 MOV ENABLE,#11110100B ACALL EN ;커맨드 출력 RET ;BF 검사 BUSY: PUSH DPH PUSH DPL MOV A,#92H MOV DPTR,#PPI MOVX @DPTR,A DEC DPL MOV A,#0F3H ; RS = 1, RW = 1, E = 0 MOVX @DPTR,A ;LCD 제어신호 출력 BUSY1: MOV A,#11110110B ; RS = 0, RW = 1, E = 1 MOVX @DPTR,A ;LCD 제어신호 출력 DEC DPL ; Bport MOVX A,@DPTR ;BF 리드 MOV 2EH,A INC DPL ; Cport MOV A,ENABLE CLR ACC.2 ; E = 0 MOVX @DPTR,A JB 2EH.7,BUSY1 MOV A,#0F3H ; E = 0 MOVX @DPTR,A MOV DPTR,#PPI MOV A,#90H MOVX @DPTR,A DEC DPL MOV A,#0F3H ; E = 0 MOVX @DPTR,A POP DPL POP DPH RET ; ;LCD로 데이터 라이트 ; EN: PUSH DPL PUSH DPH MOV DPTR,#C825 MOV A,#0F3H MOVX @DPTR,A MOV A,ENABLE MOVX @DPTR,A DEC DPL ; Bport MOV A,R5 MOVX @DPTR,A INC DPL ; Cport MOV A,ENABLE CLR ACC.2 ; E = 0 MOVX @DPTR,A MOV A,#11110011B MOVX @DPTR,A ; E = 0 POP DPH POP DPL RET ;1문자를 LCD에 출력 ; CHAROUT: PUSH ACC MOV R5,A CALL BUSY MOV ENABLE,#11110101B ; RS = 1, WR = 0, E = 1 CALL EN POP ACC RET ;문자열을 LCD로 출력, 끝 데이터는 00H ; STRING: PUSH DPL PUSH DPH PUSH ACC PUSH PSW MOV PSW,#00011000B ; BANK 3 MOV A,SP CLR C SUBB A,#4 XCH A,SP ; SP = SP -4 POP DPH POP DPL XCH A,SP CLR A MOVC A,@A+DPTR XSTR2: ACALL CHAROUT INC DPTR CLR A MOVC A,@A+DPTR CJNE a,#0,XSTR2 INC DPTR MOV A,SP CLR C SUBB A,#6 ; SP = SP -6 XCH A,SP PUSH DPL PUSH DPH XCH A,SP POP PSW POP ACC POP DPH POP DPL RET DELAY: ;시간 지연을 위한 함수 PUSH PSW MOV PSW,#00010000B ;뱅크2 MOV R0,#0 DEL_LOOP1: ; MOV R1,#0 ;시간 지연 루프 DEL_LOOP: ; MUL AB DJNZ R1,DEL_LOOP DJNZ R0,DEL_LOOP1 POP PSW RET ; ;LED 모두 켜진 상태에서 한 행단위로 사라진다. ; DISP_LED: PUSH PSW MOV PSW,#00001000B ;뱅크1 MOV R2,#8 ;루프 카운터 DSP_LOOP:                                 MOV A,RED_FONT MOV DPTR,#PPI_A MOVX @DPTR,A ;적색폰트 출력 MOV A,GREN_FONT INC DPTR MOVX @DPTR,A ;녹색폰트 출력 MOV A,#00 INC DPTR MOVX @DPTR,A ;행 점등 CALL DELAY ;시간 지연 MOV A,RED_FONT CLR C RLC A MOV RED_FONT,A ;적색 다음 모양 MOV A,GREN_FONT CLR C RLC A MOV GREN_FONT,A ;녹색 다음 모양 MOV A,#0FFH MOVX @DPTR,A DJNZ R2,DSP_LOOP CALL DELAY POP PSW RET DEL2: MOV 30H,#6 ;시간 지연 DEL21: ACALL TIMER DJNZ 30H,DEL21 RET TIMER: PUSH 0 ;타이머 PUSH B MOV R0,#90 L1: MOV B,#0 L2: NOP NOP NOP NOP NOP DJNZ B,L2 DJNZ R0,L1 POP B POP 0 RET ;함수 선언 끝

START: ;메인 프로그램 시작 MOV SP,#50H MOV PSW,#0H MOV DPTR,#PPI_CR MOV A,#80H MOVX @DPTR,A DEC DPL MOV A,#0FFH MOVX @DPTR,A SETB IP.0 ; SETB EA ;인터럽트 초기화 SETB IE.0 ; SETB TCON.0 LOOP: CALL ALLCLR ;LCD RED표시 CALL STRING DB 'RED',0 ; ?? MOV A,#11101110B ;LED 빨간색 MOV P1,A MOV RED_FONT,#11111111B ;DOT LED 빨간색 MOV GREN_FONT,#0 CALL DISP_LED MOV A,#11011101B ;LED 노란색 MOV P1,A CALL ALLCLR ;LCD YELLOW 표시 CALL STRING DB 'YELLOW',0 ACALL DEL2 CALL ALLCLR ;LCD GREEN표시 CALL STRING DB 'GREEN',0 MOV A,#10111011B ;LED 초록색 MOV P1,A MOV RED_FONT,#0 MOV GREN_FONT,#11111111B ;DOT LED 초록색 CALL DISP_LED SJMP LOOP TONE: MOV A,R6 ADD A,R6 MOV R6,A ; MOV A,#0FFH MOV DPTR,#SPK ;SPK 출력 TONE1: MOVX @DPTR,A ; TONE2: NOP ;스피커 ON/OFF NOP ; NOP      NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP ;DJNZ R6,TONE2 XRL A,#80H ;SPK ON/OFF 설정 DJNZ R4,TONE1 RET RINGBK: MOV R7,#1 ;SPK 초기화 값 ; ;인터럽트 서비스 ; SERVICE: MOV A,#000000000B ;LED 모두 점등 MOV P1,A MOV R6,#96 MOV R4,#24 CALL TONE ;SPK ON DJNZ R7,SERVICE RETI END

매우 복잡합니다. 아무래도 저급 언어에 가깝기 때문에 해석도 무리가 있을 것이라 생각합니다. 어느정도 기계어에 숙련된 개발자라면 한 번쯤 분석하셔도 좋을 것 같습니다. 만든지 오래된 아이라 오랜만에 보니 어렵네요. 주석좀 더 많이 달 걸.


후기 및 정리

시스템의 흐름을 잘 파악한다면 어느정도 내용이 파악 가능하실 것입니다. 시뮬레이터를 이용해 한 번씩 돌려보시면 더 좋을 것 같습니다. 감사합니다.



조금의 도움이 되셨다면 로그인 없이도 가능한 댓글과

왼쪽 아래 ♥공감 버튼을 꾹 눌러주세요! 




728x90
반응형