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) MAIN: ORG 2000H 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 MAIN: LAP1: LAP: ORG 2000H CPL P1.0 MOV R5,#10 MOV R6,#100 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% MAIN: LAP1: LAP: ORG 2000H SETB P1.0 MOV R5,#30 MOV R6,#100 MOV R7,#100 DJNZ R7,$ DJNZ R6,LAP DJNZ R5,LAP1 CLR P1.0 MOV R5,#70 LOOP1: LOOP: MOV R6,#100 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 MOV R7,#10 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 LOOP: LAP: Dùng ngắt Timer 0 để tạo xung vuông 1Hz ORG 2000H LJMP MAIN ORG 200BH LJMP ISR_T0 MOV TMOD,#01H MOV R7,#10 CLR TR0 MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 MOV IE,#82H SJMP $ CLR TR0 MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) MAIN: ISR_T0: EXIT: SETB TR0 DJNZ R7,EXIT CPL P1.0 MOV R7,#10 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 SJMP LOOP JNB P1.2,$ DEC R0 CJNE R0,#30H,GIAM MOV R0,#33H SJMP LOOP MOV A,@R0 MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) TANG: LOOP2: GIAM: DELAY: LAP: BÀI TẬP THÊM : SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ ACC,LAP RET END 1) Viết chương trình thực hiện cổng logic XOR 2 ngõ vào KO_DOI: ORG 2000H MOV C,P1.1 JNB P1.0,KO_DOI CPL C MOV P1.5,C SJMP $ END 2) Viết chương trình thực hiện mạch sau: KO_DOI: ORG 2000H MOV C,P1.1 JNB P1.0,KO_DOI CPL C 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. LOOP: LAP: ORG 2000H MOV A,#0 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 DB 0E0H,0E1H,0E2H,0E3H,0E4H,0E5H,0E6H,0E7H,0E8H,0E9H TABLE: 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 LOOP: LAP: ORG 2000H MOV A,#0 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 TABLE: DB SJMP LOOP 071H,0B2H,0D3H,0E4H MOV TMOD,#01H MOV TH0,#HIGH(-3000) MOV TL0,#LOW(-3000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET END DELAY_3MS: 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 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 MOV TMOD,#01H MOV TH0,#HIGH(-3000) MOV TL0,#LOW(-3000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET END LOOP: DELAY_3MS: 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 delay để chống rung phím MOV A,#0 MOV DPTR,#0000H SJMP LOOP LAP: LOOP: INC A MOV R7,A 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 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 ; khởi động giá trị của R3,R4,R5tạo ; kiểm tra có ấn nút hay chưa JNB P1.0, LOOP SJMP LAP DELAY_3MS: ; kiểm tra đã thả nút ấn hay chưa 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 100*(3ms+3ms+4ms)=1s LOOP: MOV DPTR,#0000H 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 ;khởi động giá trị R5 để tạo trễ DELAY_3MS: MOV TMOD,#01H MOV TH0,#HIGH(-3000) MOV TL0,#LOW(-3000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET MOV TMOD,#01H MOV TH0,#HIGH(-4000) MOV TL0,#LOW(-4000) SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET END DELAY_4MS: 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 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 $ MOV A,#38H ACALL WRITE_CMD MOV A,#0EH ACALL WRITE_CMD MOV A,#06H ACALL WRITE_CMD RET MAIN: LCD_INIT: 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 ACALL WAIT_LCD CLR RS WRITE_CMD: 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 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 MOV R1,#11 MOV A,#18H : khới động dịch trái ACALL WRITE_CMD 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 ACALL WRITE_CMD 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 MOV A, #38H ACALL WRITE_CMD MOV A, #0CH ACALL WRITE_CMD MOV A, #06H ACALL WRITE_CMD MAIN: TT: LAP: DL: LAP2: DL2: LCD_INIT: MOV A, #01H ACALL WRITE_CMD MOV A, #8BH ACALL WRITE_CMD RET WAIT_LCD: LOOP: MOV R7,#100 MOV R6, #250 DJNZ R6,$ DJNZ R7, LOOP RET ACALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET ACALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET END WRITE_CHAR: WRITE_CMD: 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 CLR A MOVC A,@A+DPTR JZ KT ACALL SEND INC DPTR SJMP LAP SJMP KT 'HellO, world',0 JNB TI,SEND MOV SBUF,A CLR TI RET END LAP: KT: MSG: DB SEND: 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: LOOP: MOV R7,#100 MOV R6, #250 DJNZ R6,$ DJNZ R7, LOOP RET ACALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET ACALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET JNB RI,RECEIVE MOV A, SBUF CLR RI RET END WRITE_CHAR: WRITE_CMD: RECEIVE: 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: LOOP: MOV R7,#100 MOV R6, #250 DJNZ R6,$ DJNZ R7, LOOP RET ACALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET ACALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET JNB RI,RECEIVE MOV A, SBUF WRITE_CHAR: WRITE_CMD: RECEIVE: SEND: CLR RI RET 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 CJNE A,#27,TT1 ; kiểm tra phím nhấn ESC MOV A,#01H ACALL WRITE_CMD SJMP THOAT CJNE A,#30H,SO ; bắt đầu kiểm tra phím nhấn là số JC THOAT CJNE A,#3AH,CHU ; kết thúc kiểm tra phím nhấn là số JC LED CJNE A,#41H,KHAC; bắt đầu kiểm tra phím nhấn là chữ hoa JC THOAT CJNE A,#5BH,HOA ; kết thúc kiểm tra phím nhấn là chữ hoa JC NHO TT: TT1: SO: CHU: KHAC: HOA: KHAC1: THUONG: NHO: CJNE A,#61H,KHAC1 ; bắt đầu kiểm tra phím nhấn là chữ thường JC THOAT CJNE A,#7BH,THUONG ; kết thúc kiểm tra phím nhần là chữ thường JC NHO SJMP THOAT 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 JC XUATLCD PUSH ACC MOV A,#0C0H ACALL WRITE_CMD POP ACC MOV R1,#0 XUONG: 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 LAP: ORG 2000H MOV R1,#255 MOV DPTR,#4000H MOV A,#0 MOVX @DPTR,A ACALL DELAY_100US MOVX A,@DPTR 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 SJMP LAP MOV R6,#200 DJNZ R6,$ RET MOV R6,#5 MOV R5,#100 DJNZ R5,$ DJNZ R6,LOOP RET END LAP1: ; tạo thời gian delay DELAY_100US: DELAY_1MS: LOOP: 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 LAP: ORG 2000H RS BIT P3.5 EN BIT P3.4 MOV DPTR,#8000H ACALL LCD_INIT 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 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 MOV R7,#100 MOV R6, #250 DJNZ R6,$ DJNZ R7, LOOP RET LCD_INIT: WAIT_LCD: LOOP: WRITE_CHAR: SETB RS MOVX @DPTR,A SETB EN CLR EN ACALL WAIT_LCD RET CLR RS MOVX @DPTR,A SETB EN CLR EN ACALL WAIT_LCD RET MOV R6,#200 DJNZ R6,$ RET END WRITE_CMD: DELAY_100US: 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 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 MOV A, #38H ACALL WRITE_CMD MOV A, #0CH ACALL WRITE_CMD MOV A, #04H ACALL WRITE_CMD MOV A, #01H ACALL WRITE_CMD LAP: LCD_INIT: RET WAIT_LCD: LOOP: MOV R7,#100 MOV R6, #250 DJNZ R6,$ DJNZ R7, LOOP RET SETB RS MOVX @DPTR,A SETB EN CLR EN ACALL WAIT_LCD RET CLR RS MOVX @DPTR,A SETB EN CLR EN ACALL WAIT_LCD RET MOV R6,#200 DJNZ R6,$ RET 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 WRITE_CHAR: WRITE_CMD: DELAY_100US: CHIA: 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: DL: MOV R7,#5 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 ACALL HT_COT PUSH ACC CLR A MOV A,@R0 ACALL HT_HANG INC R0 POP ACC RL A DJNZ R1, LAP RET 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: DL: MOV R7,#5 MOV R6,#100 DJNZ R6,$ DJNZ R7,DL RET LAP: HT_COT: Dùng chương trình con trên hiển thị chữ A LOOP: HT_ONHO: 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 ACALL HT_ONHO SJMP LOOP MOV R1,#8 MOV A,#00000001B MOV R0,#30H ACALL HT_COT PUSH ACC CLR A MOV A,@R0 ACALL HT_HANG INC R0 POP ACC RL A DJNZ R1, LAP RET PUSH DPH PUSH DPL MOV DPTR,# 0C000H MOVX @DPTR,A POP DPL POP DPH RET LAP: HT_COT: 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 ACALL HT_ONHO SJMP LOOP MOV R1,#8 MOV A,#00000001B MOV R0,#30H ACALL HT_COT PUSH ACC CLR A MOV A,@R0 ACALL HT_HANG INC R0 POP ACC RL A DJNZ R1, LAP RET PUSH DPH PUSH DPL MOV DPTR,# 0C000H MOVX @DPTR,A POP DPL POP DPH RET HT_HANG: PUSH DPH PUSH DPL MOV DPTR,# 0A000H LOOP: HT_ONHO: LAP: HT_COT: MOVX @DPTR,A ACALL DELAY_1ms POP DPL POP DPH RET DELAY_1ms: DL: MOV R7,#5 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: DL: MOV R7,#5 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 ACALL CHIEUTHUAN ACALL DELAY_2S ACALL NGHI ACALL DELAY_2S ACALL CHIEUNGHICH ACALL DELAY_2S ACALL NGHI ACALL DELAY_2S SJMP LAP 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: LOOP: MOV R7,#40 MOV TL1,#LOW(-50000) MOV TH1,#HIGH(-50000) SETB TR1 JNB TF1,$ CLR TF1 CLR TR1 DJNZ R7, LOOP RET END LAP: CHIEUTHUAN: 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 MOVX @DPTR,A SJMP LAP 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 CJNE R5,#0,KHAC20 CLR TR1 MOV TL1,#LOW(-200) MOV TH1,#HIGH(-200) SETB TR1 SJMP EXIT CJNE R5,#1,KHAC50 CLR TR1 MOV TL1,#LOW(-500) MOV TH1,#HIGH(-500) SETB TR1 SJMP EXIT CJNE R5,#2,KHAC80 CLR TR1 MOV TL1,#LOW(-800) MOV TH1,#HIGH(-800) SETB TR1 SJMP EXIT LAP: ISR_T0: TT: KHAC20: KHAC50: KHAC80: EXIT: ISR_T1: MOV R5,#0 SJMP TT SETB ET1 RETI 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 MAIN: ORG MOV MOV MOV 2000H DPTR,#0E000H R3,#5 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 INC R3 DEC R4 MOV A,#01H MOVX @DPTR,A ACALL DLC MOV A,#00H NHAY1: MOVX @DPTR,A ACALL DLT SJMP KT NHAY2: SKIP2: INC DEC R4 R3 MOV A,#01H MOVX @DPTR,A ACALL DLC MOV A,#00H MOVX @DPTR,A ACALL DLT SJMP KT MOV MOV DJNZ DJNZ RET MOV MOV DJNZ DJNZ RET END R6,03H R5,#100 R5,$ R6,LAP1 R6,04H R5,#100 R5,$ R6,LAP DLC: LAP1: DLT: LAP: 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 #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 #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 #use delay(clock = 4000000) #use fast_io(c) int8 i; void main() { set_tris_c(0); while(1) { for(i=0; i0x0F) 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 #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