You are on page 1of 73

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

HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN- ĐIỆN TỬ


BÁO CÁO THÍ NGHIỆM MÔN VI


Giáo viên hướng dẫn: Trần Văn Hoàng
Lớp: DD17KSTD Nhóm: TND1 (Thứ 4 Tiết 2-5)
Năm học: 2018-2019 Nhóm thí nghiệm: Nhóm 04
Thành viên nhóm:
STT HỌ VÀ TÊN MSSV
1 Nguyễn Huy Khiêm 1710138
2 Huỳnh Minh Khôi 1710149
3 Huỳnh Quốc Kiệt 1710156
Báo cáo Thí nghiện Vi xử lý

BÀI THÍ NGHIỆM 1:


LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN
MỤC TIÊU:
 Nắm được cách sử dụng kit thí nghiệm, phần mềm lập trình.
 Nắm được cách lập trình giao tiếp IO port
 Nắm được cách lập trình tạo thời gian trễ dùng các lệnh
CHUẨN BỊ:
 Đọc chương 1, chương 2 và chương 6 của tài liệu hướng dẫn
 Viết chương trình và mô phỏng các bài thí nghiệm
LÝ THUYẾT VỀ PHÍM NHẤN VÀ LED:
1. Cấu tạo phần cứng của phím đơn và led:

2
Báo cáo Thí nghiện Vi xử lý

2. Tín hiệu của phím nhấn và Led:


- Đối với phim nhấn đơn trên Kit thí nghiệm được thiết kế theo cấu hình chế độ
pull-up. Nên khi nhấn phím thì chân port sẽ đọc giá trị 0. Ngược lại chân port đọc
giá trị 1.
- Đối với Led muốn Led sang thì phải cho port tín hiệu 0 do thiết kế phần cứng của
Kit thí nghiệm
CÁC BÀI THÍ NGHIỆM:
I. 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.
2. 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).
3. Code của chương trình:
ORG 2000H
LOOP:
MOV C, P1.0
MOV P3.0, C
SJMP LOOP
END
4. Trả lời câu hỏi:
- 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?
Trả lời: Khi nhấn hoặc thả nút (nút ứng với P1.0) thì do cấu cấu tạo phần cứng
của Kit thí nghiệm nên ta có Led tương ứng được nói chung port với nút (P1.0) sẽ
bị tác động đồng thời do chịu tác động của phần mềm mà ta đã nạp vào 8051 nên
Led được nói vào port quy định trong chương trình (P3.0) cũng sẽ bị tác động.
Chính vì vậy chúng ta sẽ thấy có 2 Led bị tác động khi nhấn hoặc thả nút.
- 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?
Trả lời: Các bit của 2 port đều sử dụng được trừ 2 bit P3.6 và P3.7. Vì 2 bit P3.6
và P3.7 được sử dụng để làm tín hiệu điều khiển cho chế độ 3 bus mà kit thí
nghiệm sử dụng cụ thể là P3.6=nWR, P3.7= nRD nên các LED nói vào 2 bit này
của port 3 không sử dụng được.
II. THÍ NGHIỆM 2:
1. Mục tiêu:
- Nắm được cách tạo trễ dùng vòng lặp lệnh
2. Yêu cầu:
- Viết chương trình tạo xung vuông 1 Hz, chu kỳ nhiệm vụ 50% trên P1.0
3. Code của chương trình:
ORG 2000H
3
Báo cáo Thí nghiện Vi xử lý

SETB P1.0
MAIN:
CPL P1.0
ACALL DELAY05S
SJMP MAIN
DELAY05S:
MOV R7, #4
LOOP1:
MOV R6, #224
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
END

4. Trả lời câu hỏi:


- Để tạo xung 1 Hz, các vòng trễ 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.
Trả lời: Dùng cách câu lệnh DJNZ để tạo các vòng lặp tạo trễ cho chương trình.
Dựa trên thạch anh có tần số 11.0592 MHz thì chu kỳ máy MC=1,0851 µs.
Chương trình trên do chu kỳ làm việc là 50% tức ½ chu kỳ sẽ ở mức 1, ½ còn lại
của chu kỳ sẽ là mức 0. Trong 1 chu kỳ làm việc 0.5s xung ở mức 1, 0.5s xung ở
mức 0. Vì vậy ta cần dùng chương trình tạo trễ trong thời gian 0.5s. Thời gian
chính xác mà chương trình DELAY05S trên là:
(((255.2+1+2).224+1+2).4+2+1).MC=0,4988s
|0,4988−0,5|
Sai số của chương trình DELAY05S: .100 %=0,24 %
0,5
- Sai số nhỏ nhất có thể đạt được so với yêu cầu là bao nhiêu?
Trả lời: Sai số nhỏ nhất có thể đạt được là: 0%
III. THÍ NGHIỆM 3:
1. Mục tiêu:
- Nắm được cách viết chương trình con để tạo trễ
2. 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.
3. Code chương trình:
a. Chương trình con Delay1sIns
4
Báo cáo Thí nghiện Vi xử lý

Delay1sIns:
MOV R7, #8
LOOP1:
MOV R6, #229
LOOP2:
MOV R5, #250
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
b. 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
SETB P1.0
MAIN:
CPL P1.0
ACALL Delay1sIns
SJMP MAIN
Delay1sIns:
MOV R7, #8
LOOP1:
MOV R6, #229
LOOP2:
MOV R5, #250
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
END
4. Trả lời câu hỏi:
- Thời gian 1s được tạo ra như thế nào?
Trả lời: Thời gian 1s được tạo ra bằng 3 vòng lặp DJNZ long ghép vào nhau. Dựa
vào chu kỳ máy của từng lệnh ta tính được số vòng lặp cần thiết cho lệnh DJNZ,
tạo được độ trễ 1s. Đối với chường trình Display1sIns này thì thời gian delay tính
như sau: (((250.2+1+2).229+1+2).8+2+1).MC=0,99992s. MC là chu kỳ máy
(1MC= 1,0851 µs). Sai số cùa chương trình trên: %sai số= 0,00836%.
IV. THÍ NGHIỆM 4:

5
Báo cáo Thí nghiện Vi xử lý

1. Mục tiêu:
- Nắm được cách hiển thị LED và tạo hiệu ứng
2. 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.
3. Code chương trình:
ORG 2000H
MOV A, #11111110B
MAIN:
RR A
MOV P1, A
ACALL DELAY1SINS
SJMP MAIN
DELAY1SINS:
MOV R7, #8
LOOP1:
MOV R6, #229
LOOP2:
MOV R5, #250
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
END
4. Trả lời 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?
Trả lời: Led ngoài cùng bên trái được nối đến MSB của port.
6
Báo cáo Thí nghiện Vi xử lý

BÀI THÍ NGHIỆM 2:


HIỂN THỊ LED 7 ĐOẠN
MỤC TIÊU:
 Nắm được cách giao tiếp ngoại vi ở dạng ánh xạ bộ nhớ, giao tiếp LED 7 đoạn.
CHUẨN BỊ:
 Đọc chương 2 và chương 4 của tài liệu hướng dẫn
 Viết chương trình và mô phỏng các bài thí nghiệm
LÝ THUYẾT CƠ BẢN:
1. LED 7 đoạn :

Cấu tạo của led 7 đoạn gồm 8 led đơn được nối chung cực anode (dạng led anode
chung) hoặc nối chung cực cathode (dạng led cathode chung). Các đoạn led đơn
này được đặt tên là a, b, c, d, e, f, g và dấu chấm dp. Để hiển thị một giá trị lên led
7 đoạn, cần cấp điện áp lên chân chung và các tín hiệu điều khiển đoạn tương tự
như điều khiển các led đơn.

7
Báo cáo Thí nghiện Vi xử lý

2. Thiết kế phần cứng:

CÁC BÀI THÍ NGHIỆM:


I. THÍ NGHIỆM 1:
1. Mục tiêu:
- Nắm được cách thức hiển thị LED 7 đoạn
2. 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
- 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.

8
Báo cáo Thí nghiện Vi xử lý

3. Code của chương trình:


ORG 2000H
MOV R0, #9
ACALL DISPLAYLED0
SJMP KT
DISPLAYLED0:
MOV A, R0
ADD A, #0E0H
MOV DPTR, #0000H
MOVX @DPTR, A
RET
KT:
NOP
END
II. THÍ NGHIỆM 2:
1. Mục tiêu:
- Kết hợp được các chương trình con, hiển thị LED 7 đoạn sử dụng các lệnh tạo
delay.
2. 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
3. Code của chương trình:
ORG 2000H
MAIN:
MOV R0, #0
LOOP:
ACALL DISPLAYLED0
ACALL DELAY
INC R0
CJNE R0, #10, LOOP
SJMP MAIN
DISPLAYLED0:
MOV A, R0
ADD A, #0E0H
MOV DPTR, #0000H
MOVX @DPTR, A
RET
DELAY:
9
Báo cáo Thí nghiện Vi xử lý

MOV R7, #7
LOOP1:
MOV R6, #255
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
END

III. THÍ NGHIỆM 3:


1. Mục tiêu:
- Nắm được cách dùng chương trình con có truyền tham số để điều khiển ngoại vi
2. Yêu cầu:
- Viết chương trình con DisplayLED xuất giá trị trong thanh ghi R0 lên LED 7 đoạn
có số thứ tự ghi trong thanh ghi R1
- Xuất giá trị 1 lên LED số 3
3. Code chương trình VÀ GIẢI THÍCH Ý NGHĨA
ORG 2000H
MOV R0,#1
MOV R1,#3
ACALL DISPLAYLED
SJMP $
DISPLAYLED:
MOV B, R1 ; chuyển giá trị trong R1 sang B
INC B ; tăng B 1 đơn vị
MOV A, #11110111B ; chuyển giá trị 11110111B sang A
LOOP:
RL A ; dịch trái thanh ghi A
DJNZ B, LOOP ; thực hiện B lần vòng lặp LOOP
ANL A, #11110000B ; AND A với 11110000B để giữ lại 4 bit cao của A
PUSH ACC ; lưu giá trị của A vào Stack
MOV A, R0 ; chuyển giá trị từ R0 sang A
ANL A, #00001111B ; AND A với 100001111B để giữa lại 4 bit thấp
MOV R0, A ; chuyển giá trị trong A sang R0
POP ACC ; đưa giá trị A lưu trong Stack quay lại vào A

ORL A, R0 ; OR A với R0 để 4 bit thấp là data; 4 bit cao là điều

10
Báo cáo Thí nghiện Vi xử lý

;khiển LED
MOV DPTR, #0000H
MOVX @DPTR, A
RET
4. Trả lời câu hỏi:
- Giải thích ý nghĩa các lệnh của đoạn chương trình trong hướng dẫn.
- Trả lời: Ý nghĩa chi tiết các câu lệnh được giải thích trên phần code.
IV. THÍ NGHIỆM 5:
1. Mục tiêu:
- Nắm được phương pháp quét LED 7 đoạn
2. Yêu cầu:
- Viết chương trình hiện thị số 1 lên LED 7 đ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 lặp lại.
- Giảm trễ 100ms
- Tính toán thời gian để không còn nhấp nháy
- Trễ =0
3. Code chương trình:
a. Code thời gian delay 1S:

ORG 2000H
MAIN:
MOV R1, #0
MOV R0, #1
MAIN1:
LCALL DISPLAYLED
LCALL DELAY1S
INC R1
INC R0
CJNE R0, #5, MAIN1
LJMP MAIN
DISPLAYLED:

11
Báo cáo Thí nghiện Vi xử lý

MOV B, R1
INC B
MOV A, #11110111B
LOOP:
RL A
DJNZ B, LOOP
ANL A, #11110000B
PUSH ACC
MOV A, R0
ANL A, #00001111B
MOV R0, A
POP ACC
ORL A, R0
MOV DPTR, #0000H
MOVX @DPTR, A
RET
DELAY1S:
MOV R7, #7
LOOP1:
MOV R6, #255
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET

12
Báo cáo Thí nghiện Vi xử lý

END
b. Code thời gian delay 100MS:
- Thay chương trình con DELAY1S ở code trên bằng chương trình con sau:
DELAY100MS:
MOV R6, #183
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
RET
c. Thời gian tính toán để không nhấp nháy 10MS
DELAY10MS:
MOV R6, #38
LOOP2:
MOV R5, #130
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
RET
4. Trả lời 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.
- Trả lời: Thời gian trễ để không còn thấy LED nhấp nháy theo lý thuyết là:
1/4T >24 ( số lần chớp trong 1s của Led lớn hơn 24 lần )
 T<10.4 MS.
- Khi giảm rất nhỏ thời gian trễ, hiện tượng xảy ra là gì? Giải thích
- Trả lời: Khi giảm thời gian trễ rất nhỏ thì mắt ta sẽ thấy các LED hiển thị cùng
1 lúc và không có hiện tượng giật LED. Giải thích là do chu kì sáng tắt của
LED rất nhỏ do thời gian delay nhỏ nên mắt người không còn cảm giác về sợ
sáng tắt liên tục của LED.

13
Báo cáo Thí nghiện Vi xử lý

BÀI THÍ NGHIỆM 3:


GIAO TIẾP LCD VÀ ADC

MỤC TIÊU:
 Nắm được cách điều khiển LCD
 Nắm được cách giao tiếp ADC
 Nắm được cách chuyển giá trị đọc được thành giá trị thực tế
CHUẨN BỊ:
 Đọc chương 5 và chương 9 của tài liệu hướng dẫn
 Viết chương trình và mô phỏng các bài thí nghiệm
LÝ THUYẾT VỀ LCD VÀ ADC:
1. Lý thuyết về LCD:
a. Các chân của LCD và chức năng:

Chân số Tên Chức năng


1 V ss Đất
2 V DD Cực + của nguồn điện
3 V EE Tương phản (constract)
4 RS Register Select (Chọn thanh ghi)
5 R/W Read/Write
6 E Enable (Cho phép)
7 D0 Bit 0 của dữ liệu
8 D1 Bit 1 của dữ liệu
9 D2 Bit 2 của dữ liệu
10 D3 Bit 3 của dữ liệu
11 D4 Bit 4 của dữ liệu
12 D5 Bit 5 của dữ liệu
13 D6 Bit 6 của dữ liệu
14 D7 Bit 7 của dữ liệu

b. Thiết kế phần cứng của LCD:

14
Báo cáo Thí nghiện Vi xử lý

2. Lý thuyết về ADC:
Vi mạch ADC (Analog to Digital Converter) được sử dụng để chuyển đổi các tín
hiệu từ dạng tương tự sang dạng số.
Kit thí nghiệm sử dụng vi mạch chuyển đổi ADC0809. Sơ đồ kết nối như sau:

CÁC BÀI THÍ NGHIỆM:


I. THÍ NGHIỆM 1:
15
Báo cáo Thí nghiện Vi xử lý

1. Mục tiêu:
- Nắm được cách thức xuất giá trị lên LCD.
2. 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à chayjthurw chương trình,
- Sủa chương trình để hiển thị tên sinh viên lên hàng đầu.
3. Code chương trình:
a. Code chương trình mẫu:
LCD_E BIT P3.4
LCD_RS BIT P3.5
LCDADDR EQU 8000H

ORG 2000H
MAIN:
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
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
16
Báo cáo Thí nghiện Vi xử lý

WRITETEXT:
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
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
DJNZ B, LOOP
EXIT:
RET

WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET

MESSAGE:
DB 'HELLO WORLD!',0
END
b. Code chương trình sau khi sửa theo yêu cầu:
LCD_E BIT P3.4
LCD_RS BIT P3.5
LCDADDR EQU 8000H

ORG 2000H
MAIN:

17
Báo cáo Thí nghiện Vi xử lý

MOV DPTR, #LCDADDR


ACALL CLEAR
ACALL INIT_LCD
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

DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE
MOV R0,A
18
Báo cáo Thí nghiện Vi xử lý

MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
DJNZ B, LOOP
EXIT:
RET

WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET

MESSAGE:
DB 'KHOI KIEN KIET',0
END
4. Trả lời câu hỏi:
- Giải thích ý nghĩa và cách sử dụng các chương trình con trên project mẫu.
- Trả lời: Ý nghĩa và cách sử dụng các chương trình con của project mẫu:
- Chương trình con INIT_LCD có nhiệm vụ khởi động module LCD
- Chương trình con CLEAR có nhiệm vụ xóa tất cả các ký tự đang hiển
thị của LCD
- Chương trình con WRITECOM có nhiệm vụ ghi 1 byte lệnh đến LCD
- Chương trình con WRITETEXT có nhiệm vụ ghi 1 byte dữ liệu hiển thị
đến LCD
- Chương trình con DISPLAYSTRING để dễ dàng hơn trong việc lấy các
ký tự và xuất ra LCD bằng phương pháp tra bảng
- Chương trình con WAIT_LCD tạo thời gian trễ để LCD có thể hoàn
thành thao tác hiện thời trước khi bắt đầu 1 thao tác khác
II. THÍ NGHIỆM 2:
1. 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ỏ 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.
2. Code chương trình:

19
Báo cáo Thí nghiện Vi xử lý

a. Code chương trình con CLRSCREEN:

CLRSCREEN:
MOV A, #01H
ACALL WRITECOM
RET

b. Code chương trình con GOTOXY:

GOTOXY:
PUSH ACC
MOV A, R0
MOV DPTR, #TB
MOVC A, @A+DPTR
ADD A, R1
ACALL WRITECOM
POP ACC
TB:
DB 80H, 0C0H
RET
c. Code chương trình ở thí nghiệm 1 sau khi sửa theo yêu cầu:

LCD_E BIT P3.4


LCD_RS BIT P3.5
LCDADDR EQU 8000H

ORG 2000H
MAIN:
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING01
MOV R0, #1
MOV R1, #3
ACALL GOTOXY
ACALL DISPLAYSTRING02
SJMP $

INIT_LCD:
MOV A, #38H
20
Báo cáo Thí nghiện Vi xử lý

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

DISPLAYSTRING01:
MOV A,#0
LOOP1:
MOV DPTR, #MESSAGE01
MOV R3,A
MOVC A,@A+DPTR
JZ EXIT01
ACALL WRITETEXT
MOV A,R3
INC A
DJNZ B, LOOP1
EXIT01:
RET

21
Báo cáo Thí nghiện Vi xử lý

DISPLAYSTRING02:
MOV A,#0
LOOP2:
MOV DPTR, #MESSAGE02
MOV R3,A
MOVC A,@A+DPTR
JZ EXIT02
ACALL WRITETEXT
MOV A,R3
INC A
DJNZ B, LOOP2
EXIT02:
RET

WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET

GOTOXY:
PUSH ACC
MOV A, R0
MOV DPTR, #TB
MOVC A, @A+DPTR
ADD A, R1
LCALL WRITECOM
POP ACC
TB: DB 80H, 0C0H
RET

MESSAGE01:
DB 'KHOI KIEN KIET!',0
MESSAGE02:
DB "NHOM 04",0
END
III. THÍ NGHIỆM 3:
1. 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

22
Báo cáo Thí nghiện Vi xử lý

- 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
2. Code chương trình:
a. Code chương trình con READADC:
READ_ADC:
MOV DPTR,#4000H
MOVX @DPTR,A
ACALL WAIT_LCD
MOVX A, @DPTR
MOV R0,A
RET

b. Code chương trình theo yêu cầu:

EN BIT P3.4
RS BIT P3.5
ORG 2000H
MAIN:
LCALL INIT_LCD
LCALL CLEAR
MOV R2, #0
MOV R3, #2
LOOP:
;LCALL CLEAR
LCALL GOTOXY
LCALL READADC
LCALL DISPLAYADC
;LCALL DELAY
SJMP LOOP
;-------------
READADC:
MOV DPTR, #4000H
MOVX @DPTR, A
ACALL DELAY_LCD
MOVX A, @DPTR
MOV R0, A
RET
;------------
DISPLAYADC:
MOV A, R0
MOV B, #100

23
Báo cáo Thí nghiện Vi xử lý

DIV AB
ADD A, #30H
LCALL WRITE_DATA
MOV A,B
MOV B,#10
DIV AB
ADD A, #30H
LCALL WRITE_DATA
MOV A, B
ADD A, #30H
LCALL WRITE_DATA
RET
;-------------
INIT_LCD:
MOV A, #38H
LCALL WRITE_COM
MOV A, #0EH
LCALL WRITE_COM
MOV A, #06H
LCALL WRITE_COM
RET
;---------------
CLEAR:
MOV A, #01H
LCALL WRITE_COM
RET
;-------------
WRITE_COM:
MOV DPTR, #8000H
SETB EN
CLR RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
RET
;--------------
WRITE_DATA:
MOV DPTR, #8000H
SETB EN
SETB RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
24
Báo cáo Thí nghiện Vi xử lý

RET
;---------------
DELAY_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
;-----------------
GOTOXY:
PUSH ACC
MOV A, R2
MOV DPTR, #TB
MOVC A,@A+DPTR
ADD A, R3
LCALL WRITE_COM
POP ACC
RET
;-----------------
DELAY:
PUSH 06H
PUSH 07H
MOV R5,#8
DL3:
MOV R6,#250
DL2:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL2
DJNZ R5, DL3
POP 06H
POP 07H
RET
;------------------
TB:
DB 80H, 0C0H
END

3. Trả lời 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?

25
Báo cáo Thí nghiện Vi xử lý

- Trả lời: Giá trị 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?

- Trả lời: Để hiển thị giá trị thực tế của mức diện áp đặt vào kênh 0 ta dùng
công thức:
Giá trị thực tế =Giá trị đo∗¿ ¿

IV. THÍ NGHIỆM 4:


1. 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).
- 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.
2. Code chương trình:
a. Code chương trình con CALADC:
CALADC:
PUSH 05H
MOV A, R0
MOV B, #51
DIV AB
MOV 30H, A
MOV A,B
MOV B, #10
MUL AB
MOV 31H, B
MOV B, #51
DIV AB
MOV 32H, B
MOV R5, 31H
CJNE R5, #01H, BANG0_1
ADD A, #5
BANG0_1:
MOV 31H, A
MOV A, 32H
MOV B, #10
MUL AB
MOV 33H, B
MOV B, #51
26
Báo cáo Thí nghiện Vi xử lý

DIV AB
MOV R5, 33H
CJNE R5, #01H, BANG0_2
ADD A, #5
BANG0_2:
MOV 32H, A
POP 05H
RET

b. Code chương trình hiển thị giá trị đo được lên LCD:

EN BIT P3.4
RS BIT P3.5
ORG 2000H
MAIN:
LCALL CLEAR
LCALL INIT_LCD
LCALL DISPLAYSTRING01
MAIN_LOOP1:
LCALL READADC
LCALL CALADC
LCALL DISPLAYSTRING02
MOV R5, #225
MINILOOP:
LCALL DELAY_LCD
DJNZ R5, MINILOOP
SJMP MAIN_LOOP1
;---------------
INIT_LCD:
MOV A, #38H
LCALL WRITE_COM
MOV A, #0EH
LCALL WRITE_COM
MOV A, #06H
LCALL WRITE_COM
RET
;---------------
CLEAR:
MOV A, #01H
LCALL WRITE_COM
RET
;-------------

27
Báo cáo Thí nghiện Vi xử lý

WRITE_COM:
MOV DPTR, #8000H
SETB EN
CLR RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
RET
;--------------
WRITE_DATA:
MOV DPTR, #8000H
SETB EN
SETB RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
RET
;---------------
DELAY_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
;-----------------
GOTOXY:
PUSH ACC
MOV A, R2
MOV DPTR, #TB
MOVC A,@A+DPTR
ADD A, R3
LCALL WRITE_COM
POP ACC
RET
;-----------------
CALADC:
PUSH 05H
MOV A, R0
MOV B, #51
DIV AB
MOV 30H, A
MOV A,B
28
Báo cáo Thí nghiện Vi xử lý

MOV B, #10
MUL AB
MOV 31H, B
MOV B, #51
DIV AB
MOV 32H, B
MOV R5, 31H
CJNE R5, #01H, BANG0_1
ADD A, #5
BANG0_1:
MOV 31H, A
MOV A, 32H
MOV B, #10
MUL AB
MOV 33H, B
MOV B, #51
DIV AB
MOV R5, 33H
CJNE R5, #01H, BANG0_2
ADD A, #5
BANG0_2:
MOV 32H, A
POP 05H
RET
;-------------------
;CHUONG TRINH HIEN THI KI TU TREN LCD
DISPLAYSTRING01:
MOV A, #0
MAIN_LOOP:
MOV R5, A
MOV DPTR, #MAIN_TB
MOVC A, @A+DPTR
JZ KETTHUC
LCALL WRITE_DATA
MOV A, R5
INC A
SJMP MAIN_LOOP
KETTHUC:
MAIN_TB:
DB 'Voltage: ',0
RET
;-----------------------
DISPLAYSTRING02:
29
Báo cáo Thí nghiện Vi xử lý

MOV R2, #0
MOV R3, #9
LCALL GOTOXY
MOV A, 30H
ADD A, #30H
LCALL WRITE_DATA
MOV A, #','
LCALL WRITE_DATA
MOV A, 31H
ADD A, #30H
LCALL WRITE_DATA
MOV A, 32H
ADD A, #30H
LCALL WRITE_DATA
MOV A, #' '
LCALL WRITE_DATA
MOV A, #'V'
LCALL WRITE_DATA
RET
;-----------------------
READADC:
MOV DPTR, #4000H
MOVX @DPTR, A
ACALL DELAY_LCD
MOVX A, @DPTR
MOV R0, A
RET
;----------------------
TB:
DB 80H, 0C0H
;----------------------
END

30
Báo cáo Thí nghiện Vi xử lý

BÀI THÍ NGHIỆM 4:


LẬP TRÌNH GIAO TIẾP TIMER VÀ SERIAL PORT
MỤC TIÊU:
 Nắm được cách giao tiếp timer để tạo trễ và tạo baudrate
 Nắm được cách giao tiếp port nối tiếp
CHUẨN BỊ:
 Đọc chương 3 và chương 7 của tài liệu hướng dẫn
 Viết chương trình và mô phỏng các bài thí nghiệm
LÝ THUYẾT VỀ TIMER VÀ SERIAL PORT:
1. Lý thuyết về Timer:
Để tạo ra các khoảng thời gian trễ chính xác người ta thường dùng ngoại vi timer.
Timer (bộ định thì) thường dùng để đo khoảng thời gian. Thực chất Timer là một
bộ đếm xung với xung đếm có tần số cố định và biết trướ. Khi xác định được số
xung đếm và biết chu kỳ của xung thì có thể tính được thời gian. Timer của 8051
có thể hoạt động ở chế độ 8-bit hoặc 16-bit. Tùy theo số xung đếm cần nhiều hay
ít mà có thể cấu hình Timer ở chế độ tương ứng.

2. Lý thuyết về Serial port:


a. Khung truyền nối tiếp bất đồng bộ:

Thuật ngữ tốc độ baud dùng để chỉ tốc độ truyền dữ liệu nối tiếp được truyền.
Tốc độ baud được định nghĩa 1/(thời gian giữa những chuyển tiếp tín hiệu).
b. Thiết kế phần cứng:
31
Báo cáo Thí nghiện Vi xử lý

Hai tín hiệu dùng cho giao tiếp là TXD và RXD trên Port 3 của 8051. Như vậy,
người lập trình cần bật ON hai switch này (của SW_CC4) để có thể dùng cổng
nối tiếp:

CÁC BÀI THÍ NGHIỆM:


I. THÍ NGHIỆM 1:
1. Mục tiêu:
- Nắm được cách thức tạo trễ sử dụng Timer chế độ 1.
2. Yêu cầu:
- Viết chương trình tạo sóng vuông 1Hz trên chân P1.0 sử dụng timer 0 ở
chế độ 1.
3. Code chương trình:
ORG 2000H
MAIN_LOOP:
MOV R7, #10
CPL P1.0
MAIN_LOOP_1:
ACALL DELAY005S
DJNZ R7, MAIN_LOOP_1
SJMP MAIN_LOOP
DELAY005S:
MOV TMOD, #01H
MOV TH0, #HIGH(-46080)
MOV TL0, #LOW(-46080)
32
Báo cáo Thí nghiện Vi xử lý

SETB TR0
JNB TF0, $
CLR TF0
RET
END

4. Trả lời câu hỏi:


- Để tạo sóng 1 Hz, ta có thể sử dụng timer ở chế độ 2 được không?
- Trả lời: Để tạo sóng 1 Hz, ta có thể sử dụng timer chế độ 2 được.
- Dạng sóng 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?
- Trả lời: Dạng sóng có sai số. Để hạn chế sai số ta nạp các giá trị vào timer như
code trên.
II. THÍ NGHIỆM 2:
1. Mục tiêu:
- Nắm được cách thức tạo trễ sử dụng Timer chế độ 2.
2. Yêu cầu:
- Viết chương trình tạo sóng vuông 1Hz trên chân P1.0 sử dụng timer 0 ở
chế độ. 2
3. Code chương trình:

ORG 2000H
MAIN_LOOP:
MOV DPTR, #0000H
CPL P1.0
MOV TMOD, #02H
MOV TH0, #(-251)
SETB TR0
LOOP:
JNB TF0, $
CLR TF0
INC DPTR
MOV A, DPH
CJNE A, #07H, TIEP
MOV A, DPL
CJNE A, #33H, TIEP
CLR TR0
SJMP MAIN_LOOP
TIEP:

33
Báo cáo Thí nghiện Vi xử lý

SJMP LOOP
END
4. Trả lời 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?
- Trả lời: Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit không gây sai
số cho dạng sóng ngõ ra. Vì ở chế độ 2, giá trị được tự động nạp lại khi tràn
nên không cần phải dừng lại để nạp lại giá trị, do đó dạng sóng chỉ bị dịch đi
do các độ trễ chứ không gây ra sai số cho dạng sóng.
III. THÍ NGHIỆM 3:
1.Mục tiêu:
- Nắm được cách thức điều khiển cổng nối tiếp.
2.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.
3. Code chương trình:

ORG 2000H
;SET SMOD LEN 1
MOV A, PCON
SETB ACC.7
MOV PCON, A
;SET SERIAL PORT MODE 1
MOV SCON, #01010010B
;SET TOC DO BAUD THONG QUA TIMER 1
MOV TMOD, #20H
MOV TH1, #(-3)
SETB TR1
MAIN_LOOP1:
MOV R7, #0
MOV DPTR, #TABLE
MAIN_LOOP2:
JB P1.0, $
ACALL DELAY
JNB P1.0, $
MOV A, R7
INC R7
MOVC A, @A+DPTR
JZ MAIN_LOOP1

34
Báo cáo Thí nghiện Vi xử lý

ACALL SEND
SJMP MAIN_LOOP2
SEND:
JNB TI, $
CLR TI
MOV SBUF, A
RET
;---------------------------

DELAY:
MOV R6, #183
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
RET
;-------------------------------
TABLE: DB "HELLO,WORLD ",0
END

IV. THÍ NGHIỆM 4:


1. 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 tại vị trí cột 0 hàng 0, đồng
thời phát trở lại lên serial port.
2. Code chương trình:

RS BIT P3.5
EN BIT P3.4
ORG 2000H
MOV A, PCON
SETB ACC.7
MOV PCON, A
MOV SCON, #01010010B
MOV TMOD, #20H
MOV TH1, #-3
SETB TR1
;--------------
;--------------CT CHINH----------------------

35
Báo cáo Thí nghiện Vi xử lý

ACALL INIT_LCD
ACALL CLEAR_LCD
MAIN_LOOP:
ACALL RECIEVE
ACALL SEND
MOV R0, #0
MOV R1, #0
ACALL GOTOXY
ACALL WRITE_DATA
SJMP MAIN_LOOP
;---------CT CON CHO HYPERTERMINAL----------
RECIEVE:
JNB RI, $
CLR RI
MOV A, SBUF
RET
SEND:
JNB TI, $
CLR TI
MOV SBUF, A
RET
;-------------------------------------------
;------CT CON CHO LCD-----------------------
INIT_LCD:
MOV A, #38H
ACALL WRITE_COM
MOV A, #0EH
ACALL WRITE_COM
MOV A, #06H
ACALL WRITE_COM
RET
;----
CLEAR_LCD:
MOV A, #01H
ACALL WRITE_COM
RET
;---
WRITE_COM:
CLR RS
SETB EN
MOV DPTR, #8000H
MOVX @DPTR, A
CLR EN
36
Báo cáo Thí nghiện Vi xử lý

ACALL DELAY
RET
;----
WRITE_DATA:
SETB RS
SETB EN
MOV DPTR, #8000H
MOVX @DPTR, A
CLR EN
ACALL DELAY
RET
;----
GOTOXY:
PUSH ACC
MOV A, R0
MOV DPTR, #TB
MOVC A, @A+DPTR
ADD A, R1
LCALL WRITE_COM
POP ACC
RET
;---------------------------------------
;---------------CT CON DELAY-------------
DELAY:
MOV R6, #183
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
RET
;---------------------------------------
TB:
DB 80H, 0C0H
;---------------------------------------
END

V. THÍ NGHIỆM 5:
1. 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:

37
Báo cáo Thí nghiện Vi xử lý

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.
2. Code chương trình:

EN BIT P3.4
RS BIT P3.5
ORG 2000H
;----------KHOI DONG CAC THONG SO---------
MOV A, PCON
SETB ACC.7
MOV PCON, A
MOV SCON, #01010010B
MOV TMOD, #20H
MOV TH1, #-3
SETB TR1
;------------------------------------------
;------------CT CHINH----------------------
MAIN:
LCALL RECIEVE
LCALL CHAR_TEST
LCALL ENTER_TEST
LCALL ESC_TEST
LCALL BACK_TEST
SJMP MAIN
;------------------------------------------
;CT NHAN TU HYPERTERNIMAL
RECIEVE:
JNB RI, $
CLR RI
MOV A, SBUF
RET
;-------------------------------------------
;CT KIEM TRA PHAI CHU CAI KHONG
CHAR_TEST:
CJNE A, #30H, $+3
JC CHAR_TEST_OUT
CJNE A, #7FH, $+3
JNC CHAR_TEST_OUT
CLR C
LCALL WRITE_DATA
CHAR_TEST_OUT:
RET

38
Báo cáo Thí nghiện Vi xử lý

;---------------------------------------------
;KHOI DONG LCD
INIT_LCD:
MOV A, #01H
ACALL WRITE_COM
MOV A, #02H
ACALL WRITE_COM
MOV A, #38H
ACALL WRITE_COM
MOV A, #0EH
ACALL WRITE_COM
MOV A, #06H
ACALL WRITE_COM
RET
;---------------------------------------------
;XOA MAN HINH
CLEAR_LCD:
MOV A, #01H
ACALL WRITE_COM
RET
;----------------------------------------------
;GHI LENH
WRITE_COM:
CLR RS
SETB EN
MOV DPTR, #8000H
MOVX @DPTR, A
CLR EN
ACALL DELAY
RET
;-----------------------------------------------
;GHI DATA
WRITE_DATA:
SETB RS
SETB EN
MOV DPTR, #8000H
MOVX @DPTR, A
CLR EN
ACALL DELAY
INC R1
RET
;------------------------------------------------
;KT ENTER
39
Báo cáo Thí nghiện Vi xử lý

ENTER_TEST:
CJNE A, #13H, ENTER_TEST_OUT
LCALL EXCHANGE
ENTER_TEST_OUT:
RET
;------------------------------------------------
;CT CHUYEN HANG
EXCHANGE:
CPL F0
JB F0, HANG01
LCALL INIT_LCD
MOV R1, #0
SJMP EXCHANGE_OUT
HANG01:
MOV R0, #1
MOV R1, #0
LCALL GOTOXY
EXCHANGE_OUT:
RET
;------------------------------------------------
;GO TO XY
GOTOXY:
PUSH ACC
MOV A, R0
MOV DPTR, #TB
MOVC A, @A+DPTR
ADD A, R1
LCALL WRITE_COM
POP ACC
RET
;------------------------------------------------
;KT ESC
ESC_TEST:
CJNE A, #27H, ESC_TEST_OUT
LCALL CLEAR_LCD
ESC_TEST_OUT:
RET
;-------------------------------------------------
;KT BACKSPASE
BACK_TEST:
CJNE A, #08H, BACK_TEST_OUT
LCALL CHAR_DEL
BACK_TEST_OUT:
40
Báo cáo Thí nghiện Vi xử lý

RET
;--------------------------------------------------
;XOA KY TU
CHAR_DEL:
DEC R1
JNB F0, H1
MOV R0, #00H
SJMP GOTO
H1: MOV R0, #01H
GOTO:
LCALL GOTOXY
MOV A, #0FEH
LCALL WRITE_DATA
DEC R1
LCALL GOTOXY
RET
;-----------------------------------------------------
DELAY:
MOV R6, #183
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
RET

;-------------------------------------------------
TB:
DB 80H, 0C0H
;-------------------------------------------------
END

41
Báo cáo Thí nghiện Vi xử lý

BÀI THÍ NGHIỆM 5:


LẬP TRÌNH NGẮT
MỤC TIÊU:
 Nắm được cách lập trình cho ngắt của 8051
CHUẨN BỊ:
 Đọc chương 8 của tài liệu hướng dẫn
 Viết chương trình và mô phỏng các bài thí nghiệm
LÝ THUYẾT CƠ BẢN:
Ngắt là tính năng rất quan trọng của vi xử lý, cho phép chương trình phục vụ một
ngoại vi khi cần mà không cần phải mất thời gian hỏi vòng (polling) các ngoại vi.

Với 8051, khi xảy ra sự kiện ngắt, ví dụ như timer tràn, chương trình sẽ quay về
một địa chỉ cố định trong bộ nhớ chương trình, địa chỉ này được gọi là vector ngắt của
ngoại vi. Từ địa chỉ này, chương trình thực hiện một lệnh nhảy đến địa chỉ của chương
trình phục vụ ngắt.

42
Báo cáo Thí nghiện Vi xử lý

Để cho phép ngắt, người lập trình phải cho phép bit tương ứng trong thanh ghi IE

Người lập trình cũng có thể chọn mức ưu tiên cho ngắt thông qua thanh ghi IP

43
Báo cáo Thí nghiện Vi xử lý

CÁC BÀI THÍ NGHIỆM:


I. THÍ NGHIỆM 1:
I. Mục tiêu:
- Nắm được cách sử dụng ngắt serial port
2. 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ả.
3. Code của chương trình:
ORG 2000H
LJMP MAIN
ORG 2023H
LJMP SPISR
ORG 2030H
MAIN:
MOV A, PCON
SETB ACC.7
MOV PCON, A
MOV TMOD, #20H
MOV SCON, #01010000B
MOV TH1, #-3
SETB EA
SETB ES
SETB TR1
MAIN_LOOP:
JNB P1.0, DUOCNHAN
SETB P1.1
SJMP MAIN_LOOP
DUOCNHAN:
CLR P1.1
SJMP MAIN_LOOP
SPISR:
JB RI, NHAN
CLR TI
SJMP DONE
NHAN:
CLR RI
44
Báo cáo Thí nghiện Vi xử lý

MOV A, SBUF
MOV SBUF, A
DONE:
RETI
END
II. THÍ NGHIỆM 2:
1. Mục tiêu:
Nắm được cách sử dụng ngắt timer
2. 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.

3. Code của chương trình:


ORG 2000H
LJMP MAIN
ORG 200BH
LJMP DISPLAY
ORG 2030H
MAIN:
MOV 23H,#9
MOV 22H, #2
MOV 21H,#3
MOV 20H, #1
MOV R1,#0
MOV TMOD ,#01H
MOV TH0,#HIGH(-7500)
MOV TL0,#LOW(-7500)
SETB TR0
SETB EA
SETB ET0
SJMP $
;------------------------
DISPLAY:
CLR TR0
CLR TF0
MOV TL0,#LOW(-7500)
MOV TH0,#HIGH(-7500)
SETB TR0

45
Báo cáo Thí nghiện Vi xử lý

MOV R0,#20H
CJNE R1,#4,NEXT
MOV R1,#0
NEXT:
MOV A,R0
ADD A,R1
MOV R0,A
MOV A,@R0
MOV R0,A
ACALL DISPLAYLED
INC R1
RETI
;-----------------------------
DISPLAYLED:
MOV B,R1
INC B
MOV A,#11111110B
SHIFTLOOP:
RR A
DJNZ B, SHIFTLOOP
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

III. THÍ NGHIỆM 3:


1. 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
2. Code chương trình
ORG 2000H
LJMP MAIN

46
Báo cáo Thí nghiện Vi xử lý

ORG 200BH
LJMP DISPLAY
ORG 2030H
MAIN:
MOV 23H,#0
MOV 22H, #0
MOV 21H,#0
MOV 20H, #0
MOV R1,#0
MOV TMOD ,#01H
MOV TH0,#HIGH(-9000)
MOV TL0,#LOW(-9000)
SETB TR0
SETB EA
SETB ET0
MAIN_LOOP:
JB P3.5, M_NEXT
ACALL DELAY
JNB P3.5, $
LCALL COUNTER
M_NEXT:
SJMP MAIN_LOOP
;------------------------
DISPLAY:
CLR TR0
CLR TF0
MOV TL0,#LOW(-9000)
MOV TH0,#HIGH(-9000)
SETB TR0
MOV R0,#20H
CJNE R1,#4,NEXT
MOV R1,#0
NEXT:
MOV A,R0
ADD A,R1
MOV R0,A
MOV A,@R0
MOV R0,A
ACALL DISPLAYLED
INC R1
47
Báo cáo Thí nghiện Vi xử lý

RETI
;-----------------------------
DISPLAYLED:
MOV B,R1
INC B
MOV A,#11111110B
SHIFTLOOP:
RR A
DJNZ B, SHIFTLOOP
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
;---------------------------
COUNTER:
MOV 30H, R0
MOV R0, #23H
MOV A, @R0
CJNE A, #9, SKIP
MOV 23H, #0
DEC R0
MOV A, @R0
CJNE A, #9, SKIP
MOV 22H, #0
DEC R0
MOV A, @R0
CJNE A, #9, SKIP
MOV 21H, #0
DEC R0
MOV A, @R0
CJNE A, #9, SKIP
MOV 20H, #0
SJMP COUNTER_DONE
SKIP:
48
Báo cáo Thí nghiện Vi xử lý

INC A
MOV @R0, A
COUNTER_DONE:
RET
;-----------------------------
DELAY:
MOV R6,#25
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
END
IV. THÍ NGHIỆM 4:
1. 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.

2. Code chương trình:


RE BIT P1.0 ;RESET
SA BIT P1.1 ;START
SO BIT P1.2 ;STOP
ORG 2000H
LJMP MAIN
ORG 200BH
LJMP DISPLAY
ORG 201BH
LJMP COUNTER

49
Báo cáo Thí nghiện Vi xử lý

ORG 2030H
MAIN:
CLR TR1
MOV R6, #0 ;PHAN TRAM GIAY
MOV R7, #0 ;GIAY
MOV 23H,#0
MOV 22H, #0
MOV 21H,#0
MOV 20H, #0
MOV R1,#0
MOV TMOD ,#11H
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
MOV TH1,#HIGH(-10000)
MOV TL1,#LOW(-10000)
SETB TR0
SETB EA
SETB ET0
SETB ET1
MAIN_LOOP:
JNB RE, RESET
XL_CONT:
JNB SO, STOP
XL_CONT1:
JNB SA, START
SJMP M_NEXT
;------------------------

50
Báo cáo Thí nghiện Vi xử lý

START:
SETB TR1
SJMP M_NEXT
;------------------------
STOP:
CLR TR1
SJMP M_NEXT
;------------------------
RESET:
SJMP MAIN
;------------------------
M_NEXT:
SJMP MAIN_LOOP
;------------------------
DISPLAY:
CLR TR0
CLR TF0
MOV TL0,#LOW(-10000)
MOV TH0,#HIGH(-10000)
SETB TR0
MOV R0,#20H
CJNE R1,#4,NEXT
MOV R1,#0
NEXT:
MOV A,R0
ADD A,R1
MOV R0,A

51
Báo cáo Thí nghiện Vi xử lý

MOV A,@R0
MOV R0,A
ACALL DISPLAYLED
INC R1
RETI
;-----------------------------
DISPLAYLED:
MOV B,R1
INC B
MOV A,#11111110B
SHIFTLOOP:
RR A
DJNZ B, SHIFTLOOP
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
;---------------------------
COUNTER:
CLR TR1
CLR TF1

52
Báo cáo Thí nghiện Vi xử lý

MOV TL1,#LOW(-10000)
MOV TH1,#HIGH(-10000)
SETB TR1
INC R6
CJNE R6, #100, XULY
MOV R6, #0
INC R7
CJNE R7, #100, XULY
MOV R7, #0
XULY:
MOV A, R6
MOV B, #10
DIV AB
MOV 22H, A
MOV 23H, B
MOV A, R7
MOV B, #10
DIV AB
MOV 20H, A
MOV 21H, B
RETI
END

53
Báo cáo Thí nghiện Vi xử lý

BÁO CÁO PHẦN BÀI TẬP THÊM


I. BÀI THÍ NGHIỆM 1:
LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED ĐƠN
ĐỀ:
Viết code thực hiện 4 chế độ sáng các LED khác nhau khi nhấn các nút P3.2; P3.3; P3.4
và P3.5. Cụ thể:
Nút được nhấn Chế độ sáng LED
P3.2 Sáng từ trái qua phải (Từ trọng số cao đến thấp)
P3.3 Sáng từ 2 LED ở giữa rồi lần lượt sáng cặp LED tương ứng
kế đến cặp LED ngoài cùng sáng
P3.4 Sáng từ phải qua trái (Từ trọng số thấp đến cao)
P3.5 Sáng từ 2 LED ngoài cùng, rồi lần lượt sáng cặp LED tương
ứng kế tiếp đến 2 LED ở giữa sáng
CODE:
ORG 2000H
MOV P1, #0FFH
MAIN:
JNB P3.2, MOT
JNB P3.3, HAI
JNB P3.4, BA
JNB P3.5, BON
SJMP MAIN
;---------------------------------------
MOT:
LCALL ALERT
MOV P1, #11111110B
MOV A, P1
L1:
RR A
MOV P1, A
LCALL DELAY
LCALL KT
SJMP L1
;----------------------------------------
HAI:
LCALL ALERT
MOV DPTR, #S2
L3:

54
Báo cáo Thí nghiện Vi xử lý

MOV R1, #3
L4:
MOV A, R1
MOVC A, @A+ DPTR
MOV P1, A
LCALL DELAY
LCALL KT
DJNZ R1, L4
MOV P1, #7EH
LCALL DELAY
SJMP L3
S2:
DB 0FFH, 0BDH, 0DBH, 0E7H
;--------------------------------
BA:
LCALL ALERT
MOV P1, #01111111B
MOV A, P1
L5:
RL A
MOV P1, A
LCALL DELAY
LCALL KT
SJMP L5
;-------------------------------
BON:
LCALL ALERT
MOV DPTR, #S4
L7:
MOV R1, #3
L8:
MOV A, R1
MOVC A, @A+ DPTR
MOV P1, A
LCALL DELAY
LCALL KT
DJNZ R1, L8
MOV P1, #0E7H
LCALL DELAY
SJMP L7
S4:
DB 0E7H, 0DBH , 0BDH, 7EH
;--------------------------------------
55
Báo cáo Thí nghiện Vi xử lý

; CHUONG TRINH CON KIEM TRA


KT:
JNB P3.2, MOT
JNB P3.3, HAI
JNB P3.4, BA
JNB P3.5, BON
RET
;--------------------------------------
; CHUONG TRINH DELAY
DELAY:
MOV R7, #7
LOOP1:
MOV R6, #255
LOOP2:
MOV R5, #255
LOOP3:
DJNZ R5, LOOP3
DJNZ R6, LOOP2
DJNZ R7, LOOP1
RET
;----------------------------------------
; CHUONG TRINH BAO CHAY CHE DO MOI
ALERT:
MOV P1, #00H
LCALL DELAY
MOV P1, #0FFH
LCALL DELAY
RET
;------------------------------------------
END

II. BÀI THÍ NGHIỆM 2:


HIỂN THỊ LED 7 ĐOẠN
ĐỀ:
Viết code thiết kế đồng LED 7 đoạn hiển thị phần trăm giây và giây, có 3 nút nhấn thực
hiện chức năng sau:
Nút nhấn Chắc năng
P1.1 Dừng đồng hồ
P1.2 Cho đồng hồ chạy
P1.3 Reset đồng hồ về 00:00

56
Báo cáo Thí nghiện Vi xử lý

CODE:
SO BIT P1.1
SA BIT P1.2
RE BIT P1.3
ORG 2000H
MOV R7,#1 ;1 DUNG; 0 CHAY
MOV A,#0 ;PERCENT SECOND
MOV R1,#0 ;SECOND
MAIN_LOOP:
CJNE R7,#0, KHONGTANG
INC A
KHONGTANG:
CJNE A,#100,PAST
MOV A,#0
INC R1
CJNE R1,#60,PAST
MOV R1,#0
PAST:
MOV R2,#11010000B
MOV R3,#11100000B
ACALL XULY
MOV R0,A
MOV A,R1
MOV R2,#01110000B
MOV R3,#10110000B
ACALL XULY
MOV R1,A
MOV A,R0
SJMP MAIN_LOOP
;---------------------
XULY:
JNB SO,STOP
TIEP_1:
JNB SA,START
TIEP_2:
JNB RE,RESET
TIEP_3:
MOV 20H,A
MOV B,#10
57
Báo cáo Thí nghiện Vi xử lý

DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ORL A,R2
ACALL DISPLAYLED
ACALL DELAY
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
ORL A,R3
ACALL DISPLAYLED
ACALL DELAY
MOV A,20H
RET
;--------------------
STOP:
MOV R7,#01H
SJMP TIEP_1
START:
MOV R7,#0
SJMP TIEP_2
RESET:
MOV R7, #1
MOV A,#0
MOV R1,#0
MOV R0,#0
SJMP TIEP_3
;--------------------
DISPLAYLED:
MOV DPTR,#0000H
MOVX @DPTR,A
RET
;--------------------
DELAY:
MOV R5,#40
D_LOOP:
MOV R4,#30
DJNZ R4,$
DJNZ R5,D_LOOP
RET
58
Báo cáo Thí nghiện Vi xử lý

;-------------------
TABLE:
DB 00H,01H,02H,03H,04H,05H,06H,07H,08H,09H
END
III. BÀI THÍ NGHIỆM 3:
GIAO TIẾP LCD VÀ ADC
ĐỀ:
Viết chương trình xuất ra giá trị thực tế của điện áp đọc được từ kênh 0 ở hàng 1, đồng
thời xuất ở hàng thứ 2 dòng chữ LOW, HIGH, NORMAL trên LCD tùy theo giá trị điện
áp thỏa mãn bảng sau:
Dòng thứ 2 trên LCD Giá trị điện áp lúc đó
LOW  2.00 V
NORMAL 2.00 V  Gía trị điện áp  4.00 V
HIGH  4.00 V

CODE:
EN BIT P3.4
RS BIT P3.5
ORG 2000H
MAIN:
LCALL INIT_LCD
LCALL CLEAR
MOV R2, #0
MOV R3, #8
LCALL GOTOXY
MOV A, #'V'
LCALL WRITE_DATA
LOOP_MAIN:
LCALL READADC
LCALL CALADC
LCALL CT_HIENSOV
LCALL CT_DK
SJMP LOOP_MAIN
;---------------
INIT_LCD:
MOV A, #38H
LCALL WRITE_COM
MOV A, #0CH
LCALL WRITE_COM

59
Báo cáo Thí nghiện Vi xử lý

MOV A, #06H
LCALL WRITE_COM
RET
;---------------
CLEAR:
MOV A, #01H
LCALL WRITE_COM
RET
;-------------
WRITE_COM:
MOV DPTR, #8000H
SETB EN
CLR RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
RET
;--------------
WRITE_DATA:
MOV DPTR, #8000H
SETB EN
SETB RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
RET
;---------------
DELAY_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
;-----------------
GOTOXY:
PUSH ACC
MOV A, R2
MOV DPTR, #TB
MOVC A,@A+DPTR
60
Báo cáo Thí nghiện Vi xử lý

ADD A, R3
LCALL WRITE_COM
POP ACC
RET
;-----------------
CALADC:
PUSH 05H
MOV A, R0
MOV B, #51
DIV AB
MOV 30H, A
MOV A,B
MOV B, #10
MUL AB
MOV 31H, B
MOV B, #51
DIV AB
MOV 32H, B
MOV R5, 31H
CJNE R5, #01H, BANG0_1
ADD A, #5
BANG0_1:
MOV 31H, A
MOV A, 32H
MOV B, #10
MUL AB
MOV 33H, B
MOV B, #51
DIV AB
MOV R5, 33H
CJNE R5, #01H, BANG0_2
ADD A, #5
BANG0_2:
MOV 32H, A
POP 05H
RET
;---------------------
READADC:
MOV DPTR, #4000H
MOVX @DPTR, A
61
Báo cáo Thí nghiện Vi xử lý

ACALL DELAY_LCD
MOVX A, @DPTR
MOV R0, A
RET
;---------------------
;CHUONG TRINH XET DIEU KIEN
CT_DK:
MOV R2, #1
MOV R3, #4
LCALL GOTOXY
CJNE R0, #205, $+3
JNC HIGH1
CJNE R0, #103, $+3
JC LOW1
NORMAL:
MOV A, #0
MAIN_LOOP1:
MOV R5, A
MOV DPTR, #MAIN_NORMAL
MOVC A, @A+DPTR
JZ KETTHUC
LCALL WRITE_DATA
MOV A, R5
INC A
SJMP MAIN_LOOP1
HIGH1:
MOV A, #0
MAIN_LOOP2:
MOV R5, A
MOV DPTR, #MAIN_HIGH
MOVC A, @A+DPTR
JZ KETTHUC
LCALL WRITE_DATA
MOV A, R5
INC A
SJMP MAIN_LOOP2
LOW1:
MOV A, #0
MAIN_LOOP3:
MOV R5, A
62
Báo cáo Thí nghiện Vi xử lý

MOV DPTR, #MAIN_LOW


MOVC A, @A+DPTR
JZ KETTHUC
LCALL WRITE_DATA
MOV A, R5
INC A
SJMP MAIN_LOOP3
KETTHUC:
RET
MAIN_NORMAL: DB 'NORMAL',0
MAIN_HIGH: DB 'HIGH ',0
MAIN_LOW: DB 'LOW ',0
;-------------------------
CT_HIENSOV:
MOV R2, #0
MOV R3, #4
LCALL GOTOXY
MOV A, 30H
ADD A, #30H
LCALL WRITE_DATA
MOV A, #','
LCALL WRITE_DATA
MOV A, 31H
ADD A, #30H
LCALL WRITE_DATA
MOV A, 32H
ADD A, #30H
LCALL WRITE_DATA
RET
;----------------------------------
TB:
DB 80H, 0C0H
;-----------------------------------
END
IV. BÀI THÍ NGHIỆM 4:
LẬP TRÌNH GIAO TIẾP TIMER VÀ SERIAL PORT
ĐỀ:
Viết chường trình thực hiện đồng hồ bằng LED 7 đoạn hoặc LCD hiển thị phút và giây.
Sử dụng Serial Port để điều chỉnh thời gian của đồng hồi. Cụ thể:
63
Báo cáo Thí nghiện Vi xử lý

Nút nhấn Chức năng


S Dừng đồng hồ để chỉnh thời gian
R Cho phép đồng hồ chạy tiếp
P Nhập P sau đó nhập tiếp 2 số để chỉnh phút
G Nhập G sau đó nhập tiếp 2 số để chỉnh giây
CODE:
LCD_E BIT P3.4
LCD_RS BIT P3.5
ORG 2000H
MAIN:
MOV SCON,#01010010B
MOV A,PCON
SETB ACC.7
MOV PCON,A
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
ACALL INIT_LCD
ACALL CLEAR
MOV R3,#0;giay
MOV R4,#0;phut
SETB P1.0
SETB P1.3
SETB P1.5
SETB P1.1
;-------------MAIN CODE-------------------;
LOOP:
ACALL RECIEVE
CJNE A,#52H,NEXT
AJMP RUN
NEXT:
CJNE A,#47H,NEXT1
AJMP GIAY
NEXT1:
CJNE A,#50H,NEXT2
AJMP PHUT
NEXT2:
SJMP LOOP
;-----------------------------------------;
;-------------CT NHAP SO GIAY-------------;
GIAY:
ACALL RECIEVE

64
Báo cáo Thí nghiện Vi xử lý

ADD A,#-48
MOV 20H,A
ACALL RECIEVE
ADD A,#-48
MOV 21H,A
MOV B,#10
MOV A,20H
MUL AB
ADD A,21H
MOV R3,A
SJMP LOOP
;-----------------------------------------;
PHUT:
ACALL RECIEVE
ADD A,#-48
MOV 22H,A
ACALL RECIEVE
ADD A,#-48
MOV 23H,A
MOV B,#10
MOV A,22H
MUL AB
ADD A,23H
MOV R4,A
SJMP LOOP
;----------------------------------------------------------;
;-------------CT CHAY GIA TRI DA NHAP------;
RUN:
JNB RI,RUN1
ACALL RECIEVE
CJNE A,#53H,RUN1
AJMP LOOP
RUN1:
PUSH ACC
ACALL DELAY
CJNE R3, #60, DK_GIAY
MOV R3, #0
INC R4
CJNE R4, #60, DK_GIAY
MOV R4, #0
SJMP RUN
DKGIAY
MOV A,R3
65
Báo cáo Thí nghiện Vi xử lý

MOV B,#10
DIV AB
MOV 20H,A
MOV 21H,B
MOV A,R4
MOV B,#10
DIV AB
MOV 22H,A
MOV 23H,B
ACALL LCD_DISPLAY
INC R3
POP ACC
SJMP RUN
; --------------------LCD DISPLAY--------------;
LCD_DISPLAY:
MOV A,#83H
ACALL WRITECOM
MOV A,22H
ADD A,#30H
ACALL WRITETEXT
MOV A,23H
ADD A,#30H
ACALL WRITETEXT
MOV A,#3AH
ACALL WRITETEXT
MOV A,20H
ADD A,#30H
ACALL WRITETEXT
MOV A,21H
ADD A,#30H
ACALL WRITETEXT
RET
;----------------------------------------------------------------;
;---------NHAN DU LIEU TU SERIAL PORT---------;
RECIEVE:
JNB RI,$
CLR RI
MOV A,SBUF
RET
;------------------------------------------------------------------;
INIT_LCD:
MOV A, #38H
ACALL WRITECOM
66
Báo cáo Thí nghiện Vi xử lý

MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
;------------------------------------------------;
CLEAR:
PUSH ACC
MOV A, #01H
ACALL WRITECOM
POP ACC
RET
;------------------------------------------------;
WRITECOM:
MOV DPTR, #8000H
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
;-----------------------------------------;
WRITETEXT:
MOV DPTR, #8000H
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
;-----------------------------------------;
DELAY:
MOV R1,#4
DELAY_0:
MOV R2,#250
67
Báo cáo Thí nghiện Vi xử lý

DELAY_1:
MOV R5,#210
DELAY_2:
DJNZ R5,DELAY_2
DJNZ R2,DELAY_1
DJNZ R1,DELAY_0
RET
END

V. BÀI THÍ NGHIỆM 5:


LẬP TRÌNH NGẮT
ĐỀ:
Viết chương trình thực hiện các nhiệm vụ sau:
- Thực hiện đồng hồ hiển thị phút giây trên LCD
- Chỉnh thời gian bằng Serial Port (Dùng ngắt Serial port)
- Đồng thời trên LCD hiển thị giá trị đọc được trực tiếp từ kênh 0 (Thực hiện
trong chương trình chính)
Cụ thể trong chương trình: nhập P sau đó nhập tiếp 2 số để quy định phút, 2 số tiếp theo
quy định giây, sau đó đồng hồ LED sẽ tự động cập nhật giá trị.
CODE:
EN BIT P3.4
RS BIT P3.5
ORG 2000H
LJMP MAIN
ORG 200BH
LJMP DISPLAY
ORG 2023H
LJMP SP_ISR
ORG 2030H
MAIN:
LCALL INIT_LCD
LCALL CLEAR
MOV R2, #0
MOV R3, #2
MOV A, PCON
SETB ACC.7
MOV PCON, A
MOV SCON, #01010000B
MOV 26H, #00H
MOV 24H, #0 ;24H 25H BIEN DEM PHAN TRAM GIAY

68
Báo cáo Thí nghiện Vi xử lý

MOV 25H, #0
MOV 23H, #0 ;22H 23H GIAY
MOV 22H, #0 ;20H 21H PHUT
MOV 21H, #0
MOV 20H, #0
MOV R1,#0
MOV TMOD ,#21H
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
MOV TH1, #-3
SETB TR1
SETB TR0
SETB EA
SETB ET0
SETB ES
SETB IP.4
MAIN_LOOP:
LCALL GOTOXY
LCALL READADC
LCALL DISPLAYADC
SJMP MAIN_LOOP
;------------------------
DISPLAY:
CLR TR0
CLR TF0
MOV TL0,#LOW(-10000)
MOV TH0,#HIGH(-10000)
SETB TR0
MOV R7, 26H
CJNE R7, #01H, D_CHAY
SJMP D_DUNG
D_CHAY:
MOV 30H, R0
MOV R0, #25H
MOV A, @R0
CJNE A, #9, SKIP
MOV 25H, #0
DEC R0
MOV A, @R0
CJNE A, #9, SKIP
MOV 24H, #0
DEC R0
MOV A, @R0
69
Báo cáo Thí nghiện Vi xử lý

CJNE A, #9, SKIP


MOV 23H, #0
DEC R0
MOV A, @R0
CJNE A, #5, SKIP
MOV 22H, #0
DEC R0
MOV A, @R0
CJNE A, #9, SKIP
MOV 21H, #0
DEC R0
MOV A, @R0
CJNE A, #5, SKIP
MOV 20H, #0
SJMP COUNTER_DONE
SKIP:
INC A
MOV @R0, A
COUNTER_DONE:
MOV R0, 30H
D_DUNG:
MOV R0,#20H
CJNE R1,#4,NEXT
MOV R1,#0
NEXT:
MOV A,R0
ADD A,R1
MOV R0,A
MOV A,@R0
MOV R0,A
ACALL DISPLAYLED
INC R1
RETI
;-----------------------------
DISPLAYLED:
MOV B,R1
INC B
MOV A,#11111110B
SHIFTLOOP:
RR A
DJNZ B, SHIFTLOOP
ANL A, #0F0H
PUSH ACC
70
Báo cáo Thí nghiện Vi xử lý

MOV A,R0
ANL A, #0FH
MOV R0,A
POP ACC
ORL A,R0
MOV DPTR, #0000H
MOVX @DPTR,A
RET
;---------------------------
SP_ISR:
CLR ES
JNB TI, RI_ISR
CLR TI
LJMP RUN
RI_ISR:
CLR RI
MOV A, SBUF
CJNE A, #52H, SPNEXT
LJMP RUN
SPNEXT:
CJNE A,#50H, RUN
LCALL RECIEVE
ADD A,#-48
MOV 20H, A
LCALL RECIEVE
ADD A,#-48
MOV 21H, A
LCALL RECIEVE
ADD A,#-48
MOV 22H, A
LCALL RECIEVE
ADD A,#-48
MOV 23H, A
RUN:
SETB ES
RETI
;----------------------
RECIEVE:
JNB RI,$
CLR RI
MOV A,SBUF
RET
;---------------------
71
Báo cáo Thí nghiện Vi xử lý

READADC:
MOV DPTR, #4000H
MOVX @DPTR, A
ACALL DELAY_LCD
MOVX A, @DPTR
MOV R0, A
RET
;------------
DISPLAYADC:
MOV A, R0
MOV B, #100
DIV AB
ADD A, #30H
LCALL WRITE_DATA
MOV A,B
MOV B,#10
DIV AB
ADD A, #30H
LCALL WRITE_DATA
MOV A, B
ADD A, #30H
LCALL WRITE_DATA
RET
;-------------
INIT_LCD:
MOV A, #38H
LCALL WRITE_COM
MOV A, #0CH
LCALL WRITE_COM
MOV A, #06H
LCALL WRITE_COM
RET
;---------------
CLEAR:
MOV A, #01H
LCALL WRITE_COM
RET
;-------------
WRITE_COM:
MOV DPTR, #8000H
SETB EN
CLR RS
MOVX @DPTR, A
72
Báo cáo Thí nghiện Vi xử lý

CLR EN
LCALL DELAY_LCD
RET
;--------------
WRITE_DATA:
MOV DPTR, #8000H
SETB EN
SETB RS
MOVX @DPTR, A
CLR EN
LCALL DELAY_LCD
RET
;---------------
DELAY_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
;-----------------
GOTOXY:
PUSH ACC
MOV A, R2
MOV DPTR, #TB
MOVC A,@A+DPTR
ADD A, R3
LCALL WRITE_COM
POP ACC
RET
;-----------------
TB:
DB 80H, 0C0H
END

73

You might also like