You are on page 1of 63

ĐẠI HỌC QUỐC GIA TP.

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

BÁO CÁO THÍ NGHIỆM


VI XỬ LÝ
~~~~~~~~~~~~~~~~~~~~~~~~~˜&™~~~~~~~~~~~~~~~~~~~~~~~~

GVHD: NGUYỄN PHAN HẢI PHÚ

NHÓM: L20_5

STT MSSV HỌ TÊN ĐIỂM GHI CHÚ

1 2011815 Nguyễn Doãn Phong

2 2011576 Nguyễn Tiến Lộc

3 2010851 Lê Vũ Hoàng Anh

TP. HỒ CHÍ MINH, NGÀY 14 THÁNG 06 NĂM 2022

1
MỤC LỤC
BÀI THÍ NGHIỆM LAB1:................................................................................
A. THÍ NGHIỆM 1.1..................................................................................
B. THÍ NGHIỆM 1.2..................................................................................
C. THÍ NGHIỆM 1.3..................................................................................
D. THÍ NGHIỆM 1.4..................................................................................
E. THÍ NGHIỆM 1.5..................................................................................
F. THÍ NGHIỆM 1.6..................................................................................
G. THÍ NGHIỆM 1.7................................................................................
H. THÍ NGHIỆM 1.8................................................................................
BÀI THÍ NGHIỆM LAB2:..............................................................................
A. THÍ NGHIỆM 2.1................................................................................
B. THÍ NGHIỆM 2.2................................................................................
C. THÍ NGHIỆM 2.3................................................................................
D. THÍ NGHIỆM 2.4................................................................................
E. THÍ NGHIỆM 2.5................................................................................
F. THÍ NGHIỆM 2.6................................................................................
BÀI THÍ NGHIỆM LAB3:..............................................................................
A. THÍ NGHIỆM 3.1................................................................................
B. THÍ NGHIỆM 3.2................................................................................
C. THÍ NGHIỆM 3.3................................................................................
D. THÍ NGHIỆM 3.4................................................................................
E. THÍ NGHIỆM 3.5................................................................................
F. THÍ NGHIỆM 3.6................................................................................
G. THÍ NGHIỆM 3.7................................................................................

KHOA ĐIỆN - ĐIỆN TỬ Trang


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED

BÀI THÍ NGHIỆM LAB1:

A.THÍ NGHIỆM 1.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).

Kiểm tra:

 Biên dịch và thực thi chương trình để kiểm tra kết quả thực hiện.

ORG 2000H

LAP: MOV C,P1.0 ; Đọc trạng thái của nút nhấn

MOV P3.0,C ; Hiển thị trạng thái nút ra led

SJMP LAP ;Lặp lại để chương trình liên tục đọc trạng thái nút

END

Câu hỏi:

 Thử giải thích tại sao có đến 2 led cùng bị tác động khi nhấn hoặc thả nút?

Vì khi nhấn nút nối với P1.0 thì catot của led sẽ nối đất còn anode nối với nguồn vcc nên
led sáng, led ở P3.0 sáng vì do chương trình được nạp vào kit thực hiện đọc trạng thái P1.0
và hiển thị ra P3.0 nên cả 2 led đều

 Tổng kết xem các bit nào của 2 port có thể được dùng trong thí nghiệm trên và giải
thích tại sao?

P2.0 đến P2.7 vì là cổng nhập xuất 8 bit

B.THÍ NGHIỆM 1.2

Mục tiêu: Nắm được cách viết chương trình con để tạo trễ

Yêu cầu:

KHOA ĐIỆN - ĐIỆN TỬ Trang 1


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
 Viết chương trình con Delay1s.
 Dùng chương trình con đã viết để chớp/tắt LED đơn gắn vào P1.0 sau mỗi khoảng
thời gian 1s.
 Thay đổi chương trình con để tần số chớp tắt bây giờ là 1KHz.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát LED đơn.

ORG 2000H

LAP: CPL P1.0 ;Đảo bit p1.0

LCALL Delay1s ;Gọi chương trình con Delay1s

SJMP LAP ;Nhảy đến nhãn LAP để đảo bit p1.0 tạo trạng thái chớp tắt của led

Delay1s: ;Chương trình con tạo trễ 1s

MOV R5,#8 ; R5  8

LAP1: MOV R6,#250;R6  250

LAP2: MOV R7,#250;R7  250

DJNZ R7, $ ;3 câu lệnh sau thực hiện lặp vòng để tạo trễ

DJNZ R6, LAP2

DJNZ R5,LAP1

RET

END

Câu hỏi:

 Thời gian 1s được tạo ra như thế nào? Tính toán chính xác dựa trên chương trình đã
viết.

Thời gian 1s được tạo ra bởi vòng lặp: sử dụng 3 vòng lặp theo công thức 2*m*n*k(MC)
tính được m = 8; n = 250, k = 250

 Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?

KHOA ĐIỆN - ĐIỆN TỬ Trang 2


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
 Khi tần số chớp tắt là 1Khz, cho biết hiện tượng trên LED?
LED sáng 500us và tối 500us

 Sinh viên thay đổi chương trình con như thế nào để được tần số chớp tắt là 1KHz?

ORG 2000H

LAP: CPL P1.0

MOV R7,#230

DJNZ R7,$

SJMP LAP

END

C.THÍ NGHIỆM 1.3

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 tạo 2 xung vuông 0.5Hz (chu kỳ nhiệm vụ 50%) và 1Hz (chu kỳ
nhiệm vụ là 30%) lần lượt trên chân P1.0 và P1.1.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình bằng cách sử dụng oscilloscope để kiểm
tra.

ORG 2000H

LAP: CLR P1.0 ; Đảo bit p1.0

CLR P1.1 ;Xóa bit p1.1

LCALL DELAY300MS ;Gọi chương trình con DELAY300MS

SETB P1.1 ;Đưa p1.1 lên 1 để tạo xung vuông chu kỳ


30%

LCALL DELAY200MS ;Gọi chương trình con DELAY200MS

SETB P1.0 ; Đưa p1.0 lên 1 tạo xung vuông chu kỳ 50%

LCALL DELAY200MS

KHOA ĐIỆN - ĐIỆN TỬ Trang 3


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
LCALL DELAY300MS ; Tạo trễ 500ms

SJMP LAP ; Tiếp tục quá trình trên

DELAY300MS: ; Chương trình con tạo trễ 300ms

MOV R5,#6

LAP1: MOV R6,#100

LAP2: MOV R7,#250

DJNZ R7,$

DJNZ R6,LAP2

DJNZ R5,LAP1

RET

DELAY200MS: ;Chương trình con tạo trễ 200ms

MOV R5,#4

LAP3: MOV R6,#100

LAP4: MOV R7,#250

DJNZ R7,$

DJNZ R6,LAP4

DJNZ R5,LAP3

RET

END

Câu hỏi:

 Vẽ giản đồ của 2 xung? Các chương trình con viết với thời gian trễ là bao nhiêu?

Giản đồ 2 xung:

KHOA ĐIỆN - ĐIỆN TỬ Trang 4


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED

Chương trình con Delay:

Chương trình sử dụng 2 ctc Delay 300ms và 700ms

 Tại mỗi thời gian tạo trễ, các chân P1.0 và P1.1 xuất tín hiệu như thế nào?

 Tại thời điểm gọi ctc Delay3 00ms thì P1.1 = 0 (sáng), khi gọi ctc Delay 700ms thì
P1.1 = 1 (tắt)
 Sau 2 lần gọi ctc Delay300ms và Delay700ms trạng thái P1.0 bị đảo

 Để tạo các xung thỏa yêu cầu bài toán, các vòng trễ được viết như thế nào?

D.THÍ NGHIỆM 1.4

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

KHOA ĐIỆN - ĐIỆN TỬ Trang 5


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
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 Delay1s đã viết ở
trên.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình bằng cách quan sát hiệu ứng trên bar led.

ORG 2000H

MOV P1,#7FH ; Làm sáng led đầu tiên, các led còn lại tắt

LAP: MOV A,P1 ; Chuyển tín hiệu led sáng vào A

RR A ; Dịch phải A để làm sáng led kế tiếp

MOV P1,A ; Xuất led sáng kế tiếp

LCALL DELAY1S ;Tạo trễ 1s

SJMP LAP ; Tiếp tục quá trình dịch ở trên

DELAY1S: ;Chương trình con tạo trễ 1s giống các bài trước

MOV R5,#8

LAP1: MOV R6,#250

LAP2: MOV R7,#250

DJNZ R7,$

DJNZ R6,LAP2

DJNZ R5,LAP1

RET

END

Câu hỏi:

 Led ngoài cùng bên trái kết nối đến MSB (most significant bit) hay LSB (less
significant bit) của port 1?

Nối đến MSB.


KHOA ĐIỆN - ĐIỆN TỬ Trang 6
Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED

E.THÍ NGHIỆM 1.5

Mục tiêu: Nắm được cách thức giao tiếp với ngoại vi LED 7 đoạn

Yêu cầu:

 Viết chương trình con DisplayLed hiển thị lên LED 7 đoạn số 0 giá trị chứa trong
thanh ghi R0

 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 DisplayLed.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình

Yêu cầu 1

DisplayLed:

MOV A,#11101001B ;Gán giá trị điều khiểu LED (9) vào A

ADD A,R0 ;Gán giá trị R0 vào A để hiển thị

MOV DPTR,#0000H ;0000H là địa chỉ giao tiếp LED 7 đoạn

MOVX @DPTR,A ;Gán giá trị vào địa chỉ trên và hiển thị led

RET

Yêu cầu 2:

ORG 2000H

MAIN:

MOV R0,#9

LCALL DisplayLed

DisplayLed:

MOV A,#11101001B ;Gán giá trị điều khiểu LED (9) vào A

ADD A,R0 ;Gán giá trị R0 vào A để hiển thị

KHOA ĐIỆN - ĐIỆN TỬ Trang 7


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
MOV DPTR,#0000H ;0000H là địa chỉ giao tiếp LED 7 đoạn

MOVX @DPTR,A ;Gán giá trị vào địa chỉ trên và hiển thị led

RET

Delay1s:

MOV R5,#8

LAP1: MOV R6,#250

LAP2: MOV R7,#250

DJNZ R7,$

DJNZ R6,LAP2

DJNZ R5,LAP1

RET

END

F.THÍ NGHIỆM 1.6

Mục tiêu: Kết hợp được các chương trình con: chương trình con tạo trễ và chương trình con
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 sử dụng 2 chương trình con ở Thí nghiệm 2 và Thí nghiệm 5.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình.

ORG 2000H

MAIN: ;Chương trình chính

MOV R0,#0 ;Xóa R0

LAP: LCALL DisplayLed ;Gọi chương trình con hiển thị led

LCALL Delay1s ;Gọi chương trình con delay 1 giây

INC R0 ;Tăng R0 lên 1

KHOA ĐIỆN - ĐIỆN TỬ Trang 8


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
CJNE R0,#10,LAP ;Kiểm tra nếu R0 lớn hơn 9 hay không

SJMP MAIN ;Nếu R0 lớn hơn 0 thì đặt R0 bằng không

DisplayLed: ;Chương trình con hiển thị led

MOV A,#0E0H

ADD A,R0

MOV DPTR,#0000H

MOVX @DPTR,A

RET

Delay1s: ; Chương trình con delay 1s

MOV R5,#8

LAP1: MOV R6,#250

LAP2: MOV R7,#250

DJNZ R7,$

DJNZ R6,LAP2

DJNZ R6,LAP1

RET

END

KHOA ĐIỆN - ĐIỆN TỬ Trang 9


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
Câu hỏi:

 Vẽ lưu đồ giải thuật của chương trình.

BẮT ĐẦU

R0 = 0

Displayed LED

Delays 1s

R0 = R0 +1

S Đ
R0 > 9
S

KHOA ĐIỆN - ĐIỆN TỬ Trang 10


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
G.THÍ NGHIỆM 1.7

Mục tiêu: Nắm được cách thức dùng chương trình con và giao tiếp 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. Trong đó:

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.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình

ORG 0000H

MOV R1,#3 ; R1 = 3

MOV R0,#1 ;R0 = 1

LCALL DisplayLED ; Gọi chương trình con DisplayLED

SJMP $ ; Nhảy tại chỗ

DisplayLED: ; Chương trình con DisplayLED

MOV B,R1 ; Chuyển dữ liệu R1 vào B

INC B ; Tăng B lên 1

MOV A,#11110111B ;bit số 3 bằng 0, bốn bit cao bằng 1

LAP:

RL A ; Xoay trái A

DJNZ B,LAP ; Giảm B đi 1, nếu khác 0 thì quay lại nhãn LAP

ANL A,#0F0H ; Nếu B giảm đến 0 thì giữ lại 4 bit cao của A

PUSH ACC ; Cất Acc vào ngăn xếp

MOV A,R0 ; A  R0

KHOA ĐIỆN - ĐIỆN TỬ Trang 11


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
ANL A,#0F0H ; Giữ lại 4 bit thấp của A

MOV R0,A ; R0  A

POP ; Lấy lại Acc từ ngăn xếp

ORL A,R0 ; Or A và R0 và lưu vào A

MOV DPTR,#0000H

MOVX @DPTR,A

RET

END

Câu hỏi:

 Viết lại chương trình trên bằng phương pháp sử dụng bảng tra (Lookup table).

DisplayLED:

MOV DPTR,#TABLE

MOV A,R1

MOVC A,@A+DPTR

ADD A,R0

MOV DPTR,#0000H

MOVX @DPTR,A

RET

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

KHOA ĐIỆN - ĐIỆN TỬ Trang 12


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
H.THÍ NGHIỆM 1.8

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.

Giảm thời gian trễ xuống còn 100 ms. Quan sát hiện tượng.

Tính toán thời gian trễ sao cho không còn thấy LED nhấp nháy và áp dụng vào chương trình

Giảm thời gian trễ xuống bằng 0 (không sử dụng hàm delay). Quan sát hiện tượng.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình

ORG 0000H

MAIN:

MOV R1,#0

MOV R0,#1

LOOP:

LCALL DisplayLED

LCALL Delay1s

INC R1

INC R0

CJNE R1,#4,LOOP

SJMP MAIN

DisplayLED:

MOV DPTR,#TABLE

KHOA ĐIỆN - ĐIỆN TỬ Trang 13


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP NÚT NHẤN ĐƠN VÀ LED
MOV A,R1

MOVC A,@A+DPTR

ADD A,R0

MOVX @DPTR, A

RET

Delay1s:

MOV R7,#8

LAP2: MOV R6,#250

LAP1: MOV R5,#250

DJNZ R5, $

DJNZ R6, LAP1

DJNZ R7, LAP2

RET

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

END

Câu hỏi:

 Thời gian trễ để không còn thấy LED nhấp nháy là bao nhiêu theo lý thuyết? Giải
thích cách tính.
Với tần số thạch anh sử dụng là 11.0592 MHz , ta có: 1 MC= 12/ 11.0592 MHz= 1.085 µs
Vì khoảng cách giữa 2 lần sáng tối của 1 led là 4 khoảng => để mắt người coi LED như
sáng liên tục thì LED phải chớp tắt ít nhất 24 lần trong 1 giây Suy ra thời gian trễ nhất để
không còn thấy LED nhấp nháy là: 1s= 24*4x => = 10416us

 Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
Không thấy led 7 sáng vì tần số chớp tắt quá nhanh

KHOA ĐIỆN - ĐIỆN TỬ Trang 14


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER

BÀI THÍ NGHIỆM LAB2:

A. THÍ NGHIỆM 2.1

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ử hoặc trong
folder thí nghiệm của sinh viên.

 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.

Kiểm tra:

 Kiểm tra kết quả thực hiện của chương trình.

LCD_E BIT P3.3 ;Định nghĩa LCD_E là chân P3.4

LCD_RS BIT P3.5 ;Định nghĩa LCD_RS là chân P3.5

LCDADDR EQU 6000H ;Định nghĩa LCDADDR là 6000H

ORG 2000H

MAIN:

MOV @R0, 30H

MOV DPTR, #LCDADDR

ACALL CLEAR

ACALL INIT_LCD

ACALL DISPLAYSTRING

SJMP $

INIT_LCD: ;Các dòng lệnh cấu hình LCD ban đầu

MOV A, #38H

ACALL WRITECOM

KHOA ĐIỆN - ĐIỆN TỬ Trang 16


Thí Nghiệm Vi Xử Lý 16
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
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

KHOA ĐIỆN - ĐIỆN TỬ Trang 17


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
DISPLAYSTRING: ; Hàm con xuất chuỗi ký tự bằng cách tra bảng

MOV A,#0

LOOP:

MOV DPTR, #MESSAGE

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT

ACALL WRITETEXT

MOV A,R0

INC A

DJNZ B, LOOP

EXIT:

RET

WAIT_LCD: ;Hàm con delay cho LCD

MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

MESSAGE:

DB "HELLO WORLD!",0

END

Câu hỏi:

 Giải thích ý nghĩa của các chương trình con trên project mẫu.

KHOA ĐIỆN - ĐIỆN TỬ Trang 18


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
 WRITECOM: ;Hàm con ghi lệnh
 MOV DPTR, #LCDADDR ;Gán địa chỉ ngoại LCD vào thanh ghi
DPTR
 SETB LCD_E ;Đưa bit EN của LCD lên 1
 CLR LCD_RS ;Xuất lệnh cho LCD nên bit RS = 0
 MOVX @DPTR, A ;Xuất mã Lệnh trong A ra LCD
 CLR LCD_E ;Cho phép LCD thực hiện  EN cạnh
xuống
 ACALL WAIT_LCD ;Gọi Delay chờ bit BF = 0
 RET ;Thoát khỏi CT con
 ;==================================================
==
 WRITETEXT: ;Hàm con ghi dữ liệu
 MOV DPTR, #LCDADDR ;Gán địa chỉ ngoại LCD vào thanh ghi
DPTR
 SETB LCD_E ;Đưa bit EN của LCD lên 1
 SETB LCD_RS ;Xuất data cho LCD nên bit RS = 1
 MOVX @DPTR, A ;Xuất mã Ký tự trong A ra LCD
 CLR LCD_E ;Cho phép LCD thực hiện  EN cạnh
xuống
 ACALL WAIT_LCD ;Gọi Delay chờ bit BF = 0
 RET ;Thoát khỏi CT con
 ;==================================================
==
 INIT_LCD: ;Hàm cài đặt ban đầu cho LCD
 MOV A, #38H ;Đặt chức năng giao tiếp 8 bit,2 dòng,5X8 dots
 ACALL WRITECOM ;Gọi CTC xuất lệnh
 MOV A, #0EH ;Hiện màn hình, không chớp ký tự chỉ bởi con
trỏ
 ACALL WRITECOM ;Gọi CTC xuất lệnh
 MOV A, #06H ;Dịch con trỏ sang phải (khi đọc/ghi data)
 ACALL WRITECOM ;Gọi CTC xuất lệnh

KHOA ĐIỆN - ĐIỆN TỬ Trang 19


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
 RET ;Thoát khỏi CT con
 ;==================================================
==

 CLEAR: ;Hàm con xóa màn hình
 MOV A, #01H ;Mã lệnh xóa màn hình
 ACALL WRITECOM ;Gọi CTC xuất lệnh
 RET ;Thoát khỏi CTC
 ;==================================================
==
 WAIT_LCD: ;Hàm con Delay đợi bit BF = 0
 MOV R6,#10 ;Delay 5ms
 DL1:
 MOV R7, #250
 DJNZ R7, $
 DJNZ R6,DL1
 RET
 ;==================================================
==
 DISPLAYSTRING: ;Hàm con hiển thị chuỗi ký tự
 MOV A,#0
 LOOP:
 MOV DPTR, #MESSAGE
 MOV R2, A
 MOVC A,@A+DPTR
 JZ EXIT
 ACALL WRITETEXT
 MOV A, R2
 INC A
 JMP LOOP
 EXIT:
 RET

 Trình bày lưu đồ giải thuật giao tiếp LCD.

KHOA ĐIỆN - ĐIỆN TỬ Trang 20


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER

B.THÍ NGHIỆM 2.2

Mục tiêu: Nắm được giao tiếp cơ bản của LCD.

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.

Kiểm tra:

 Kiểm tra kết quả chương trình.

KHOA ĐIỆN - ĐIỆN TỬ Trang 21


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
LCD_E BIT P3.3

LCD_RS BIT P3.5

LCDADDR EQU 6000H

ORG 2000H

MAIN:

MOV @R0, 30H

MOV DPTR,#LCDADDR

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

KHOA ĐIỆN - ĐIỆN TỬ Trang 22


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
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:

KHOA ĐIỆN - ĐIỆN TỬ Trang 23


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
MOV R1,#1

JB F0,HANG2

MOV R0,#1

SJMP TOI

HANG2:

MOV R0,#2

ACALL GOTOXY

TOI:

MOV A, #0

LOOP:

JB F0,SO2

MOV DPTR,#MESSAGE1

SJMP NHAY

SO2:

MOV DPTR,#LOP

NHAY:

MOV R3,A

MOVC A,@A+DPTR

JZ EXIT

ACALL WRITETEXT

MOV A,R3

INC A

SJMP LOOP

EXIT:

RET

KHOA ĐIỆN - ĐIỆN TỬ Trang 24


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
GOTOXY:

MOV A,#0

CJNE R0,#1,BANG2

ADD A,R1

JMP XUAT

BANG2:

ADD A,#3FH

ADD A,R1

XUAT:

ADD A,#80H

ACALL WRITECOM

RET

MESSAGE1:

DB "BACH KHOA HCM",0

LOP:

DB "L20",0

END

Câu hỏi:

 Cho biết mã lệnh dùng để xóa màn hình, dịch con trỏ đến vị trí thứ 1 của hàng 1 và vị
trí thứ 1 của hàng 2 của LCD?
 Xóa màn hình: 01H
 Dịch con trỏ đến vị trí thứ 1 của hàng 1: 80H
 Dịch con trở đến vị trí thứ 1 của hàng 2: 0C0H

 Thực hiện canh giữa hàng 2 của LCD. Cho biết cách làm?

KHOA ĐIỆN - ĐIỆN TỬ Trang 25


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
-Thực hiện tính toán số ký tự trên dòng 1. Ví dụ chuỗi ký tự “AN_KIET_TRUNG” gồm 13 ký
tự  canh trái 1 ký tự và phải 2 ký tự ( tổng số ký tự trên 1 dòng là 16)
-Trước khi xuất Dòng 1, thực hiện đưa con trở tới vị trí Dòng 1 Cột 2
-Thực hiện tính toán số ký tự trên dòng 2. Ví dụ chuỗi ký tự “L18_NHOM2” gồm 9 ký tự 
canh trái 3 ký tự và phải 4 ký tự
-Trước khi xuất Dòng 2, thực hiện đưa con trở tới vị trí Dòng 2 Cột 4

C. THÍ NGHIỆM 2.3

Mục tiêu: Nắm được cách thức giao tiếp ADC.

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.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

LCD_E BIT P3.3

LCD_RS BIT P3.5

LCDADDR EQU 6000H

ADCADDR EQU 4000H

ORG 2000H

MAIN:

CALL READADC

PUSH 0

KHOA ĐIỆN - ĐIỆN TỬ Trang 26


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
MOV DPTR, #LCDADDR

CALL CLEAR

CALL INIT_LCD

CALL DISPLAYSTRING

POP ACC

MOV R0,A

MOV B,#100

DIV AB

ADD A,#30H

ACALL WRITETEXT

MOV A,B

MOV B,#10

DIV AB

ADD A,#30H

ACALL WRITETEXT

MOV A,B

ADD A,#30H

ACALL WRITETEXT

ACALL WAIT

SJMP MAIN

READADC:

MOV DPTR,#ADCADDR

MOV A,#0

MOVX @DPTR,A

KHOA ĐIỆN - ĐIỆN TỬ Trang 27


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
CALL WAIT_LCD

MOVX A,@DPTR

MOV R0,A

MOV P1,A

RET

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

KHOA ĐIỆN - ĐIỆN TỬ Trang 28


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
WRITETEXT:

MOV DPTR, #LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WAIT:

MOV R6,#255

DL:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL

RET

WAIT_LCD:

MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

DISPLAYSTRING:

MOV A,#0

LOOP:

KHOA ĐIỆN - ĐIỆN TỬ Trang 29


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
MOV DPTR, #MESSAGE

MOV R0,A

MOVC A,@A+DPTR

JZ EXIT

ACALL WRITETEXT

MOV A,R0

INC A

SJMP LOOP

EXIT:

RET

MESSAGE: DB "GTkenh 0:",0

END

Câu hỏi:

 Giá trị này có phải giá trị thực của điện áp đặt vào kênh 0 hay không?

 Giá trị hiển thị này không phải giá trị thực của điện áp đặt vào kênh 0

 Để hiển thị giá trị thực tế của mức điện áp đặt vào kênh 0 ta phải làm như thế nào?

 Để hiển thị giá trị thực tế của mức điện áp đăt vào kệnh 0, ta phải chuyển đổi giá trị này
theo công thức: Vin= A .¿ ¿ (V)
5∗A
 Nếu (REF+) = 5V và (REF-) = 0V thì: Vin= (V )
256

D. THÍ NGHIỆM 2.4

Mục tiêu: Nắm được cách thức giao tiếp ADC và chuyển giá trị đọc được sang điện áp.

KHOA ĐIỆN - ĐIỆN TỬ Trang 30


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
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.

 Hiển thị giá trị đo được lên LCD theo cấu trúc: "Voltage: x.xx V" với x.xx là giá trị
điện áp đo được, với hai số sau dấu chấm.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình, so sánh giá trị hiển thị với giá trị
đo được dùng VOM

LCD_E BIT P3.3

LCD_RS BIT P3.5

LCDADDR EQU 6000H

ADCADDR EQU 4000H

ORG 2000H

MAIN:

CALL READADC

PUSH 0

MOV DPTR, #LCDADDR

CALL CLEAR

CALL INIT_LCD

CALL DISPLAYSTRING

POP ACC

MOV R0,A

KHOA ĐIỆN - ĐIỆN TỬ Trang 31


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
MOV B,#5

MUL AB

PUSH ACC

MOV A,B

ADD A,#30H

ACALL WRITETEXT

MOV A,#2CH

ACALL WRITETEXT

POP ACC

MOV R5,#4

LAPP:

MOV B,#10

MUL AB

PUSH ACC

MOV A,B

ADD A,#30H

ACALL WRITETEXT

POP ACC

DJNZ R5, LAPP

MOV A,#56H

ACALL WRITETEXT

ACALL WAIT

SJMP MAIN

READADC:

MOV DPTR,#ADCADDR

KHOA ĐIỆN - ĐIỆN TỬ Trang 32


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
MOV A,#0

MOVX @DPTR,A

CALL WAIT_LCD

MOVX A,@DPTR

MOV R0,A

MOV P1,A

RET

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

KHOA ĐIỆN - ĐIỆN TỬ Trang 33


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
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:

MOV R6,#255

DL:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL

RET

WAIT_LCD:

MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

DISPLAYSTRING:

KHOA ĐIỆN - ĐIỆN TỬ Trang 34


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
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

MESSAGE: DB "Vin :",0

END

KHOA ĐIỆN - ĐIỆN TỬ Trang 35


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
E. THÍ NGHIỆM 2.5

Mục tiêu: Nắm được cách thức sử dụng Timer mode 1.

Yêu cầu:

 Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng Timer 0 ở mode 1.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình.


ORG 2000H
MOV TMOD ,#01H
LOOP:
SETB P1.0
CALL DELAY_0.5S
CLR P1.0
CALL DELAY_0.5S
SJMP LOOP
DELAY_0.5S MOV R7,#10
AGAIN:
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
WAIT:
JNB TF0,WAIT
CLR TR0
CLR TF0
DJNZ R7,AGAIN
RET
END

Câu hỏi:

 Để tạo sóng 1 Hz, ta có thể sử dụng timer ở mode 2 được không? Nếu được, trình bày

KHOA ĐIỆN - ĐIỆN TỬ Trang 36


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
đoạn chương trình tạo sóng 1 Hz sử dụng timer ở mode 2.

ORG 2000H
MOV TMOD,#02H
MOV TH0, #-250
MOV TL0, TH0
START:
CPL P1.0
MOV R6, #10
LOOP1:
MOV R7, #200
LOOP2:
SETB TR0
CALL DELAY1_250us
DJNZ R7,LOOP2
DJNZ R6,LOOP1
JMP START
/*DELAY_250us*/
DELAY1_250us:
JNB TF0,$
CLR TR0
CLR TF0
RET
END

 Trong chương trình của sinh viên, khi sử dụng mode 1, sóng vuông 1 Hz có bị sai số
không? Để hạn chế sai số ta phải nạp các giá trị vào timer như thế nào?

Chương trình trên vẫn có sai số do ta cần phải tốn thời gian để nạp lại giá trị cho TL0 và
TH0.
Để giảm thiểu sai số ta cần hạn chế số lần nạp lại bằng cách tăng cao nhất có thể giá trị
nạp và TL0 và TH0

KHOA ĐIỆN - ĐIỆN TỬ Trang 37


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
F. THÍ NGHIỆM 2.6

Mục tiêu: Nắm được cách thức sử dụng Timer mode 2.

Yêu cầu:

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

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình.

ORG 2000H

MOV TMOD, #02H

MOV TH0, #(-250)

MOV TL0, TH0

SETB TR0

MAIN:

CPL P1.0

ACALL DL500ms

SJMP MAIN

DL500ms:

MOV R1, #8

LOOP:

MOV R0, #250

WAIT:

JNB TF0, $

CLR TF0

DJNZ R0, WAIT

KHOA ĐIỆN - ĐIỆN TỬ Trang 38


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP LCD, ACD VÀ TIMER
DJNZ R1, LOOP

RET

END

Câu hỏi:

 Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit có gây sai số cho dạng sóng
ngõ ra không? Vì sao?

Ở chế độ 2, độ trễ gây ra lúc này không xuất phát từ việc nạp lại giá trị cho TL0 (do nạp lại
tự động), thay vào đó việc gọi CTC Delay nhiều lần hơn cũng khiến độ sai số tăng do giới
hạn giá trị nạp trong thanh ghi TL0 là 255

KHOA ĐIỆN - ĐIỆN TỬ Trang 39


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT

BÀI THÍ NGHIỆM LAB3:


A. THÍ NGHIỆM 3.1
Mục tiêu: Nắm được cách thức điều khiển serial port.

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 bps mỗi khi SW 310 (gắn vào P1.0) được
nhấn.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

SW_310 BIT P1.0

ORG 2000H

MOV SCON, #42H ;chỉ phát data UART 8 bit

MOV TMOD, #20H ;cài đặt Timer 1 ở Mode 2 tự nạp lại

ORL PCON, #80H ;cài đặt SMOD = 1

MOV TH1, #-3 ;cài dặt Timer 1 chu kỳ 3us

MOV TL1, TH1

SETB TR1 ;cho Timer 1 bắt đầu hoạt động

MAIN:

JB SW_310,$

JNB SW_310,$

CALL STRING

JMP MAIN

STRING:

MOV R0,#0

KHOA ĐIỆN - ĐIỆN TỬ Trang 36


Thí Nghiệm Vi Xử Lý 36
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
LOOP1:

MOV A, R0

MOV DPTR,#MESSAGE

MOVC A,@A+DPTR

JZ KT

CALL PHAT

INC R0

JMP LOOP1

KT: RET

PHAT:

JNB TI, $

CLR TI

MOV SBUF, A

RET

MESSAGE: DB “HELLO WORLD!!!”, 0H

END

Câu hỏi:

 Trong chương trình khởi tạo serial port, ta có thể sử dụng tốc độ baud khác giá trị
19200bps được không? Tại sao?

Muốn thay đổi tốc độ baud khác thì phải đảm bảo HyperTerminal cũng phải có chức năng
thay đổi baud có giá trị giống như ở MCU

Nếu HyperTerminal chỉ mặc định một tốc độ baud là 19200bps thì ở MCU ta cũng phải cố
định tốc độ 19200bps

KHOA ĐIỆN - ĐIỆN TỬ Trang 37


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
B. THÍ NGHIỆM 3.2
Mục tiêu: Nắm được cách thức điều khiển serial port.

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 chương trình
Hercules (bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình Hercules). Kí
tự nhận được sẽ hiển thị lên LCD tại vị trí cột 0 hàng 0 và đồng thời phát trở lại serial port.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

LCD_E BIT P3.3 ;định dịa chỉ chân LCD_E la P3.3

LCD_RS BIT P3.5 ;định địa chỉ chân LCD_RS la P3.5

LCDADDR EQU 6000H ;định nghĩa LCDADDR là 6000H

ORG 2000H

MOV DPTR,#LCDADDR ;địa chỉ vùng nhớ ngoại vi LCD

ACALL CLEAR ;xóa màn hình LCD

ACALL INIT_LCD ;cài đặt các thông số ban đầu cho LCD

MOV SCON,#52H ;cài đặt phát-thu data UART 8bit

MOV TMOD,#20H ;cài đặt Timer 1 ở Mode 2 tự nạp lại

MOV PCON,#80H ;cài đặt SMOD = 1

MOV TH1, #-3 ;cài dặt Timer 1 chu kỳ 3us

MOV TL1, TH1

SETB TR1 ;cho Timer 1 bắt đầu hoạt động

MAIN:

CALL THU

CALL WRITETEXT

CALL PHAT

KHOA ĐIỆN - ĐIỆN TỬ Trang 38


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
JMP MAIN

/*=========================*/

THU: ;CT THU data

JNB RI,$

CLR RI

MOV A, SBUF

RET

PHAT: ;CT PHÁT data

JNB TI,$

CLR TI

MOV SBUF, A

RET

CLEAR: ;CT XÓA màn hình

MOV A, #01H

ACALL WRITECOM

RET

INIT_LCD: ;CT CẤU HÌNH LCD ban đầu

MOV A, #38H

ACALL WRITECOM

MOV A, #0EH

ACALL WRITECOM

MOV A, #06H

ACALL WRITECOM

RET

WRITECOM: ;CT Xuất lệnh ra LCD

KHOA ĐIỆN - ĐIỆN TỬ Trang 39


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOV DPTR, #LCDADDR

SETB LCD_E

CLR LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WRITETEXT: ;CT xuất ký tự ra LCD

MOV DPTR, #LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WAIT_LCD: ;CT đợi bit BF = 0

MOV R6, #10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6, DL1

RET

END

C. THÍ NGHIỆM 3.3

KHOA ĐIỆN - ĐIỆN TỬ Trang 40


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
Mục tiêu: Nắm được cách thức điều khiển serial port.

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 cương trình
Hercules (bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình Hercules) và
hiển thị lên LCD theo nguyên tắc 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.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

EN EQU P3.3

RS EQU P3.5

ROW EQU 20H.0 ; Biến xác định hàng, 0/1: Hàng 1/ hàng 2

ORG 2000H

MOV SCON, #53H

MOV PCON, #80H

MOV TMOD, #20H

MOV TH1, #-3

SETB TR1

MOV R1, #00H ; Biến xác định vị trí cursor hàng 1

MOV R2, #40H ; Biến xác định vị trí cursor hàng 2

CLR ROW ; Thiết lập ban đầu: hàng 1

ACALL INIT_LCD ; Khởi động LCD

MAIN:

KHOA ĐIỆN - ĐIỆN TỬ Trang 41


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
ACALL RECEIVE ; Nhận ký tự

CHECK_ENTER: ; Kiểm tra ký tự: ENTER?

CJNE R5, #0DH, CHECK_ESC

ACALL ENTER ; Gọi chương trình Enter

SJMP MAIN

CHECK_ESC: ; Kiểm tra ký tự: ESC?

CJNE R5, #21H, CHECK_BACKSPACE

ACALL CLR_LCD ; Xóa LCD

MOV R1, #00H ; Đặt lại vị trí hàng 1 cột 1

MOV R2, #40H ; Đặt lại vị trí hàng 2 cột 1

SJMP MAIN

CHECK_BACKSPACE: ; Kiểm tra ký tự: BACKSPACE?

CJNE R5, #08H, CHECK_LETTER

ACALL BACKSPACE ; Gọi chương trình BACKSPACE

SJMP MAIN

CHECK_LETTER: ; Kiểm tra ký tự: Letter?

ACALL LETTER ; Gọi chương trình kiểm tra ký tự

JNB F0, MAIN ; Nếu F0 = 0, không phải ký tự

MOV A, R5

ACALL DISP ; Hiển thị letter lên LCD

ACALL CURSOR ; Thực hiện tăng vị trí cursor

ACALL TRANSMIT ; Gửi letter lên serial port

SJMP MAIN ; Quay lại chờ nhận ký tự tiếp theo

ENTER: ; Chương trình thực thi ENTER

CPL ROW ; Đổi hàng đang ghi ký tự

KHOA ĐIỆN - ĐIỆN TỬ Trang 42


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
JB ROW, E_R2 ; Kiểm tra đang ở hàng nào

E_R1: MOV A, R1

SJMP E_S ; Enter_Skip

E_R2: MOV A, R2

E_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor hàng mới

ACALL COMD ; Thực hiện đặt cursor ở vị trí mới

RET

BACKSPACE: ; Chương trình thực thi BACKSPACE

JB ROW, B_R2 ; Kiểm tra đang ở hàng nào

B_R1: DEC R1 ; Lùi vị trí cursor hàng 1 đi 1

MOV A, R1

SJMP B_S ; Backspace_Skip

B_R2: DEC R2 ; Lùi vị trí cursor hàng 2 đi 1

MOV A, R2

B_S: ADD A, #80H ; Lấy mã lệnh đặt vị trí cursor tại vị trí xóa

PUSH ACC ; Cất mã lệnh vào stack

ACALL COMD ; Thực hiện đặt vị trí cursor ở vị trí xóa

MOV A, #' '

ACALL DISP ; Chèn kí tự space vào, cursor dịch phải 1

POP ACC ; Lấy mã lệnh từ stack

ACALL COMD ; Đặt cursor lại vị trí tại vị trí xóa

RET

LETTER: ; Chương trình kiểm tra Letter

CJNE R5, #41H, $+3

JC NO ; (R5) < 41H

KHOA ĐIỆN - ĐIỆN TỬ Trang 43


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
CJNE R5, #5BH, $+3 ; 41H <= (R5)

JC YES ; 41H <= (R5) <= 5AH : Chữ thường

CJNE R5, #61H, $+3 ; 5AH < (R5)

JC NO ; 5AH < (R5) < 61H

CJNE R5, #7BH, $+3 ; 61H <= (R5)

JNC NO ; 7BH <= (R5)

YES: SETB F0 ; Là letter, cờ F0 = 1

RET

NO: CLR F0 ; Không phải letter, cờ F0 = 0

RET

CURSOR: ; Tăng vị trí cursor sau mỗi lần nhập ký tự

JB ROW, C_R2 ; Kiểm tra đang ở hàng nào

C_R1: INC R1

RET

C_R2: INC R2

RET

TRANSMIT:

JNB TI, $

CLR TI

MOV SBUF, A

RET

RECEIVE:

JNB RI, $

CLR RI

MOV R5, SBUF

KHOA ĐIỆN - ĐIỆN TỬ Trang 44


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
RET

INIT_LCD:

MOV A, #38H

ACALL COMD

MOV A, #0EH

ACALL COMD

MOV A, #06H

ACALL COMD

RET

CLR_LCD:

MOV A, #01H

ACALL COMD

RET

COMD:

MOV DPTR, #6000H

SETB EN

CLR RS

MOVX @DPTR, A

CLR EN

ACALL WAIT_LCD

RET

DISP:

MOV DPTR, #6000H

SETB EN

SETB RS

KHOA ĐIỆN - ĐIỆN TỬ Trang 45


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOVX @DPTR, A

CLR EN

ACALL WAIT_LCD

RET

WAIT_LCD:

MOV R7, #14

DL: MOV R6, #144

DJNZ R6, $

DJNZ R7, DL

RET

END

D. THÍ NGHIỆM 3.4


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 Hercules.

- 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ả.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

ORG 0000H

LJMP START

ORG 0023H

LJMP ISR_SerialPort

KHOA ĐIỆN - ĐIỆN TỬ Trang 46


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
ORG 0030H

START: MOV SCON, #50H

MOV PCON, #80H

MOV TMOD, #21H

MOV TH1, #-3

SETB EA ; Cho phép ngắn

SETB ES ; Cho phép ngắt serial port

SETB TR1

MAIN:

MOV R2, #10 ; Chống rung nút nhấn

WAIT: JB P1.0, MAIN

DJNZ R2, WAIT

CLR P1.1 ; Bật led P1.1

JNB P1.0, $ ; Chờ nút nhấn được thả

SETB P1.1 ; Tắt led P1.1

SJMP MAIN

ISR_SerialPort:

JNB RI, TRANSMIT ; Kiểm tra ngắt thu hay ngắt phát

RECEIVE: ; Ngắt thu

CLR RI ; Xóa cờ ngắt

MOV A, SBUF ; Đọc byte từ máy tính về

MOV SBUF, A ; Gửi byte lên màn hình

RETI

TRANSMIT: ; Ngắt phát

CLR TI ; Xóa cờ ngắt

KHOA ĐIỆN - ĐIỆN TỬ Trang 47


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
RETI

DL10ms:

MOV TH0, #HIGH(-9216)

MOV TL0, #LOW(-9216)

SETB TR0

JNB TF0, $

CLR TR0

CLR TF0

RET

END

E. THÍ NGHIỆM 3.5


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.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

START

Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho phép timer
chạy

KHOA ĐIỆN - ĐIỆN TỬ Trang 48


Dừng timer, xóa cờ ngắt, đặt lại giá trị timer, cho phép timer
Thí Nghiệm Vi Xử Lý chạy
Lấy giá trị hiển thị LED vào R0
Hiển thị ra LED tương ứng
Cập nhật giá trị R1
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾPENDSERIAl PORT VÀ INTERRUPT

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP ISR_TIMER0

ORG 0030H

MAIN: MOV TMOD, #01H

MOV 20H, #1

MOV 21H, #2

MOV 22H, #3

MOV 23H, #4

SETB EA ; Cho phép ngắt

SETB TF0 ; Ép ngắt timer 0

SETB ET0 ; Cho phép ngắt timer 0

SJMP $

ISR_TIMER0:

CLR TR0

MOV TH0, #HIGH(-9216)

KHOA ĐIỆN - ĐIỆN TỬ Trang 49


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOV TL0, #LOW(-9216)

SETB TR0

ACALL GET_R1 ; Lấy giá trị nạp vào R1

ACALL GET_R0 ; Lấy giá trị nạp vào R0

LCALL DisplayLED ; Hiển thị LED

RETI

DisplayLED:

MOV DPTR, #LED

MOV A, R1

MOVC A, @A + DPTR

ORL A, R0

MOV DPTR, #0

MOVX @DPTR, A

RET

GET_R1:

INC R1

CJNE R1, #4, SKIP ; Nếu R1 = 4

MOV R1, #0 ; Reset R1

SKIP: RET

GET_R0:

MOV A, #20H

ADD A, R1 ; Lấy vị trí ô nhớ

MOV R0, A

MOV A, @R0

MOV R0, A

KHOA ĐIỆN - ĐIỆN TỬ Trang 50


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
RET

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

END

F. THÍ NGHIỆM 3.6


Mục tiêu: Vận dụng ngắt timer để lập trình.

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

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

ORG 0000H

LJMP BEGIN

ORG 000BH

LJMP ISR_TIMER0

ORG 0030H

BEGIN:

MOV TMOD, #01H

SETB EA ; Cho phép ngắt

SETB TF0 ; Ép ngắt timer 0

SETB ET0 ; Cho phép ngắt timer 0

MAIN:

MOV R2, #10 ; Debounce

WAIT:

JB P1.7, MAIN

ACALL DL10us

KHOA ĐIỆN - ĐIỆN TỬ Trang 51


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
DJNZ R2, WAIT

INC 23H

ACALL UPDATE

JNB P1.7, $

SJMP MAIN

UPDATE: ; Hàm con điều chỉnh các giá trị thanh ghi

MOV A, 23H ; Kiểm tra hàng đơn vị

CJNE A, #10, SKIP

MOV 23H, #0

INC 22H

MOV A, 22H ; Kiểm tra hàng chục

CJNE A, #10, SKIP

MOV 22H, #0

INC 21H

MOV A, 21H ; Kiểm tra hàng trăm

CJNE A, #10, SKIP

MOV 21H, #0

INC 20H

MOV A, 20H ; Kiểm tra hàng nghìn

CJNE A, #10, SKIP

MOV 20H, #0

RET

ISR_TIMER0:

CLR TR0

MOV TH0, #HIGH(-9216)

KHOA ĐIỆN - ĐIỆN TỬ Trang 52


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOV TL0, #LOW(-9216)

SETB TR0

ACALL GET_R1 ; Lấy giá trị nạp vào R1

ACALL GET_R0 ; Lấy giá trị nạp vào R0

LCALL DisplayLED ; Hiển thị LED

RETI

DisplayLED:

MOV DPTR, #LED

MOV A, R1

MOVC A, @A + DPTR

ORL A, R0

MOV DPTR, #0

MOVX @DPTR, A

RET

GET_R1:

INC R1

CJNE R1, #4, SKIP ; Nếu R1 = 4

MOV R1, #0 ; Reset R1

SKIP:RET

GET_R0:

MOV A, #20H

ADD A, R1 ; Lấy vị trí ô nhớ

MOV R0, A

MOV A, @R0

MOV R0, A

KHOA ĐIỆN - ĐIỆN TỬ Trang 53


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
RET

DL10us:

MOV R5, #4

DJNZ R5, $

RET

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

END

G. THÍ NGHIỆM 3.7


Mục tiêu: Vận dụng ngắt timer để lập trình.

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.

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

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

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

ORG 0000H

LJMP BEGIN

ORG 000BH

LJMP ISR_TIMER0 ; Hiển thị LED

ORG 001BH

LJMP ISR_TIMER1 ; Đếm giờ

ORG 0030H

BEGIN:

KHOA ĐIỆN - ĐIỆN TỬ Trang 54


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOV TMOD, #11H

SETB EA ; Cho phép ngắt

SETB TF0 ; Ép ngắt Timer 0

SETB TF1 ; Ép ngắt Timer 1

SETB ET0 ; Cho phép ngắt Timer 0

SW311: ; Play

MOV R2, #10

WAIT311:

JB P1.1, SW310 ; Nếu không nhấn, kiểm tra SW310

ACALL DL10us

DJNZ R2, WAIT311

SETB ET1 ; Được nhấn, khởi động bộ đếm giờ

JNB P1.1, $ ; Chờ thả nút

SW310: ; Reset

MOV R2, #10

WAIT310:

JB P1.0, SW312 ; Nếu không nhấn, kiểm tra SW312

ACALL DL10us

DJNZ R2, WAIT310

MOV 20H, #0 ; Được nhấn, reset các thanh ghi

MOV 21H, #0 ; chứa nội dung bộ đếm giờ

MOV 22H, #0

MOV 23H, #0

JNB P1.0, $ ; Chờ thả nút

SW312: ; Pause

KHOA ĐIỆN - ĐIỆN TỬ Trang 55


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOV R2, #10

WAIT312:

JB P1.2, SW311 ; Nếu không nhấn, kiểm tra SW311

ACALL DL10us

DJNZ R2, WAIT312

CLR ET1 ; Được nhấn, dừng bộ đếm

JNB P1.2, $ ; Chờ thả nút

SJMP SW310

ISR_TIMER1: ; Bộ đếm giờ

CLR TR1

MOV TH1, #HIGH(-9216) ; 10ms

MOV TL1, #LOW(-9216)

SETB TR1

INC 23H

ACALL UPDATE ; Điều chỉnh giá trị các thanh ghi

RETI

UPDATE: ; Hàm con điều chỉnh giá trị các thanh ghi

MOV A, 23H

CJNE A, #10, SKIP ; SKIP trong GET_R1

MOV 23H, #0

INC 22H

MOV A, 22H

CJNE A, #10, SKIP

MOV 22H, #0

INC 21H

KHOA ĐIỆN - ĐIỆN TỬ Trang 56


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
MOV A, 21H

CJNE A, #10, SKIP

MOV 21H, #0

INC 20H

MOV A, 20H

CJNE A, #10, SKIP ; Nếu giới hạn trong 1 phút thì

MOV 20H, #0 ; so sánh với 6

RET

ISR_TIMER0:

CLR TR0

MOV TH0, #HIGH(-9216)

MOV TL0, #LOW(-9216)

SETB TR0

ACALL GET_R1 ; Lấy giá trị nạp vào R1

ACALL GET_R0 ; Lấy giá trị nạp vào R0

LCALL DisplayLED ; Hiển thị lên LED

RETI

DisplayLED:

MOV DPTR, #LED

MOV A, R1

MOVC A, @A + DPTR

ORL A, R0

MOV DPTR, #0

MOVX @DPTR, A

RET

KHOA ĐIỆN - ĐIỆN TỬ Trang 57


Thí Nghiệm Vi Xử Lý
BÀI THÍ NGHIỆM VI XỬ LÝ
LẬP TRÌNH GIAO TIẾP SERIAl PORT VÀ INTERRUPT
GET_R1:

INC R1

CJNE R1, #4, SKIP ; Nếu R1 = 4

MOV R1, #0 ; Reset R1

SKIP: RET

GET_R0:

MOV A, #20H

ADD A, R1 ; Lấy vị trí ô nhớ

MOV R0, A

MOV A, @R0

MOV R0, A

RET

DL10us: ; Hàm con delay 10 s

MOV R5, #4

DJNZ R5, $

RET

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

END

KHOA ĐIỆN - ĐIỆN TỬ Trang 58


Thí Nghiệm Vi Xử Lý

You might also like