You are on page 1of 41

THÍ NGHIỆM VI XỬ LÝ VỚI EME-MC8

BÀI 1: THÍ NGHIỆM VỚI NÚT NHẤN VÀ LED ĐƠN

THÍ NGHIỆM 1: Viét chương trình liên tục đọ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 P1.1 ( bit thứ nhất của Led thanh BL202)

ORG 2000H
MAIN: MOV C,P1.0
MOV P1.1,C
SJMP MAIN
END

THÍ NGHIỆM 2: Viết chương trình tạo xung vuông 1Hz được nối đến chân P1.0

ORG 2000H
MAIN: CPL P1.0
MOV R5,#10
LAP1: MOV R6,#100
LAP: MOV R7,#250
DJNZ R7,$
DJNZ R6,LAP
DJNZ R5,LAP1
SJMP MAIN
END

Thay đổi tần số xung vuông thành 0.5Hz với chu kỳ nhiệm vụ là 30%

ORG 2000H
MAIN: SETB P1.0
MOV R5,#30
LAP1: MOV R6,#100
LAP: MOV R7,#100
DJNZ R7,$
DJNZ R6,LAP
DJNZ R5,LAP1
CLR P1.0
MOV R5,#70
LOOP1: MOV R6,#100
LOOP: MOV R7,#100
DJNZ R7,$
DJNZ R6,LOOP
DJNZ R5,LOOP1
SJMP MAIN
END

THÍ NGHIỆM 3: Viết chương trình tạo xung vuông 1Hz dùng Timer0 ( không dung ngắt)

ORG 2000H
MOV TMOD,#01H
LOOP: MOV R7,#10
LAP: CLR TR0
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TF0
DJNZ R7,LAP
CPL P1.0
SJMP LOOP
END

Dùng ngắt Timer 0 để tạo xung vuông 1Hz

ORG 2000H
LJMP MAIN
ORG 200BH
LJMP ISR_T0
MAIN: MOV TMOD,#01H
MOV R7,#10
CLR TR0
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
MOV IE,#82H
SJMP $
ISR_T0:
CLR TR0
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
DJNZ R7,EXIT
CPL P1.0
MOV R7,#10
EXIT: RETI
END

THÍ NGHIỆM 4: Viết chương trình làm cho led nối đến chân P1.0 chớp tắt với tần số có thể
tăng ( hoặc giảm) bằng cách nhấn nút nối đến chân P1.1 ( hoặc P1.2 ). Chu kỳ chớp tắt trung
bình được chọn là 1s

ORG 2000H
MOV 31H,#100;TAO XUNG 0.1Hz
MOV 32H,#20 ;TAO XUNG 0.5Hz
MOV 33H,#10 ;TAO XUNG 1Hz
MOV 34H,#5 ;TAO XUNG 2Hz
MOV 35H,#4 ;TAO XUNG 2.5Hz
MOV 36H,#2 ;TAO XUNG 5Hz
MOV TMOD,#01H
MOV R0,#33H
LOOP:
JNB P1.1,LOOP1 ;TANG TAN SO
JNB P1.2,LOOP2 ;GIAM TAN SO
CALL DELAY
CPL P1.0
SJMP LOOP
LOOP1:
JNB P1.1,$
INC R0
CJNE R0,#37H,TANG
MOV R0,#33H
TANG: SJMP LOOP
LOOP2:
JNB P1.2,$
DEC R0
CJNE R0,#30H,GIAM
MOV R0,#33H
GIAM: SJMP LOOP
DELAY:
MOV A,@R0
LAP: MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ ACC,LAP
RET
END
BÀI TẬP THÊM : 1) Viết chương trình thực hiện cổng logic XOR 2 ngõ vào

ORG 2000H
MOV C,P1.1
JNB P1.0,KO_DOI
CPL C
KO_DOI: MOV P1.5,C
SJMP $
END

2) Viết chương trình thực hiện mạch sau:

ORG 2000H
MOV C,P1.1
JNB P1.0,KO_DOI
CPL C
KO_DOI: ANL C,P1.2
MOV P1.5,C
SJMP $
END

3) Viết chương trình thực hiện mạch đèn chạy ở Port1:


STTTTTTT  SSTTTTTT  SSSTTTTT  …SSSSSSSS  TTTTTTTT

Biết hoàn thành 1 chu kỳ mất 4.5s


ORG 2000H
MOV R0,#01111111B
LAP: MOV A,#01111111B
LOOP: MOV P1,A
ACALL DELAY_500MS
CJNE A,#00H,SANG
MOV P1,#0FFH
ACALL DELAY_500MS
SJMP LAP
SANG: RR A
ANL A,R0
SJMP LOOP
DELAY_500MS:
MOV R7,#5
DL1: MOV R6,#200
DL: MOV R5,#250
DJNZ R5,$
DJNZ R6,DL
DJNZ R7,DL1
RET
END
BÀI 2: THÍ NGHIỆM HIỂN THỊ DÙNG LED 7 ĐOẠN

THÍ NGHIỆM 1: Viết chương trình thực hiện bộ đếm từ 0 đến 9 và hiển thị lên led 7 đoạn, mỗi
lần cách nhau 2s.

ORG 2000H
LOOP: MOV A,#0
LAP: MOV R7,A
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#0000H
MOVX @DPTR,A
MOV A,R7
INC A
ACALL DELAY_2S
CJNE A,#10,LAP
SJMP LOOP

TABLE: DB 0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H,0E8H,0E9H

DELAY_2S: MOV TMOD,#01H


MOV R7,#40
LAP1: MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
DJNZ R7,LAP1
RET
END

THÍ NGHIỆM 2: Viết chương trình hiển thị giá trị 1234 lên 4 led 7 đoạn

ORG 2000H
LOOP: MOV A,#0
LAP: MOV R7,A
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV DPTR,#0000H
MOVX @DPTR,A
MOV A,R7
INC A
ACALL DELAY_3MS
CJNE A,#4,LAP
SJMP LOOP
TABLE: DB 071H,0B2H,0D3H,0E4H

DELAY_3MS: MOV TMOD,#01H


MOV TH0,#HIGH(-3000)
MOV TL0,#LOW(-3000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
END

THÍ NGHIỆM 3: Viết chương trình hiển thị giá trị nhị phân trong thanh ghi R7 lên led 7 đoạn

ORG 2000H
MOV R7,#255
LOOP: MOV B,#10
MOV A,R7
DIV AB
MOV R4,B
MOV B,#10
DIV AB
ORL A,#0B0H
MOV DPTR,#0H
MOVX @DPTR,A
ACALL DELAY_3MS
MOV A,B
ORL A,#0D0H
MOVX @DPTR,A
ACALL DELAY_3MS
MOV A,R4
ORL A,#0E0H
MOVX @DPTR,A
ACALL DELAY_3MS
SJMP LOOP

DELAY_3MS: MOV TMOD,#01H


MOV TH0,#HIGH(-3000)
MOV TL0,#LOW(-3000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
END
BÀI TẬP THÊM: 1) Đếm số lần nhấn phìm P1.0 kết quả xuất ra led 7 đoạn hàng chục & đơn
vị ( giả sử số lần nhấn nút nhỏ hơn 100 )

ORG 2000H
SETB P1.0
MOV R7,#0
MOV R3,#30
MOV R4,#100
MOV R5,#100 ; khởi động giá trị của R3,R4,R5tạo
delay để chống rung phím
MOV A,#0
MOV DPTR,#0000H
SJMP LOOP

LAP: INC A
MOV R7,A

LOOP: MOV B,#10


DIV AB
MOV R6,B
MOV B,#10
DIV AB
ORL A,#0B0H
MOVX @DPTR,A
ACALL DELAY_3MS
MOV A,B
ORL A,#0D0H
MOVX @DPTR,A
ACALL DELAY_3MS
MOV A,R6
ORL A,#0E0H
MOVX @DPTR,A
ACALL DELAY_3MS
MOV A,R7
JB P1.0, LOOP ; kiểm tra có ấn nút hay chưa
DJNZ R3,LOOP
MOV R3,#30
DJNZ R4,LOOP
MOV R3,#30
MOV R4,#100
DJNZ R5,LOOP
MOV R3,#30
MOV R4,#100
MOV R5,#100
JNB P1.0, LOOP ; kiểm tra đã thả nút ấn hay chưa
SJMP LAP

DELAY_3MS: MOV TMOD,#01H


MOV TH0,#HIGH(-3000)
MOV TL0,#LOW(-3000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
END

2) Viết chương trình thực hiện đồng hồ hẹn giờ với thời gian là 3 phút, từ
2 phút 59 giây  0 phút 00 giây

ORG 2000H
MOV R0,#0B2H
MOV R1,#59
MOV R5,#100 ;khởi động giá trị R5 để tạo trễ
100*(3ms+3ms+4ms)=1s
MOV DPTR,#0000H
LOOP: MOV A,R0
MOVX @DPTR,A
ACALL DELAY_4MS
MOV B,#10
MOV A,R1
DIV AB
ORL A,#0D0H
MOVX @DPTR,A
ACALL DELAY_3MS
MOV A,B
ORL A,#0E0H
MOVX @DPTR,A
ACALL DELAY_3MS
DJNZ R5,LOOP
MOV R5,#100
DEC R1
CJNE R1,#0FFH,LOOP ; kiểm tra đã hết 1 phút hay chưa
MOV R1,#59
DEC R0
CJNE R0,#0AFH,LOOP ; kiểm tra đã hết 3 phút hay chưa
MOV R0,#0B2H
SJMP LOOP
DELAY_3MS: MOV TMOD,#01H
MOV TH0,#HIGH(-3000)
MOV TL0,#LOW(-3000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET

DELAY_4MS: MOV TMOD,#01H


MOV TH0,#HIGH(-4000)
MOV TL0,#LOW(-4000)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
END
BÀI 3: THÍ NGHIỆM HIỂN THỊ DÙNG LCD

THÍ NGHIỆM 1: Viết chương trình hiển thị chuỗi “ Hello” lên LCD

ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN: MOV DPTR, #8000H
ACALL LCD_INIT
MOV A,#'H'
ACALL WRITE_CHAR
MOV A,#'e'
ACALL WRITE_CHAR
MOV A,#'l'
ACALL WRITE_CHAR
MOV A,#'l'
ACALL WRITE_CHAR
MOV A,#'o'
ACALL WRITE_CHAR
SJMP $

LCD_INIT: MOV A,#38H


ACALL WRITE_CMD
MOV A,#0EH
ACALL WRITE_CMD
MOV A,#06H
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7, #100


DL: MOV R6, #250
DJNZ R6, $
DJNZ R7, DL
RET

WRITE_CHAR: ACALL WAIT_LCD


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

WRITE_CMD: ACALL WAIT_LCD


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

BÀI TẬP THÊM: Cho chạy chữ “ Hello” trên màn hình LCD

ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN: MOV R5,#2
MOV DPTR, #8000H
ACALL LCD_INIT
MOV A,#'H'
ACALL WRITE_CHAR
MOV A,#'E'
ACALL WRITE_CHAR
MOV A,#'L'
ACALL WRITE_CHAR
MOV A,#'L'
ACALL WRITE_CHAR
MOV A,#'O'
ACALL WRITE_CHAR
TT: MOV R1,#11
MOV A,#18H : khới động dịch trái
LAP: ACALL WRITE_CMD
DL: ACALL WAIT_LCD
DJNZ R5,DL ; tạo thới gian delay sau mỗi lần dịch
MOV R5,#2
DJNZ R1, LAP
MOV R1,#11
MOV A,#1CH ; khới động dịch phải
LAP2: ACALL WRITE_CMD
DL2: ACALL WAIT_LCD
DJNZ R5,DL2 ; tạo thời gian delay sau mỗi lần dịch
MOV R5,#2
DJNZ R1,LAP2
SJMP TT

LCD_INIT: MOV A, #38H


ACALL WRITE_CMD
MOV A, #0CH
ACALL WRITE_CMD
MOV A, #06H
ACALL WRITE_CMD
MOV A, #01H
ACALL WRITE_CMD
MOV A, #8BH
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7,#100


LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET

WRITE_CHAR: ACALL WAIT_LCD


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

WRITE_CMD: ACALL WAIT_LCD


CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
END
BÀI 4: THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP

THÍ NGHIỆM 1: Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thong qua
HyperTerminal với tốc độ 9600pbs

ORG 2000H
MOV TMOD,#20H
MOV TL1,#-3
MOV TH1,#-3
MOV SCON,#42H
SETB TR1
MOV DPTR,#MSG
LAP: CLR A
MOVC A,@A+DPTR
JZ KT
ACALL SEND
INC DPTR
SJMP LAP
KT: SJMP KT
MSG: DB 'HellO, world',0
SEND: JNB TI,SEND
MOV SBUF,A
CLR TI
RET
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

ORG 2000H
EN BIT P3.4
RS BIT P3.5
MOV TMOD,#20H
MOV TL1,#-3
MOV TH1,#-3
MOV SCON,#52H
SETB TR1
MOV DPTR,#8000H
ACALL LCD_INIT
LAP:
ACALL RECEIVE
ACALL WRITE_CHAR
SJMP LAP
LCD_INIT:
MOV A, #38H
ACALL WRITE_CMD
MOV A, #0EH
ACALL WRITE_CMD
MOV A, #06H
ACALL WRITE_CMD
MOV A,#01H
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7,#100


LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET

WRITE_CHAR: ACALL WAIT_LCD


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

WRITE_CMD: ACALL WAIT_LCD


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

RECEIVE: JNB RI,RECEIVE


MOV A, SBUF
CLR RI
RET
END

THÍ NGHIỆM 3: Viết chương trình nhận một ký tự từ cổng nối tiếp hiển thị lên LCD đồng thời
phát ra cổng nối tiếp. Tốc độ tùy chọn

ORG 2000H
EN BIT P3.4
RS BIT P3.5
MOV TMOD,#20H
MOV TL1,#-3
MOV TH1,#-3
MOV SCON,#52H
SETB TR1
MOV DPTR,#8000H
ACALL LCD_INIT
LAP:
ACALL RECEIVE
ACALL WRITE_CHAR
ACALL SEND
SJMP LAP

LCD_INIT:
MOV A, #38H
ACALL WRITE_CMD
MOV A, #0EH
ACALL WRITE_CMD
MOV A, #06H
ACALL WRITE_CMD
MOV A,#01H
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7,#100


LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET

WRITE_CHAR: ACALL WAIT_LCD


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

WRITE_CMD: ACALL WAIT_LCD


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

RECEIVE: JNB RI,RECEIVE


MOV A, SBUF
CLR RI
RET
SEND: JNB TI, SEND
MOV SBUF, A
CLR TI
RET
END

BÀI TẬP THÊM : Viết chương trình nhận ký tự từ cổng nối tiếp, đông thới phát ra cổng nối
tiếp, với điều kiện:
- Nếu ký tự nhân được là số thì xuất ra Led
- Nếu ký tự nhân được là chữ A-Z, a-z thì xuất ra LCD
- Nếu ký tự nhận được là Enter thì xuống hàng , là ESC thì xóa trong màn hình LCD.
Mã ASCII của Enter là 13, ESC là 27

ORG 2000H
EN BIT P3.4
RS BIT P3.5
MOV TMOD,#20H
MOV TL1,#-3
MOV TH1,#-3
MOV SCON,#52H
SETB TR1
MOV R1,#0
MOV DPTR,#8000H
ACALL LCD_INIT
LAP:
ACALL RECEIVE
CJNE A,#13,TT ; kiểm tra phím nhấn Enter
MOV A,#0C0H
ACALL WRITE_CMD
SJMP THOAT
TT: CJNE A,#27,TT1 ; kiểm tra phím nhấn ESC
MOV A,#01H
ACALL WRITE_CMD
SJMP THOAT
TT1:
CJNE A,#30H,SO ; bắt đầu kiểm tra phím nhấn là số
SO: JC THOAT
CJNE A,#3AH,CHU ; kết thúc kiểm tra phím nhấn là số
CHU: JC LED
CJNE A,#41H,KHAC; bắt đầu kiểm tra phím nhấn là chữ hoa
KHAC: JC THOAT
CJNE A,#5BH,HOA ; kết thúc kiểm tra phím nhấn là chữ hoa
HOA: JC NHO
CJNE A,#61H,KHAC1 ; bắt đầu kiểm tra phím nhấn là chữ
thường
KHAC1: JC THOAT
CJNE A,#7BH,THUONG ; kết thúc kiểm tra phím nhần là chữ
thường
THUONG: JC NHO
SJMP THOAT
NHO: MOV DPTR,#8000H
INC R1
CJNE R1,#17,XUONG ; kiểm tra nếu hiển thị hết hàng
đầu tiên thì xuông hàng trong màn hình LCD

XUONG: JC XUATLCD
PUSH ACC
MOV A,#0C0H
ACALL WRITE_CMD
POP ACC
MOV R1,#0

XUATLCD: ACALL WRITE_CHAR


SJMP THOAT
LED: MOV DPTR,#0000H
ANL A,#0FH
ORL A,#0E0H
MOVX @DPTR,A
THOAT: MOV DPTR,#8000H
ACALL SEND
SJMP LAP

LCD_INIT:
MOV A, #38H
ACALL WRITE_CMD
MOV A, #0EH
ACALL WRITE_CMD
MOV A, #06H
ACALL WRITE_CMD
MOV A, #01H
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7,#100


LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET
WRITE_CHAR:
ACALL WAIT_LCD
SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
RET

WRITE_CMD:
ACALL WAIT_LCD
CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
RECEIVE: JNB RI,RECEIVE
MOV A, SBUF
CLR RI
RET
SEND: JNB TI,SEND
MOV SBUF,A
CLR TI
RET
END
BÀI 5: THÍ NGHIỆM ĐIỀU KHIỂN ADC
THÍ NGHIỆM 1: Viết chương trình đọc điện áp của biến trở trên kênh 0 và hiển thị ra led 7
đoạn

ORG 2000H
LAP: MOV R1,#255
MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
LAP1: PUSH ACC
MOV DPTR,#0000H
MOV B,#10
DIV AB
MOV R7,B
MOV B,#10
DIV AB
ORL A,#0B0H
MOVX @DPTR,A
ACALL DELAY_1MS
MOV A,B
ORL A,#0D0H
MOVX @DPTR,A
ACALL DELAY_1MS
MOV A,R7
ORL A,#0E0H
MOVX @DPTR,A
ACALL DELAY_1MS
POP ACC
DJNZ R1,LAP1 ; tạo thời gian delay
SJMP LAP

DELAY_100US: MOV R6,#200


DJNZ R6,$
RET

DELAY_1MS: MOV R6,#5


LOOP: MOV R5,#100
DJNZ R5,$
DJNZ R6,LOOP
RET
END

THÍ NGHIỆM 2: Viết chương trình đọc điện áp của biến trở trên kênh 0 và hiển thị ra LCD
ORG 2000H
RS BIT P3.5
EN BIT P3.4
MOV DPTR,#8000H
ACALL LCD_INIT
LAP: MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV DPTR,#8000H
PUSH ACC
MOV A, #80H
ACALL WRITE_CMD
POP ACC
MOV B,#10
DIV AB
MOV R0,B
MOV B,#10
DIV AB
ORL A,#30H
ACALL WRITE_CHAR
MOV A,B
ORL A,#30H
ACALL WRITE_CHAR
MOV A,R0
ORL A,#30H
ACALL WRITE_CHAR
SJMP LAP

LCD_INIT: MOV A, #38H


ACALL WRITE_CMD
MOV A, #0CH
ACALL WRITE_CMD
MOV A, #04H
ACALL WRITE_CMD
MOV A, #01H
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7,#100


LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET
WRITE_CHAR: SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
ACALL WAIT_LCD
RET

WRITE_CMD: CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
ACALL WAIT_LCD
RET

DELAY_100US: MOV R6,#200


DJNZ R6,$
RET
END

BÀI TẬP THÊM : Viết chương trình đọc điện áp thực của kênh 0 và hiển thị lên LCD

ORG 2000H
RS BIT P3.5
EN BIT P3.4
MOV DPTR,#8000H
ACALL LCD_INIT
LAP: MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV DPTR,#8000H
ACALL CHIA
MOV A, #80H
ACALL WRITE_CMD
SJMP LAP

LCD_INIT: MOV A, #38H


ACALL WRITE_CMD
MOV A, #0CH
ACALL WRITE_CMD
MOV A, #04H
ACALL WRITE_CMD
MOV A, #01H
ACALL WRITE_CMD
RET

WAIT_LCD: MOV R7,#100


LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET

WRITE_CHAR: SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
ACALL WAIT_LCD
RET

WRITE_CMD: CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
ACALL WAIT_LCD
RET

DELAY_100US: MOV R6,#200


DJNZ R6,$
RET

CHIA: PUSH ACC


PUSH B
MOV B,#51
DIV AB
ORL A,#30H
ACALL WRITE_CHAR
MOV A,#0A5H
ACALL WRITE_CHAR
MOV A,B
MOV B,#5
DIV AB
ORL A,#30H
ACALL WRITE_CHAR
POP B
POP ACC
RET
END
BÀI 6: THÍ NGHIỆM HIỂN THỊ DÙNG LED MA TRẬN

THÍ NGHIỆM 1: Viết chương trình hiển thị ký tự chữ A lên led ma trận

ORG 2000H
LOOP: MOV R1,#8
MOV A,#00000001B
MOV DPTR,#CHARA
LAP: ACALL HT_COT
PUSH ACC
CLR A
MOVC A,@A+DPTR
ACALL HT_HANG
INC DPTR
POP ACC
RL A
DJNZ R1, LAP
SJMP LOOP
CHARA: DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFH

HT_COT: PUSH DPH


PUSH DPL
MOV DPTR,# 0C000H
MOVX @DPTR,A
POP DPL
POP DPH
RET

HT_HANG: PUSH DPH


PUSH DPL
MOV DPTR,# 0A000H
MOVX @DPTR,A
ACALL DELAY_1ms
POP DPL
POP DPH
RET

DELAY_1ms:
MOV R7,#5
DL: MOV R6,#100
DJNZ R6,$
DJNZ R7,DL
RET
END

THÍ NGHIỆM 2: Viết chương trình con hiển thị nội dung 8 ô nhớ từ 30H đến 37H. Dùng
chương trình con để hiển thị chữ A, B

HT_ONHO:
MOV R1,#8
MOV A,#00000001B
MOV R0,#30H
LAP: ACALL HT_COT
PUSH ACC
CLR A
MOV A,@R0
ACALL HT_HANG
INC R0
POP ACC
RL A
DJNZ R1, LAP
RET

HT_COT:
PUSH DPH
PUSH DPL
MOV DPTR,# 0C000H
MOVX @DPTR,A
POP DPL
POP DPH
RET
HT_HANG:
PUSH DPH
PUSH DPL
MOV DPTR,# 0A000H
MOVX @DPTR,A
ACALL DELAY_1ms
POP DPL
POP DPH
RET
DELAY_1ms:
MOV R7,#5
DL: MOV R6,#100
DJNZ R6,$
DJNZ R7,DL
RET

Dùng chương trình con trên hiển thị chữ A


ORG 2000H
MOV 30H,#03H
MOV 31H,#0EDH
MOV 32H,#0EEH
MOV 33H,#0EEH
MOV 34H,#0EDH
MOV 35H,#03H
MOV 36H,#0FFH
MOV 37H,#0FFH
LOOP: ACALL HT_ONHO
SJMP LOOP
HT_ONHO:
MOV R1,#8
MOV A,#00000001B
MOV R0,#30H
LAP: ACALL HT_COT
PUSH ACC
CLR A
MOV A,@R0
ACALL HT_HANG
INC R0
POP ACC
RL A
DJNZ R1, LAP
RET

HT_COT:
PUSH DPH
PUSH DPL
MOV DPTR,# 0C000H
MOVX @DPTR,A
POP DPL
POP DPH
RET
HT_HANG:
PUSH DPH
PUSH DPL
MOV DPTR,# 0A000H
MOVX @DPTR,A
ACALL DELAY_1ms
POP DPL
POP DPH
RET
DELAY_1ms:
MOV R7,#5
DL: MOV R6,#100
DJNZ R6,$
DJNZ R7,DL
RET
END

Dùng chương trình con trên hiển thị chữ B

ORG 2000H
MOV 30H,#00H
MOV 31H,#76H
MOV 32H,#76H
MOV 33H,#76H
MOV 34H,#89H
MOV 35H,#0FFH
MOV 36H,#0FFH
MOV 37H,#0FFH
LOOP: ACALL HT_ONHO
SJMP LOOP
HT_ONHO:
MOV R1,#8
MOV A,#00000001B
MOV R0,#30H
LAP: ACALL HT_COT
PUSH ACC
CLR A
MOV A,@R0
ACALL HT_HANG
INC R0
POP ACC
RL A
DJNZ R1, LAP
RET

HT_COT:
PUSH DPH
PUSH DPL
MOV DPTR,# 0C000H
MOVX @DPTR,A
POP DPL
POP DPH
RET
HT_HANG:
PUSH DPH
PUSH DPL
MOV DPTR,# 0A000H
MOVX @DPTR,A
ACALL DELAY_1ms
POP DPL
POP DPH
RET
DELAY_1ms:
MOV R7,#5
DL: MOV R6,#100
DJNZ R6,$
DJNZ R7,DL
RET
END

BÀI TẬP THÊM : Cho hiển thị và chạy chữ A B C trên led ma trận

ORG 2000H
TT: MOV R4,#10
MOV R0,#0
MOV DPTR,#CHAR
MOV R5,#32
LOOP1: MOV R2,DPH
MOV R3,DPL
LOOP: MOV DPH,R2
MOV DPL,R3
MOV R1,#8
MOV A,#00000001B
LAP: ACALL HT_COT
PUSH ACC
CLR A
MOVC A,@A+DPTR
ACALL HT_HANG
INC DPTR
POP ACC
RL A
DJNZ R1, LAP
DJNZ R4,LOOP
MOV R4,#10
INC R0
MOV A,R0
MOV DPTR,#CHAR
ADD A,DPL
MOV DPL,A
DJNZ R5,LOOP1
SJMP TT
CHAR: DB 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,03H,
0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFH,00H, 76H, 76H, 76H, 89H, 0FFH,
0FFH,0FFH,81H,7EH,7EH,7EH,0BDH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,
0FFH,0FFH,0FFH,0FFH

HT_COT:
PUSH DPH
PUSH DPL
MOV DPTR,#0C000H
MOVX @DPTR,A
POP DPL
POP DPH
RET
HT_HANG:
PUSH DPH
PUSH DPL
MOV DPTR,#0A000H
MOVX @DPTR,A
ACALL DELAY_1ms
POP DPL
POP DPH
RET
DELAY_1ms:
MOV R7,#5
DL: MOV R6,#100
DJNZ R6,$
DJNZ R7,DL
RET
END
BÀI 7: THÍ NGHIỆM VỚI ĐỘNG CƠ DC

THÍ NGHIỆM 1: Viết chương trình cho phép động cơ chạy theo chiều thuận trong vòng 2s ,
nghỉ 2s,chạy theo chiều ngược 2s, nghỉ 2s và lặp lại

ORG 2000H
CLR A
MOV TMOD,#10H
MOV DPTR,#0E000H
LAP: ACALL CHIEUTHUAN
ACALL DELAY_2S
ACALL NGHI
ACALL DELAY_2S
ACALL CHIEUNGHICH
ACALL DELAY_2S
ACALL NGHI
ACALL DELAY_2S
SJMP LAP
CHIEUTHUAN:
SETB ACC.0
CLR ACC.1
MOVX @DPTR,A
RET
NGHI:
CLR ACC.0
CLR ACC.1
MOVX @DPTR,A
RET
CHIEUNGHICH:
CLR ACC.0
SETB ACC.1
MOVX @DPTR,A
RET
DELAY_2S:
MOV R7,#40
LOOP: MOV TL1,#LOW(-50000)
MOV TH1,#HIGH(-50000)
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
DJNZ R7, LOOP
RET
END
THÍ NGHIỆM 2: Viết chương trình điều khiển động cơ với phương pháp PWM, trong đó thời
gian bật của xung là 50% chu kỳ

ORG 2000H
LJMP MAIN
ORG 200BH
LJMP ISR_T0
ORG 201BH
LJMP ISR_T1
MAIN:
MOV TMOD,#11H
CLR A
SETB TF0
MOV IE,#82H
MOV DPTR,#0E000H
LAP: MOVX @DPTR,A
SJMP LAP
ISR_T0:
SETB ACC.0
CLR TR0
MOV TL0,#LOW(-1000)
MOV TH0,#HIGH(-1000)
SETB TR0
CLR TR1
MOV TL1,#LOW(-500)
MOV TH1,#HIGH(-500)
SETB TR1
SETB ET1
RETI
ISR_T1:
CLR TR1
CLR ACC.0
CLR ET1
RETI
END

THÍ NGHIỆM 3: Viết chương trình điều khiển động cơ với phương pháp PWM, trong đó thời
gian “bật” của xung lần lượt là 20%, 50%, và 80% chu kỳ. Mỗi độ rộng xung cách nhau 5s. Quy
trình được lặp lại liên tục

ORG 2000H
LJMP MAIN
ORG 200BH
LJMP ISR_T0
ORG 201BH
LJMP ISR_T1
MAIN:
MOV TMOD,#11H
MOV R7,#50
MOV R6,#100
MOV R5,#0
CLR A
SETB TF0
MOV IE,#82H
MOV DPTR,#0E000H
LAP: MOVX @DPTR,A
SJMP LAP
ISR_T0:
SETB ACC.0
CLR TR0
MOV TL0,#LOW(-1000)
MOV TH0,#HIGH(-1000)
SETB TR0
DJNZ R6,TT
MOV R6,#100
DJNZ R7,TT
MOV R7,#50
MOV R6,#100
INC R5
TT: CJNE R5,#0,KHAC20
CLR TR1
MOV TL1,#LOW(-200)
MOV TH1,#HIGH(-200)
SETB TR1
SJMP EXIT
KHAC20: CJNE R5,#1,KHAC50
CLR TR1
MOV TL1,#LOW(-500)
MOV TH1,#HIGH(-500)
SETB TR1
SJMP EXIT
KHAC50: CJNE R5,#2,KHAC80
CLR TR1
MOV TL1,#LOW(-800)
MOV TH1,#HIGH(-800)
SETB TR1
SJMP EXIT
KHAC80: MOV R5,#0
SJMP TT
EXIT: SETB ET1
RETI
ISR_T1:
CLR TR1
CLR ACC.0
CLR ET1
RETI
END

THÍ NGHIỆM 4: Viết chương trình thực hiện tăng hoặc giảm dần tốc độ động cơ nhờ 2 nút
nhấn P1.4 và P1.5. Khi không nhấn nút, tốc độ động cơ không đổi. Khi nút P1.4 được nhấn và
giữ thì tốc độ động cơ tăng dần. Khi nút P1.5 được nhấn và giữ thì tốc độ động cơ giảm dần

ORG 2000H
MAIN: MOV DPTR,#0E000H
MOV R3,#5
MOV R4,#5

KT: JNB P1.4,NHAY1


MOV A,#01H
MOVX@DPTR,A
ACALL DLC
MOV A,#00H
MOVX @DPTR,A
ACALL DLT
JNB P1.5,NHAY2
MOV A,#01H
MOVX @DPTR,A
ACALL DLC
MOV A,#00H
MOVX @DPTR,A
ACALL DLT
SJMP KT

NHAY1: INC R3
DEC R4
MOV A,#01H
MOVX @DPTR,A
ACALL DLC
MOV A,#00H
MOVX @DPTR,A
ACALL DLT
SJMP KT

NHAY2: INC R4
DEC R3

SKIP2: MOV A,#01H


MOVX @DPTR,A
ACALL DLC
MOV A,#00H
MOVX @DPTR,A
ACALL DLT
SJMP KT

DLC: MOV R6,03H


LAP1: MOV R5,#100
DJNZ R5,$
DJNZ R6,LAP1
RET

DLT: MOV R6,04H


LAP: MOV R5,#100
DJNZ R5,$
DJNZ R6,LAP
RET
END

THÍ NGHIỆM VI XỬ LÝ VỚI PIC 16F690


BÀI 1: THÍ NGHIỆM VỚI LED ĐƠN
THÍ NGHIỆM 1: Viết chương trình chớp tắt led được nối đến chân RC2 của PIC 16F690 với
tần số chớp tắt là 1Hz

#include <16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)

void main ()
{ set_tris_c(0);
for( ; ; )
{ output_toggle(pin_c2);
delay_ms(500); }
}

THÍ NGHIỆM 2: Viết chương trình thực hiện mạch led chạy được nối đến 4 led Port C của PIC
16F690 như sau, biết thời gian giữa các trạng thái S (sáng) và T (tắt) là 0.5s:
STTTTSTTTTSTTTTSSTTT….

#include <16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)
int8 a=0x10;
void main()
{ set_tris_c(0);
while(1)
{ a=a>>1;
output_c (a);
delay_ms(500);
if ( a==0x01)
{ a=0x10;
}
}
{

THÍ NGHIỆM 3:Viết chương trình thực hiện mạch đếm lên bắt đầu từ 0 đến 15, kết quả xuất ra
4 led đơn được nối đến port C của PIC 16F690. Giá trị mạch đếm tăng lên 1 đơn vị cách nhau 1s
#include <16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)
int8 i;
void main()
{ set_tris_c(0);
while(1)
{ for(i=0; i<= 0x0F; i++)
{ output_c(i);
delay_ms(1000);
}
}
}

THÍ NGHIỆM 4: Viết chương trình thực hiện mạch đếm lên bắt đầu từ 0 đến 15, kết quả xuất
ra 4 led đơn được nối đến Port C của PIC 16F690. Mạch chỉ đếm khi SW1 được nhấn

#include <16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)
int8 i=0;
void main ()
{ set_tris_c(0);
set_tris_a(1);
while(1)
{ if ( input(pin_A3)==0 )
{ i=i+1;
if ( i>0x0F)
i=0;
}
output_c(i);
}
}

THÍ NGHIỆM 5: Viết chương trình thực hiện mạch đếm lên bắt đầu từ 0 đến 15, kết quả xuất
ra 4 led đơn được nối đến Port C của PIC 16F690. Trong quá trình đếm nếu SW1 được nhấn thì
thực hiện đếm ngược từ giá trị đó về 0, sau đó lại đếm lên từ 0

#include <16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)
#use fast_io(a)
int const a[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
void main()

int i=0;
set_tris_C(0x00);
output_C(0x00);
while(1)
{ while(i<16)
{ output_C(a[i]);
delay_ms(1000);
if (input(pin_a0)==0)
{ if (i==0)
{ while(i<16)
{ output_C(a[i]);
delay_ms(1000);
i++;
}
}
else //i>0
{

while(i!=0)
{ output_c(a[i]);
delay_ms(500);
i--;
}
}
}
else
i++;
}
i = 0;
}
}

BÀI 2: THÍ NGHIỆM VỚI LED 7 ĐOẠN


THÍ NGHIỆM 1: Viết chương trình thực hiện mạch đếm lên từ 0 đến F ( số Hex ), kết quả xuất
ra led 7 đoạn, giá trị bộ đếm tăng lên 1 đơn vị cách nhau mỗi 0.5s

#include<16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)
#use fast_io(a)
int const a[16] = {0x06,0x04,0x07,0x07,0x05,0x03,0x03,0x06,0x07,0x07,0x07,
0x01,0x02, 0x05,0x03,0x03} ;
int const c[16] = {0x0f,0x01,0x06,0x03,0x09,0x0b,0x0f,0x01,0x0f,0x0b,0x0d,
0x0f,0x0e, 0x07,0x0e,0x0c} ;
void main()
{ int i = 0;
set_tris_c(0);
set_tris_a(0);
while(1)
{ for(i=0, i<=0xFF,i++)
{ output_c(c[i]);
output_a(a[i]);
delay_ms(500);
}
}
}

BÀI 3: THÍ NGHIỆM ĐIỀU KHIỂN ADC


THÍ NGHIỆM1: Viết chương trình đọc giá trị điện áp của biến trở RP1 và xuất mức điện áp
tương ứng với giá trị điện áp đọc được ra led 7 đoạn ( dùng ADC với độ phân giải 10 bits ) được
cho bởi bảng sau:

Mức ( ngõ ra bộ ADC) Giá trị hiển thị trên led 7đoạn

0 – 63 0

64 – 127 1

128 – 191 2

... ...

832 – 895 D

896 – 959 E

960 – 1023 F

#include <16f690.h>
#include <math.h>
#use delay(clock = 4000000)
#use fast_io(c)
#use fast_io(a)
void main()
{ int16 adc;
set_tris_c(0);
set_tris_a(1);
setup_adc(adc_clock_internal);
setup_adc_ports(sAN0);
set_adc_channel(0);
delay_us(10);
while(1)
{ adc = read_adc();
adc = adc/16;
output_c(adc);
}
}

THÍ NGHIỆM 2: Viết chương trình đọc giá trị ngõ ra ADC với độ phân giải 10bít dùng để điều
khiển thời gian chớp tắt led đơn được nối đến chân RC0 của PIC 16F690

#include <16f690.h>
#include <math.h>
#use delay(clock = 4000000)
#use fast_io(c)
#use fast_io(a)
void main()
{ int16 adc;
set_tris_c(0);
set_tris_a(1);
setup_adc(adc_clock_internal);
setup_adc_ports(sAN0);
set_adc_channel(0);
delay_us(10);
while(1)
{ adc = read_adc();
output_c(0xFF);
delay_ms(adc*10);
output_c(0x00);
delay_ms(adc*10);
}
}

You might also like