You are on page 1of 53

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.

HCM
KHOA ĐIỆN – ĐIỆN TỬ

BÁO CÁO
THÍ NGHIỆM VI XỬ LÍ

GVHD: Phạm Đăng Lâm

Nhóm L15
Thành viên MSSV
Hoàng Hữu Đạt 1510670
Trần Công Minh 1512020
Vũ Thành Nhân 1512283
Trần Văn Trường 1513796

TP.HCM, tháng 5 năm 2017


BÀI TN 1
LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN
THÍ NGHIỆM 1

Mục tiêu

Nắm được cách thức điều khiển trực tiếp ngoại vi thông qua các port I/O của 8051.

Yêu cầu

Viết chương trình thực hiện việc đọc liên tục trạng thái của nút nhấn được nối đến P1.0 và hiển thị ra
led được nối tại chân P3.0 (bit thứ 0 của led thanh BL202).

ORG 2000H
LOOP:
SETB P1.0
MOV C, P1.0
MOV P3.0,C
SJMP LOOP
END

THÍ NGHIỆM 2

Biên dịch và thử nghiệm chương trình cho sẵn sau:

ORG 2000H

MAIN:

CPL P3.0

SJMP MAIN

END

THÍ NGHIỆM 3

Mục tiêu

Nắm được cách tạo trễ dùng vòng lặp lệnh

Yêu cầu
Viết chương trình tạo xung vuông 1 Khz, chu kỳ nhiệm vụ 50% trên P3.0

ORG 2000H

MAIN:

CPL P3.0

ACALL DELAY05MS

SJMP MAIN

DELAY05MS:

MOV R7,#230

LOOP:

DJNZ R7,LOOP

RET

END

THÍ NGHIỆM 4

Mục tiêu

Nắm được cách viết chương trình con để tạo trễ

Yêu cầu

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

LOOP:

CPL 1.0

ACALL DELAY1SINS

SJMP LOOP

DELAY1SINS:
MOV R7, #7

LOOP1:

MOV R6, #250

LOOP2:

MOV R5, #250

LOOP3:

DJNZ R5, LOOP3

DJNZ R6, LOOP2

DJNZ R7, LOOP1

RET

END

THÍ NGHIỆM 5

Mục tiêu

Nắm được cách hiển thị LED và tạo hiệu ứng

Yêu cầu

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.
ORG 2000H
MOV DPTR,#SIGNAL
LAP1:
MOV R1,#8
LAP2:
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
ACALL DELAY1SINS
DJNZ R1,LAP2
MOV P1,#0FFH
SJMP LAP1
DELAY1SINS:
MOV R7,#25
LOOP1:
MOV R6,#250
LOOP2:
MOV R5,#250
LOOP3:
DJNZ R5,LOOP3
DJNZ R6,LOOP2
DJNZ R7,LOOP1
RET
SIGNAL:
DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH
END

BÀI TN 2
LẬP TRÌNH CHO TIMER VÀ HIỂN THỊ LED 7 ĐOẠN

THÍ NGHIỆM 1

Mục tiêu

Nắm được cách thức tạo trễ sử dụng Timer chế độ 1.

Yêu cầu

Viết chương trình tạo sóng vuông 1 Khz trên chân P1.0 sử dụng timer 0 ở chế độ 1

ORG 2000H

LOOP:

CPL P1.0

ACALL DELAY05MS

SJMP LOOP
DELAY05MS:

MOV TMOD,#01H

MOV TH0,#HIGH(-461)

MOV TL0,#LOW(-461)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

RET

END

THÍ NGHIỆM 2

Mục tiêu

Nắm được cách thức tạo trễ sử dụng Timer chế độ 2.

Yêu cầu

Viết chương trình tạo sóng vuông 10 Khz trên chân P1.0 sử dụng timer 0 ở chế độ 2

ORG 2000H

MOV TMOD,#02H

MOV TH0,#(-46)

SETB TR0

LOOP:

JNB TF0,$

CLR TF0

CPL P1.0

SJMP LOOP

END
THÍ NGHIỆM 3

Mục tiêu

Nắm được cách thức hiển thị LED 7 đoạn

Yêu cầu

Viết chương trình con DisplayLed0 hiển thị lên LED 7 đoạn số 0 giá trị chứa trong thanh ghi R0
DISPLAYLED0:
MOV A,R0
ADD A,#0E0H
MOV DPTR,#0000H
MOVX @DPTR,A
RET
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 DONE

DISPLAYLED0:

MOV A,R0

ADD A,#0E0H

MOV DPTR,#0000H

MOVX @DPTR,A

RET

DONE: NOP

END

THÍ NGHIỆM 4

Mục tiêu
Kết hợp được các chương trình con, sử dụng được timer và hiển thị LED 7 đoạn

Yêu cầu

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

MOV TMOD, #01H

LAP1:

MOV R0, #0

LOOP:

LCALL DisplayLed0

LCALL Delay1s

INC R0

CJNE R0, #10, LOOP

SJMP LAP1

DisplayLed0:

MOV A, R0

ORL A, #0E0H

MOV DPTR, #0000H

MOVX @DPTR, A

RET

Delay1s:

MOV R7, #20

LAP2:

MOV TH0, #HIGH(-50000)

MOV TL0, #LOW(-50000)

SETB TR0
JNB TF0, $

CLR TF0

CLR TR0

DJNZ R7, LAP2

RET

END

BÀI TN 3
QUÉT LED 7 ĐOẠN VÀ GIAO TIẾP LCD

THÍ NGHIỆM 1

Mục tiêu

Nắm được cách thức xuất giá trị lên LED 7 đoạn

Yêu cầu

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.

ORG 2000H

MOV R0, #1

MOV R1, #3

LCALL DisplayLED

SJMP $

DisplayLED:
MOV A, R1

MOV DPTR, #TABLE

MOVC A, @A +DPTR

ORL A, R0

MOV DPTR, #0000H

MOVX @DPTR, A

RET

TABLE:

DB 0E0H, 0D0H, 0B0H, 070H

END

THÍ NGHIỆM 2

Mục tiêu

Nắm được phương pháp quét LED 7 đoạn.

Yêu cầu

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

MOV TMOD, #01H

MAIN:

MOV R0, #1

MOV R1, #0

LAP:

LCALL DisplayLED

LCALL DELAY1s

INC R0
INC R1

CJNE R0, #5, LAP

SJMP MAIN

Delay1s:

MOV R7, #20

LOOP:

MOV TH0, #HIGH(-50000)

MOV TL0, #LOW(-50000)

SETB TR0

JNB TF0, $

CLR TF0

CLR TR0

DJNZ R7, LOOP

RET

DisplayLED:

MOV A, R1

MOV DPTR, #TABLE

MOVC A, @A +DPTR

ORL A, R0

MOV DPTR, #0000H

MOVX @DPTR, A

RET

TABLE:

DB 0E0H, 0D0H, 0B0H, 70H

END

THÍ NGHIỆM 3
Mục tiêu

Nắm được cách thức xuất giá trị lên LCD

Yêu cầu

Download chương trình mẫu LCD.A51 trên trang web bộ môn điện tử.

Biên dịch và chạy thử chương trình

Sửa chương trình để hiển thị tên sinh viên lên hàng đầu

LCD_E BIT P3.4

LCD_RS BIT P3.5

LCD_ADDR EQU 6000H

ORG 2000H

MOV TMOD, #01H

MOV DPTR, #LCD_ADDR

LCALL LCD_INT

LCALL DISPLAY

SJMP $

LCD_INT:

MOV A, #38H

LCALL WRITECOM

MOV A, #0EH

LCALL WRITECOM

MOV A, #06H

LCALL WRITECOM

RET

WRITECOM:

MOV DPTR, #LCD_ADDR

CLR LCD_RS
SETB LCD_E

MOVX @DPTR, A

CLR LCD_E

LCALL WAIT

RET

WAIT:

MOV R6,#10

DL1: MOV R7,#250

DJNZ R7,$

DJNZ R6,DL1

RET

WRITETEXT:

MOV DPTR, #LCD_ADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

CALL WAIT

RET

DISPLAY:

MOV R3, #15

MOV A, #0

LOP:

MOV DPTR, #TEXT

MOV R0, A

MOVC A, @A + DPTR
JZ EXIT

ACALL WRITETEXT

LU:

MOV A, R0

INC A

DJNZ R3, LOP

MOV A, #0C0H ; tu dong xuong hang thu hai khi chieu dai hon 16 bits

LCALL WRITECOM

MOV R3, #15

SJMP LU

EXIT:

RET

TEXT:

DB "Tranvantruong",0

END

THÍ NGHIỆM 4

Yêu cầu

 Viết thêm chương trình con CLRSCREEN để xóa màn hình LCD

 Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD đến hàng x, cột y,
với X chứa trong R0 và Y chứa trong R1

 Sửa chương trình ở thí nghiệm 1 để hiển thị thêm số nhóm ở hàng thứ 2

 Chương trình con CLRSCREEN

CLRSCREEN:
PUSH ACC
MOV A, #01H
CALL WRITECOM
POP ACC
RET

 Chương trình con GOTOXY


GOTOXY:
PUSH ACC
MOV A, R1
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO:
ADD A, #7FH
ADD A, R2
LCALL WRITECOM
POP ACC
RET

 Chương trình chính:


LCD_E BIT P3.4
LCD_RS BIT P3.5
LCD_ADDR EQU 6000H
ORG 2000H
MOV R1, #2
MOV R2, #1
MOV TMOD, #01H
MOV DPTR, #LCD_ADDR
LCALL LCD_INT
LCALL CLRSCREEN
LCALL DISPLAY
SJMP $
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
MOV DPTR, #LCD_ADDR
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
MOV R6,#10
DL1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
WRITETEXT:
MOV DPTR, #LCD_ADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
DISPLAY:
MOV R3, #15
MOV A, #0
LOP: MOV DPTR, #TEXT
MOV R0, A
MOVC A, @A + DPTR
JZ EXIT
LCALL WRITETEXT
LU: MOV A, R0
INC A
DJNZ R3, LOP
EXIT: LCALL GOTOXY
MOV A, #0
LOP1:
MOV DPTR, #TEXT1
MOV R0, A
MOVC A, @A + DPTR
JZ EXIT1
LCALL WRITETEXT
MOV A, R0
INC A
SJMP LOP1
EXIT1:
RET
TEXT: DB "Tranvantruong",0
TEXT1: DB “Nhom 2”,0
RET
GOTOXY:
PUSH ACC
MOV A, R1
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO:
ADD A, #7FH
ADD A, R2
LCALL WRITECOM
POP ACC
RET
CLRSCREEN:
PUSH ACC
MOV A, #01H
CALL WRITECOM
POP ACC
RET
END

BÀI TN 4
LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ BÀN PHÍM SỐ
HEX

THÍ NGHIỆM 1

Yêu cầu

 Viết chương trình đếm số lần nhấn SW310 (phím đơn kết nối vào P1.0), hiển thị lên LCD
theo cấu trúc: Push Number = xx (xx là số lần nhấn)

LCD_E BIT P3.4

LCD_RS BIT P3.5

LCD_ADDR EQU 6000H

ORG 2000H

MOV R1, #1
MOV R2, #1

MOV TMOD, #01H

MOV DPTR, #LCD_ADDR

LCALL LCD_INT

MOV R0, #48

MOV A, #48

TT:

LCALL CLEAR

MOV R2, #2

LCALL GOTOXY

PUSH ACC

MOV A, R0

LCALL WRITETEXT

POP ACC

MOV R2, #3

LCALL GOTOXY

LCALL WRITETEXT

JNB P1.0, $

JB P1.0, $

INC A

CJNE A, #58, TT

MOV A, #48

INC R0

CJNE R0,#58, TT

MOV R0, #48

SJMP TT
LCD_INT:

MOV A, #38H

LCALL WRITECOM

MOV A, #0EH

LCALL WRITECOM

MOV A, #06H

LCALL WRITECOM

RET

WRITECOM:

MOV DPTR, #LCD_ADDR

CLR LCD_RS

SETB LCD_E

MOVX @DPTR, A

CLR LCD_E

LCALL WAIT

RET

WAIT:

PUSH 06H

PUSH 07H

MOV R6, #10

DL1: MOV R7, #250

DJNZ R7, $

DJNZ R6, DL1

POP 07H

POP 06H

RET
WRITETEXT:

MOV DPTR, #LCD_ADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

LCALL WAIT

RET

CLEAR:

PUSH ACC

MOV A, #01H

CALL WRITECOM

POP ACC

RET

GOTOXY:

PUSH ACC

MOV A, R1

CLR C

SUBB A, #1

JZ GOTO

MOV A, #40H

GOTO:

ADD A, #7FH

ADD A, R2

LCALL WRITECOM

POP ACC
RET

END

THÍ NGHIỆM 2

Yêu cầu

 Viết chương trình đếm số lần nhấn SW310 (phím đơn kết nối vào P1.0), hiển thị lên
LCD, có chống rung phím

LCD_E BIT P3.4

LCD_RS BIT P3.5

LCD_ADDR EQU 6000H

ORG 2000H

MOV R1, #1 ;R1 hàng, 1-2

MOV R2, #1 ;R2 c?t, 1-16

MOV TMOD, #01H

MOV DPTR, #LCD_ADDR

LCALL LCD_INT

LCALL GOTOXY

MOV R0, #48

MOV A, #48

TT:

LCALL CLEAR

MOV R2, #2

LCALL GOTOXY

PUSH ACC

MOV A, R0

LCALL WRITETEXT
POP ACC

MOV R2, #3

LCALL GOTOXY

LCALL WRITETEXT

MOV R4, #20

SS1: JB P1.0, $

LCALL DELAY1ms

DJNZ R4, SS1

MOV R4, #20

SS2: JNB P1.0, $

LCALL DELAY1ms

DJNZ R4, SS2

INC A

CJNE A, #58, TT

MOV A, #48

INC R0

CJNE R0,#58, TT

MOV R0, #48

SJMP TT

LCD_INT:

MOV A, #38H

LCALL WRITECOM

MOV A, #0EH

LCALL WRITECOM

MOV A, #06H
LCALL WRITECOM

RET

WRITECOM:

MOV DPTR, #LCD_ADDR

CLR LCD_RS

SETB LCD_E

MOVX @DPTR, A

CLR LCD_E

LCALL WAIT

RET

WAIT:

PUSH 06H

PUSH 07H

MOV R6,#10

DL1: MOV R7,#250

DJNZ R7,$

DJNZ R6,DL1

POP 07H

POP 06H

RET

WRITETEXT:

MOV DPTR, #LCD_ADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A
CLR LCD_E

LCALL WAIT

RET

CLEAR:

PUSH ACC

MOV A, #01H

CALL WRITECOM

POP ACC

RET

GOTOXY:

PUSH ACC

MOV A, R1

CLR C

SUBB A, #1

JZ GOTO

MOV A, #40H

GOTO: ADD A, #7FH

ADD A, R2

LCALL WRITECOM

POP ACC

RET

DELAY1ms:

MOV TH0, #HIGH(-1000)

MOV TL0, #LOW(-1000)

SETB TR0
JNB TF0, $

CLR TR0

CLR TF0

RET

END

THÍ NGHIỆM 3

Yêu cầu

Viết chương trình con SCANKEY quét bàn phím ma trận 4x4 trên board thí nghiệm. Các giá trị trả về
từ 0-15 nếu có phím được nhấn hoặc 255 nếu không có phím được nhấn. Kết quả chứa trong R0.

Sử dụng chương trình con này viết chương trình gửi lên máy tính các ký tự từ '0' cho đến 'F' ứng với
phím được nhấn trên bàn phím, baudrate là 19200.

ORG 2000H
MAIN:
MOV SCON, #52H
MOV TMOD, #20H
MOV TH1, #-3
MOV A, PCON
SETB ACC.7
MOV PCON, A
CALL SCANKEY
CJNE A, #255, TT
SJMP MAIN
TT:
LCALL PHAT
SJMP MAIN
SCANKEY:
MOV P1, #0EFH
CALL WAIT
MOV A, P1
CJNE A, #0EEH, BUT01
MOV A, “0”
SJMP DONE
BUT01:
CJNE A, #0EDH, BUT02
MOV A, “4”
SJMP DONE
BUT02:
CJNE A, #0EBH, BUT03
MOV A, “8”
SJMP DONE
BUT03:
CJNE A, #0E7H, OW
MOV A, “C”
SJMP DONE
OW:
MOV P1, #0DFH
LCALL WAIT
MOV A, P1
CJNE A, #0DEH, BUT11
MOV A, “1”
SJMP DONE
BUT11:
CJNE A, #0DDH, BUT12
MOV A, “5”
SJMP DONE
BUT12:
CJNE A, #0DBH, BUT13
MOV A, “9”
SJMP DONE
BUT13:
CJNE A, #0D7H, OW1
MOV A, “D”
SJMP DONE
OW1:
MOV P1, #0BFH
CALL WAIT
MOV A, P1
CJNE A, #0BEH, BUT21
MOV A, “2”
SJMP DONE
BUT21:
CJNE A, #0BDH, BUT22
MOV A, “6”
SJMP DONE
BUT22:
CJNE A, #0BBH, BUT13
MOV A, “A”
SJMP DONE
BUT23:
CJNE A, #0B7H, OW2
MOV A, “E”
SJMP DONE
OW2:
MOV P1, #07FH
LCALL WAIT
MOV A, P1
CJNE A, #07EH, BUT31
MOV A, “3”
SJMP DONE
BUT31:
CJNE A, #07DH, BUT32
MOV A, “7”
SJMP DONE
BUT32:
CJNE A, #07BH, BUT33
MOV A, “B”
SJMP DONE
BUT33:
CJNE A, #077H, OW3
MOV A, “F”
SJMP DONE
OW3:
MOV A, #255
DONE: NOP
RET
WAIT:
MOV R7, #40;
LAP:
MOV R6, #250;
DJNZ R6, $
DJNZ R7, LAP
RET
PHAT:
JNB TI, $
CLR TI
MOV SBUF, A
RET
END

BÀI TN 5
LẬP TRÌNH GIAO TIẾP SERIAL PORT VÀ ADC

THÍ NGHIỆM 1
Mục tiêu

Nắm được cách thức điều khiển cổng nối tiếp.

Yêu cầu

Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thông qua HyperTerminal với tốc độ
baud 19200 pbs mỗi khi SW 310 (gắn vào P1.0) được nhấn

ORG 2000H

MOV TMOD ,#20H

MOV TH1,#-3

MOV SCON,#52H

MOV A, PCON

SETB ACC.7

MOV PCON, A

MOV DPTR, #TEXT

MOV A , #0

SETB TR1

LOOP: MOV R1, #20

SS1: JNB P1.0, $

LCALL DELAY1MS

DJNZ R1, SS1

MOV R1, #20

SS2: JB P1.0, $

LCALL DELAY1MS

DJNZ R1, SS2

JNB TI, $

MOV R0,A
MOVC A, @A+DPTR

MOV SBUF, A

MOV A, R0

INC A

CLR TI

SJMP LOOP

TEXT: DB "Hello, world"

DELAY1MS:

PUSH 01H

PUSH 02H

MOV R1, #2

LAP: MOV R2, #250

DJNZ R2, $

DJNZ R1, LAP

POP 02H

POP 01H

RET

END

THÍ NGHIỆM 2

Yêu cầu

Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8 thông qua HyperTerminal (bằng
cách gõ các ký tự trên bàn phím khi đang ở trong chương trình HyperTerminal) và hiển thị lên LCD
như sau:
Nếu ký tự là chữ thì hiển thị lên LCD; Enter thì xuống hàng; ESC thì xóa màn hình LCD; Backspace
thì xóa ký tự bên trái dấu nháy.

LCD_E BIT P3.3

LCD_RS BIT P3.5

LCD_ADDR EQU 6000H

ORG 2000H

MOV R1, #1 ;R1 hang, 1-2

MOV R2, #1 ;R2 cot 1-16

MOV TMOD, #01H

MOV DPTR, #LCD_ADDR

LCALL LCD_INT

MOV TMOD, #20H

MOV TH1, #-3

MOV SCON , #50H

MOV A, PCON

SETB ACC.7

MOV PCON, A

SETB TR1

LAP:

JNB RI, $

MOV A, SBUF

CJNE A, #8, TT

MOV A, #10H

LCALL WRITECOM

MOV A, #0
LCALL WRITETEXT

CLR RI

SJMP LAP

TT:

CJNE A, #10, TT1

PUSH 01H

PUSH 02H

MOV R1,#2

MOV R2,#1

LCALL GOTOXY

POP 02H

POP 01H

CLR RI

SJMP LAP

TT1:

CJNE A, #27, TT2

LCALL CLEAR ;XOA MAN HINH

CLR RI

SJMP LAP

TT2:

CJNE A, #65,$+3

JC LAP

CJNE A, #91,$+3

JNC TT3

LCALL WRITETEXT
CLR RI

SJMP LAP

TT3:

CJNE A, #97, $+3

JC LAP

CJNE A, #123, $+3

JNC LAP

LCALL WRITETEXT

CLR RI

SJMP LAP

LCD_INT:

MOV A, #38H

LCALL WRITECOM

MOV A, #0EH

LCALL WRITECOM

MOV A, #06H

LCALL WRITECOM

RET

WRITECOM:

MOV DPTR, #LCD_ADDR

CLR LCD_RS

SETB LCD_E

MOVX @DPTR, A

CLR LCD_E

LCALL WAIT
RET

WAIT:

MOV R6,#10

DL1: MOV R7,#250

DJNZ R7,$

DJNZ R6,DL1

RET

WRITETEXT:

MOV DPTR, #LCD_ADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

CALL WAIT

RET

CLEAR:

MOV A, #01H

CALL WRITECOM

RET

GOTOXY:

MOV A, R1

CLR C

SUBB A, #1

JZ GOTO

MOV A, #40H
GOTO: ADD A, #7FH

ADD A, R2

LCALL WRITECOM

RET

END

THÍ NGHIỆM 3

Yêu cầu

Viết chương trình con READADC thực hiện đọc giá trị của kênh 0 và trả về giá trị trong R0
Viết chương trình hiển thị giá trị của kênh 0 của ADC lên LCD dùng chương trình con
READADC đã viết

LCD_E BIT P3.3

LCD_RS BIT P3.5

LCD_ADDR EQU 6000H

ORG 2000H

MOV R2, #1

MOV TMOD, #01H

ACALL LCD_INT

ACALL LCD_CLR

LAP:

MOV R1,#1

ACALL GOTOXY

ACALL READADC

MOV B, #100

DIV AB

ADD A, #48

ACALL WRITETEXT
MOV A, B

MOV B, #10

DIV AB

ADD A, #48

ACALL WRITETEXT

MOV A, B

ADD A, #48

ACALL WRITETEXT

SJMP LAP

READADC:

MOV A, #0

MOV R7,#100

MOV DPTR, #4000H

MOVX @DPTR, A

DJNZ R7,$

MOVX A, @DPTR

MOV R0, A

RET

LCD_INT:

MOV A, #38H

LCALL WRITECOM

MOV A, #0EH

LCALL WRITECOM

MOV A, #06H

LCALL WRITECOM
RET

WRITECOM:

MOV DPTR, #LCD_ADDR

CLR LCD_RS

SETB LCD_E

MOVX @DPTR, A

CLR LCD_E

LCALL WAIT

RET

WAIT:

MOV R6,#10

DL1: MOV R7,#250

DJNZ R7,$

DJNZ R6,DL1

RET

WRITETEXT:

MOV DPTR, #LCD_ADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

CALL WAIT

RET

GOTOXY:

PUSH ACC
MOV A, R2

CLR C

SUBB A, #1

JZ GOTO

MOV A, #40H

GOTO:

ADD A, #7FH

ADD A, R1

LCALL WRITECOM

POP ACC

RET

LCD_CLR:

PUSH ACC

MOV A, #01H

ACALL WRITECOM

POP ACC

RET

END

THÍ NGHIỆM 4

Yêu cầu

Viết chương trình con CALADC tính toán giá trị điện áp thực tế đặt vào kênh 0 ADC từ giá trị đo
được của ADC
Chương trình có giá trị vào chứa trong R0 (là kết quả của chương trình con READADC)

Giá trị trả về chứa trong R0 và R1, R0 chứa giá trị nguyên và R1 chứa giá trị thập phân.
LCD_E BIT P3.3
LCD_RS BIT P3.5
LCD_ADDR EQU 6000H
ORG 2000H
MOV R2, #1
MOV TMOD, #01H
MOV DPTR, #LCD_ADDR
LCALL LCD_INT
ACALL LCD_CLR
LAP:
MOV R3, #1
ACALL GOTOXY
ACALL READADC
ACALL CALADC
MOV A,R0
ACALL WRITETEXT
MOV A, #2EH
ACALL WRITETEXT
MOV A, R1
ACALL WRITETEXT
SJMP LAP
CALADC:
MOV B, #50
DIV AB
ADD A, #48
MOV R0, A
MOV A, B
MOV B, #5
DIV AB
ADD A, #48
MOV R1, A
RET
READADC:
MOV A, #0
MOV R7,#100
MOV DPTR, #4000H
MOVX @DPTR, A
DJNZ R7,$
MOVX A, @DPTR
MOV R0, A
RET
LCD_INT:
MOV A, #38H
LCALL WRITECOM
MOV A, #0EH
LCALL WRITECOM
MOV A, #06H
LCALL WRITECOM
RET
WRITECOM:
MOV DPTR, #LCD_ADDR
CLR LCD_RS
SETB LCD_E
MOVX @DPTR, A
CLR LCD_E
LCALL WAIT
RET
WAIT:
MOV R6,#10
DL1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
WRITETEXT:
MOV DPTR, #LCD_ADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
CALL WAIT
RET
GOTOXY:
PUSH ACC
MOV A, R2
CLR C
SUBB A, #1
JZ GOTO
MOV A, #40H
GOTO:
ADD A, #7FH
ADD A, R3
LCALL WRITECOM
POP ACC
RET
LCD_CLR:
PUSH ACC
MOV A, #01H
ACALL WRITECOM
POP ACC
RET
END
BÀI TN 6
LẬP TRÌNH NGẮT

THÍ NGHIỆM 1

Mục tiêu

Nắm được cách sử dụng ngắt serial port

Yêu cầu

Viết chương trình làm song song 2 công việc sau:

Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình terminal

Bật LED gắn vào P1.1 khi SW 317 (gắn vào P1.0) được nhấn, và tắt LED khi phím được nhả.

ORG 2000H
JMP MAIN
ORG 2023H
JMP ISRPORT
MAIN:
MOV TMOD, #20H
MOV TH1, #-3
MOV SCON , #52H
MOV A, PCON
SETB ACC.7
MOV PCON, A
SETB TR1
MOV IE, #10010000B
LOOP: MOV R1, #20
SS1:
JNB P1.0, $
LCALL DELAY1ms
DJNZ R1, SS1
MOV R1, #20
SETB P1.1
SS2:
JB P1.0, $
LCALL DELAY1ms
DJNZ R1, SS2
CLR P1.1
JMP LOOP
ISRPORT:
JNB RI, SKIP
CLR RI
MOV A, SBUF
MOV SBUF, A
JMP DONE
SKIP:
CLR TI
DONE: RETI
DELAY1ms:
MOV R7, #2
VONG:
MOV R6, #250
DJNZ R6, $
DJNZ R7, VONG
RET
END

THÍ NGHIỆM 2

Mục tiêu

Nắm được cách sử dụng ngắt timer


Yêu cầu

Viết chương trình hiển thị lên 4 LED 7 đoạn một số có 4 chữ số, 4 ký số này chứa trong các ô nhớ 20H,
21H, 22H và 23H. Ô nhớ 20H chứa số hàng nghìn.

ORG 2000H

SJMP MAIN

ORG 200BH

SJMP ISRT0

MAIN:

MOV 20H, #1

MOV 21H, #3

MOV 22H, #1

MOV 23H, #8

MOV TMOD, #01H

MOV TL0, #LOW(-1000)

MOV TH0, #HIGH(-1000)

SETB TR0

MOV IE, #10000010B

MOV R3, #20H

MOV R1, #3

SJMP $

ISRT0:

CLR TR0

MOV TL0, #LOW(-1000)

MOV TH0, #HIGH(-1000)

MOV A, R3
ADD A, R1

MOV R0, A

LCALL DISPLAYLED

DEC R1

CJNE R1, #0FFH, SKIP

MOV R1, #3

SKIP:

SETB TR0

RETI

DISPLAYLED:

MOV A, R1

MOV DPTR, #POT

MOVC A, @A+DPTR

MOV R2, A

MOV A, @R0

ORL A, R2

MOV DPTR, #0000H

MOVX @DPTR, A

RET

POT:

DB 070H, 0B0H, 0D0H, 0E0H

END

THÍ NGHIỆM 3

Yêu cầu

Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên 4 LED 7 đoạn
ORG 2000H

JMP MAIN

ORG 200BH

JMP IRST0

ORG 2030H

MAIN:

MOV R3, #23H

MOV R1, #0

MOV 20H, #0

MOV 21H, #0

MOV 22H, #0

MOV 23H, #0

MOV TMOD, #01H

MOV TH0, #HIGH(-10000)

MOV TL0, #LOW(-10000)

MOV IE, #82H

SETB TR0

SKIP:

MOV R7, #20

T: JNB P1.7, $

LCALL DELAY1MS

DJNZ R7, T

MOV R7, #20

LOP:

JB P1.7, $
LCALL DELAY1MS

DJNZ R7, LOP

INC 23H

MOV A, 23H

CJNE A, #10, SKIP

MOV 23H, #0

INC 22H

MOV A, 22H

CJNE A, #10, SKIP

MOV 22H, #0

INC 21H

MOV A, 21H

CJNE A, #10, SKIP

MOV 21H, #0

INC 20H

MOV A, 20H

CJNE A, #10, SKIP

MOV 20H, #0

SJMP SKIP

IRST0:

MOV TH0, #HIGH(-10000)

MOV TL0, #LOW(-10000)

MOV A, R3

CLR C

SUBB A, R1
MOV R0, A

LCALL FORLED

INC R1

CJNE R1, #4, CONTI

MOV R1, #0

CONTI:

RETI

FORLED:

MOV A, R1

MOV DPTR, #TABLE

MOVC A, @A + DPTR

MOV R6,A

MOV A, @R0

ORL A, R6

MOV DPTR, #0000H

MOVX @DPTR, A

RET

TABLE: DB 0E0H, 0D0H, 0B0H, 070H

DELAY1MS:

MOV R4, #2

LAP: MOV R5, #250

DJNZ R5, $

DJNZ R4, LAP

RET

END
THÍ NGHIỆM 4

Yêu cầu

Viết chương trình thực hiện đồng hồ bấm giây, hiển thị lên LED 7 đoạn. Hai LED 3 và 2 thể hiện số
giây, 2 LED 1 và 0 thể hiện phần trăm của giây.

Khi SW310 nhấn, đồng hồ reset về 0

SW 311 nhấn, đồng hồ bắt đầu chạy

SW 312 nhấn, đồng hồ dừng lại

ORG 2000H

JMP MAIN

ORG 200BH

JMP IRST0

ORG 2030H

MAIN:

MOV R3, #20H

MOV R1, #0

MOV TMOD, #01H

MOV TH0, #HIGH(-10000)

MOV TL0, #LOW(-10000)

LL1: MOV 20H, #0

MOV 21H, #0

MOV 22H, #0

MOV 23H, #0

LL2: LCALL FORLED

JB P1.1, LL2
T2: SETB TR0

MOV IE, #10000010B

TT2: JB P1.0, TT1

T: CLR TR0

MOV IE, #0

SJMP LL1

TT1: JB P1.2, TT2

CLR TR0

MOV IE, #0

TA2: JNB P1.0, TT2

LCALL FORLED

JB P1.1, TA2

SJMP T2

IRST0:

MOV TH0, #HIGH(-10000)

MOV TL0, #LOW(-10000)

LCALL FORLED

MOV A, 20H

INC 20H

MOV A, 20H

CJNE A, #10, SKIP

MOV 20H, #0

INC 21H

MOV A, 21H

CJNE A, #10, SKIP


MOV 21H, #0

INC 22H

MOV A, 22H

CJNE A, #10, SKIP

MOV 22H, #0

INC 23H

MOV A, 23H

CJNE A, #07, SKIP

MOV 23H, #0

SKIP: RETI

FORLED:

MOV A, R3

ADD A, R1

MOV R0, A

LCALL DISPLAY

INC R1

CJNE R1, #4, DONE

MOV R1, #0

DONE: RET

DISPLAY:

MOV A, R1

MOV DPTR, #TABLE

MOVC A, @A +DPTR

MOV R2, A

MOV A, @R0
ORL A, R2

MOV DPTR, #0000H

MOVX @DPTR, A

RET

TABLE:

DB 0E0H,0D0H,0B0H,070H

END

You might also like