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

