Thí nghiệm Vi xử lý EME - MC8
1. Thí nghiệm 1: Viết chương trình thực hiện đọc liện tục trạng thái 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ứ 1 của
port 1)
ORG 2000H
MAIN:
MOV C,P1.0
MOV P1.1,C
SJMP MAIN
END
a. Khi nhấn có 2 đèn sáng cùng lúc: khi mình nhấn P1.0 ( đèn sáng) thì dữ liệu từ P1.0 được
chuyển qua P1.1 thông qua cờ C, thời gian chuyển quá nhanh ( thời gian thực hiện lệnh là
vài micro giây) => ta nhìn sẽ thấy 2 đèn cùng sáng/tắt cùng lúc.
b. Các bit của 4 port được sử dụng trong thì nghiệm trên: Vì EME-MC8 thiết kế hoat động ở
chế độ 3 bus, nên port 0: bus dữ liệu, port 2: bus địa chỉ, P3.0, P3.1, P3.6, P3.7 dùng làm
bus điều khiển. Các chân còn lại của các port đều có thể dùng trong thí nghiệm này.
2. Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz được nối đến chân P1.0
với tần số dao động dùng trong hệ thống là 11.059MHz
a. Duty cycle: 50% - Hz
ORG 2000H
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, DB 0EEH, 0EDH, 03H, 0FFH, 0FFH,00H, 76H, 76H, 76H, 89H, 0FFH, 0FFH, DB 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 1. 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 MAIN: MOV DPTR,#0E000H ;địa chỉ của động cơ LOOP: MOV A,#02H ;động cơ quay ngược (theo quy ước) MOVX @DPTR,A ACALL DL2S MOV A,#00H ;động cơ dừng MOVX @DPTR,A ACALL DL2S MOV A,#01H ;động cơ quay thuận (theo quy ước) MOVX @DPTR,A ACALL DL2S MOV A,#00H MOVX @DPTR,A ACALL DL2S SJMP LOOP DL2S: MOV R5,#40 LAP1: MOV R6,#100 LAP: MOV R7,#250 DJNZ R7,$ DJNZ R6,LAP DJNZ R5,LAP1 RET END 2. 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 ;địa chỉ ngắt timer 0 LJMP ISRT0 ORG 201BH ;địa chỉ ngắt timer 1 LJMP ISRT1 MAIN: MOV DPTR,#0E000H ;địa chỉ của động cơ MOV A,#01H MOVX @DPTR,A MOV TMOD,#11H SETB TF0 MOV IE,#8AH ;cho phép ngắt timer 0 và timer 1 SJMP $ ISRT0: ;ngắt timer 0 tạo chu kỳ 1000us SETB ACC.0 CLR ACC.1 MOVX @DPTR,A CLR TR0 MOV TH0,#HIGH(-1000) MOV TL0,#LOW(-1000) SETB TR0 CLR TR1 MOV TH1,#HIGH(-500) MOV TL1,#LOW(-500) SETB TR1 RETI ISRT1: ;ngắt timer 1 tạo độ rộng xung 500us CLR ACC.0 CLR ACC.1 MOVX @DPTR,A RETI END 3. 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%, 80% chu kỳ. Mỗi độ rộng xung cách nhau 5s. Qui trình được lặp lại liên tục. ORG 2000H LJMP MAIN ORG 200BH LJMP ISRT0 ORG 201BH LJMP ISRT1 MAIN: MOV R7,#250 MOV R6,#20 MOV R3,#0 MOV DPTR,#0E000H MOV A,#01H MOVX @DPTR,A MOV TMOD,#11H SETB TF0 MOV IE,#8AH SJMP $ ISRT0: Nhay sang pwn 50% neu R3=1 80% neu r3=2 CJNE R3,#0,NHAY DJNZ R7,LOP pwm 20% DJNZ R6,LOP1 INC R3 MOV R6,#20 MOV R7,#250 SJMP LOP2 pwm 50% LOP1: MOV R7,#250 LOP: SETB ACC.0 CLR ACC.1 MOVX @DPTR,A CLR TR0 MOV TH0,#HIGH(-1000) Chu kỳ động co 1 ms MOV TL0,#LOW(-1000) SETB TR0 CLR TR1 MOV TH1,#HIGH(-200) chu kỳ mơ 20%=200us MOV TL1,#LOW(-200) SETB TR1 SJMP THOAT NHAY: CJNE R3,#1,NHAY1 nhay sang pwn 80% khi r3=2 DJNZ R7,LOP2 DJNZ R6,LOP3 INC R3 MOV R6,#20 MOV R7,#250 SJMP LOP2 LOP3: MOV R7,#250 LOP2: SETB ACC.0 CLR ACC.1 MOVX @DPTR,A CLR TR0 MOV TH0,#HIGH(-1000) MOV TL0,#LOW(-1000) SETB TR0 CLR TR1 MOV TH1,#HIGH(-500) chu kỳ mo 50% MOV TL1,#LOW(-500) SETB TR1 SJMP THOAT NHAY1: DJNZ R7,LOP4 DJNZ R6,LOP5 MOV R3,#0 MOV R6,#20 MOV R7,#250 SJMP THOAT LOP5: MOV R7,#250 LOP4: SETB ACC.0 CLR ACC.1 MOVX @DPTR,A CLR TR0 MOV TH0,#HIGH(-1000) MOV TL0,#LOW(-1000) SETB TR0 CLR TR1 MOV TH1,#HIGH(-800) 80% MOV TL1,#LOW(-800) SETB TR1 SJMP THOAT THOAT: RETI ISRT1: CLR ACC.0 CLR ACC.1 MOVX @DPTR,A RETI END 4. Thí nghiệm 4: Viết chươg trình thực hiện việc tăng hoặc giảm dần tốc độ động cơ nhờ hai 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 ;nhấn P1.4 thì đến NHAY1 MOV A,#01H MOVX @DPTR,A ACALL DLC MOV A,#00H MOVX @DPTR,A ACALL DLT JNB P1.5,NHAY2 ;nhấn P1.5 thì đến 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Ý PHẦN PIC 16F690 BÀI 1: THÍ NGHIỆM VỚI LED ĐƠN 1. 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(0x00); output_C(0x00); while(1) { output_high(pin_C0); delay_ms(500); output_low(pin_C0); delay_ms(500); } } 2. 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) la 0.5s: STTT – TSTT – TTST – TTTS – STTT - ..... #include #use delay(clock = 4000000) #use fast_io(c) int const a[4] = {0x08, 0x04, 0x02, 0x01); void main() { int i; set_tris_C(0x00); output_C(0x00); while(1) { while(i<4) { port_C = a[i]; delay_ms(500); i++; } i = 0; } } 3. 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 PIC16F690. 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) int const a[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; void main() { int i; set_tris_C(0x00); output_C(0x00); while(1) { while(i<16) { output_C(a[i]); delay_ms(1000); i++; } i = 0; } } 4. 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 PIC16F690. Mạch chỉ đếm khi SW1 được nhấn. #include #use delay(clock = 4000000) #use fast_io(C) int const a[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; void main() { int i; set_tris_C(0x00); output_C(0x00); while(1) { while(i<16) { if (input(pin_a0)==0) { output_C(a[i]); delay_ms(1000); i++; } } i = 0; } } 5. 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 PIC16F690. Trong quá trình đếm nếu SW1 được nhấn thì sẽ thực hiện đếm ngược tại giá trị đó về 0. Sau đó lại thực hiện đế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; set_tris_C(0x00); output_C(0x00); while(1) { while(i<16) { output_C(a[i]); delay_ms(1000); if (input(pin_a0)==0) { lap: 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 //tang i tiep khi khong nhan i++; } i = 0; } goto lap; } BÀI 2: THÍ NGHIỆM VỚI LED 7 ĐOẠN 1. 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 #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) { while(i<16) { output_c(c[i]); output_a(a[i]); delay_ms(500); i++; } i = 0; } } BÀI 3: THÍ NGHIỆM ĐIỀU KHIỂN ADC 1. Thí nghiệm 1: 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 (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 0 – 63 0 64 – 127 1 128 – 191 2 ... ... 832 – 895 D 896 – 959 E 960 – 1023 F #include #include #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); } } 2. Thí nghiệm 2: Viết chương trình đọc giá trị ngõ ra ADC với độ phân giải 10 bits 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 #include #use delay(clock = 4000000) #use fast_io(c) #use fast_io(a) void main() { int 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*4; output_c(0xff); delay_ms(adc+100); output_c(0x00); delay_ms(adc+100); } }
File đính kèm:
- thi_nghiem_vi_xu_ly_eme_mc8.pdf