8052 프로그래밍

Y

yasm81

Guest
우리가 코드를 준 Proff 우리는 그것을 수정할 필요가있다면 ...하지만 우리가 배운 적이 asembly 그래서 내가 각 단계에서 코드가 이해가 안 돼요 .. 우리는 일주일도 .. 아무도 모른다고?여기 코드가있다
; period.asm : 핀 p2.0에서 대책 기간
; 의해 예수 칼비노 - Fraga, 2007
;
하며, 마이크로 컨트롤러의 직렬 포트를 사용하는 디스플레이에
; 측정 기간.마이크로 컨트롤러는 시리얼 포트에 연결
; 컴퓨터 하이퍼 터미널이나 다른 터미널 프로그램을
사용하여; 115200 보오드, 2 막을 비트, 패리티, 악수는 아무도에 구성됩니다.
;
$ MOD52
org 같은 0000H
MyProgram
ljmp
org 같은 000BH; 타이머 0 벡터 인터럽트
ljmp Timer0ISR

org 같은 001BH
ljmp 1234H; CMON51에 필요한

; R0의 증가 16 - 비트 셀 -의 R1
Timer0ISR :
타운의 R1
cjne의 R1, # 0, 다
타운 R0
다 :
은퇴

; R0에있는 16 진수 숫자를 감시하도록 R2 -의
BCD 변환에의 R1
- R3 - R4
; 변경 R0 R5와 어큐뮤레이터를.
; 310 머신 사이클 및 28 바이트로 이동합니다.
hex2bcd :
mov 인의 R2, # 0; 00000하는 결과 집합의 BCD
mov 인 R3, # 0
mov 인 R4, # 0
mov 인 R5, # 16; 루프 카운터.
hex2bcd_L0 :
mov 인,의 R1; 시프트 R0 - 왼쪽의 R1을 통해 수행
a RLC
mov 인의 R1,
mov 인, R0
a RLC
mov 인 R0,
mov 인, R4;의
BCD 수행 의 BCD 의
BCD 번호를 이용하여 수행
addc, R4
다 a
mov 인 R4,
mov 인, R3
addc, R3
다 a
mov 인 R3,
mov 인, R2에
addc, R2에
mov 인의 R2,
djnz R5, hex2bcd_L0
부드럽게하기 위해 물에 담그다

;의 시리얼 포트를 초기화
InitSerial :
CLR을 TR1; 그만 타이머 1
mov 인, # 0FH;
8로 설정 타이머 1 - 비트 autoreload 타이머
, TMOD
anl, # 20h
orlmov 인 TMOD,
orl PCON, # 80h; SMOD = 1 -> 케이 = 2 : 더블 baudrate
mov 인 TL1, # 0FFH; 22.1184MHz 크리스털 115200로 설정을위한 전송 속도
mov 인 TH1, # 0FFH
setb TR1; 시작 타이머 1
mov 인 SCON, # 52H; 모드
1, 르네, txrdy, 시리얼 포트 rxempty
부드럽게하기 위해 물에 담그다

;의 시리얼 포트를 통해 어큐뮤레이터를에서 바이트를 보냅니다
putchar :
TI는 jnb, putchar; 마지막 문자에 대한 전송을 기다려
CLR은 TI의
mov 인 SBUF,
부드럽게하기 위해 물에 담그다

; DPTR 제로 보냅니다하여 직렬 포트를 통해 지적 문자열 종료
박았 :
a CLR을
movc, dptr
@JZ puts_end
lcall putchar
타운 dptr
jmp 박았
puts_end :
부드럽게하기 위해 물에 담그다

; 번호 인화의 BCD의
R2 - R3 저장된 - R4
printBCD :
; 자리 5
mov 인, R2에
, # 30H
orllcall putchar
; 진수 포인트
mov 인, # '.'
lcall putchar
; 자리 4
mov 인, R3
스왑
, # 0FH
anl, # 30H
orllcall putchar
; 자리 3
mov 인, R3
, # 0FH
anl, # 30H
orllcall putchar
; 자리 2
mov 인, R4
스왑
, # 0FH
anl, # 30H
orllcall putchar
; 자리 1
mov 인, R4
, # 0FH
anl, # 30H
orllcall putchar
부드럽게하기 위해 물에 담그다

; 초기화 타이머 / 카운터 0은 8 - 비트 autoreload 카운터로
InitTimer0 :
setb t0; 입력으로 핀 t0 활성화
CLR은 TR0; 그만 타이머 0
mov 인, # 0F0H
, TMOD
anl, # 02H orl;
8로 설정 타이머 0 - 비트 autoreload 타이머
mov 인 TMOD,
mov 인 TH0, # 72; 100us@22.11MHz
들면 : 256 - ((100E - 6) * (22.11e6/12))
mov 인 익스플로러, # 82H; 0 방해 및 글로벌 인터럽트 타이머를 활성화
부드럽게하기 위해 물에 담그다

MyProgram :
mov 인 특검팀, # 80h; iData의 시작 포인터를 스택 설정

lcall InitSerial
lcall InitTimer0
mov 인 dptr, # 배너
lcall 박았

영원히 :

mov 인 TL0, # 0
mov 인 R0, # 0
mov 인의 R1, # 0
setb P2.0;하는 입력으로 사용이 핀

; 버려라 어떤 불완전한 마침표
L0 :
jnb P2.0, L0
940 :
jb P2.0, 940

setb TR0; 쟤렴
의 L2 :
jnb P2.0,의 L2
L3 :
jb P2.0, L3
CLR은 TR0; 그만
R0 -의 R1 100us 단위의 수를 세고있다

lcall hex2bcd

mov 인 dptr, # 기간
lcall 박았

printBCD
lcall
mov 인 dptr, # Secs
lcall 박았

jmp 영원히

; 일부 문자열 :
배너 :
DB를 0AH, 0DH
DB를 'Period.asm : 대책 기간 (0.0000s에 6.5535s) 핀 p2.0에서'
DB를 0AH, 0DH
예수 칼비노으로
DB를 '- Fraga, 2007'
DB를 0AH, 0DH, 0AH, 0DH, 0
기간 :
DB를 'T는 ='
DB를 0
초 :
DB를 '을'
DB를 0DH, 0
최종

 
첫째, 언제나 코드를 게시하는 동안 사용코드 :

 

Welcome to EDABoard.com

Sponsor

Back
Top