2009년 12월 22일 화요일

[8051]직렬통신 command mode 흉내내기

■ 프로그램 : 직렬통신 command mode 흉내내기 (Ver. 0.1)
■ 컴파일러 : KEIL uVision3
■ 실행환경 : Proteus 7, AT89C52, UART 19200bps

$NOMOD51
$INCLUDE(AT89S52.INC)

CSEG    AT      0000H

START:
        MOV     SP, #7FH
        CALL    INIT_SERIAL
        CALL    PROMPT

REP:
        CALL    RXDATA
        JMP     REP  

INIT_SERIAL:         
        MOV     TMOD, #20H   ; [GATE|C/T_|M1|M0|GATE|C/T_|M1|M0] #00100000B
                                                   ; 1번 타이머 모드2(8비트 재저장 모드), 보레이트 발생용
        MOV     SCON, #52H     ; [SM0|SM1|SM2|REN|TB8|RB8|TI|RI] #01010010B
                                                   ; 모드1을 사용
        MOV     A, PCON     
        SETB    ACC.7
        MOV     PCON, A      ; [SMOD|-|-|-|GF1|GF0|PD|IDL] SMOD=1
                                                   ; 가속모드 사용
        MOV     TH1, #0FDH     ; 19200bps
        SETB    TR1          ; 타이머1 시작
        RET              

TXDATA:    
        JNB     TI, $                
        CLR     TI           ; TI비트를 0으로 초기화
        MOV     SBUF, A          ; A레지스터에 저장된 데이터를 시리얼 버퍼로 이동
        RET

RXDATA:               
        JNB     RI, $          
        MOV     A, SBUF
        CLR     RI              ; RI비트를 0으로 초기화      
        CJNE    A, #0DH, TXDATA  ; [Enter]키 검사
        CALL    PROMPT
        RET           

PROMPT:
        JNB    TI, $             
        MOV    SBUF, #0AH    ; line feed
        CLR    TI
        JNB    TI, $             
        MOV    SBUF, #0DH    ; carriage return
        CLR    TI                
        JNB    TI, $             
        MOV    SBUF, #3EH    ; '>' 표시
        CLR    TI                
        RET

        END

댓글 없음:

댓글 쓰기