ĐẠ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