You are on page 1of 36

1

TRƯỜNG ĐẠI HỌC BÁCH KHOA THÀNH PHỐ HỒ CHÍ MINH

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

BỘ MÔN ĐIỆN TỬ

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

GVHD:

THỰC HIỆN:

Lương Thị Thái Bình


1510226
Nguyễn Văn Chung
1410394

2
BÀI 1: LẬP TRÌNH GIAO TIẾP LED ĐƠN VÀ PHÍM
ĐƠN
THÍ NGHIỆM 1: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 %% bắt đầu chương trình tại địa chỉa 2000H
LOOP: %% khởi tạo vòng lặp
SETB P1.0 %% set chân P1.0, khi nhấn nút nó trả về 0
MOV C, P1.0 %% đọc giá trị chân P1.0 vào bit carry
MOV P3.0,C %% đọc giá trị cờ carry xuất ra P3.0
SJMP LOOP %% nhảy về vòng lặp
END %% kết thúc
- LED nối vào P1.0 và P3.0 đều bị tác động. LED tại P1.0 bị tác động do phần cứng,
khi nhấn phím, mức điện áp trên P1.0 bằng 0, đầu còn lại của LED được nối với điện
trở và nối lên VCC nên đèn tại P1.0 sáng. Tương tự, tại P3.0, 1 đầu LED được nối
vào điện trở và nối đến VCC, đầu còn lại nối đến P3.0. Khi nhấn nút, P1.0 có mức
điện áp thấp, phần mềm sẽ đọc mức điện áp và đặt cho P3.0 mức điện áp thấp nên
đèn sáng.
- Tất cả các chân trên P1 và P3 đều có thể sử dụng do tất cả các chân đều có thể
dùng làm chân IO.

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 %% đảo bit P3.0
JMP MAIN %% nhảy không điều kiện về chương trình main
END %% Kết thúc chương trình
- Theo lý thuyết, với thạch anh 11.0592MHz, chương trình trên sẽ tạo ra sóng vuông
trên P3.0 với chu kì 6.5us
- Vẽ dạng sóng:

- Tần số tối đa một xung tuần hoàn có chu kỳ nhiệm vụ 50% có thể đạt được là
153600Hz với đoạn code như trên

3
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
ORG 2000H
CONT:
CPL P3.0 %% đảo bit tại P3.0
ACALL DELAY05MS %% gọi chương trình con delay 0.5ms
SJMP CONT %% nhảy về cont
DELAY05MS: %% chương trình con delay 0.5ms
MOV R7,#230 %% move R7 giá giá trị 230
LOOP:
DJNZ R7,LOOP %% giảm R7 xuống 1 nếu chưa về 0 quay trở lại vòng lặp
RET
END
- Vòng trễ tạo ra với thời gian trễ 0.5ms. Mỗi vòng lặp DJNZ có thời gian thực thi 2
chu kì máy, mỗi chu kì máy có thời gian bằng 12 chu kì thạch anh. Gọi n là số lần
lặp:
0.5(10^-3)=2n.Tmáy=2n.12Txtal=24n.(1/11059200) => n=230.4 => chọn n=230
- Vẽ lại dạng sóng:
- Sai số nhỏ nhất có thể đạt được: (230.4-230)/230.4=0.17%

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 LOOP2:
LOOP: %% bắt đầu vòng lặp MOV R5,#250
CPL P1.0 %% đảo bit P1.0 LOOP3:
ACALL DELAY1SINS %% gọi chương DJNZ R5,LOOP3 %% nếu R5 chưa bằng
trình con delay1sins 0 quay về vòng lặp 3
SJMP LOOP %% nhảy về vòng lặp DJNZ R6,LOOP2 %% nếu R6 chưa bằng
0 quay về vòng lặp 2
DELAY1SINS:
DJNZ R7,LOOP1 %% nếu R7 chưa bằng
MOV R7,#7
0 quay về vòng lặp 1
LOOP1:
RET
MOV R6,#250
END
- Tính thời gian delay 1s:

4
1
1=2n.Tmáy=2n.12Txtal=24n.( ) => n=460800 => chọn n1=250; n2=250;
11059200
n3=7

5
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.
ORG 2000H CPL P1.6
LOOP: %% tạo vòng lặp ACALL DELAY1SINS
CPL P1.0 %% đảo bit P1.0 CPL P1.6
ACALL DELAY1SINS %%gọi lại chương CPL P1.7
trình con delay1sins
ACALL DELAY1SINS
CPL P1.0
CPL P1.7
CPL P1.1
SJMP LOOP %% nhảy về lại vòng lặp
ACALL DELAY1SINS
DELAY1SINS: %% chương trình con
CPL P1.1 delay1sins
CPL P1.2 MOV R7,#7
ACALL DELAY1SINS LOOP1:
CPL P1.2 MOV R6,#250
CPL P1.3 LOOP2:
ACALL DELAY1SINS MOV R5,#250
CPL P1.3 LOOP3:
CPL P1.4 DJNZ R5,LOOP3
ACALL DELAY1SINS DJNZ R6,LOOP2
CPL P1.4 DJNZ R7,LOOP1
CPL P1.5 RET
ACALL DELAY1SINS END
CPL P1.5

- LED ngoài cùng bên trái nối với MSB của P1

6
7
BÀI 2: LẬP TRÌNH TIMER VÀ HIỂN THỊ LED 7
ĐOẠN
THÍ NGHIỆM 1:
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
- Có dùng timer mod 2 kết hợp vòng MOV TH0,#HIGH(-461) %%nạp giá
lặp trị 461 MC cho timer (MC=1.0851us)
ORG 2000H
LOOP: %% bắt đầu vòng lặp MOV TL0,#LOW(-461)
CPL P1.0 %% đảo bit P1.0 SETB TR0 %% cho timer0 chạy
ACALL DELAY05MS %%gọi lại ct con JNB TF0,$ %% chờ đến khi timer0
tràn
SJMP LOOP %% nhảy lại vòng lặp
CLR TF0 %% xóa cờ ngắt
DELAY05MS: %% ct con delay 0.5ms
CLR TR0 %% dừng timer0
MOV TMOD,#01H %% cài đặt timer ở
chế độ 1 RET
END

- Dạng sóng có thể bị sai số, để hạn chế sai số, ta nên tính toán giá trị nạp vào TH0
và TL0 bằng tần số xtal của mạch
THÍ NGHIỆM 2:
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 %%khai báo timer0 mode 2
MOV TH0,#-46 %% nạp giá trị 46MC cho timer0
SETB TR0 %% chạy timer0
LOOP: %% khởi tạo vòng lặp
JNB TF0,$ %% chờ cho timer 0 tràn
CLR TF0 %% xóa cờ ngắt timer
CPL P1.0 %% đảo bit P1.0
SJMP LOOP %% nhảy lại vòng lặp
END
- Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit gây sai số cho dạng sóng
ngõ ra. Tuy nhiên sai số là không lớn

THÍ NGHIỆM 3:
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: %%chương trình con displayled0


MOV A,R0 %% đưa giá trị R0 vào thanh ghi A

8
ADD A,#0E0H %% cộng E0H với R0 ( E: cho dẫn led0, R0: số BCD)
MOV DPTR,#0000H %% trỏ DPTR đến địa chỉ IC 573 của led 7 đoạn
MOVX @DPTR,A %% ghi giá trị ra IC 573
RET %% kết thúc chương trình con

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 %% lưu R0=9
ACALL DISPLAYLED0 %% gọi chương trình con displayled0
DISPLAYLED0:
MOV A,R0
ADD A,#0E0H
MOV DPTR,#0000H
MOVX @DPTR,A
END

THÍ NGHIỆM 4:
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

9
ORG 2000H
MOV R0,#0 %% hiện số 0 đầu tiên
LOOP: %% khởi tạo vòng lặp
ACALL DISPLAYLED0 %% gọi chương trình con displayled0
INC R0 %% tăng R0 lên 1 đơn vị
ACALL DELAY1S %% gọi chương trình con delay1s
CJNE R0,#10,LOOP %%R0 khác 10 thì quay lại loop để hiện thị số tiếp theo
MOV R0,#0 %% R0=10 thì nạp lại 0 cho R0
SJMP LOOP %% quay lại vòng lặp để tiếp tục
DISPLAYLED0: %% chương trình con displayled0
MOV A,R0
ADD A,#0E0H
MOV DPTR,#0000H
MOVX @DPTR,A
RET
DELAY1S: %% chương trình con delay1s
MOV TMOD, #01H %%cài đặt timer0 mode 1 (16 bit)
MOV TH0,#HIGH(-50000) %%đặt timer0 đến tới 50000MC
MOV TL0,#LOW(-50000)
SETB TR0 %%cho chạy timer0
JNB TF0,$ %%chờ cho timer0 tràn
CLR TF0 %%xóa cờ báo tràn
CLR TR0 %%dừng timer0
DJNZ R7,TIMELOOP %%lặp lại 20 lần 0.05s cho đủ 1s
RET %%kết thúc chương trình con
END

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


LCD
THÍ NGHIỆM 1: 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 R1,#03 ;R1 chứa vị trí led
MOV R0,#07 ;R0 chứa giá trị led
LAP:
MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ORL A,R0
MOV DPTR,#0
MOVX @DPTR,A
SJMP LAP
TABLE: DB 0E0H,0D0H,0B0H,70H ;bảng giá trị chọn led

10
END
THÍ NGHIỆM 2: 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.
ORG 2000H
MAIN:
MOV R1,#00H
MOV R0,#04H
ACALL XUAT
ACALL DL
MOV R1,#01H
MOV R0,#03H
ACALL XUAT
ACALL DL
MOV R1,#02H
MOV R0,#02H
ACALL XUAT
ACALL DL
MOV R1,#03H
MOV R0,#01H
ACALL XUAT
ACALL DL
SJMP MAIN
;----------------------------------------
;chương trình xuất giá trị chứa trong R0 và vị trí led chứa trong R1
XUAT:
MOV A,R1
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ORL A,R0
MOV DPTR,#0
MOVX @DPTR,A
RET
TABLE: DB 0E0H,0D0H,0B0H,70H
;----------------------------------------
; chương trình tạo trễ quét led
DL:
MOV TMOD,#10H
MOV TL1,#LOW(-1000)
MOV TH1,#HIGH(-1000)
SETB TR1
11
JNB TF1,$
CLR TF1
CLR TR1
RET

END

- Khi giảm thời gian delay còn 100ms, các LED 7 đoạn chớp tắt nhanh hơn
- Khi loại bỏ hàm delay, các LED 7 đoạn không quan sát được led sáng
- Mắt người có hiện tượng lưu ảnh, những hình ảnh chuyển động với tốc độ trên 24 khung
hình 1 giây sẽ khiến mắt ta không thể phân biệt được sự nhấp nháy của ảnh. Vậy LED cần có
thời gian sáng mỗi chu kì quét là: 1/(4.25)=10ms

THÍ NGHIỆM 3: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
- Tại cuối chương trình, sau nhãn MESSAGE, sửa các kí tự trong dấu “ ” thành
tên sinh viên

ORG 2000H
RS BIT P3.5
EN BIT P3.3
MAIN:
LCALL KHOIDONGLCD

MOV A,#0
LAP: PUSH ACC
MOV DPTR,#TABLE
MOVC A,@A + DPTR
JZ EXIT
LCALL XUAT1KYTU
POP ACC
INC A
SJMP LAP
EXIT: SJMP $
;-------------------------
NHAPLENH:
MOV DPTR,#6000H
CLR EN
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;-------------------------
XUAT1KYTU:
MOV DPTR,#6000H

12
CLR EN
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;----------------------------
DL5MS:
MOV TMOD,#10H
MOV TL1,#LOW(-5000)
MOV TH1,#HIGH(-5000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
;----------------------------
KHOIDONGLCD:
MOV A,#01H
LCALL NHAPLENH
MOV A,#0EH
LCALL NHAPLENH
MOV A,#02H
LCALL NHAPLENH
MOV A,#06H
LCALL NHAPLENH
MOV A,#38H
LCALL NHAPLENH
RET

TABLE: DB "TRAN TUAN DUNG",0

END
THÍ NGHIỆM 4: Viết thêm chương trình con CLRSCREEN để xóa
màn hình LCD

CLEAR:
MOV A, #01H ;đặt giá trị cho A ứng với lệnh xóa màn hình trong LCD
LCALL NHAPLENH ;gửi lệnh tới LCD
RET
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

GOTOXY:
PUSH ACC ;cất dữ liệu đang chứa trong A
MOV A,R0 ;chọn hàng hiển thị trên LCD
MOV DPTR,#TABLE

13
MOVC A,@A+DPTR
ORL A,R1 ;chọn cột hiển thị trên LCD
LCALL NHAPLENH
POP ACC ;lấy lại dữ liệu đang chứa trong A
TABLE: DB 80H,0C0H
RET
Sửa chương trình ở thí nghiệm 1 để hiển thị thêm số nhóm ở hàng thứ 2

ORG 2000H
RS BIT P3.5
EN BIT P3.3
MAIN:
LCALL KHOIDONGLCD
MOV A,#0
LAP: PUSH ACC
MOV DPTR,#TABLE ;xuất chuỗi họ tên
MOVC A,@A + DPTR
JZ EXIT
LCALL XUAT1KYTU
POP ACC
INC A
SJMP LAP
EXIT:
;----------------------------------------------------------------
; xuất chuỗi tổ hàng R0 cột R1
MOV R1,#03
MOV R0,#01
LCALL GOTOXY
LAP1: PUSH ACC
MOV DPTR,#TABLE1 ;xuất chuỗi tổ
MOVC A,@A + DPTR
JZ KETTHUC
LCALL XUAT1KYTU
POP ACC
INC A
SJMP LAP1
KETTHUC:
SJMP $
;-------------------------
NHAPLENH:
MOV DPTR,#6000H
CLR EN
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;-------------------------
14
XUAT1KYTU:
MOV DPTR,#6000H
CLR EN
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;----------------------------
DL5MS:
MOV TMOD,#10H
MOV TL1,#LOW(-5000)
MOV TH1,#HIGH(-5000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
;----------------------------
KHOIDONGLCD:
MOV A,#01H
LCALL NHAPLENH
MOV A,#0EH
LCALL NHAPLENH
MOV A,#02H
LCALL NHAPLENH
MOV A,#06H
LCALL NHAPLENH
MOV A,#38H
LCALL NHAPLENH
RET
;----------------------------------
GOTOXY:
PUSH ACC
MOV A,R0
MOV DPTR,#TB
MOVC A,@A+DPTR
ORL A,R1
LCALL NHAPLENH
POP ACC
TB: DB 80H,0C0H
RET

TABLE: DB " THÁI BÌNH ",0


TABLE1: DB "TO: 01",0
END

15
16
BÀI 4: LẬP TRINH GIAO TIẾP PHÍM ĐƠN
VÀ BÀN PHÍM SỐ HEX
THÍ NGHIỆM 1: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)
ORG 2000H
RS BIT P3.5
EN BIT P3.3
MOV R0,#0
LCALL KHOIDONGLCD

LAP:
LCALL XOALCD
ACALL HTSO
JB P1.0,$
LCALL DL100MS ;chống rung phím delay 100ms
JNB P1.0,$
INC R0
SJMP LAP

HTSO:
MOV A,#83H ;chuyển con trỏ đến vị trí 3
LCALL NHAPLENH
MOV A,R0
MOV B,#10
DIV AB
CJNE A,#0AH,TTUC
CLR A
MOV B,#0
MOV R0,#0
TTUC:
ADD A,#30H
LCALL XUAT1KYTU
MOV A,B
ADD A,#30H
LCALL XUAT1KYTU
RET

17
;-------------------------------------------------------
NHAPLENH:
MOV DPTR,#6000H
CLR EN
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;-------------------------------------------------------------
XUAT1KYTU:
MOV DPTR,#6000H
CLR EN
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;-----------------------------------------------------------------
DL5MS:
MOV TMOD,#10H
MOV TL1,#LOW(-5000)
MOV TH1,#HIGH(-5000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
;--------------------------------------------------------------------
KHOIDONGLCD:
MOV A,#01H
LCALL NHAPLENH
MOV A,#0EH
LCALL NHAPLENH
MOV A,#02H
LCALL NHAPLENH
MOV A,#06H
LCALL NHAPLENH
MOV A,#38H
LCALL NHAPLENH
RET
;-----------------------------------------------------------------------
DL100MS:
MOV R4,#2
LAP1:
MOV TMOD,#10H
MOV TL1,#LOW(-50000)
MOV TH1,#HIGH(-50000)

18
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
DJNZ R4,LAP1
RET
;-------------------------------------------------------------------------
XOALCD:
MOV A,#01H
LCALL NHAPLENH
RET
END
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.
Thêm chương trình Delay05s sau lệnh ACALL DISPLAYSTRING trong chương trình
MAIN bằng lệnh ACALL Delay100ms.
Vì sau mỗi lần nhấn nhả phím phải có 1 khoảng thời gian vừa đủ để cho phím được nhấn nhả
xong rồi mới hiển thị lên LCD

THÍ NGHIỆM 3: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
;--------------------------------------------------------------------
MOV TMOD,#20H
MOV TH1,#-3
MOV SCON,#52H ;sử dụng seriport cho phép xuất
MOV PCON,#80H ;bit SMOD=1, tăng gấp đôi baud 9600
SETB TR1 ;cho phép timer1 hoạt động
;-------------------------------------------------------------------------
QUETLAI:
LCALL SCANKEY ;quét bàn phím
LCALL DL50MS ;chống rung phím
EXIT:
LCALL WRITETEXT ;xuất giá trị 255
SJMP QUETLAI

19
;----------------------------------------------------------------------
SCANKEY:
MOV P1,#0EFH
JB P1.0,TT1
LCALL DL50MS
JNB P1.0,$
MOV A,#'0'
JMP EXIT
TT1:
JB P1.1,TT2
LCALL DL50MS
JNB P1.0,$
MOV A,#'1'
JMP EXIT
TT2:
JB P1.2,TT3
LCALL DL50MS
JNB P1.0,$
MOV A,#'2'
JMP EXIT
TT3:
JB P1.3,TT4
LCALL DL50MS
JNB P1.0,$
MOV A,#'3'
JMP EXIT
TT4:
MOV P1,#0DFH
JB P1.0,TT5
LCALL DL50MS
JNB P1.0,$
MOV A,#'4'
JMP EXIT
TT5:
JB P1.1,TT6
LCALL DL50MS
JNB P1.0,$
MOV A,#'5'
JMP EXIT
TT6:
JB P1.2,TT7
LCALL DL50MS
JNB P1.0,$
MOV A,#'6'
JMP EXIT
TT7:
JB P1.3,TT8
LCALL DL50MS
JNB P1.0,$

20
MOV A,#'7'
JMP EXIT
TT8:
MOV P1,#0BFH
JB P1.0,TT9
LCALL DL50MS
JNB P1.0,$
MOV A,#'8'
JMP EXIT
TT9:
JB P1.1,TT10
LCALL DL50MS
JNB P1.0,$
MOV A,#'9'
JMP EXIT
TT10:
JB P1.2,TT11
LCALL DL50MS
JNB P1.0,$
MOV A,#'A'
JMP EXIT
TT11:
JB P1.3,TT12
LCALL DL50MS
JNB P1.0,$
MOV A,#'B'
JMP EXIT
TT12:
MOV P1,#7FH
JB P1.0,TT13
LCALL DL50MS
JNB P1.0,$
MOV A,#'C'
JMP EXIT
TT13:
JB P1.1,TT14
LCALL DL50MS
JNB P1.0,$
MOV A,#'D'
LJMP EXIT
TT14:
JB P1.2,TT15
LCALL DL50MS
JNB P1.0,$
MOV A,#'E'
LJMP EXIT
TT15:
JB P1.3,TT16
LCALL DL50MS
JNB P1.0,$

21
MOV A,#'F'
LJMP EXIT
TT16:
MOV A,#255
LJMP EXIT
RET
;------------------------------------------------------------------------
DL50MS:
MOV TMOD,#01H
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
;------------------------------------------------------------------------------
;chương trình xuất ký tự ra TX
WRITETEXT:
MOV R0,A ;chuyền ký tự trong A vào R0
MOV SBUF, A ;phát
JNB TI, $ ; chờ cờ báo bộ phát rỗng
CLR TI ; chuẩn bị phát byte kế
RET
END
BÀI 5: LẬP TRÌNH GIAO TIẾP SERIAL
PORT VÀ ADC
THÍ NGHIỆM 1: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 ;cài đặt port nối tiếp vào tốc độ baud
MOV TH1,#-3
SETB TR1
MOV SCON,#42H
MOV PCON,#80H
LAP:
MOV R7,#0
MOV DPTR,#TABLE
TTUC:
JB P1.0,$ ;chờ phím được nhấn
LCALL DL100MS ; chống rung phím
JNB P1.0,$ ;chờ phím được nhả
MOV A,R7
INC R7
MOVC A,@A+DPTR

22
JZ LAP
LCALL XUAT
SJMP TTUC
;---------------------------------------------------------------
; xuất ra port nt
XUAT:
JNB TI,$
CLR TI
MOV SBUF,A
RET
;---------------------------------------------------------------
DL100MS:
MOV R4,#2
LAP1:
MOV TMOD,#01H
MOV TL0,#LOW(-50000)
MOV TH0,#HIGH(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R4,LAP1
RET
;-------------------------------
TABLE: DB "HELLO,WORLD",0
END
THÍ NGHIỆM 2: 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.
ORG 2000H
RS BIT P3.5
EN BIT P3.3
MOV TMOD,#20H
MOV TH1,#-3
MOV SCON,#50H
MOV PCON,#80H
SETB TR1
CLR F0 ;bien trang thai hang(enter)
LCALL KHOIDONGLCD

23
MAIN:
LCALL INCHAR
LCALL KTRACHAR
LCALL KTRAENTER
LCALL KTRAESC
LCALL KTRABACK
SJMP MAIN
;---------------------------------------------------------------------------------------------------------------
KTRABACK:
CJNE A,#08H,OUT1
LCALL XOAKYTU
OUT1:
RET
;--------------------------------------------------
XOAKYTU:
DEC R1 ; chuyển con trỏ vị trí về vị trí trước
JB F0,H1 ; kiểm tra hàng hiện tại của con trỏ
MOV R0,#00H
SJMP GOTO
H1: MOV R0,#01H
GOTO:
LCALL GOTOXY
MOV A,#0FEH ;thay ký tự hiện tại bằng ký tự trắng
LCALL XUAT1KYTU
DEC R1 ; vì con trỏ tự động tăng lên 1 nên phải giảm vị trí đi 1
LCALL GOTOXY
RET

;---------------------------------------------------------------------------------------------------------------

KTRAENTER:
CJNE A,#13H,OUT2 ;kiểm tra mã ASCII của phím enter
LCALL CHUYENHANG
OUT2:
24
RET
;---------------------------------------------------------------------------
CHUYENHANG:
CPL F0 ; đảo cờ vị trí hàng con trỏ
JB F0,HANG1 ;kiem tra vi tri con tro
LCALL KHOIDONGLCD
MOV R1,#0
SJMP OUT4
HANG1:
MOV R0,#01 ;cho con tro len hang tren
MOV R1,#00
LCALL GOTOXY
OUT4:
RET
;---------------------------------------------------------------------------------------------------------------

KTRAESC:
CJNE A,#27H,OUT3 ; ktra mã ASCII của phím ESC
LCALL CLRLCD
OUT3:
RET
;------------------------------------------------
CLRLCD:
MOV A,#01H
LCALL NHAPLENH
MOV R1,#0 ; khoi dong lai bộ đếm vị trí cột của con trỏ tên LCD
RET

;-------------------------------------------------------------------------------------------------------
KTRACHAR:
CJNE A,#30H,$+3 ; chỉ nhận ký tự mã ASCII trong khoảng hiển thị được
JC THOAT
CJNE A,#7FH,$+3
JNC THOAT
25
CLR C
LCALL XUAT1KYTU
THOAT:
RET
;-----------------------------------------------------------------------------------
INCHAR:
JNB RI,$ ; nhận ký tự từ port nối tiếp
CLR RI
MOV A,SBUF
RET
;-------------------------------------------------------------------------------
NHAPLENH:
MOV DPTR,#6000H
CLR EN
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;-------------------------
XUAT1KYTU:
MOV DPTR,#6000H
CLR EN
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
INC R1
RET
;----------------------------
DL5MS:
MOV TMOD,#10H
26
MOV TL1,#LOW(-5000)
MOV TH1,#HIGH(-5000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
;----------------------------
KHOIDONGLCD:
MOV A,#01H
LCALL NHAPLENH
MOV A,#0EH
LCALL NHAPLENH
MOV A,#02H
LCALL NHAPLENH
MOV A,#06H
LCALL NHAPLENH
MOV A,#38H
LCALL NHAPLENH
RET
;-------------------------------------
GOTOXY:
PUSH ACC
MOV A,R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ORL A,R1
LCALL NHAPLENH
POP ACC
TABLE: DB 80H,0C0H
RET

END

27
THÍ NGHIỆM 3,4: 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
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.
RS BIT P3.5
EN BIT P3.3
ORG 2000H
MAIN:
LCALL KHOIDONGLCD
LCALL HIENTHI
LAP:
MOV DPTR,#4000H ;tao xung start
MOVX @DPTR,A
ACALL DELAY120US ;thoi gian de ADC tinh gia tri
MOVX A,@DPTR ; ket qua sau khi ADC tinh duoc chuyen vao A
MOV R5,A
ACALL XUATDIENAP
SJMP LAP
;-----------------------------------------------------------------
DELAY120US:
MOV R1,#60
DJNZ R1,$
RET
;------------------------------------------------------------
NHAPLENH:
MOV DPTR,#6000H
CLR EN
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET

;---------------------------------------------------------------
DL5MS:

28
MOV TMOD,#01H
MOV TL0,#LOW(-5000)
MOV TH0,#HIGH(-5000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
;---------------------------------------------------------------
KHOIDONGLCD:
MOV A,#01H
LCALL NHAPLENH
MOV A,#0EH
LCALL NHAPLENH
MOV A,#02H
LCALL NHAPLENH
MOV A,#06H
LCALL NHAPLENH
MOV A,#38H
LCALL NHAPLENH
RET
;-------------------------------------------------------------
XUAT1KYTU:
MOV DPTR,#6000H
CLR EN
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
LCALL DL5MS
RET
;--------------------------------------------------------------------
XUATDIENAP:
MOV A,#88H
LCALL NHAPLENH
MOV A,R5
MOV B,#51
DIV AB
ADD A,#48 ;ma ASCII gia tri dien ap phan nguyen
ACALL XUAT1KYTU
MOV A,#10
MUL AB ; phan du nhan voi 10
MOV R4,B ; trong so cao chuyen vao R4, neu gia tri
vuot qua 255 thi B co gtri 1
MOV B,#51 ; vi chia 51 nen so du lon nhat la 500
CJNE R4,#1,TIEP1
DIV AB ; neu so du lon hon 255
ADD A,#5 ; cong them vao A gia tri 255:51=5
MOV R4,A
SJMP TIEP2

29
TIEP1:
DIV AB ; phan du nho hon 255
MOV R4,A
TIEP2:
MOV A,#8AH
ACALL NHAPLENH
MOV A,R4
ADD A,#48
ACALL XUAT1KYTU
RET
;----------------------------------------------------
HIENTHI:
MOV A,#80H
ACALL NHAPLENH
MOV R3,#0
LP:
MOV A,R3
MOV DPTR,#TABLE
MOVC A,@A+DPTR
JZ EXIT
ACALL XUAT1KYTU
INC R3
SJMP LP
EXIT:
RET

TABLE: DB "VOLT: , V",0

END

BÀI 6: LẬP TRÌNH NGẮT


THÍ NGHIỆM 1: 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
LJMP MAIN ;nhảy đến chương trình chính MAIN
ORG 2023H ;địa chỉ cho ngắt serial port
LJMP SERIAL  ;nhảy đến chương trình phục vụ ngắt nếu timer tràn
MAIN:
MOV P1,#02H ;tắt led ở P1.1
MOV TMOD,#20H ;tạo timer 1 chế độ 2
MOV TH1,#-3 ;gán trị cho timer tao toc do baud
MOV SCON,#52H
MOV PCON,#80H ;tăng gấp đôi giá trị baud

30
MOV IE,#90H ;cho phép ngắt toàn cục và ngắt nối tiếp
SETB TR1 ;timer hoạt động
;---------------------------------------------------------------
;chương trình bật tắt P1.1
LAP:
MOV C,P1.0
MOV P1.1,C
SJMP LAP
;---------------------------------------------------------------------------
;chương trình phục vụ ngắt
SERIAL:
JNB RI,TRANFER ;nếu RI báo ngắt thì chuyển dl vào A rồi xuất dl, nếu TI báo ngắt thì
xóa TI và quay lại chương trình chính sẵn sàng nhận byte kế
MOV A,SBUF ;chuyển dữ liệu vào A
MOV SBUF,A ;xuất dữ liệu
CLR RI ;xóa RI để sẵn sáng nhận byte kế
SJMP EXIT
TRANFER:
CLR TI ;xóa cờ TI sẵn sàng suất byte kế tiếp
EXIT:
RETI ;trở về từ ISR
END
THÍ NGHIỆM 2: 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
LJMP MAIN0 ;nhảy đến chương trình MAIN0
ORG 2030H

MAIN0:
MOV 20H,#71H ;trị để khởi động led 3 hiện số 1
MOV 21H,#0B2H ;trị để khởi động led 2 hiện số 2
MOV 22H,#0D3H ; trị để khởi động led 1 hiện số 3
MOV 23H,#0E5H ; trị để khởi động led 0 hiện số 5
MOV TMOD,#20H ;khởi động timer 1 chế độ 2
MOV IE,#88H ;cho phép ngắt toàn cục và ngắt timer 1
MOV TH0,#HIGH(-5000) ;gán trị cho timer
SETB TR0 ;cho phép timer hoạt động
;----------------------------------------------------------------------
;chương trình chính chờ timer tràn
MAIN1:
MOV R1,#20H ;gán trị của ô nhớ 20H vào R1
LCALL HLED ;gọi chương trình hiện 4 led
LJMP MAIN1
;---------------------------------------------------------------------
;chương trình quét led
HLED:
LL:

31
MOV A,@R1 ;lấy trị của ô nhớ 20H gán vào hiện led 3
MOV DPTR, #0000h
MOVX @DPTR, A
MOV R4,#20 ;tạo trễ cho led đọc kịp 4 số
NHAY:
MOV R3,#250 ;và hiện lên 4 led
DJNZ R3,$
DJNZ R4,NHAY
INC R1 ;tăng R1 lên 1 trị tương ứng với led khác được hiện
CJNE R1,#24H,LL  ;quay lại nhãn LL đến khi hiện đủ 4 led
RET
END
THÍ NGHIỆM 3: 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
LJMP MAIN0 ;nhảy đến chương trình MAIN0 để cài đặt timer
ORG 200BH ;vecto ngắt timer0
LJMP IRS_T0 ;nhảy đến chương trình phục vụ ngắt T0
MAIN0:
MOV 20H,#70H ;trị khởi động led 3
MOV 21H,#0B0H ;trị khởi động led 2
MOV 22H,#0D0H ;trị khởi động led 1
MOV 23H,#0E0H ;trị khởi động led 0
MOV TMOD,#01H ;khởi động timer 0 chế độ 1
MOV IE,#82H ;cho phép ngắt toàn cục và timer 0
SETB TF0 ;ép ngắt timer0
;-----------------------------------------------------------------
;chương trình chính
MAIN1:
MOV R1,#20H
LCALL HLED ;hiện led
SJMP MAIN1
;---------------------------------------------------------------
; chuong trình phục vụ ngắt timer0
IRS_T0:
CLR TR0 ;ngừng timer
JNB P1.0,DEM0 ;nhấn phím thì nhảy đến DEM0
KTHUC:
MOV TH0,#HIGH(-50000) ;gán lại trị timer và khởi động lại timer
MOV TL0,#LOW(-50000)
SETB TR0
RETI
;---------------------------------------------------------------------------
;chương trình cập nhật các led
DEM0:
LCALL DELAY ;gọi hàm tạo trễ để chống rung phím
INC 23H ;tăng trị hiện trên led 0 lên 1

32
MOV A,23H ;gán vào A
CJNE A,#0EAH,DEM1 ;tăng đến khi trị đó bằng 10
MOV 23H,#0E0H ;thì quay về 0

INC 22H ;và tăng hàng chục lên 1 đơn vị


MOV A,22H ;tương tự với các led còn lại, led 2 hàng trăm led 3 hàng nghìn
CJNE A,#0DAH,DEM1
MOV 22H,#0D0H

INC 21H
MOV A,21H
CJNE A,#0BAH,DEM1
MOV 21H,#0B0H

INC 20H
MOV A,20H
CJNE A,#7AH,DEM1
MOV 20H,#70H
MOV 21H,#0B0H
MOV 22H,#0D0H
MOV 23H,#0E0H

DEM1:
NOP
LJMP KTHUC ;nhảy về nhản KTHUC để thực hiện tiếp chương trình
;------------------------------------------------------------------------------------
; chương trình quét led
HLED:
LL:
MOV A,@R1
ADD A,R0
MOV DPTR, #0000H
MOVX @DPTR, A
MOV R4,1
NHAY: MOV R3,1
DJNZ R3,$
DJNZ R4,NHAY
INC R1
CJNE R1,#24H,LL
RET
;------------------------------------------------------------------------
DELAY:
MOV R6,#200
TTRE:
MOV R7,#250
DJNZ R7,$
DJNZ R6,TTRE
RET
END

33
 THÍ NGHIỆM 4: 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.
1. Khi P1.1 nhấn, đồng hồ reset về 0
2. SW P1.0 nhấn, đồng hồ bắt đầu chạy
3. SW P1.2 nhấn, đồng hồ dừng lại

ORG 2000H
LJMP MAIN0
ORG 200BH
LJMP TM0
MAIN0:
MOV P1,#07H ;đưa 3 bít P1.0,
;P1.1, P1.2 lên múc cao
JB P1.0,$ ;đợi nhã phím để bắt
LCALL DELAY ;đầu chương trình

MOV 20H,#70H
MOV 21H,#0B0H
MOV 22H,#0D0H
MOV 23H,#0E0H

MOV TMOD,#01H
MOV IE,#82H
MOV TH0,#HIGH(-7000)
MOV TL0,#LOW(-7000)
SETB TR0

34
MAIN1:
MOV R1,#20H
ACALL HLED
JNB P1.1,LLAI1 ;nhã phím thì nhảy ;đến LLAI1 để cài lại led 0 hiện 0
SJMP MAIN1
LLAI1:
MOV A,#0E0H
MOV DPTR, #0000h
MOVX @DPTR, A
LJMP MAIN0
;-------------------------------------------------------------------
; chuong trình phục vụ ngắt timer0
TM0:
CLR TR0
JNB P1.2,DUNG ;nhấn phím, nhảy
;đến DUNG
LCALL DEM0
TRA:
MOV TH0,#HIGH(-7000)
MOV TL0,#LOW(-7000)
SETB TR0
RETI
DUNG: ;dừng đếm và hiển thị lên ;led các giá trị tức thời
CLR P1.2 ;xóa bit để ngừng hẳn việc
;đếm
SJMP TRA
;-------------------------------------------------------------
;chương trình quét led
HLED:
LL:
MOV A,@R1
MOV DPTR, #0000h
MOVX @DPTR, A
MOV R4,#20
NHAY: MOV R3,#250
DJNZ R3,$
DJNZ R4,NHAY
INC R1
CJNE R1,#24H,LL
RET
;-------------------------------------------------------
DELAY:
MOV R5,#2
TTRE1:
MOV R6,#200
TTRE:
MOV R7,#250
DJNZ R7,$
DJNZ R6,TTRE
DJNZ R5,TTRE1

35
RET

;chương trình đếm


DEM0:
INC 23H
MOV A,23H
CJNE A,#0EAH,DEM1
MOV 23H,#0E0H

INC 22H
MOV A,22H
CJNE A,#0DAH,DEM1
MOV 22H,#0D0H

INC 21H
MOV A,21H
CJNE A,#0BAH,DEM1
MOV 21H,#0B0H

INC 20H
MOV A,20H
CJNE A,#76H,DEM1
MOV 20H,#70H
MOV 21H,#0B0H
MOV 22H,#0D0H
MOV 23H,#0E0H
DEM1:
RET
END

36

You might also like