bctnvxl
TRANSCRIPT
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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