Tải bản đầy đủ (.pdf) (24 trang)

Báo cáo thí nghiệm môn vi xử lý

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (159.72 KB, 24 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ

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

TP.HCM , THÁNG ...... NĂM 201...

1


Để tạo sự trực quan và dễ hiểu cho người đọc, một số chương trình có số câu
lệnh nhiều sẽ được chia làm nhiều cột, được đọc từ trái sang phải.
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
LOOP:
SETB P1.0
MOV C, P1.0
MOV P3.0,C
SJMP LOOP
END
- 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

CPL

P3.0

JMP

MAIN

MAIN:

END
- Theo lý thuyết, với thạch anh 11.0592MHz, chương trình trên sẽ tạo ra sóng vng 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 hồn có chu kỳ nhiệm vụ 50% có thể đạt được là 153600Hz với
đoạn code như trên

2


THÍ NGHIỆM 3:
Viết chương trình tạo xung vng 1 KHz, chu kỳ nhiệm vụ 50% trên P3.0

ORG 2000H
CONT:
CPL P3.0
ACALL DELAY05MS
SJMP CONT
DELAY05MS:
MOV R7,#230
LOOP:
DJNZ R7,LOOP
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:

MOV R5,#250

CPL P1.0

LOOP3:


ACALL DELAY1SINS

DJNZ R5,LOOP3

SJMP LOOP

DJNZ R6,LOOP2

DELAY1SINS:

DJNZ R7,LOOP1

MOV R7,#7

RET

LOOP1:

END

MOV R6,#250
- Tính thời gian delay 1s:
1=2n.Tmáy=2n.12Txtal=24n.(

1
) => n=460800 => chọn n1=250; n2=250; n3=7
11059200

3



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

LOOP1:

MOV DPTR,#SIGNAL

MOV R6,#250

LOOP:

LOOP2:

MOV R7,#8

MOV R5,#250

LOOP1:

LOOP3:

MOV A,R7

DJNZ R5,LOOP3

MOVC P1,@A+DPTR


DJNZ R6,LOOP2

ACALL DELAY1SINS

DJNZ R7,LOOP1

DJNZ R7,LOOP1

RET

MOV P1,#0FFH

SIGNAL:

SJMP LOOP

DB 00H,01H,03H,07H,0FH,1FH,3FH,7FH

DELAY1SINS:

END

MOV R7,#7

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

4



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 vng 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 lặp
ORG 2000H

MOV TL0,#LOW(-461)

LOOP:

SETB TR0

CPL P1.0

JNB TF0,$

ACALL DELAY05MS

CLR TF0

SJMP LOOP

CLR TR0

DELAY05MS:

RET

MOV TMOD,#01H


END

MOV TH0,#HIGH(-461)
- Dạng sóng có thể bị sai số, để hạn chế sai số, ta nên tính tố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 vng 10 KHz trên chân P1.0 sử dụng timer 0 ở chế độ 2
ORG 2000H
MOV TMOD,#02H
MOV TH0,#-46
SETB TR0
LOOP:
JNB TF0,$
CLR TF0
CPL P1.0
SJMP LOOP
END
- Ở 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
ORG 2000H
MOV R7, #128 ; Giá trị ví dụ
CALL BI2BCD
AGAIN:
; HIEN THI HANG DON VI
MOV A, 21H
MOV DPTR, #DONVI
MOVC A, @A+DPTR


5


MOV DPTR, #0000H
MOVX @DPTR, A
LCALL DELAY
; HIEN THI HANG CHUC
MOV A, 22H
MOV DPTR, #CHUC
MOVC A, @A+DPTR
MOV DPTR, #0000H
MOVX @DPTR, A
LCALL DELAY
; HIEN THI HANG TRAM
MOV A, 23H
MOV DPTR, #TRAM
MOVC A, @A+DPTR
MOV DPTR, #0000H
MOVX @DPTR, A
LCALL DELAY
SJMP EXIT
DELAY:
MOV TH0, #HIGH(-1000)
MOV TL0, #LOW(-1000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
RET

RET
BI2BCD:
MOV A, R7
MOV B, #10
DIV AB
MOV 21H, B ; LUU HANG DON VI
MOV B, #10
DIV AB
MOV 22H, B ; LUU HANG CHUC
MOV 23H, A ; LUU HANG TRAM
RET
DONVI:
DB 0E0H, 0E1H, 0E2H, 0E3H, 0E4H, 0E5H, 0E6H, 0E7H, 0E8H, 0E9H
CHUC:
DB 0D0H, 0D1H, 0D2H, 0D3H, 0D4H, 0D5H, 0D6H, 0D7H, 0D8H, 0D9H
TRAM:
DB 0B0H, 0B1H, 0B2H, 0B3H, 0B4H, 0B5H, 0B6H, 0B7H, 0B8H, 0B9H
EXIT:
NOP
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
ORG 2000H

MOV R0,#0

6


LOOP:

ACALL DISPLAYLED0
INC R0
ACALL DELAY1S
CJNE R0,#10,LOOP
MOV R0,#0
SJMP LOOP
DISPLAYLED0:
MOV A,R0
ADD A,#0E0H
MOV DPTR,#0000H

MOVX @DPTR,A
RET
DELAY1S:
MOV R7,#18
TIMELOOP:
MOV TMOD, #01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R7,TIMELOOP
RET
END

7



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
SJMP DONE
MOV R0,#1
ANONUM2:
MOV R1,#3
CJNE A,#2,ANONUM3
ACALL DISPLAYLED
MOV A,#0B0H
SJMP FINISH
ADD A,R0
DISPLAYLED:
SJMP DONE
MOV A,R1
ANONUM3:
CJNE A,#0,ANONUM1
MOV A,#70H
MOV A,#0E0H
ADD A,R0
ADD A,R0
DONE:
SJMP DONE
MOV DPTR,#0000H
ANONUM1:
MOVX @DPTR,A
CJNE A,#1,ANONUM2

RET
MOV A,#0D0H
FINISH: NOP
ADD A,R0
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 tố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
LOOP:
MOV R7,#4
MOV R0,#1
MOV R1,#0
LOOP1:
ACALL DISPLAYLED
ACALL DELAY1S
INC R0
INC R1
DJNZ R7, LOOP1
SJMP LOOP
DISPLAYLED:

MOV A,R1
CJNE A,#0,ANONUM1
MOV A,#0E0H
ADD A,R0

SJMP DONE
ANONUM1:
CJNE A,#1,ANONUM2
MOV A,#0D0H
ADD A,R0
SJMP DONE
ANONUM2:
CJNE A,#2,ANONUM3
MOV A,#0B0H
ADD A,R0
SJMP DONE
ANONUM3:
MOV A,#70H
ADD A,R0

DONE:
MOV DPTR,#0000H
MOVX @DPTR,A
RET
DELAY1S:
MOV R7,#18
TIMELOOP:
MOV TMOD, #01H
MOV TH0,#HIGH(50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R7,TIMELOOP

RET
END

8


- 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 dường như hiển thị các số cùng lúc
- 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ì qt 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
THÍ NGHIỆM 4:
Viết thêm chương trình con CLRSCREEN để xóa màn hình LCD
Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD đến hàng x, cột y, với
X chứa trong R0 và Y chứa trong R1
GOTOXY:

ROW1:

MOV A,R0

ADD A,R1

CJNE A,#0,ROW1


ADD A,#40H

ADD A,R1

ADD A,#80H

ADD A,#80H

GOTOXYDONE:

SJMP GOTOXYDONE

RET

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

P3.4

SJMP $

LCD_RS BIT P3.5

INIT_LCD:

LCDADDR

MOV A, #38H

EQU 6000H


ORG 0000H

ACALL WRITECOM

MAIN:

MOV A, #0EH

MOV @R0, 30H

ACALL WRITECOM

MOV DPTR, #LCDADDR

MOV A, #06H

ACALL CLEAR

ACALL WRITECOM

ACALL INIT_LCD

RET

ACALL DISPLAYSTRING

CLEAR:

MOV R0,#1


MOV A, #01H

MOV R1,#0

ACALL WRITECOM

ACALL GOTOXY
ACALL DISPLAYSTRING1

RET
GOTOXY:

9


MOV A,R0

MOVC A,@A+DPTR

CJNE A,#0,ROW1

JZ

ADD A,R1

ACALL WRITETEXT

ADD A,#80H


MOV A,R0

SJMP GOTOXYDONE

INC

ROW1:

DJNZ B,LOOP

EXIT

A

ADD A,R1

EXIT:

ADD A,#40H

RET

ADD A,#80H

DISPLAYSTRING1:

GOTOXYDONE:

MOV A,#0


RET

LOOP1:

WRITECOM:

MOV DPTR, #MESSAGE1

MOV DPTR, #LCDADDR

MOV

SETB LCD_E

MOVC

A,@A+DPTR

CLR

JZ

EXIT

MOVX @DPTR, A

ACALL

WRITETEXT


CLR

MOV

A,R0

ACALL WAIT_LCD

INC

A

RET

DJNZ

B,LOOP

LCD_RS
LCD_E

WRITETEXT:

WAIT_LCD:

MOV DPTR, #LCDADDR
SETB LCD_E

R0,A


MOV R6,#10
DL1:

SETB LCD_RS

MOV R7, #250

MOVX @DPTR, A

DJNZ R7, $

CLR

DJNZ R6,DL1

LCD_E

ACALL WAIT_LCD
RET
DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE

RET
MESSAGE:
DB

"HELLO WORLD!",0


MESSAGE1:
DB

"NHOM 4",0
END

MOV R0,A

10


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)
LCD_E BIT P3.4

MOV

A,#0EH

LCD_RS BIT P3.5

ACALL WRITECOM

LCDADDR
6000H

MOV

ORG


EQU

A,#06H

ACALL WRITECOM

0000H

RET

MAIN:

CLEAR:
MOV
MOV

@R0, 30H

MOV

DPTR,

A,#01H

ACALL WRITECOM

#LCDADDR

RET

ACALL CLEAR
ACALL INIT_LCD
MOV P1,#0FFH
MOV R0,#0

WRITECOM:
MOV
DPTR,#LCDADDR

LOOP:

SETB LCD_E

ACALL CLEAR

CLR

ACALL
DISPLAYSTRING

LCD_RS

MOVX @DPTR, A
CLR

ACALL DISPNUM

ACALL WAIT_LCD

MOV A,P1

CJNE A,#0FEH,
LOOP
INC R0
SJMP LOOP

LCD_E

RET
WRITETEXT:
MOV
DPTR,#LCDADDR
SETB LCD_E

DISPNUM:

SETB LCD_RS

MOV A,R0

MOVX @DPTR, A

DIV AB

CLR

ADD A,#30H

ACALL WAIT_LCD

ACALL WRITETEXT

MOV A,B

LCD_E

RET
DISPLAYSTRING:

ADD A,#30H

MOV

ACALL WRITETEXT
RET

A,#0

LOOPDISPSTRING:

INIT_LCD:
MOV

A,#38H

ACALL WRITECOM

MOV

DPTR,

MOV


R0,A

#MESSAGE

11


MOVC A,@A+DPTR

MOV

R6,#10

ACALL WRITETEXT

MOV

R7, #250

MOV

A,R0

DJNZ R7, $

INC

A


DJNZ R6,DL1

JZ EXIT

DL1:

DJNZ B,LOOPDISPSTRING

RET

EXIT:

MESSAGE:
RET

WAIT_LCD:

DB "PUSH NUMBER
= ",0
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
LCD_E BIT P3.4
MOV A,#0EH
LCD_RS BIT P3.5
ACALL WRITECOM
LCDADDR EQU 6000H
MOV A,#06H
ORG 0000H

ACALL WRITECOM
MAIN:
RET
CLEAR:
MOV A,#01H
MOV DPTR, #LCDADDR
ACALL WRITECOM
ACALL CLEAR
RET
ACALL INIT_LCD
MOV P1,#0FFH
MOV R0,#0
WRITECOM:
LOOP:
MOV DPTR,#LCDADDR
ACALL CLEAR
SETB LCD_E
ACALL DISPLAYSTRING
CLR LCD_RS
ACALL DISPNUM
MOVX @DPTR, A
MOV A,P1
CLR LCD_E
ACALL DELAYBUTTON
ACALL WAIT_LCD
CJNE A,#0FEH, LOOP
RET
INC R0
WRITETEXT:
SJMP LOOP

MOV DPTR,#LCDADDR
DISPNUM:
SETB LCD_E
MOV A,R0
SETB LCD_RS
MOV B,#10
MOVX @DPTR, A
DIV AB
CLR LCD_E
ADD A,#30H
ACALL WAIT_LCD
ACALL WRITETEXT
RET
MOV A,B
DISPLAYSTRING:
ADD A,#30H
MOV A,#0
ACALL WRITETEXT
LOOPDISPSTRING:
RET
MOV DPTR, #MESSAGE
INIT_LCD:
MOV R0,A
MOV A,#38H
MOVC A,@A+DPTR
ACALL WRITECOM
JZ EXIT

12



ACALL WRITETEXT
RET
MOV A,R0
DELAYBUTTON:
INC A
MOV R6,#40
DJNZ B,LOOPDISPSTRING
DL2:
EXIT:
MOV R7, #250
RET
DJNZ R7, $
WAIT_LCD:
DJNZ R6,DL2
MOV R6,#10
RET
DL1:
MESSAGE:
MOV R7, #250
DB "PUSH NUMBER = ",0
DJNZ R7, $
END
DJNZ R6,DL1
THÍ NGHIỆM 3:Viết chương trình con SCANKEY qt 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

ANOBUT3:
MAIN:
CJNE A,#0E7H,ANOBUT4
MOV SCON,#52H
MOV R0,#'C'
MOV TMOD,#20H
SJMP DONE
MOV TH1,#-3
ANOBUT4:
SETB TR1
MOV P1,#0DFH
ACALL SCANKEY
ACALL DELAYBUTTON
MOV A,R0
MOV A,P1
CJNE A,#225,SENDCHAR
CJNE A,#0DEH,ANOBUT5
SJMP MAIN
MOV R0,#'1'
SENDCHAR:
SJMP DONE
ACALL SEND
ANOBUT5:
SJMP MAIN
CJNE A,#0DDH,ANOBUT6
SEND:
MOV R0,#'5'
JNB TI,$
SJMP DONE
CLR TI

ANOBUT6:
MOV SBUF,A
CJNE A,#0DBH,ANOBUT7
RET
MOV R0,#'9'
SCANKEY:
SJMP DONE
MOV P1,#0EFH
ANOBUT7:
ACALL DELAYBUTTON
CJNE A,#0D7H,ANOBUT8
MOV A,P1
MOV R0,#'D'
CJNE A,#0EEH,ANOBUT1
SJMP DONE
MOV R0,#'0'
ANOBUT8:
LJMP DONE
MOV P1,#0BFH
ANOBUT1:
ACALL DELAYBUTTON
CJNE A,#0EDH,ANOBUT2
MOV A,P1
MOV R0,#'4'
CJNE A,#0BEH,ANOBUT9
SJMP DONE
MOV R0,#'2'
ANOBUT2:
SJMP DONE
CJNE A,#0EBH,ANOBUT3

ANOBUT9:
MOV R0,#'8'
CJNE A,#0BDH,ANOBUT10
SJMP DONE
MOV R0,#'6'

13


SJMP DONE
ANOBUT10:
CJNE A,#0BBH,ANOBUT11
MOV R0,#'A'
SJMP DONE
ANOBUT11:
CJNE A,#0B7H,ANOBUT12
MOV R0,#'E'
SJMP DONE
ANOBUT12:
MOV P1,#07FH
ACALL DELAYBUTTON
MOV A,P1
CJNE A,#07EH,ANOBUT13
MOV R0,#'3'
SJMP DONE
ANOBUT13:
CJNE A,#07DH,ANOBUT14
MOV R0,#'7'
SJMP DONE
ANOBUT14:


CJNE A,#07BH,ANOBUT15
MOV R0,#'B'
SJMP DONE
ANOBUT15:
CJNE A,#077H,ANOBUT16
MOV R0,#'F'
SJMP DONE
ANOBUT16:
MOV R0,#255
DONE:
RET
DELAYBUTTON:
MOV R6,#40
DL2:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL2
RET
END

14


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
INC R0
MOV SCON,#52H

DJNZ R7, LOOP
MOV TMOD,#20H
SJMP DONE
MOV TH1,#-3
SEND:
SETB TR1
JNB TI,$
MOV R7,#11
CLR TI
MOV R0,#0
MOV SBUF, A
MOV DPTR,#MESSAGE
RET
LOOP:
MESSAGE:
MOV A,R0
DB “HELLO WORLD”
MOVC A,@A+DPTR
DONE:
ACALL SEND
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
IN_CHAR:
JNB RI, IN_CHAR

EN BIT P3.3
CLR RI
MOV A, SBUF
RS BIT P3.5
RET
MOV SCON,#52H

LCD_INIT:

MOV TMOD,#20H

MOV A, #38H

MOV TH1,#-3

ACALL WRITE_COMMAND

SETB TR1

MOV A,#0EH

MOV A,#01H

ACALL WRITE_COMMAND

ACALL WRITE_COMMAND

MOV A,#06H
ACALL WRITE_COMMAND
RET


MOV DPTR, #6000H
ACALL LCD_INIT
MAIN:
ACALL IN_CHAR
ACALL WRITE_TEXT
SJMP MAIN

WAIT_LCD:
MOV R7,#100
WAITLCDLOOP:
MOV R6,#250
DJNZ R6,$
DJNZ R7,WAITLCDLOOP
RET

15


WRITE_TEXT:
MOV DPTR,#6000H
ACALL WAIT_LCD
SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
RET

MOV DPTR,#6000H
ACALL WAIT_LCD

CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
END

WRITE_COMMAND:

16


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
MOV A,P1
LJMP MAIN
CJNE A,#0FEH,LOOP
ORG 2023H
MOV A,#0FDH
LJMP SERIALINT
SJMP LOOP
ORG 2030H
SERIALINT:
MAIN:
JNB RI,SKIP
MOV SCON,#52H

CLR RI
MOV TMOD,#20H
MOV A,SBUF
MOV TH1,#-3
MOV SBUF,A
SETB TR1
SKIP:
SETB ES
CLR TI
SETB EA
RETI
LOOP:
END
MOV P1,#0FFH
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

CONT:

LJMP MAIN

MOV A,R1

ORG 200BH

ADD A,#20H

LJMP TIMER0INT


MOV R0,A

ORG 2030H

MOV A,@R0

MAIN:

MOV R0,A

MOV R1,#0

ACALL DISPLAYLED

SETB ET0

RETI

SETB EA

DISPLAYLED:

MOV TMOD,#01H

MOV A,R1

MOV TH0,#HIGH(-10000)

CJNE A,#0,ANONUM1


MOV TL0,#LOW(-10000)

MOV A,#0E0H

SETB TR0

ADD A,R0

SJMP $

SJMP DONE

TIMER0INT:

ANONUM1:

CJNE R1,#4,CONT

CJNE A,#1,ANONUM2

MOV R1,#0

MOV A,#0D0H

17


ADD A,R0


ANONUM3:

SJMP DONE

MOV A,#70H

ANONUM2:

ADD A,R0

CJNE A,#2,ANONUM3

DONE:
MOV DPTR,#0000H
MOVX @DPTR,A

MOV A,#0B0H
ADD A,R0

RET

SJMP DONE

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

MOV A,P1


MOV @R0,A

LJMP MAIN

ACALL DELAYBUTTON

COUNTDONE:

ORG 200BH

CJNE
A,#7FH,COUNTDONE

RET

LJMP TIMER0INT
ORG 2030H
MAIN:
MOV R0,#20H
MOV @R0,#0
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
MOV R1,#0
SETB ET0
SETB EA

MOV TMOD,#01H
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
SETB TR0
CONTCOUNT:
ACALL BUTTONCOUNT
SJMP CONTCOUNT
BUTTONCOUNT:
MOV P1,#0FFH

MOV R0,#23H
MOV A,@R0
CJNE A,#9,SKIP
MOV A,#0
MOV @R0,A
DEC R0
MOV A,@R0
CJNE A,#9,SKIP
MOV A,#0
MOV @R0,A
DEC R0
MOV A,@R0
CJNE A,#9,SKIP
MOV A,#0
MOV @R0,A
DEC R0
MOV A,@R0
CJNE A,#9,SKIP
MOV A,#0
MOV @R0,A

SJMP COUNTDONE
SKIP:

DELAYBUTTON:
MOV

R6,#40

DL2:
MOV

R7, #250

DJNZ R7, $
DJNZ R6,DL2
RET
TIMER0INT:
CLR TR0
CJNE R1,#4,CONT
MOV R1,#0
CONT:
MOV A,R1
ADD A,#20H
MOV R0,A
MOV A,@R0
MOV R0,A
ACALL DISPLAYLED
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
SETB TR0

RETI
DISPLAYLED:

INC A

18


MOV A,R1

ADD A,R0

MOV A,#70H

CJNE A,#0,ANONUM1

SJMP DONE

ADD A,R0

MOV A,#0E0H

ANONUM2:

DONE:

ADD A,R0

CJNE A,#2,ANONUM3


MOV DPTR,#0000H

SJMP DONE

MOV A,#0B0H

MOVX @DPTR,A

ANONUM1:

ADD A,R0

RET

CJNE A,#1,ANONUM2

SJMP DONE

END

MOV A,#0D0H

ANONUM3:

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.
Khi SW310 nhấn, đồng hồ reset về 0
SW 311 nhấn, đồng hồ bắt đầu chạy
SW 312 nhấn, đồng hồ dừng lại

ORG 2000H

SETB TR0

LJMP MAIN

CONTCOUNT:

ORG 200BH

MOV P1,#0FFH

LJMP TIMER0INT

MOV A,P1

ORG 2030H

CJNE A,#0FEH,ANOBUTTON1

MAIN:

MOV R0,#20H

CLR C

MOV @R0,#0

MOV R0,#20H


INC R0

MOV @R0,#0

MOV @R0,#0

INC R0

INC R0

MOV @R0,#0

MOV @R0,#0

INC R0

INC R0

MOV @R0,#0

MOV @R0,#0

INC R0

CLR C

MOV @R0,#0

SJMP CONTCOUNT


MOV R1,#0

ANOBUTTON1:

SETB ET0

CJNE A,#0FDH,ANOBUTTON2

SETB EA

SETB C

MOV TMOD,#01H

SJMP CONTCOUNT

MOV TH0,#HIGH(-10000)

ANOBUTTON2:

MOV TL0,#LOW(-10000)

CJNE A,#0FBH,CONTCOUNT

19


CLR C

ANONUM3:


SJMP CONTCOUNT

MOV A,#70H
ADD A,R0

TIMER0INT:

DONE:

ACALL TIMEVALUE

MOV DPTR,#0000H

CLR TR0

MOVX @DPTR,A

CJNE R1,#4,CONT

RET

MOV R1,#0

TIMEVALUE:

CONT:

JNC COUNTDONE


MOV A,R1

MOV R0,#23H

ADD A,#20H

MOV A,@R0

MOV R0,A

CJNE A,#9,SKIP

MOV A,@R0

MOV A,#0

MOV R0,A

MOV @R0,A

ACALL DISPLAYLED

DEC R0

MOV TH0,#HIGH(-10000)

MOV A,@R0

MOV TL0,#LOW(-10000)


CJNE A,#9,SKIP

SETB TR0

MOV A,#0

RETI

MOV @R0,A

DISPLAYLED:

DEC R0

MOV A,R1

MOV A,@R0

CJNE A,#0,ANONUM1

CJNE A,#9,SKIP

MOV A,#0E0H

MOV A,#0

ADD A,R0

MOV @R0,A


SJMP DONE

DEC R0

ANONUM1:

MOV A,@R0

CJNE A,#1,ANONUM2

CJNE A,#9,SKIP

MOV A,#0D0H

MOV A,#0

ADD A,R0

MOV @R0,A

SJMP DONE

SJMP COUNTDONE

ANONUM2:

SKIP:

CJNE A,#2,ANONUM3


INC A

MOV A,#0B0H

MOV @R0,A

ADD A,R0

SJMP COUNTDONE

SJMP DONE

COUNTDONE:

20


RET

END

21


BÀI TẬP LỚN:
Viết chương trình thực hiện đồng hồ số có thể chỉnh giờ. Giờ, phút, giây được hiển thị trên
màn hình LCD
LCD_E BIT
P3.3
LCD_RS

BIT
ORG 2000H

P3.5

MAIN:
ACALL CLEAR
ACALL INIT_LCD
ACALL INITTIME
ACALL DELAY1S
ACALL DELAY1S
ACALL INITHOUR
ACALL INITMIN
ACALL INITSEC
LOOP:
ACALL DELAY1S
CJNE R0,#59,INCS
MOV R0,#0
CJNE R1,#59,INCM
MOV R1,#0
CJNE R2,#23,INCH
MOV R2,#0
SJMP FINISH
INCS:
INC R0
SJMP FINISH
INCM:
INC R1
SJMP FINISH
INCH:

INC R2
FINISH:
ACALL CLEAR
ACALL DISPHOUR
ACALL DISPMIN
ACALL DISPSEC
SJMP LOOP
INITHOUR:
ACALL CLEAR
MOV A,#0
MOV R4,#9
MOV DPTR,#MESSAGE2
INITHOURLOOP:
MOV R5,A
MOVC A, @A+DPTR
ACALL WRITETEXT
MOV A,R5
INC A
DJNZ R4, INITHOURLOOP

ACALL DELAY1S
MOV R2,#0
ACALL CLEAR
ACALL DISPHOUR
MOV P0,#0FFH
ANOBUTHOUR3:
MOV A,P0
ACALL DELAY100MS
CJNE A,#10111111B,ANOBUTHOUR1
MOV A,R2

CJNE A,#23,INCHOUR
MOV R2,#0
ACALL CLEAR
ACALL DISPHOUR
SJMP ANOBUTHOUR3
INCHOUR:
INC R2
ACALL CLEAR
ACALL DISPHOUR
ANOBUTHOUR1:
CJNE A,#01111111B,ANOBUTHOUR2
MOV A,R2
CJNE A,#0,DECHOUR
MOV R2,#23
ACALL CLEAR
ACALL DISPHOUR
SJMP ANOBUTHOUR3
DECHOUR:
DEC R2
ACALL CLEAR
ACALL DISPHOUR
ANOBUTHOUR2:
CJNE A,#11011111B,ANOBUTHOUR3
RET
INITMIN:
ACALL CLEAR
MOV A,#0
MOV R4,#8
MOV DPTR,#MESSAGE3
INITMINLOOP:

MOV R5,A
MOVC A, @A+DPTR
ACALL WRITETEXT
MOV A,R5
INC A
DJNZ R4, INITMINLOOP
ACALL DELAY1S
MOV R1,#0
ACALL CLEAR

22


ACALL DISPMIN
MOV P0,#0FFH
ANOBUTMIN3:
MOV A,P0
ACALL DELAY100MS
CJNE A,#10111111B,ANOBUTMIN1
MOV A,R1
CJNE A,#59,INCMIN
MOV R1,#0
ACALL CLEAR
ACALL DISPMIN
SJMP ANOBUTMIN3
INCMIN:
INC R1
ACALL CLEAR
ACALL DISPMIN
ANOBUTMIN1:

CJNE A,#01111111B,ANOBUTMIN2
MOV A,R1
CJNE A,#0,DECMIN
MOV R1,#59
ACALL CLEAR
ACALL DISPMIN
SJMP ANOBUTMIN3
DECMIN:
DEC R1
ACALL CLEAR
ACALL DISPMIN
ANOBUTMIN2:
CJNE A,#11011111B,ANOBUTMIN3
RET
INITSEC:
ACALL CLEAR
MOV A,#0
MOV R4,#8
MOV DPTR,#MESSAGE4
INITSECLOOP:
MOV R5,A
MOVC A, @A+DPTR
ACALL WRITETEXT
MOV A,R5
INC A
DJNZ R4, INITSECLOOP
ACALL DELAY1S
MOV R0,#0
ACALL CLEAR
ACALL DISPSEC

MOV P0,#0FFH
ANOBUTSEC3:
MOV A,P0
ACALL DELAY100MS
CJNE A,#10111111B,ANOBUTSEC1
MOV A,R0
CJNE A,#59,INCSEC
MOV R0,#0

ACALL CLEAR
ACALL DISPSEC
SJMP ANOBUTSEC3
INCSEC:
INC R0
ACALL CLEAR
ACALL DISPSEC
ANOBUTSEC1:
CJNE A,#01111111B,ANOBUTSEC2
MOV A,R0
CJNE A,#0,DECSEC
MOV R0,#59
ACALL CLEAR
ACALL DISPSEC
SJMP ANOBUTSEC3
DECSEC:
DEC R0
ACALL CLEAR
ACALL DISPSEC
ANOBUTSEC2:
CJNE A,#11011111B,ANOBUTSEC3

RET
INITTIME:
ACALL CLEAR
MOV A,#0
MOV R4,#9
MOV DPTR,#MESSAGE1
INITTIMELOOP:
MOV R5,A
MOVC A, @A+DPTR
ACALL WRITETEXT
MOV A,R5
INC A
DJNZ R4, INITTIMELOOP
RET
INIT_LCD:
MOV
ACALL
MOV
ACALL
MOV
ACALL
RET

A, #38H
WRITECOM
A, #0EH
WRITECOM
A, #06H
WRITECOM


DISPSEC:
MOV B,#10
MOV A,R0
DIV AB
ADD A,#30H
ACALL WRITETEXT
MOV A,B
ADD A,#30H
ACALL WRITETEXT
RET

23


RET
DISPMIN:
MOV B,#10
MOV A,R1
DIV AB
ADD A,#30H
ACALL WRITETEXT
MOV A,B
ADD A,#30H
ACALL WRITETEXT
MOV A,#'.'
ACALL WRITETEXT
RET
DISPHOUR:
MOV B,#10
MOV A,R2

DIV AB
ADD A,#30H
ACALL WRITETEXT
MOV A,B
ADD A,#30H
ACALL WRITETEXT
MOV A,#'.'
ACALL WRITETEXT
RET
CLEAR:
MOV A, #01H
ACALL WRITECOM
RET
WRITECOM:
MOV DPTR,#6000H
SETB LCD_E
CLR
LCD_RS
MOVX @DPTR, A
CLR
LCD_E
ACALL WAIT_LCD
RET

DELAY1S:
MOV R7,#20
RECOUNT:
MOV TMOD, #01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)

SETB TR0
WAIT: JNB TF0, WAIT
CLR TF0
CLR TR0
DJNZ R7,RECOUNT
RET
DELAY100MS:
MOV R7,#2
RECOUNT1:
MOV TMOD, #01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
WAIT1: JNB TF0, WAIT1
CLR TF0
CLR TR0
DJNZ R7,RECOUNT1
RET
MESSAGE1:
DB 'I','N','I','T',' ','T','I','M','E'
MESSAGE2:
DB 'I','N','I','T',' ','H','O','U','R'
MESSAGE3:
DB 'I','N','I','T',' ','M','I','N'
MESSAGE4:
DB 'I','N','I','T',' ','S','E','C'
END

WRITETEXT:
MOV DPTR,#6000H

SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR
LCD_E
ACALL WAIT_LCD
RET
WAIT_LCD:
MOV
DL1:
MOV
DJNZ
DJNZ

R6,#10
R7, #250
R7, $
R6,DL1

24



×