49
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

BaocaoTNVXL

Embed Size (px)

Citation preview

Page 1: BaocaoTNVXL

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 2000HMAIN: 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 2000HMAIN: CPL P1.0

MOV R5,#10LAP1: MOV R6,#100LAP: MOV R7,#250

DJNZ R7,$DJNZ R6,LAPDJNZ R5,LAP1SJMP MAIN

END

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

ORG 2000HMAIN: SETB P1.0

MOV R5,#30LAP1: MOV R6,#100LAP: MOV R7,#100

DJNZ R7,$DJNZ R6,LAPDJNZ R5,LAP1

CLR P1.0 MOV R5,#70

Page 2: BaocaoTNVXL

LOOP1: MOV R6,#100LOOP: MOV R7,#100

DJNZ R7,$DJNZ R6,LOOPDJNZ 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 2000HMOV TMOD,#01H

LOOP: MOV R7,#10LAP: CLR TR0 MOV TH0,#HIGH(-50000)

MOV TL0,#LOW(-50000)SETB TR0JNB TF0,$CLR TF0DJNZ R7,LAPCPL P1.0SJMP 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)

Page 3: BaocaoTNVXL

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 LOOPLOOP2:

JNB P1.2,$ DEC R0 CJNE R0,#30H,GIAM MOV R0,#33H

GIAM: SJMP LOOPDELAY:

MOV A,@R0 LAP: MOV TH0,#HIGH(-50000)

MOV TL0,#LOW(-50000)

Page 4: BaocaoTNVXL

SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ ACC,LAP RET

ENDBÀ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 2000HMOV C,P1.1JNB P1.0,KO_DOICPL C

KO_DOI: MOV P1.5,CSJMP $END

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

ORG 2000HMOV C,P1.1JNB P1.0,KO_DOICPL C

KO_DOI: ANL C,P1.2MOV P1.5,CSJMP $END

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

Page 5: BaocaoTNVXL

STTTTTTT SSTTTTTT SSSTTTTT …SSSSSSSS TTTTTTTT

Biết hoàn thành 1 chu kỳ mất 4.5sORG 2000HMOV R0,#01111111B

LAP: MOV A,#01111111BLOOP: MOV P1,A

ACALL DELAY_500MSCJNE A,#00H,SANGMOV P1,#0FFHACALL DELAY_500MSSJMP LAP

SANG: RR AANL A,R0SJMP LOOP

DELAY_500MS:MOV R7,#5

DL1: MOV R6,#200DL: MOV R5,#250

DJNZ R5,$DJNZ R6,DLDJNZ R7,DL1RETEND

Page 6: BaocaoTNVXL

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 2000HLOOP: MOV A,#0LAP: MOV R7,A

MOV DPTR,#TABLEMOVC A,@A+DPTRMOV DPTR,#0000HMOVX @DPTR,AMOV A,R7INC AACALL DELAY_2SCJNE A,#10,LAPSJMP LOOP

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

DELAY_2S: MOV TMOD,#01HMOV R7,#40

LAP1: MOV TH0,#HIGH(-50000)MOV TL0,#LOW(-50000)SETB TR0JNB TF0,$CLR TR0CLR TF0DJNZ R7,LAP1RETEND

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

ORG 2000HLOOP: MOV A,#0LAP: MOV R7,A

MOV DPTR,#TABLEMOVC A,@A+DPTRMOV DPTR,#0000HMOVX @DPTR,AMOV A,R7INC AACALL DELAY_3MS

Page 7: BaocaoTNVXL

CJNE A,#4,LAPSJMP LOOP

TABLE: DB 071H,0B2H,0D3H,0E4H

DELAY_3MS: MOV TMOD,#01HMOV TH0,#HIGH(-3000)MOV TL0,#LOW(-3000)SETB TR0JNB TF0,$CLR TR0CLR TF0RETEND

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 2000HMOV R7,#255

LOOP: MOV B,#10MOV A,R7DIV ABMOV R4,BMOV B,#10DIV ABORL A,#0B0HMOV DPTR,#0HMOVX @DPTR,AACALL DELAY_3MSMOV A,BORL A,#0D0HMOVX @DPTR,AACALL DELAY_3MSMOV A,R4ORL A,#0E0HMOVX @DPTR,AACALL DELAY_3MSSJMP LOOP

DELAY_3MS: MOV TMOD,#01HMOV TH0,#HIGH(-3000)MOV TL0,#LOW(-3000)SETB TR0JNB TF0,$CLR TR0CLR TF0RET

Page 8: BaocaoTNVXL

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 2000HSETB P1.0MOV R7,#0MOV R3,#30MOV R4,#100MOV R5,#100 ; khởi động giá trị của R3,R4,R5tạo

delay để chống rung phímMOV A,#0MOV DPTR,#0000HSJMP LOOP

LAP: INC AMOV R7,A

LOOP: MOV B,#10DIV ABMOV R6,BMOV B,#10DIV ABORL A,#0B0HMOVX @DPTR,AACALL DELAY_3MSMOV A,BORL A,#0D0HMOVX @DPTR,AACALL DELAY_3MSMOV A,R6ORL A,#0E0HMOVX @DPTR,AACALL DELAY_3MSMOV A,R7JB P1.0, LOOP ; kiểm tra có ấn nút hay chưaDJNZ R3,LOOPMOV R3,#30DJNZ R4,LOOPMOV R3,#30MOV R4,#100DJNZ R5,LOOPMOV R3,#30MOV R4,#100

Page 9: BaocaoTNVXL

MOV R5,#100JNB P1.0, LOOP ; kiểm tra đã thả nút ấn hay chưaSJMP LAP

DELAY_3MS: MOV TMOD,#01HMOV TH0,#HIGH(-3000)MOV TL0,#LOW(-3000)SETB TR0JNB TF0,$CLR TR0CLR TF0RETEND

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 2000HMOV R0,#0B2HMOV R1,#59MOV R5,#100 ;khởi động giá trị R5 để tạo trễ

100*(3ms+3ms+4ms)=1sMOV DPTR,#0000H

LOOP: MOV A,R0MOVX @DPTR,AACALL DELAY_4MSMOV B,#10MOV A,R1DIV ABORL A,#0D0HMOVX @DPTR,AACALL DELAY_3MSMOV A,BORL A,#0E0HMOVX @DPTR,AACALL DELAY_3MSDJNZ R5,LOOPMOV R5,#100DEC R1CJNE R1,#0FFH,LOOP ; kiểm tra đã hết 1 phút hay chưaMOV R1,#59DEC R0CJNE R0,#0AFH,LOOP ; kiểm tra đã hết 3 phút hay chưaMOV R0,#0B2HSJMP LOOP

Page 10: BaocaoTNVXL

DELAY_3MS: MOV TMOD,#01HMOV TH0,#HIGH(-3000)MOV TL0,#LOW(-3000)SETB TR0JNB TF0,$CLR TR0CLR TF0RET

DELAY_4MS: MOV TMOD,#01HMOV TH0,#HIGH(-4000)MOV TL0,#LOW(-4000)SETB TR0JNB TF0,$CLR TR0CLR TF0RETEND

Page 11: BaocaoTNVXL

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 2000HEN BIT P3.4RS BIT P3.5

MAIN: MOV DPTR, #8000HACALL LCD_INITMOV A,#'H'ACALL WRITE_CHARMOV A,#'e'ACALL WRITE_CHARMOV A,#'l'ACALL WRITE_CHARMOV A,#'l'ACALL WRITE_CHARMOV A,#'o'ACALL WRITE_CHARSJMP $

LCD_INIT: MOV A,#38HACALL WRITE_CMDMOV A,#0EHACALL WRITE_CMDMOV A,#06HACALL WRITE_CMDRET

WAIT_LCD: MOV R7, #100DL: MOV R6, #250

DJNZ R6, $DJNZ R7, DLRET

WRITE_CHAR: ACALL WAIT_LCDSETB RSMOVX @DPTR, ASETB ENCLR ENRET

Page 12: BaocaoTNVXL

WRITE_CMD: ACALL WAIT_LCDCLR RSMOVX @DPTR, ASETB ENCLR ENRETEND

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

ORG 2000HEN BIT P3.4RS BIT P3.5

MAIN: MOV R5,#2MOV DPTR, #8000HACALL LCD_INITMOV A,#'H'ACALL WRITE_CHARMOV A,#'E'ACALL WRITE_CHARMOV A,#'L'ACALL WRITE_CHARMOV A,#'L'ACALL WRITE_CHARMOV A,#'O'ACALL WRITE_CHAR

TT: MOV R1,#11MOV A,#18H : khới động dịch trái

LAP: ACALL WRITE_CMDDL: ACALL WAIT_LCD

DJNZ R5,DL ; tạo thới gian delay sau mỗi lần dịchMOV R5,#2DJNZ R1, LAPMOV R1,#11MOV A,#1CH ; khới động dịch phải

LAP2: ACALL WRITE_CMDDL2: ACALL WAIT_LCD

DJNZ R5,DL2 ; tạo thời gian delay sau mỗi lần dịchMOV R5,#2DJNZ R1,LAP2SJMP TT

LCD_INIT: MOV A, #38HACALL WRITE_CMDMOV A, #0CHACALL WRITE_CMD

Page 13: BaocaoTNVXL

MOV A, #06HACALL WRITE_CMDMOV A, #01HACALL WRITE_CMDMOV A, #8BHACALL WRITE_CMDRET

WAIT_LCD: MOV R7,#100LOOP: MOV R6, #250

DJNZ R6,$DJNZ R7, LOOPRET

WRITE_CHAR: ACALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRITE_CMD: ACALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRETEND

Page 14: BaocaoTNVXL

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 2000HMOV TMOD,#20HMOV TL1,#-3MOV TH1,#-3MOV SCON,#42HSETB TR1MOV DPTR,#MSG

LAP: CLR AMOVC A,@A+DPTRJZ KTACALL SENDINC DPTRSJMP LAP

KT: SJMP KTMSG: DB 'HellO, world',0SEND: JNB TI,SEND

MOV SBUF,ACLR TIRETEND

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 2000HEN BIT P3.4RS BIT P3.5MOV TMOD,#20HMOV TL1,#-3MOV TH1,#-3MOV SCON,#52HSETB TR1MOV DPTR,#8000HACALL LCD_INIT

LAP:ACALL RECEIVE

Page 15: BaocaoTNVXL

ACALL WRITE_CHARSJMP LAP

LCD_INIT:MOV A, #38HACALL WRITE_CMDMOV A, #0EHACALL WRITE_CMDMOV A, #06HACALL WRITE_CMDMOV A,#01HACALL WRITE_CMDRET

WAIT_LCD: MOV R7,#100LOOP: MOV R6, #250

DJNZ R6,$DJNZ R7, LOOPRET

WRITE_CHAR: ACALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRITE_CMD: ACALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

RECEIVE: JNB RI,RECEIVEMOV A, SBUFCLR RIRETEND

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 2000HEN BIT P3.4

Page 16: BaocaoTNVXL

RS BIT P3.5MOV TMOD,#20HMOV TL1,#-3MOV TH1,#-3MOV SCON,#52HSETB TR1MOV DPTR,#8000HACALL LCD_INIT

LAP:ACALL RECEIVEACALL WRITE_CHARACALL SENDSJMP LAP

LCD_INIT:MOV A, #38HACALL WRITE_CMDMOV A, #0EHACALL WRITE_CMDMOV A, #06HACALL WRITE_CMDMOV A,#01HACALL WRITE_CMDRET

WAIT_LCD: MOV R7,#100LOOP: MOV R6, #250

DJNZ R6,$DJNZ R7, LOOPRET

WRITE_CHAR: ACALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRITE_CMD: ACALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

Page 17: BaocaoTNVXL

RECEIVE: JNB RI,RECEIVEMOV A, SBUFCLR RIRET

SEND: JNB TI, SENDMOV SBUF, ACLR TIRETEND

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 2000HEN BIT P3.4RS BIT P3.5MOV TMOD,#20HMOV TL1,#-3MOV TH1,#-3MOV SCON,#52HSETB TR1MOV R1,#0MOV DPTR,#8000HACALL LCD_INIT

LAP:ACALL RECEIVECJNE A,#13,TT ; kiểm tra phím nhấn EnterMOV A,#0C0HACALL WRITE_CMDSJMP THOAT

TT: CJNE A,#27,TT1 ; kiểm tra phím nhấn ESCMOV A,#01HACALL WRITE_CMDSJMP THOAT

TT1:CJNE A,#30H,SO ; bắt đầu kiểm tra phím nhấn là số

SO: JC THOATCJNE A,#3AH,CHU ; kết thúc kiểm tra phím nhấn là số

CHU: JC LEDCJNE A,#41H,KHAC; bắt đầu kiểm tra phím nhấn là chữ hoa

KHAC: JC THOATCJNE A,#5BH,HOA ; kết thúc kiểm tra phím nhấn là chữ hoa

Page 18: BaocaoTNVXL

HOA: JC NHOCJNE A,#61H,KHAC1 ; bắt đầu kiểm tra phím nhấn là chữ thường

KHAC1: JC THOATCJNE A,#7BH,THUONG ; kết thúc kiểm tra phím nhần là chữ thường

THUONG: JC NHOSJMP THOAT

NHO: MOV DPTR,#8000HINC R1CJNE 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 XUATLCDPUSH ACCMOV A,#0C0HACALL WRITE_CMDPOP ACCMOV R1,#0

XUATLCD: ACALL WRITE_CHARSJMP THOAT

LED: MOV DPTR,#0000HANL A,#0FHORL A,#0E0HMOVX @DPTR,A

THOAT: MOV DPTR,#8000HACALL SENDSJMP LAP

LCD_INIT:MOV A, #38HACALL WRITE_CMDMOV A, #0EHACALL WRITE_CMDMOV A, #06HACALL WRITE_CMDMOV A, #01HACALL WRITE_CMDRET

WAIT_LCD: MOV R7,#100LOOP: MOV R6, #250DJNZ R6,$DJNZ R7, LOOPRET

Page 19: BaocaoTNVXL

WRITE_CHAR:ACALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRITE_CMD: ACALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

RECEIVE: JNB RI,RECEIVEMOV A, SBUFCLR RIRET

SEND: JNB TI,SENDMOV SBUF,ACLR TIRETEND

Page 20: BaocaoTNVXL

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 2000HLAP: MOV R1,#255

MOV DPTR,#4000HMOV A,#0MOVX @DPTR,AACALL DELAY_100USMOVX A,@DPTR

LAP1: PUSH ACCMOV DPTR,#0000HMOV B,#10DIV ABMOV R7,BMOV B,#10DIV ABORL A,#0B0HMOVX @DPTR,AACALL DELAY_1MSMOV A,BORL A,#0D0HMOVX @DPTR,AACALL DELAY_1MSMOV A,R7ORL A,#0E0HMOVX @DPTR,AACALL DELAY_1MSPOP ACCDJNZ R1,LAP1 ; tạo thời gian delaySJMP LAP

DELAY_100US: MOV R6,#200DJNZ R6,$RET

DELAY_1MS: MOV R6,#5LOOP: MOV R5,#100

DJNZ R5,$DJNZ R6,LOOPRETEND

Page 21: BaocaoTNVXL

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 2000HRS BIT P3.5EN BIT P3.4MOV DPTR,#8000HACALL LCD_INIT

LAP: MOV DPTR,#4000HMOV A,#0MOVX @DPTR,AACALL DELAY_100USMOVX A,@DPTRMOV DPTR,#8000HPUSH ACCMOV A, #80HACALL WRITE_CMDPOP ACCMOV B,#10DIV ABMOV R0,BMOV B,#10DIV ABORL A,#30HACALL WRITE_CHARMOV A,BORL A,#30HACALL WRITE_CHARMOV A,R0ORL A,#30HACALL WRITE_CHARSJMP LAP

LCD_INIT: MOV A, #38HACALL WRITE_CMDMOV A, #0CHACALL WRITE_CMDMOV A, #04HACALL WRITE_CMDMOV A, #01HACALL WRITE_CMDRET

WAIT_LCD: MOV R7,#100LOOP: MOV R6, #250

DJNZ R6,$DJNZ R7, LOOP

Page 22: BaocaoTNVXL

RET

WRITE_CHAR: SETB RSMOVX @DPTR,ASETB ENCLR ENACALL WAIT_LCDRET

WRITE_CMD: CLR RSMOVX @DPTR,ASETB ENCLR ENACALL WAIT_LCDRET

DELAY_100US: MOV R6,#200DJNZ R6,$RETEND

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 2000HRS BIT P3.5EN BIT P3.4MOV DPTR,#8000HACALL LCD_INIT

LAP: MOV DPTR,#4000HMOV A,#0MOVX @DPTR,AACALL DELAY_100USMOVX A,@DPTRMOV DPTR,#8000HACALL CHIAMOV A, #80HACALL WRITE_CMDSJMP LAP

LCD_INIT: MOV A, #38HACALL WRITE_CMD MOV A, #0CHACALL WRITE_CMDMOV A, #04HACALL WRITE_CMDMOV A, #01H

Page 23: BaocaoTNVXL

ACALL WRITE_CMDRET

WAIT_LCD: MOV R7,#100LOOP: MOV R6, #250

DJNZ R6,$DJNZ R7, LOOPRET

WRITE_CHAR: SETB RSMOVX @DPTR,ASETB ENCLR ENACALL WAIT_LCDRET

WRITE_CMD: CLR RSMOVX @DPTR,ASETB ENCLR ENACALL WAIT_LCDRET

DELAY_100US: MOV R6,#200DJNZ R6,$RET

CHIA: PUSH ACCPUSH BMOV B,#51DIV ABORL A,#30HACALL WRITE_CHARMOV A,#0A5HACALL WRITE_CHARMOV A,BMOV B,#5DIV ABORL A,#30HACALL WRITE_CHARPOP BPOP ACCRETEND

Page 24: BaocaoTNVXL

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 2000HLOOP: MOV R1,#8

MOV A,#00000001BMOV DPTR,#CHARA

LAP: ACALL HT_COT PUSH ACC CLR A

MOVC A,@A+DPTRACALL HT_HANG

INC DPTRPOP ACCRL ADJNZ R1, LAPSJMP 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,#100DJNZ R6,$

Page 25: BaocaoTNVXL

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,#8MOV A,#00000001BMOV R0,#30H

LAP: ACALL HT_COT PUSH ACC CLR A

MOV A,@R0ACALL HT_HANG

INC R0POP ACCRL ADJNZ R1, LAPRET

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

Page 26: BaocaoTNVXL

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

ORG 2000HMOV 30H,#03HMOV 31H,#0EDHMOV 32H,#0EEHMOV 33H,#0EEHMOV 34H,#0EDHMOV 35H,#03HMOV 36H,#0FFHMOV 37H,#0FFH

LOOP: ACALL HT_ONHOSJMP LOOP

HT_ONHO:MOV R1,#8MOV A,#00000001BMOV R0,#30H

LAP: ACALL HT_COT PUSH ACC CLR A

MOV A,@R0ACALL HT_HANG

INC R0POP ACCRL ADJNZ R1, LAPRET

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:

Page 27: BaocaoTNVXL

MOV R7,#5 DL: MOV R6,#100

DJNZ R6,$DJNZ R7,DL

RETEND

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

ORG 2000HMOV 30H,#00HMOV 31H,#76HMOV 32H,#76HMOV 33H,#76HMOV 34H,#89HMOV 35H,#0FFHMOV 36H,#0FFHMOV 37H,#0FFH

LOOP: ACALL HT_ONHOSJMP LOOP

HT_ONHO:MOV R1,#8MOV A,#00000001BMOV R0,#30H

LAP: ACALL HT_COT PUSH ACC CLR A

MOV A,@R0ACALL HT_HANG

INC R0POP ACCRL ADJNZ R1, LAPRET

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

Page 28: BaocaoTNVXL

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

RETEND

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,#00000001BLAP: ACALL HT_COT

PUSH ACC CLR A

MOVC A,@A+DPTRACALL HT_HANG

INC DPTRPOP ACCRL ADJNZ 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

Page 29: BaocaoTNVXL

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,#100DJNZ R6,$DJNZ R7,DL

RETEND

Page 30: BaocaoTNVXL

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,ARET

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

Page 31: BaocaoTNVXL

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,#0E000HLAP: MOVX @DPTR,A SJMP LAPISR_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 RETIISR_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

Page 32: BaocaoTNVXL

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,#0E000HLAP: MOVX @DPTR,A SJMP LAPISR_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 R5TT: CJNE R5,#0,KHAC20 CLR TR1 MOV TL1,#LOW(-200) MOV TH1,#HIGH(-200) SETB TR1 SJMP EXITKHAC20: 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)

Page 33: BaocaoTNVXL

MOV TH1,#HIGH(-800) SETB TR1 SJMP EXITKHAC80: MOV R5,#0 SJMP TT EXIT: SETB ET1 RETIISR_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 2000HMAIN: 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

Page 34: BaocaoTNVXL

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,03HLAP1: MOV R5,#100 DJNZ R5,$ DJNZ R6,LAP1 RET

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

Page 35: BaocaoTNVXL

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: STTTTSTTTTSTTTTSSTTT….

#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; } } {

Page 36: BaocaoTNVXL

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

Page 37: BaocaoTNVXL

#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; } }

Page 38: BaocaoTNVXL

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); } }}

Page 39: BaocaoTNVXL

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:

#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);

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

Page 40: BaocaoTNVXL

}}

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); } }