Professional Documents
Culture Documents
HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN- ĐIỆN TỬ
2
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
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ý
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ý
8
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
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ý
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:
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:
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ý
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ý
CLRSCREEN:
MOV A, #01H
ACALL WRITECOM
RET
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:
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
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
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∗¿ ¿
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ý
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:
SETB TR0
JNB TF0, $
CLR TF0
RET
END
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
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ý
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ý
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.
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
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.
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ý
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ý
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ý
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
DKGIAY
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
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ý
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