51 단편기 어셈블리 언어 실험 및 코드
단편기 어셈블리 언어 실험 및 코드
다음 내용은 본인의 실험 수업에서 직접 작성하고 51단편기 운행을 통해 실현된 실험 코드입니다. 오류가 있거나 개선된 점이 있으면 지적해 주십시오.
실험1: 개발 환경의 응용
(1) 데이터 기억 장치의 40H-4FH의 내용을 00H-0FH로 복제하고 40H-4FH의 내용을 전체적으로 외부 데이터 기억 장치의 1050H-105FH로 복제한다.(2) P1은 8개의 다이오드를 연결하여 다이오드를 하나하나 순환시켜 밝게 한다ORG 0000H
AJMP START
ORG 0100H
START:
MOV A,#00H
MOV R0,#40H
LOOP:
MOV @R0,A
INC A
INC R0
CJNE A,#10H,LOOP
SECOND:
MOV DPTR,#1050H
MOV R1,#40H
COPY:
MOV A,@R1
MOVX @DPTR,A
INC DPTR
INC R1
CJNE R1,#50H,COPY
SJMP $
END
실험 2: 외부 인터럽트
(1) 단일 펄스 신호로 중단을 신청하고 중단 서비스 절차에서 출력 신호를 뒤집는다(P1.0으로 1, 2극관을 연결하여 관찰할 수 있다)ORG 0000H
LJMP START
ORG 0003H
LJMP INT
ORG 0100H
START:
SETB EX0
SETB PX0
SETB IT0
SETB EA
SJMP $
INT:
CPL P1.0
RETI
END
(2) 단일 펄스 신호로 중단을 신청하고 중단에 대해 누적 계수를 요구하며 계수 결과를 다이오드에 표시한다ORG 0000H
LJMP START
ORG 0003H
LJMP INT
ORG 0100H
START:
MOV A,#00H
MOV P1,A
SETB EX0
SETB PX0
SETB IT0
SETB EA
SJMP $
INT:
MOV P1,A
INC A
RETI
END
실험3: 타이머 실험
(1) 타이머 1의 방식으로 1 타이머, P1.0절 발광 다이오드, 다이오드를 초당 5회 반짝인다ORG 0000H
LJMP MAIN
ORG 001BH
LJMP INT
ORG 0100H
MAIN:
MOV TMOD,#10H
MOV TH1,#3CH
MOV TL1,#0B0H
MOV R2,#2
SETB EA
SETB ET1
SETB TR1
SJMP $
INT:
DJNZ R2,NEXT
CPL P1.0
MOV R2,#2
NEXT:
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
RETI
END
(2) 타이머 1의 방식으로 2계수를 하고 T1은 단일 펄스를 연결하며 P1구접 다이오드로 계수를 표시한다.ORG 0000H
LJMP MAIN
ORG 001BH
LJMP LOOP
ORG 0100H
MAIN:
MOV TMOD,#60H
MOV TH1,#00H
MOV TL1,#00H
SETB EA
SETB ET1
SETB TF1
SETB TR1
SJMP $
LOOP:
MOV P1,TL1
LJMP LOOP
RETI
END
실험4: 직렬 통신
전송 속도 2400bit/s.PC는 단편기에 8바이트의 데이터를 보내고, 단편기는 데이터를 받은 후 2바이트 55H와 AAH를 PC기에 보낸다(조회방식 사용).ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV SCON,#50H
MOV PCON,#00H
MOV TMOD,#20H
SETB TR1
MOV TL1,#0F3H
MOV TH1,#0F3H
LOOP:
MOV R0,#30H
MOV R1,#08H
WAIT1:
JBC RI,RECEIVE
SJMP WAIT1
RECEIVE:
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R1,WAIT1
MOV A,#55H
MOV SBUF,A
WAIT21:
JBC TI,SEND
SJMP WAIT21
SEND:
MOV A,#0AAH
MOV SBUF,A
WAIT22:
JNB TI,WAIT22
CLR TI
SJMP LOOP
END
실험5: 디지털 파이프 디스플레이 및 키보드 스캐닝
(1) 30H-32H에 저장된 6자리 십진수를 6개의 디지털 파이프에 표시한다(메모리 단원의 압축 BCD 코드를 두 개의 7단 디스플레이 코드로 바꾸는 서브루틴과 지연 서브루틴을 작성해야 한다)ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV R0,#30H
MOV R1,#20H
BCD:
MOV A,@R0
SWAP A
ANL A,#0FH
ACALL CTAB
MOV R2,A
MOV A,@R0
ANL A,#0FH
ACALL CTAB
MOV R3,A
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R2
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLEY
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R3
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLEY
INC R0
CJNE R0,#33H,BCD
LJMP MAIN
CTAB:
PUSH DPH
PUSH DPL
MOV DPTR,#TAB
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DLEY:
MOV R7,#02H
DL:MOV R6,#0FFH
DL1:DJNZ R6,DL1
DJNZ R7,DL
RET
END
(2) 매트릭스 키보드를 스캔하여 해당 키보드 값을 LED로 표시 ORG 0000H
LJMP START
ORG 1000H
START:
ACALL KEY1
AJMP START
KEY1: ACALL KEY14
JNZ KEY3
KEY2: ACALL KEY16
AJMP KEY1
KEY3: ACALL KEY16
ACALL DELAY
ACALL KEY14
JNZ KEY4
ACALL KEY16
AJMP KEY1
KEY4: MOV R2, #0FEH
MOV R4, #00H
KEY5: MOV DPTR,#8002H
MOV A, R2
MOVX @DPTR, A
MOV DPTR,#8001H
MOVX A,@DPTR
JB ACC.0,KEY6
MOV A, #00H
AJMP KEY9
KEY6: JB ACC.1,KEY7
MOV A, #06H
AJMP KEY9
KEY7: JB ACC.2,KEY8
MOV A, #0CH
AJMP KEY9
KEY8: JB ACC.3, KEY12
MOV A, #12H
KEY9: ADD A, R4
KEY10: MOV R5,A
KEY11: ACALL KEY14
JNZ KEY11
MOV A,R5
ACALL KEY15
RET
KEY12: INC R4
MOV A, R2
JNB ACC.5,KEY13
RL A
MOV R2, A
AJMP KEY5
KEY13: AJMP KEY1
KEY14: MOV DPTR,#8002H
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#8001H
MOVX A,@DPTR
CPL A
ANL A, #0FH
RET
KEY15: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
KEY16: MOV DPTR,#8002H
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R3
MOVX @DPTR,A
ACALL DELAY
RET
DELAY: MOV R7,#12
LOOP: MOV R6,#250
DJNZ R6,$
DJNZ R7,LOOP
RET
TABLE:
DB 7EH,7EH,5EH,79H,71H,3FH,7EH,7EH,39H,4FH,5BH,06H,7EH,7EH,7CH,7DH,6DH,66H ,7EH,7EH,77H,6FH,7FH,07H
END
랩 6: D/A 및 A/D
(1) 실험상자에 있는 전위기로 아날로그량 입력을 제공하고 아날로그량을 2진수로 변환하여 변환된 결과를 P1구로 이극관 디스플레이에 출력한다.ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A
MOV R2,#100
DJNZ R2,$
MOVX A,@DPTR
MOV P1,A
LJMP MAIN
END
(2) DAC0832로 한 수치를 아날로그 전압으로 변환하고 이 아날로그 전압은 ADC0809의 아날로그 입력과 연결하여 모드/수 변환을 하고 변환 결과는 P1구를 통해 다이오드로 보내어 표시한다.ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV A,#90H
MOV DPTR,#9000H
MOVX @DPTR,A
MOV DPTR,#8000H
MOVX @DPTR,A
MOV R2,#64H
DJNZ R2,$
MOVX A,@DPTR
MOV P1,A
SJMP $
END
실험7:전자시계
24시간제 전자 시계 프로그램을 실현하여 6개의 디지털 파이프에 시분초를 표시한다(타이머 0으로 업데이트 시간을 중단하고 BCD 코드 형식으로 내부 RAM의 30H, 31H와 32H 단원을 압축한다).직렬 포트를 통해 시간 조절이 가능합니다!ORG 0000H
AJMP MAIN
ORG 000BH
LJMP CLOCK
ORG 0023H
LJMP INPUT
ORG 0100H
MAIN:
MOV TMOD,#21H
CLR A
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV TH0,#3CH
MOV TL0,#0B0H
MOV 50H,#14H ;50 * 20
MOV TH1,#0F3H
MOV TL1,#0F3H ;
MOV SCON,#50H
SETB PS
MOV IE,#92H
SETB TR1
SETB TR0
SLED:
MOV R0,#30H
MOV R1,#20H
LJMP LED
CLOCK:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ 50H,RETURN
MOV 50H,#14H
MOV A,#01H
ADD A,32H
DA A
MOV 32H,A
CJNE A,#60H,RETURN
MOV 32H,#00H
MOV A,#01H
ADD A,31H
DA A
MOV 31H,A
CJNE A,#60H,RETURN
MOV 31H,#00H
MOV A,#01H
ADD A,30H
DA A
MOV 30H,A
CJNE A,#24H,RETURN
MOV 30H,#00H
RETURN:
RETI
LED:
MOV A,@R0
SWAP A
ANL A,#0FH
ACALL CTAB
MOV R2,A
MOV A,@R0
ANL A,#0FH
LCALL CTAB
MOV R3,A
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R2
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLY
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R3
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLY
INC R0
CJNE R0,#33H,LED
LJMP SLED
CTAB:
PUSH DPH
PUSH DPL
MOV DPTR,#TAB
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
INPUT:
CLR RI
CLR EA
MOV 30H,SBUF
JNB RI,$
CLR RI
MOV 31H,SBUF
JNB RI,$
CLR RI
MOV 32H,SBUF
SETB EA
RETI
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DLY:
MOV R7,#02H
DL:
MOV R6,#0FFH
DL1:
DJNZ R6,DL1
DJNZ R7,DL
RET
END
ORG 0000H
AJMP START
ORG 0100H
START:
MOV A,#00H
MOV R0,#40H
LOOP:
MOV @R0,A
INC A
INC R0
CJNE A,#10H,LOOP
SECOND:
MOV DPTR,#1050H
MOV R1,#40H
COPY:
MOV A,@R1
MOVX @DPTR,A
INC DPTR
INC R1
CJNE R1,#50H,COPY
SJMP $
END
ORG 0000H
LJMP START
ORG 0003H
LJMP INT
ORG 0100H
START:
SETB EX0
SETB PX0
SETB IT0
SETB EA
SJMP $
INT:
CPL P1.0
RETI
END
ORG 0000H
LJMP START
ORG 0003H
LJMP INT
ORG 0100H
START:
MOV A,#00H
MOV P1,A
SETB EX0
SETB PX0
SETB IT0
SETB EA
SJMP $
INT:
MOV P1,A
INC A
RETI
END
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP INT
ORG 0100H
MAIN:
MOV TMOD,#10H
MOV TH1,#3CH
MOV TL1,#0B0H
MOV R2,#2
SETB EA
SETB ET1
SETB TR1
SJMP $
INT:
DJNZ R2,NEXT
CPL P1.0
MOV R2,#2
NEXT:
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
RETI
END
ORG 0000H
LJMP MAIN
ORG 001BH
LJMP LOOP
ORG 0100H
MAIN:
MOV TMOD,#60H
MOV TH1,#00H
MOV TL1,#00H
SETB EA
SETB ET1
SETB TF1
SETB TR1
SJMP $
LOOP:
MOV P1,TL1
LJMP LOOP
RETI
END
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV SCON,#50H
MOV PCON,#00H
MOV TMOD,#20H
SETB TR1
MOV TL1,#0F3H
MOV TH1,#0F3H
LOOP:
MOV R0,#30H
MOV R1,#08H
WAIT1:
JBC RI,RECEIVE
SJMP WAIT1
RECEIVE:
MOV A,SBUF
MOV @R0,A
INC R0
DJNZ R1,WAIT1
MOV A,#55H
MOV SBUF,A
WAIT21:
JBC TI,SEND
SJMP WAIT21
SEND:
MOV A,#0AAH
MOV SBUF,A
WAIT22:
JNB TI,WAIT22
CLR TI
SJMP LOOP
END
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV R0,#30H
MOV R1,#20H
BCD:
MOV A,@R0
SWAP A
ANL A,#0FH
ACALL CTAB
MOV R2,A
MOV A,@R0
ANL A,#0FH
ACALL CTAB
MOV R3,A
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R2
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLEY
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R3
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLEY
INC R0
CJNE R0,#33H,BCD
LJMP MAIN
CTAB:
PUSH DPH
PUSH DPL
MOV DPTR,#TAB
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
DLEY:
MOV R7,#02H
DL:MOV R6,#0FFH
DL1:DJNZ R6,DL1
DJNZ R7,DL
RET
END
ORG 0000H
LJMP START
ORG 1000H
START:
ACALL KEY1
AJMP START
KEY1: ACALL KEY14
JNZ KEY3
KEY2: ACALL KEY16
AJMP KEY1
KEY3: ACALL KEY16
ACALL DELAY
ACALL KEY14
JNZ KEY4
ACALL KEY16
AJMP KEY1
KEY4: MOV R2, #0FEH
MOV R4, #00H
KEY5: MOV DPTR,#8002H
MOV A, R2
MOVX @DPTR, A
MOV DPTR,#8001H
MOVX A,@DPTR
JB ACC.0,KEY6
MOV A, #00H
AJMP KEY9
KEY6: JB ACC.1,KEY7
MOV A, #06H
AJMP KEY9
KEY7: JB ACC.2,KEY8
MOV A, #0CH
AJMP KEY9
KEY8: JB ACC.3, KEY12
MOV A, #12H
KEY9: ADD A, R4
KEY10: MOV R5,A
KEY11: ACALL KEY14
JNZ KEY11
MOV A,R5
ACALL KEY15
RET
KEY12: INC R4
MOV A, R2
JNB ACC.5,KEY13
RL A
MOV R2, A
AJMP KEY5
KEY13: AJMP KEY1
KEY14: MOV DPTR,#8002H
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#8001H
MOVX A,@DPTR
CPL A
ANL A, #0FH
RET
KEY15: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV R3,A
KEY16: MOV DPTR,#8002H
MOV A,#01H
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R3
MOVX @DPTR,A
ACALL DELAY
RET
DELAY: MOV R7,#12
LOOP: MOV R6,#250
DJNZ R6,$
DJNZ R7,LOOP
RET
TABLE:
DB 7EH,7EH,5EH,79H,71H,3FH,7EH,7EH,39H,4FH,5BH,06H,7EH,7EH,7CH,7DH,6DH,66H ,7EH,7EH,77H,6FH,7FH,07H
END
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV DPTR,#8000H
MOV A,#00H
MOVX @DPTR,A
MOV R2,#100
DJNZ R2,$
MOVX A,@DPTR
MOV P1,A
LJMP MAIN
END
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV A,#90H
MOV DPTR,#9000H
MOVX @DPTR,A
MOV DPTR,#8000H
MOVX @DPTR,A
MOV R2,#64H
DJNZ R2,$
MOVX A,@DPTR
MOV P1,A
SJMP $
END
ORG 0000H
AJMP MAIN
ORG 000BH
LJMP CLOCK
ORG 0023H
LJMP INPUT
ORG 0100H
MAIN:
MOV TMOD,#21H
CLR A
MOV 30H,A
MOV 31H,A
MOV 32H,A
MOV TH0,#3CH
MOV TL0,#0B0H
MOV 50H,#14H ;50 * 20
MOV TH1,#0F3H
MOV TL1,#0F3H ;
MOV SCON,#50H
SETB PS
MOV IE,#92H
SETB TR1
SETB TR0
SLED:
MOV R0,#30H
MOV R1,#20H
LJMP LED
CLOCK:
MOV TH0,#3CH
MOV TL0,#0B0H
DJNZ 50H,RETURN
MOV 50H,#14H
MOV A,#01H
ADD A,32H
DA A
MOV 32H,A
CJNE A,#60H,RETURN
MOV 32H,#00H
MOV A,#01H
ADD A,31H
DA A
MOV 31H,A
CJNE A,#60H,RETURN
MOV 31H,#00H
MOV A,#01H
ADD A,30H
DA A
MOV 30H,A
CJNE A,#24H,RETURN
MOV 30H,#00H
RETURN:
RETI
LED:
MOV A,@R0
SWAP A
ANL A,#0FH
ACALL CTAB
MOV R2,A
MOV A,@R0
ANL A,#0FH
LCALL CTAB
MOV R3,A
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R2
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLY
MOV DPTR,#8002H
MOV A,R1
MOVX @DPTR,A
MOV DPTR,#8004H
MOV A,R3
MOVX @DPTR,A
MOV A,R1
RR A
MOV R1,A
LCALL DLY
INC R0
CJNE R0,#33H,LED
LJMP SLED
CTAB:
PUSH DPH
PUSH DPL
MOV DPTR,#TAB
MOVC A,@A+DPTR
POP DPL
POP DPH
RET
INPUT:
CLR RI
CLR EA
MOV 30H,SBUF
JNB RI,$
CLR RI
MOV 31H,SBUF
JNB RI,$
CLR RI
MOV 32H,SBUF
SETB EA
RETI
TAB:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
DLY:
MOV R7,#02H
DL:
MOV R6,#0FFH
DL1:
DJNZ R6,DL1
DJNZ R7,DL
RET
END