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

