Professional Documents
Culture Documents
BÁO CÁO VI XỬ LÝ
ORG 2000H
MAIN:
CPL P3.0
JMP MAIN
END
THÍ NGHIỆM 3: Viết chương trình tạo xung vuông 1 Khz, chu kỳ nhiệm vụ
50% trên P3.0.
F = 1Khz => T = 1 ms
Chu kỳ nhiệm vụ 50%
Tcao = Tthấp = 0.5 ms = 500us = 500 MC
Tdelay = 2 * 250 = 500 MC
ORG 2000H
MAIN:
CPL P3.0
ACALL DELAY_500US
SJMP MAIN
DELAY_500US
DJNZ R1, $
RET
END
THÍ NGHIỆM 4: Viết chương trình con Delay1sIns và dùng chương trình con
này để chớp/tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s.
ORG 2000H
MAIN:
CPL P1.0
ACALL DELAY_1S
SJMP MAIN
DELAY_1S:
MOV R0, #8
L2: MOV R1, #250
L1: MOV R2, #250
DJNZ R2, $
DJNZ R1, L1
DJNZ R0, L2
RET
END
THÍ NGHIỆM 5: Viết chương trình tạo hiệu ứng quay LED: các LED đơn trên
BARLED1 sáng lần lượt từ trái sang phải sau thời gian 1s và lặp lại. Sử dụng
chương trình con 1s đã viết ở trên.
Mô tả chương trình:
Ban đầu tất cả các led đều tắt.
Sau 1s Led P1.7 sẽ sáng, sau 1s tiếp theo thì đến led P1.6 sẽ sáng, P1.7 vẫn sáng.
Làm tuần tự đến tất cả led đều sáng thì Reset lại chương trình.
ORG 2000H
MAIN:
MOV A, #11111110B
MOV R1,#8
LOOP:
MOV P1, A
ACALL DELAY_1S
RL A
CLR ACC.0
DJNZ R1, LOOP
SJMP MAIN
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
THÍ NGHIỆM 6: Viết chương trình theo mô tả sau:
Ban đầu: Tất cả led đều tắt
Sau 1s đầu thì led P1.7 sáng và tất cả các led còn đều tắt. Sau 1s kế tiếp led P1.6
sáng và tất cả các led còn đều tắt. Sau 1s nữa thì led P1.5 sáng và tất cả các led
còn đều tắt. Làm tuân tự đến led P1.0 và Reset quá trình.
ORG 2000H
MAIN:
MOV A, #11111110B
MOV R1,#8
LOOP:
MOV P1, A
ACALL DELAY_1S
RL A
DJNZ R1, LOOP
SJMP MAIN
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
THÍ NGHIỆM 7: Nhấn nút P1.0 thì led chạy như câu 5. Nhấn nút P1.1 thì led
như câu 6.
ORG 2000H
MAIN:
MOV A,P1
JNB ACC.0, CAU_5
JNB ACC.1, CAU_6
SJMP MAIN
CAU_5:
MOV A, #11111110B
MOV R1,#8
LOOP:
MOV P1, A
ACALL DELAY_1S
RL A
CLR ACC.0
DJNZ R1, LOOP
MOV A, #11111111B
MOV P1,A
RET
CAU_6:
MOV A, #11111110B
MOV R1,#8
LOOP_CAU_6:
MOV P1, A
ACALL DELAY_1S
RL A
DJNZ R1,LOOP_CAU_6
MOV A, #11111111B
MOV P1,A
RET
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
DISPLAYLED0:
MOV DPTR,#0000H
MOV A,#11101111B
ORL A, R0
MOVX @DPTR, A
RET
THÍ NGHIỆM 1: Viết chương trình chính hiển thị số 9 lên LED 7 đoạn số 0
bằng cách cho R0 bằng 9 và gọi chương trình con DisplayLed0.
ORG 2000H
MOV R0,#9
ACALL DISPLAYLED0
SJMP $
DISPLAYLED0:
MOV DPTR,#0000H
MOV A, #11100000B
ORL A,R0
MOVX @DPTR, A
RET
END
THÍ NGHIỆM 2: Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số từ
0 đến 9 sau các khoảng thời gian 1s.
ORG 2000H
MAIN:
MOV R0,#0
MOV R1,#10
DISPLAY_FROM_0_TO_9:
ACALL DISPLAYLED0
ACALL DELAY_1S
INC R0
DJNZ R1, DISPLAY_FROM_0_TO_9
SJMP MAIN
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
DISPLAYLED0:
MOV DPTR,#0000H
MOV A, #11100000B
ORL A,R0
MOVX @DPTR, A
RET
END
THÍ NGHIỆM 3: Viết chương trình con DisplayLED xuất giá trị chứa trong
thanh ghi R0 lên LED 7 đoạn có số thứ tự chứa trong thanh ghi R1.
R0 nằm trong tầm từ 0-9 và R1 trong tầm từ 0-3.
Sau đó dùng chương trình con này viết chương trình chính xuất giá trị 1 lên
LED 7 đoạn số 3.
DisplayLED:
MOV B, R1
MOV A,#11101111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSH ACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
ORG 2000H
MOV R0,#1
MOV R1,#3
ACALL DisplayLED
SJMP $
DisplayLED:
MOV B, R1
MOV A,#11101111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSH ACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
END
THÍ NGHIỆM 4:Viết chương trình hiển thị số 1 lên LED7 đoạn 0, sau đó 1s
hiển thị số 2 lên LED 7 đoạn 1, sau đó 1s hiển thị số 3 lên LED 7 đoạn 2, sau đó
1s hiển thị số 4 lên LED 7 đoạn 3. Quá trình này lặp đi lặp lại. Việc hiển thị này
sử dụng chương trình con DisplayLED đã viết ở trên.
ORG 2000H
RESET:
MOV R0,#1
MOV R1,#0
MOV R2,#4
MAIN:
ACALL DisplayLED
ACALL DELAY_1S
INC R0
INC R1
DJNZ R2, MAIN
SJMP RESET
DisplayLED:
MOV A,#11101111B
MOV B,R1
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSHACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
DELAY_1S:
MOV R5, #8
L2: MOV R6, #250
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
RET
END
Giảm thời gian trễ xuống còn 100 ms.
ORG 2000H
RESET:
MOV R0,#1
MOV R1,#0
MOV R2,#4
MAIN:
ACALL DisplayLED
ACALL DELAY_100MS
MOV DPTR,#0000H
MOVX @DPTR, A
INC R0
INC R1
DJNZ R2, MAIN
SJMP RESET
DisplayLED:
MOV A,#11101111B
MOV B,R1
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSHACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
RET
DELAY_100MS:
L2: MOV R6, #200
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
RET
END
Câu 5: Viết chương trình đếm từ 1 đến 100 bằng phương pháp quét Led
ORG 2000H
RESET_ALL:
MOV R3,#0
RESET:
MOV R4,#160
MAIN:
// TÁCH SỐ ĐƠN VỊ CHỤC TRĂM.
CJNE R3,#10,$+3
JC DON_VI
CJNE R3,#100,$+3
JC CHUC
TRAM:
MOV A, R3
MOV B,#100
DIV AB
MOV R0,A
MOV R2,B
MOV R1,#2
ACALL DisplayLED
ACALL DELAY_2MS
MOV A, R2
MOV R3,A
CHUC:
MOV A, R3
MOV B,#10
DIV AB
MOV R0,A
MOV R2,B
MOV R1,#1
ACALL DisplayLED
ACALL DELAY_2MS
MOV A,R2
DON_VI:
MOV A, R3
MOV B,#10
DIV AB
MOV R0,B
MOV R1,#0
ACALL DisplayLED
ACALL DELAY_2MS
DJNZ R4, MAIN
INC R3
CJNE R3,#101, $+3
JC RESET
SJMP RESET_ALL
//
DisplayLED:
MOV B, R1
MOV A,#11101111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #0F0H
PUSH ACC
MOV A, R0
ANL A, #0FH
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR,#0000H
MOVX @DPTR, A
RET
//
DELAY_2MS:
MOV R6, #4
L1: MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
RET
END
Bài 3: Làm quen với LCD
THÍ NGHIỆM 1: Chạy mẫu đoạn code
ORG 2000H
MAIN:
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
SJMP $
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
MOV A, #01H
ACALL WRITECOM
RET
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
MOV A,#0
LOOP:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP
EXIT:
RET
MOV R6,#10
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
MESSAGE:
DB "HELLO WORLD!",0
END
THÍ NGHIỆM 2: Viết “NGUYEN TUAN HUNG” và “NHOM 2” canh giữa.
ORG 2000H
MAIN:
ACALL CLEAR
ACALL INIT_LCD
CLR F0
ACALL DISPLAYSTRING
SETB F0
ACALL DISPLAYSTRING
SJMP $
INIT_LCD:
MOV A,#38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
CLEAR:
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM:
MOV DPTR,#LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
MOV DPTR,#LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD:
DJNZ R6,$
DJNZ R5, L1
RET
DISPLAYSTRING:
ACALL COUNT
JB F0,HAI
MOV R0,#1H
SJMP TT_1
TT_1:
ACALL GOTOXY
MOV A,#0H
LOOP:
JB F0, HANG_2
MOV DPTR,#TEN
SJMP TT_2
TT_2:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP
EXIT:
RET
GOTOXY:
MOV A,#80H
SJMP TT_3
TT_3 :
ADD A,R1
ACALL WRITECOM
RET
COUNT:
MOV A,#0
GG: JB F0, A1
SJMP TT
TT:
MOV R1,A
MOVC A,@A+DPTR
JZ THOAT
MOV A, R1
INC A
DJNZ B ,GG
THOAT :
MOV A, R1
CPL A
INC A
ADD A,#16
MOV B,#2
DIV AB
MOV R1,A
RET
END
ORG 2000H
MAIN:
ACALL CLEAR
ACALL INIT_LCD
MOV A,#82H
ACALL WRITECOM
ACALL DISPLAYSTRING_1
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_2
ACALL DELAY_1S
ACALL XOA_DONG_2
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_3
ACALL DELAY_1S
ACALL XOA_DONG_2
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_4
ACALL DELAY_1S
ACALL XOA_DONG_2
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_5
ACALL DELAY_1S
ACALL XOA_DONG_2
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_6
ACALL DELAY_1S
ACALL XOA_DONG_2
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_7
ACALL DELAY_1S
ACALL XOA_DONG_2
SJMP MAIN
XOA_DONG_2:
MOV A,#0C0H
ACALL WRITECOM
ACALL DISPLAYSTRING_8
RET
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
MOV A, #01H
ACALL WRITECOM
RET
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
LOOP_1:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_1
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_1
EXIT_1:
RET
MOV A,#0
LOOP_2:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_2
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_2
EXIT_2:
RET
LOOP_3:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_3
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_3
EXIT_3:
RET
MOV A,#0
LOOP_4:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_4
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_4
EXIT_4:
RET
LOOP_5:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_5
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_5
EXIT_5:
RET
MOV A,#0
LOOP_6:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_6
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_6
EXIT_6:
RET
LOOP_7:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_7
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_7
EXIT_7:
RET
MOV A,#0
LOOP_8:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT_8
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP_8
EXIT_8:
RET
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
DELAY_1S:
MOV R5,#8
L2:MOV R6,#250
L1:MOV R7,#250
DJNZ R7,$
DJNZ R6, L1
DJNZ R5, L2
RET
MESSAGE_1:
MESSAGE_2:
MESSAGE_3:
DB 'GIO',0
MESSAGE_4:
MESSAGE_5:
DB 'BAI ',0
MESSAGE_6:
DB 'DIEN THOAI',0
MESSAGE_8:
DB ' ',0
END
MOVX @DPTR,A
MOV R0,A
MOV P1,A
SJMP MAIN
WAIT_LCD:
MOV R6,#10
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
END
THÍ NGHIỆM 2: Xuất giá trị ADC lên LCD
ORG 0
MAIN:
ACALL READADC
PUSH ACC
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
MOV A,#0C0H
ACALL WRITECOM
POP ACC
CJNE A,#10,$+3
JC DON_VI
CJNE A,#100,$+3
JC CHUC
TRAM:
MOV B,#100
DIV AB
ADD A,#30H
CALL WRITETEXT
MOV A,B
CHUC:
MOV B,#10
DIV AB
ADD A,#30H
CALL WRITETEXT
MOV A,B
DON_VI:
ADD A,#30H
CALL WRITETEXT
SJMP $
READADC:
MOV A,#0
MOVX @DPTR,A
MOV R0,A
MOV P1,A
RET
INIT_LCD:
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
CLEAR:
MOV A,#01H
ACALL WRITECOM
RET
WRITECOM:
MOV DPTR,#LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
MOV DPTR,#LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD:
MOV R6,#10
DL1:
DJNZ R7, $
DJNZ R6,DL1
RET
DISPLAYSTRING:
MOV A,#0
LOOP:
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET
INIT_LCD:
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
CLEAR:
MOV A,#01H
ACALL WRITECOM
RET
WRITECOM:
MOV DPTR,#LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT:
MOV DPTR,#LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET
THÍ NGHIỆM 4: Viết chương trình tạo sóng vuông 1 Hhz trên chân P1.0 sử
dụng timer 0 ở chế độ 1
T = 1S => TCAO = 0.5s.
ORG 2000H
MAIN:
CPL P1.0
ACALL DELAY
SJMP MAIN
DELAY:
MOV R7,#10
LOOP:
MOV TMOD,#01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SET TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R7, LOOP
RET
THÍ NGHIỆM 5: Viết chương trình tạo sóng vuông 1 Hhz trên chân P1.0 sử
dụng timer 0 ở chế độ 2
ORG 2000H
MAIN:
ACALL DELAY
CPL P1.0
SJMP MAIN
DELAY:
MOV TMOD,#02H
MOV TH0,#(-250)
MOV R6,#10
L2:
MOV R7,#200
L1:
SETB TR0
JNB TF0,$
DJNZ R7,L1
DJNZ R6,L2
RET
END
DONG_2:
MOV A,#0C0H
ADD A,R1
ACALL WRITECOM
MOV A,R4
CJNE A, #08H, XOA_2
ACALL WRITETEXT
MOV A,#06H
ACALL WRITECOM
INC R1
CJNE R1,#17,$+3
JC DONG_2
SJMP MAIN
THU:
JNB RI,$
CLR RI
MOV A, SBUF
RET
PHAT:
MOV A, SBUF
JNB TI,$
CLR TI
MOV SBUF,A
RET
XOA_1:
DEC A
DEC R1
ACALL WRITECOM
MOV A,#” ”
ACALL WRITETEXT
SJMP DONG_1
RET
XOA_2:
DEC A
DEC R1
ACALL WRITECOM
MOV A,#” ”
ACALL WRITETEXT
SJMP DONG_2
RET
INIT_LCD: ;Các dòng lệnh cấu hình LCD ban đầu
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
CLEAR: ; Hàm con xóa màn hình LCD
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM: ;Hàm con ghi lệnh
MOV DPTR, #LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WRITETEXT: ; Hàm con ghi kí tự
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD: ;Hàm con delay cho LCD
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
END