bctnvxl

29
BÁO CÁO THÍ NGHIỆM VI XỬ LÝ NHÓM 5: Đỗ Đăng Khoa 40701119 Nguyễn Hà Duy 40800313 Lê Hoàng Vân 40802581 Phần 1 : Thí nghiệm với 8051 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 thực hiện việc đọc liên tục trạng trạng thái của nút nhấn P1.0 và hiển thị ra LED được nối tại chân P1.1 ORG 2000H LOOP: MOV C, P1.0 MOV P1.1, C SJMP LOOP END Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz ra chân P1.0,biết tần số dao động được dùng trong KIT là 11.059MHz ORG 2000H LAP: CPL P1.0 ACALL DL500 SJMP LAP DL500: PUSH 05 PUSH 06 PUSH 07 MOV R5, #10 L2: MOV R6, #100 L1: MOV R7, #250 Page 1 of 29

Upload: duy-nguyen

Post on 14-Oct-2014

108 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: BCTNVXL

BÁO CÁO THÍ NGHIỆM

VI XỬ LÝNHÓM 5:

Đỗ Đăng Khoa 40701119

Nguyễn Hà Duy 40800313

Lê Hoàng Vân 40802581

Phần 1 : Thí nghiệm với 8051

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 thực hiện việc đọc liên tục trạng trạng thái của nút nhấn P1.0 và hiển thị ra LED được nối tại chân P1.1

ORG 2000HLOOP: MOV C, P1.0

MOV P1.1, C SJMP LOOP END

Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz ra chân P1.0,biết tần số dao động được dùng trong KIT là 11.059MHz

ORG 2000HLAP: CPL P1.0

ACALL DL500 SJMP LAP

DL500: PUSH 05 PUSH 06 PUSH 07 MOV R5, #10

L2: MOV R6, #100 L1: MOV R7, #250 DJNZ R7, $

DJNZ R6, L1 DJNZ R5, L2 POP 07 POP 06 POP 05 RET

END

Page 1 of 24

Page 2: BCTNVXL

Thí nghiệm 2: (Mở rộng) Thay đổi tần số xung vuông thành 0.5Hz, với chu kì nhiệm vụ là 30%

ORG 2000HLAP: SETB P1.0

LCALL DL150 CLR P1.0 LCALL DL350 SJMP LAP

DL150:PUSH 07 PUSH 06 PUSH 05 MOV R5, #2

L1_2: MOV R6, #150 L1_1: MOV R7, #250

DJNZ R7, $ DJNZ R6, L1_1DJNZ R5, L1_2POP 05 POP 06 POP 07 RET

DL350:PUSH 07 PUSH 06 PUSH 05 MOV R5, #7 ;

L2_2: MOV R6, #100 ;L2_1: MOV R7, #250 ;

DJNZ R7, $ ;DJNZ R6, L2_1;DJNZ R5, L2_2;POP 05 POP 06 POP 07 RETEND

Thí nghiệm 3: Viết chương trình tạo xung vuông 1 Hz dùng Timer0

ORG 2000HSETB P1.0MOV TMOD,#01H

LAP: MOV R7,#10LOOP: MOV TL0,#LOW(-50000)

MOV TH0,#HIGH(-50000)SETB TR0JNB TF0,$CLR TF0CLR TR0DJNZ R7,LOOPCPL P1.0SJMP LAPEND

Thí nghiệm 3: (Mở rộng) Tận dụng ngắt Timer0 để tạo xung

ORG 2000HLJMP MAINORG 200BHLJMP ISR_T0SETB P1.0MOV R7,#10

Page 2 of 24

Page 3: BCTNVXL

MAIN: MOV IE,#10000010BMOV TMOD,#01HSETB TF0SJMP $

ISR_T0:CJNE R7,#0,NEXTCPL P1.0MOV R7,#10

NEXT: MOV TL0,#LOW(-50000)MOV TH0,#HIGH(-50000)SETB TR0DEC R7RETIEND

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ể thay đổi được bằng cách nhấn P1.1 (tăng) hoặc P1.2 (giảm)

ORG 2000HMOV TMOD, #01H MOV A,#10

LOOP:JNB P1.1,TANG JNB P1.2,GIAM CALL XUNGSJMP LOOP

TANG:CJNE A, #255, TANG1SJMP LOOP

TANG1:INC ACALL XUNGSJMP LOOP

GIAM:CJNE A, #1, GIAM1 SJMP LOOP

GIAM1:DEC ACALL XUNGSJMP LOOP

XUNG:MOV R5, A

DL50: MOV TH0, #HIGH(-50000)MOV TL0, #LOW(-50000)SETB TR0JNB TF0, $CLR TR0CLR TF0DJNZ R5, DL50CPL P1.0RETEND

s

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ị ra LED 7 đoạn,mỗi lần cách nhau 2s

ORG 2000HLOOP2:

MOV A,#0LOOP1:

Page 3 of 24

Page 4: BCTNVXL

MOV R0,AMOV DPTR,#TABLEMOVC A,@A+DPTRMOV DPTR,#0HMOVX @DPTR,AMOV A,R0INC AACALL DELAY2SCJNE A,#10,LOOP1SJMP LOOP2

DELAY2S:MOV TMOD,#01HMOV R1,#40

LOOP3:MOV TH0,#HIGH(-50000)MOV TL0,#LOW(-50000)SETB TR0JNB TF0,$CLR TR0CLR TF0DJNZ R1,LOOP3RET

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

Thí nghiệm 2: Viết chương trình hiển thị giá trị 1234 ra LED 7 đoạn.

ORG 2000HLOOP2:

MOV A,#0LOOP1:

MOV R0,AMOV DPTR,#TABLEMOVC A,@A+DPTRMOV DPTR,#0HMOVX @DPTR,AMOV A,R0INC AACALL DELAY3MSCJNE A,#4,LOOP1SJMP LOOP2

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

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

Thí nghiệm 3: Viết chương trình thể hiện giá trị nhị phân trong thanh ghi R7 ra LED 7 đoạn.

ORG 2000HMOV R7,#99

LOOP: MOV A,R7MOV B,#10DIV ABMOV R6,BMOV B,#10DIV AB

Page 4 of 24

Page 5: BCTNVXL

ORL A,#0B0HMOV DPTR,#0HMOVX @DPTR,AACALL DL2MSMOV A,BORL A,#0D0HMOVX @DPTR,AACALL DL2MSMOV A,R6ORL A,#0E0HMOVX @DPTR,AACALL DL2MSSJMP LOOP

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

Bài 3: Thí nghiệm hiển thị dùng LCD

Thí nghiệm 1:

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

MAIN:MOV DPTR, #TABLE

LOOP:CLR AMOVC A, @A+DPTRCJNE A, #0, NEXTSJMP $

NEXT:CALL WRITE_LCDINC DPTRSJMP LOOP

INIT_LCD:SETB ENCLR RSMOV A, #38HCALL SEND_COMMOV A, #06HCALL SEND_COMMOV A, #0EHCALL SEND_COMRET

SEND_COM:PUSH DPHPUSH DPLSETB ENCLR RSMOV DPTR, #8000HMOVX @DPTR, ACLR ENLCALL WAIT_LCDPOP DPHPOP DPL

Page 5 of 24

Page 6: BCTNVXL

RETWRITE_LCD:

PUSH DPHPUSH DPLSETB ENSETB RSMOV DPTR, #8000HMOVX @DPTR, ACLR ENLCALL WAIT_LCDPOP DPHPOP DPLRET

WAIT_LCD:MOV R6, #200

DL1: MOV R7, #250DJNZ R7, $DJNZ R6, DL1RET

TABLE:DB 'Hello',0END

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 thông qua Hyper Terminal với tốc độ 19200pbs.

ORG 2000HMAIN:

MOV TMOD, #20HMOV SCON, #42HMOV TH1, #-3SETB TR1MOV DPTR, #TABLE

NEXT:CLR AMOVC A, @A+DPTRCJNE A, #0, SENDSJMP $

SEND:JNB TI,$CLR TIMOV SBUF,AINC DPTRSJMP NEXT

TABLE:DB 'HELLO, WORLD',0END

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 Hyper Terminal (bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình Hyper Terminal) và hiển thị lên LCD.

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

MAIN:MOV DPTR,#8000HCALL LCD_INTLCALL CLR_LCD

Page 6 of 24

Page 7: BCTNVXL

CALL UART_INTLLOOP: CALL IN_CHAR

CALL WRT_TXTSJMP LOOP

UART_INTL:MOV SCON,#52HMOV TMOD,#20HMOV TH1,#-3SETB TR1RET

OUT_CHAR:JNB TI,$CLR TIMOV SBUF,ARET

IN_CHAR:JNB RI,$CLR RICJNE A,#00001101B,NEXT1MOV A,#0C0HACALL WRT_COMSJMP IN_CHAR

NEXT1:MOV A,SBUFRET

LCD_INTL:MOV A,#38HCALL WRT_COMMOV A,#0EHCALL WRT_COMMOV A,#06HCALL WRT_COMMOV A,#0CHCALL WRT_COMRET

WAIT_LCD:MOV R7,#50

DEL:MOV R6,#250DJNZ R6,$DJNZ R7,DELRET

WRT_TXT:CALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRT_COM:CALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

CLR_LCD:LCALL WAIT_LCDMOV A,#01HCALL WRT_COMRETEND

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 độ tuỳ chọn.

Page 7 of 24

Page 8: BCTNVXL

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

MAIN:MOV DPTR,#8000HCALL LCD_INTLCALL CLR_LCDCALL UART_INTL

LOOP:CALL IN_CHARCALL WRT_TXTCALL OUT_UARTSJMP LOOP

UART_INTL:MOV SCON,#52HMOV TMOD,#20HMOV TH1,#-3SETB TR1RET

OUT_CHAR:JNB TI,$CLR TIMOV SBUF,ARET

IN_CHAR:JNB RI,$CLR RIMOV A,SBUFRET

LCD_INTL:MOV A,#38HCALL WRT_COMMOV A,#0EHCALL WRT_COMMOV A,#06HCALL WRT_COMMOV A,#0CHCALL WRT_COMRET

WAIT_LCD:MOV R7,#50

DEL:MOV R6,#250DJNZ R6,$DJNZ R7,DELRET

WRT_TXT:CALL WAIT_LCDSETB RSMOVX @DPTR,ASETB ENCLR ENRET

WRT_COM:CALL WAIT_LCDCLR RSMOVX @DPTR,ASETB ENCLR ENRET

OUT_UART:PUSH ACCMOV SBUF, AJNB TI,$CLR TIPOP ACC

Page 8 of 24

Page 9: BCTNVXL

RETCLR_LCD:

LCALL WAIT_LCDMOV A,#01HCALL WRT_COMRETEND

Bài 5: Thí nghiệm điều khiển ADC

Thí nghiệm 1: Viết chương trình thực hiện đọc điện áp của biến trở trên kênh 0 và hiển thị ra led 7 đoạn.

ORG 2000HMAIN:

MOV TMOD,#20HLOOP:

MOV DPTR,#4000HMOV A,#0MOVX @DPTR,ACALL DELAY100USMOVX A,@DPTRCALL BINTOBCDMOV DPTR,#0000HMOV A,R2ORL A,#0E0HMOVX @DPTR,ACALL DELAY3MSMOV A,R3ORL A,#0D0HMOVX @DPTR,ACALL DELAY3MSMOV A,R4ORL A,#0B0HMOVX @DPTR,ACALL DELAY3MSSJMP LOOP

DELAY100US:MOV TH1,#-100MOV TL1,#-100SETB TR1JNB TF1,$CLR TF1CLR TR1RET

BINTOBCD:MOV B,#10DIV ABMOV R2,BMOV B,#10DIV ABMOV R3,BMOV R4,ARET

DELAY3MS:MOV R5,#10

LOOP1:MOV R6,#150DJNZ R6,$DJNZ R5,LOOP1RETEND

Page 9 of 24

Page 10: BCTNVXL

Thí nghiệm 2: Viết chương trình thực hiện đọ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,#100

LOOP: MOV R6, #250DJNZ 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,$

Page 10 of 24

Page 11: BCTNVXL

RETEND

Bài 6: Thí nghiệm với LED ma trận

Thí nghiệm 1: Viết chương trình hiển thị chữ A ra LED ma trận

ORG 2000HMAIN:

MOV A, #01HMOV R0, #0

LAP: ACALL QUET_COTACALL QUET_HANGINC R0ACALL DELAYCJNE R0, #5, LAPSJMP MAIN

QUET_COT:PUSH DPHPUSH DPLRR AMOV DPTR, #0C000HMOVX @DPTR, APOP DPHPOP DPLRET

QUET_HANG:PUSH ACCPUSH DPHPUSH DPLMOV DPTR, #0C000HACALL DU_LIEU_HANGMOVX @DPTR, APOP ACCPOP DPHPOP DPLRET

DU_LIEU_HANG:PUSH DPHPUSH DPLMOV A, R0MOV DPTR, #CHAR_AMOVC A, @A+DPTRPOP DPHPOP DPLRET

DELAY:MOV R7, #4

LAPC1:MOV R6, #250DJNZ R6, $DJNZ R7, LAPC1RET

CHAR_A:DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFHEND

Thí nghiệm 2: Viết lại chương trình hiển thị chữ A ra LED ma trận có sử dụng chương trình con

ORG 2000HLOOP:

MOV R1,#8MOV A,#00000001B

Page 11 of 24

Page 12: BCTNVXL

MOV DPTR,#CHARALAP: ACALL HT_COT PUSH ACC CLR A

MOVC A,@A+DPTRACALL HT_HANG

INC DPTRPOP ACCRL ADJNZ R1, LAPACALL DELAY1MOV R1,#7MOV A,#00000010BMOV DPTR,#CHARA

LAP1: ACALL HT_COT PUSH ACC CLR A

MOVC A,@A+DPTRACALL HT_HANG

INC DPTRPOP ACCRL ADJNZ R1, LAP1ACALL DELAY1MOV R1,#6MOV A,#00000100BMOV DPTR,#CHARA

LAP2: ACALL HT_COT PUSH ACC CLR A

MOVC A,@A+DPTRACALL HT_HANG

INC DPTRPOP ACCRL ADJNZ R1, LAP2ACALL DELAY1MOV R1,#5MOV A,#00001000BMOV DPTR,#CHARA

LAP3: ACALL HT_COT PUSH ACC CLR A

MOVC A,@A+DPTRACALL HT_HANG

INC DPTRPOP ACCRL ADJNZ R1, LAP3ACALL DELAY1SJMP LOOP

CHARA: DB 03H,0EDH,0EEH,0EEH,0EDH,03H,0FFH,0FFH

HT_COT:PUSH DPHPUSH DPLMOV DPTR,# 0C000HMOVX @DPTR,APOP DPLPOP DPHRET

HT_HANG:PUSH DPHPUSH DPLMOV DPTR,# 0A000HMOVX @DPTR,AACALL DELAY_1ms

Page 12 of 24

Page 13: BCTNVXL

POP DPLPOP DPHRET

DELAY_1ms:MOV R7,#5

DL: MOV R6,#100DJNZ R6,$DJNZ R7,DL

RETDELAY1:

MOV TMOD,#01HMOV R2,#40

LL: MOV TL0,#LOW(-50000)MOV TH0,#HIGH(-50000)SETB TR0JNB TF0,$CLR TF0CLR TR0DJNZ R2,LLRETEND

Bài 7: Thí nghiệm với động cơ DC

Thí nghiệm1: 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

RETDELAY_2S:

MOV R7,#40LOOP:

MOV TL1,#LOW(-50000)MOV TH1,#HIGH(-50000)SETB TR1JNB TF1,$CLR TF1CLR TR1DJNZ R7, LOOP

Page 13 of 24

Page 14: BCTNVXL

RETEND

Thí nghiệm2: 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 MOV IE,#8AH SETB TF0 MOV DPTR,#0E000HLAP: MOVX @DPTR,A SJMP LAPISR_T0: SETB ACC.0 CLR ACC.1 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 ACC.0 CLR ACC.1 CLR ET1 RETI END

Thí nghiệm3: 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 lien 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 MOV IE,#8AH SETB TF0

MOV DPTR,#0E000HLAP: MOVX @DPTR,A SJMP LAPISR_T0: SETB ACC.0 CLR ACC.1

Page 14 of 24

Page 15: BCTNVXL

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 TR1MOV TL1,#LOW(-500)MOV TH1,#HIGH(-500)SETB TR1SJMP EXIT

KHAC50: CJNE R5,#2,KHAC80CLR TR1

MOV TL1,#LOW(-800) MOV TH1,#HIGH(-800) SETB TR1 SJMP EXITKHAC 80:

MOV R5,#00H EXIT:

SETB ET1RETI

ISR_T1:CLR ACC.0

CLR ACC.1 CLR ET1 RETI END

Thí nghiệm4: Viết chương trình thực hiện việc 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ữ lại thì tốc độ động cơ giảm dần

ORG 2000HLJMP MAINORG 200BHLJMP ISR_T0ORG 201BHLJMP ISR_T1ORG 2030HIC573 EQU 0E000H

MAIN:MOV TMOD, #11HMOV R1, #0MOV IE,#8AHCLR AMOV TH0, #HIGH(-1000)MOV TL0, #LOW(-1000)SETB TR0SJMP $

ISR_T0:

Page 15 of 24

Page 16: BCTNVXL

CLR TR0CLR TF0MOV TH0, #HIGH(-1000)MOV TL0, #LOW(-1000)SETB TR0CALL CHECKCJNE R1, #0,CASE1SJMP 20PER

CASE 1:CJNE R1, #1,STATE2SJMP 40F

CASE 2:CJNE R1, #1,STATE3SJMP 60F

CASE 3:CJNE R1, #1,STATE4SJMP 80F

CASE 4:SJMP 100F

20F:MOV TH1,#HIGH(-200)MOV TL1, #LOW(-200)SJMP KT

40F:MOV TH1,#HIGH(-400)MOV TL1, #LOW(-400)SJMP KT

80F:MOV TH1,#HIGH(-800)MOV TL1, #LOW(-800)SJMP KT

100F:MOV TH1,#HIGH(-1000)MOV TL1, #LOW(-1000)

KT: SETB TR1RETI

CHECK:JNB P1.4,TANGJNB P1.5,GIAMSJMP KT1

TANG:CALL DELAYJB P1.4,TANG1

HET_TANG:MOV R1, #4SJMP KT1

TANG1:INC R1CJNE R1, #5,HET_TANGSJMP KT1

GIAM:CALL DELAYJB P1.5,GIAM1

HET_GIAM:MOV R1, #0SJMP KT1

GIAM1:DEC R1CJNE R1, #255,HET_GIAMSJMP KT1

KT1: RETISR_T1:

CLR TR1CLR TF1CPL ACC.0MOV DPTR, #IC573MOVX @DPTR,A

Page 16 of 24

Page 17: BCTNVXL

RETIDELAY:

PUSH 07 PUSH 06 PUSH 05 MOV R5, #20 ;

L2_2: MOV R6, #250 ;L2_1: MOV R7, #250 ;

DJNZ R7, $ ;DJNZ R6, L2_1;DJNZ R5, L2_2;POP 05 POP 06 POP 07 RETEND

Phần2: Thí nghiệm với PIC 16F690

Bài 1: Thí nghiệm với LED đơn

Thí nghiệm1: 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(0x00);output_C(0x00);while(1) { output_high(PIN_C0); delay_ms(500); output_low(PIN_C0); delay_ms(500); }}

Thí nghiệm2: 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)void main(){set_tris_C(0x00);output_C(0x00);while(1) { output_high(PIN_C0); delay_ms(250); output_low(PIN_C0); output_high(PIN_C1); delay_ms(250); output_low(PIN_C1);

Page 17 of 24

Page 18: BCTNVXL

output_high(PIN_C2); delay_ms(250); output_low(PIN_C2); output_high(PIN_C3); delay_ms(250); output_low(PIN_C3); }}

Thí nghiệm3: 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)void main(){set_tris_C(0b00000000);set_tris_B(0b11111111);byte value,dem;output_C(0x00);dem=0;while(true) { value=input(PIN_B4); if(value==0) { dem++; output_C(dem); delay_ms(200); if(dem==16) {dem=0;} } }}

Thí nghiệm4: 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 ra4 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)void main(){set_tris_C(0b00000000);set_tris_B(0b11111111);byte value,dem;output_C(0x00);dem=0;while(true) { value=input(PIN_B4); if(value==1) { dem++; output_C(dem); delay_ms(1000);

Page 18 of 24

Page 19: BCTNVXL

if(dem==16) {dem=0;} } else { dem--; output_C(dem); delay_ms(1000); if(dem==16) {dem=0;} } }}

Bài 2 : Thí nghiệm với 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 ( dung 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 3

… …

832-895 D

896-959 E

960-1023 F

#include <16F690.h>#use delay(clock=4000000)#use fast_io(a)#use fast_io(c)void main(){ long value,i; set_tris_C(0x00); set_tris_A(0xFF); setup_adc_ports(ALL_ANALOG); setup_adc(ADC_CLOCK_DIV_32); set_adc_channel(0); delay_ms(10); while(1) {

Page 19 of 24

Page 20: BCTNVXL

value=read_adc(); if (value<=63) { i=0; } if ((value>=64)&&(value<=127)) { i=1; } if ((value>=128)&&(value<=191)) { i=2; } if ((value>=192)&&(value<=255)) { i=3; } if ((value>=256)&&(value<=319)) { i=4; } if ((value>=320)&&(value<=383)) { i=5; } if ((value>=384)&&(value<=447)) { i=6; } if ((value>=448)&&(value<=511)) { i=7; } if ((value>=512)&&(value<=575)) { i=8; } if ((value>=576)&&(value<=639)) { i=9; } if ((value>=640)&&(value<=703)) { i=10; } if ((value>=704)&&(value<=767)) { i=11; } if ((value>=768)&&(value<=831)) { i=12; } if ((value>=832)&&(value<=895)) { i=13; } if ((value>=896)&&(value<=959)) { i=14; } if ((value>=960)&&(value<=1023)) { i=15; } output_c(i); }}

Thí nghiệm2: Viết chương trình đọc giá trị ngõ ra ADC với độ phân giải 10 bits dung để đ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>#use delay(clock=4000000)#use fast_io(a)#use fast_io(c)void main(){ long value; set_tris_C(0x00); set_tris_A(0xFF); setup_adc_ports(ALL_ANALOG); setup_adc(ADC_CLOCK_DIV_32); set_adc_channel(0); delay_ms(10); while(1) { value=read_adc(); output_high(PIN_C0); delay_ms(100); delay_ms(value); output_low(PIN_C0);

Page 20 of 24

Page 21: BCTNVXL

output_high(PIN_C1); delay_ms(100); delay_ms(value); output_low(PIN_C1); output_high(PIN_C2); delay_ms(100); delay_ms(value); output_low(PIN_C2); output_high(PIN_C3); delay_ms(100); delay_ms(value); output_low(PIN_C3); }}

Phần 3: Bài tập lớn

Viết chương trình điều khiển động cơ DC, kết nối 2 Kit 8051. Nếu ấn phím P1.0 trên Kit điều khiển thì động cơ trên Kit hoạt động quay nhanh hơn. Nếu ấn phím P1.1 trên Kit điều khiển thì động cơ trên Kit hoạt động quay chậm lại. Nếu ấn phím P1.2 trên Kit điều khiển thì động cơ trên Kit hoạt động quay, ấn lần nữa thì động cơ ngừng.

Kit điều khiển:

ORG 2000H;**********CHUONG TRINH CHINH**********MAIN:

MOV SCON,#52HMOV TMOD,#20HMOV TL1,#-3SETB TR1MOV R5,#39HMOV R4,#31HMOV R2,#00HMOV A,#0

LOOP: ACALL READ_KEYACALL CONTROL_CODELJMP LOOP

;**********CHUONG TRINH CHONG RUNG PHIM**********READ_KEY:

PUSH 03HNHOK: MOV R3,#50BACK: ACALL GET_KEY

JNC NHOKDJNZ R3,BACKPUSH ACC

BACK2: MOV R3,#50BACK3: ACALL GET_KEY

JC BACK2DJNZ R3,BACK3POP ACCPOP 03HRET

;**********CHUONG TRINH QUET PHIM**********GET_KEY:

PUSH 02HMOV A,#0FFHMOV R6,#0

TEST: MOV P1,AMOV R7,A

Page 21 of 24

Page 22: BCTNVXL

MOV A,P1ANL A,#0FFHCJNE A,#0FFH,KEY_HITCLR CLJMP EXIT_GET_KEY

KEY_HIT:MOV R2,#8

AGAIN:RRC AJNC DONEINC R6DJNZ R2,AGAIN

DONE:SETB CMOV A,R6

EXIT_GET_KEY:POP 02HRET

;**********CHUONG TRINH TAO MA DIEU KHIEN**********CONTROL_CODE:CASE1:

CJNE A,#00H,CASE2 ;NHAN P1.0CJNE R4,#39H,NEXT1MOV A,#39HACALL OUT_CONTROL_CODEMOV R5,#39HMOV R2,#00HLJMP EXIT

NEXT1: MOV A,R4 ;NHO HON 3AHACALL OUT_CONTROL_CODEINC R4MOV R5,#39HMOV R2,#00HLJMP EXIT

CASE2:CJNE A,#01H,CASE3 ;NHAN P1.1DEC R4MOV A,R4MOV R5,ACJNE R5,#30H,$+3JNC NEXT2MOV A,#30HACALL OUT_CONTROL_CODEMOV R4,#30HMOV R2,#00HLJMP EXIT

NEXT2:MOV A,R5 ;LON HON BANG 30HACALL OUT_CONTROL_CODEDEC R5MOV R2,#00HLJMP EXIT

CASE3:CJNE A,#02H,EXIT ;NHAN P1.2CJNE R2,#00H,NEXT3A

NEXT3E:MOV A,#39H ;BANG 30HACALL OUT_CONTROL_CODEINC R2MOV R5,#39HMOV R4,#31HLJMP EXIT

NEXT3A:CJNE R2,#01H,NEXT3BMOV A,#30HACALL OUT_CONTROL_CODEINC R2

Page 22 of 24

Page 23: BCTNVXL

MOV R5,#39HMOV R4,#31HLJMP EXIT

NEXT3B:CJNE R2,#02H,NEXT3CMOV A,#3AHACALL OUT_CONTROL_CODEINC R2MOV R5,#39HMOV R4,#31HLJMP EXIT

NEXT3C:CJNE R2,#03H,NEXT3DMOV A,#30HACALL OUT_CONTROL_CODEINC R2MOV R5,#39HMOV R4,#31HLJMP EXIT

NEXT3D:MOV R2,#00HLJMP NEXT3E

EXIT: NOPRET

;**********CHUONG TRINH XUAT MA DIEU KHIEN**********OUT_CONTROL_CODE:

JNB TI,$CLR TIMOV SBUF,ARET

END

Kit hoạt động:

TRUST1EQU 40HTRUST2EQU 41HORG 2000HLJMP MAINORG 200BHLJMP ISR_T0ORG 2023HLJMP ISR_SP

;**********CHUONG_TRINH_CHINH**********MAIN:

MOV DPTR,#0E000HMOV R4,#10MOV R3,#2MOV TMOD,#21HMOV TL1,#-3SETB TR1MOV SCON,#52HMOV IP,#00010000BMOV IE,#10010000BSJMP $

;**********CHUONG TRINH NGAT PORT NOI TIEP**********ISR_SP:

JB TI,NEXTMOV A,SBUFCLR RICLR CSUBB A,#30HMOV R7,AMOV R6,AINC R6MOV TRUST1,R6CLR C

Page 23 of 24

Page 24: BCTNVXL

MOV A,#0AHSUBB A,R7MOV R5,AINC R5MOV TRUST2,R5SETB ET0SETB TF0RETI

NEXT: CLR TIRETI

;**********CHUONG TRINH NGAT TIMER 0**********ISR_T0:

CLR TR0CJNE R7,#00H,NEXT1 ;DUNG DONG COMOV A,#00HMOVX @DPTR,ALJMP EXIT1

NEXT1: CJNE R7,#0AH,NEXT2CJNE R4,#0,JUMP3 ;DONG CO QUAY NGUOCCJNE R3,#0,JUMP4MOV R4,#10MOV R3,#2

JUMP3: MOV A,#02HMOVX @DPTR,ADEC R4LJMP EXIT

JUMP4: MOV A,#00HMOVX @DPTR,ADEC R3LJMP EXIT

NEXT2: CJNE R6,#0,JUMP1 ;DONG CO QUAY THUANCJNE R5,#0,JUMP2MOV R6,TRUST1MOV R5,TRUST2

JUMP1: MOV A,#01HMOVX @DPTR,ADEC R6LJMP EXIT

JUMP2: MOV A,#00HMOVX @DPTR,ADEC R5LJMP EXIT

EXIT: MOV TH0,#HIGH(-100)MOV TL0,#LOW(-100)SETB TR0

EXIT1: NOPRETI

END

Page 24 of 24