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

 

pdf41 trang | Chuyên mục: Vi Xử Lý – Vi Điều Khiển | Chia sẻ: tuando | Lượt xem: 509 | Lượt tải: 0download
Tóm tắt nội dung Thí nghiệm Vi xử lý EME - MC8, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfthi_nghiem_vi_xu_ly_eme_mc8.pdf