Báo cáo Thí nghiệm Vi xử lý với EME-MC8
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
1ms: MOV R7,#5 DL: MOV R6,#100 DJNZ R6,$ DJNZ R7,DL RET Dùng chương trình con trên hiển thị chữ A 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 LOOP: ACALL HT_ONHO SJMP LOOP HT_ONHO: MOV R1,#8 MOV A,#00000001B MOV R0,#30H LAP: ACALL HT_COT PUSH ACC CLR A MOV A,@R0 ACALL HT_HANG INC R0 POP ACC RL A DJNZ R1, LAP RET 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 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 LOOP: ACALL HT_ONHO SJMP LOOP HT_ONHO: MOV R1,#8 MOV A,#00000001B MOV R0,#30H LAP: ACALL HT_COT PUSH ACC CLR A MOV A,@R0 ACALL HT_HANG INC R0 POP ACC RL A DJNZ R1, LAP RET 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 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: 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 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,A RET 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 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,#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 LAP: MOVX @DPTR,A SJMP LAP ISR_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 R5 TT: CJNE R5,#0,KHAC20 CLR TR1 MOV TL1,#LOW(-200) MOV TH1,#HIGH(-200) SETB TR1 SJMP EXIT KHAC20: 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) MOV TH1,#HIGH(-800) SETB TR1 SJMP EXIT KHAC80: MOV R5,#0 SJMP TT EXIT: SETB ET1 RETI ISR_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 2000H MAIN: 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 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Ý 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: STTTàTSTTàTTSTàTTTSàSTTTà. #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; 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 #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 #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<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; } } 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 #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); } } } 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: 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 #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); } } 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 #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(); output_c(0xFF); delay_ms(adc*10); output_c(0x00); delay_ms(adc*10); } }
File đính kèm:
- bao_cao_thi_nghiem_vi_xu_ly_voi_eme_mc8.doc