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 b.. Thí nghiệm 2: Viết chươn
Trang 1THÍ NGHIỆM VI XƯ LÝ EME – MC8
BÀI 1: THÍ NGHIỆM VỚI NÚT NHẤN VÀ LED ĐƠN
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)
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
Trang 2Dùng vòng lặp để tạo trễ 0.5s, với giá trị nạp cho R5, R6, R7 như trên tính theo công thức gần đúng là t=2*m*n*p
Với giá trị nạp: R5 = 10, R6 = 200, R7 = 250 để giảm sai số
ORG 2000HLAP:
MOV R1,#3 MOV R2,#7
CLR P1.0LAP1:
ACALL DL DJNZ R1,LAP1
SETB P1.0LAP2:
ACALL DLDJNZ R2,LAP2SJMP LAPDL:
L2: MOV R5,#4
L1: MOV R6,#200
MOV R7,#250DJNZ R7,$
DJNZ R6,L1DJNZ R5,L2RET
END
3 Thí nghiệm 3:
ORG 2000HMAIN:
CPL P1.0ACALL DL500SJMP MAINDL500:
MOV TMOD,#01HMOV R7,#10LOOP:
MOV TH0,#HIGH(-50000) ; giá trị nạp là 50000*10 = 500000us = 0.5sMOV TL0,#LOW(-50000)
SETB TR0
Trang 3JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ tràn
4 Thí nghiệm 4: Viết chương trình làm cho led nối đến chân P1.0 chớp tắt với
tần số có thể tăng hoặc giảm bằng cách nhấn nút nối đến chân P1.1 hoặc P1.2 Chu kì chớp tắt trung bình là 1s
Trang 4MOV R7,A SJMP LAP ; mỗi lần giảm là 1*25000us = 0.025sKT_GIAM:
JNB P1.2,LAPINC A
MOV R7,ALAP:
ACALL DL500DJNZ R7,LAPSJMP MAINDL500:
MOV TMOD,#01HMOV TH0,#HIGH(-25000) ; giá trị là 50000*R7 (R7TB = 10) = 500000us = 0.5sMOV TL0,#LOW(-25000)
SETB TR0JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ trànCLR TF0
CLR TR0RET END
BÀI TẬP:
1 Viết chương trình thực hiện cổng logic: XOR 2 ngõ vào
ORG 2000HMAIN:
CLR AMOV C,P1.0MOV ACC.0,CMOV R0,AMOV C,P1.1MOV ACC.0,CXRL A,R0MOV C,ACC.0MOV P1.5,CSJMP MAINEND
2 Viết chương trình thực hiện mạch đèn chạy: SSSSTTTT…….-SSSSSSSS-TTTTTTT Thời gian thực hiện chương trình là 4.5s (với S: đèn sáng, T: đèn tắt)
STTTTTT-SSTTTTTT-SSSTTTTT-ORG 2000HMAIN:
CLR A
Trang 6BÀI 2: THÍ NGHIỆM HIỂN THỊ DÙNG LED 7 ĐOẠN
1 Thí nghiệm 1:Viết chương trính thực hiện bộ đếm từ 0->9 và hiển thị trên led
7 đoạn, mỗi lần cách nhau 2s
ORG 2000HMAIN:
MOV R7,#10MOV R5,#0LOOP:
MOV DPTR,#TABLEMOV A,R5
MOVC A,@A+DPTR
ACALL DL2S
MOV DPTR,#0000HMOVX @DPTR,AINC R5
DJNZ R7,LOOPSJMP MAINDL2S:
MOV R6,#40MOV TMOD,#01HLAP:
MOV TH0,#HIGH(-50000)MOV TL0,#LOW(-50000)SETB TR0
JNB TF0,$
CLR TF0CLR TR0DJNZ R6,LAPRET
TABLE:
DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79HEND
2 Thí nghiệm 2:
a Viết chương trình hiển thị giá trị 1234 lên led 7 đoạn
ORG 2000HMAIN:
MOV R7,#4
Trang 7MOV R5,#0LOOP:
MOV DPTR,#TABLEMOV A,R5
MOV DPTR,#0000HMOVX @DPTR,AINC R5
DJNZ R7,LOOPSJMP MAINDL2MS:
MOV TMOD,#01HMOV TH0,#HIGH(-2000)MOV TL0,#LOW(-2000)SETB TR0
JNB TF0,$
CLR TF0CLR TR0RET
MOV R7,#12HMOV R6,#34HMOV A,R7ANL A,#0F0HSWAP A
ADD A,#70HMOV R1,A ; R1 chưa gía trị 71H tương ứng với giá trị 1 đươc xuất ra led 1MOV A,R7
ANL A,#0FHADD A,#0B0HMOV R2,A ; R2 chưa giá trị 0B2H tương ứng với giá trị 1 được xuất ra led 2MOV A,R6
ANL A,#0F0H
Trang 83 Thí nghiệm 3: Viết chương trình hiển thị giá trị nhị phân trong thanh ghi R7
lên led 7 đoạn
Trang 9DIV ABMOV R3,B ; R3 chứa giá trị hàng chụcMOV R2,A ; R2 chưa giá trị hàng trămLAP:
MOV DPTR,#0MOV A,R2ADD A,#0B0HMOVX @DPTR,AACALL DL2MSMOV A,R3ADD A,#0D0HMOVX @DPTR,AACALL DL2MSMOV A,R4ADD A,#0E0HMOVX @DPTR,AACALL DL2MSSJMP LAPDL2MS:
MOV TMOD,#01HMOV TH0,#HIGH(-2000)MOV TL0,#LOW(-2000)SETB TR0
JNB TF0,$
CLR TF0CLR TR0RET
END
BÀI TẬP:
1 Đếm số từ 0-99 (giả sử <100) xuất ra led 7 đoạn Mỗi lần xuất cách nhau
ORG 2000HMAIN:
MOV DPTR,#0MOV R7,#0MOV R6,#0
JB P1.0,NHAY ; nhảy khi nhấn P1.0SJMP MAIN
NHAY:
INC R7CJNE R7,#0AH,SKIP ; nhảy đến SKIP khi R7 # 0AH
Trang 11BÀI 3: THÍ NGHIỆM HIỂN THỊ BẰNG LCD
1 Thí nghiệm 1: Hiển thị chuỗi “Hello world” lên LCD
Trang 13MOV R5,#200LOP:
MOV R4,#250DJNZ R4,$
DJNZ R5,LOPDJNZ R6,LOP1RET
DELAY2:
MOV R3,#1LOOP2:
MOV R7,#50DJNZ R7,$
DJNZ R3,LOOP2RET
MOV DPTR,#8000HMOV R1,#6
ACALL CLEAR
ACALL INIT_LCDACALL HIEN_CHUACALL DELAYLAP1:
MOV A,#1CH ; dịch phảiACALL WRITECOM
ACALL DELAYDJNZ R1,LAP1MOV R1,#6LAP:
MOV A,#18H ; dịch tráiACALL WRITECOM
ACALL DELAYDJNZ R1,LAPMOV R1,#6SJMP LAP1
Trang 15BÀI 4: THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP
1 Thí nghiệm 1: Phát chuỗi “Hello World” ra port nối tiếp
ORG 2000H
MAIN:
MOV SCON,#52H
MOV TMOD,#20H
Trang 16MOV TH1,#-3SETB TR1MOV DPTR,#TABLELAP:
CLR AMOVC A,@A+DPTRINC DPTR
ACALL OUT_CHARJNZ LAP
SJMP $OUT_CHAR: ;phát kí tự ra port nối tiếp
JNB TI, $CLR TIMOV SBUF, ARET
MOV R4,#16LAP1:
ACALL IN_CHARACALL WRITE_TEXT DJNZ R4,LA
MOV R4,#16MOV A,#0C8H ;để con trỏ xuống hàngACALL WRITE_COM
LAP2:
ACALL IN_CHARACALL WRITE_TEXT
Trang 17DJNZ R4,LAP2ACALL CLEARSJMP LOOP
;============================================ Chương trình con port nối tiếp
UART_INIT:
MOV SCON,#52HMOV TMOD,#20HMOV TH1,#-3SETB TR1RET
OUT_CHAR:
JNB TI, $ ;khi phát hết TI=1CLR TI
MOV SBUF, A RET
IN_CHAR:
JNB RI, $CLR RIMOV A, SBUFRET
;============================================== Chương trình con LCDLCD_INIT:
MOV A,#38HACALL WRITE_COMMOV A,#0EH
ACALL WRITE_COMMOV A,#06H
ACALL WRITE_COM RET
CLEAR:
MOV A,#01HACALL WRITE_COMRET
WAIT_LCD:
MOV R7, #100DEL1:
MOV R6, #250DJNZ R6, $ DJNZ R7, DEL1RET
WRITE_TEXT:
ACALL WAIT_LCDSETB RS
Trang 183 Thí nghiệm 3: Nhận kí tự từ port nối tiếp hiển thị ra LCD đồng thời phát ra
lại port nối tiếp (tốc độ port chọn là 9600pbs)
Trang 19SJMP LOOP
;========================================= Chương trình con port nối tiếp
UART_INIT: ; khởi đđộng port nối tiếp
OUT_CHAR: ; phát kí tự ra port nối tiếp
JNB TI, $ ;khi phát hết TI = 1
Trang 20WRITE_TEXT: ; ghi kí tự ra LCD
ACALL WAIT_LCDSETB RS
MOVX @DPTR, A SETB EN
CLR EN RET
WRITE_COM: ; ghi lệnh ra LCD
ACALL WAIT_LCDCLR RS
MOVX @DPTR, ASETB EN
CLR ENRETEND
BÀI TẬP:
Viết chương trình nhập kí tự từ bàn phím về làm công việc sau đây:
a Kiểm tra xem kí tự nhận được là A-Z hoặc a-z thì hiển thị lên LCD
b Kiểm tra xem kí tự nhận nhấn được số từ 0-9 thì hiển thị qua led 7 đoạn
c Nếu nhấn phím Enter thì xuống hàng mã ASCII 13H
d Nếu nhấn phím ESC thì xóa màn hình LCD mã ASCII 27H
MOV R4,#16
LAP1:
ACALL IN_CHARACALL NHANKYTUACALL OUT_CHARDJNZ R4,LAP1
Trang 22DEL1:
MOV R6, #250DJNZ R6, $ DJNZ R7, DEL1RET
WRITE_TEXT:
ACALL WAIT_LCDSETB RS
MOVX @DPTR, A SETB EN
CLR EN RET
WRITE_COM:
ACALL WAIT_LCDCLR RS
MOVX @DPTR, ASETB EN
CLR ENRET
;=========Chương trình con kiểm tra kí tự nhận ñược từ Port nối tiếp veà xử lí theo ñề
SJMP THOATSKIP1:
CJNE A,#27,TIEPACALL CLEARSJMP THOAT
; kiểm tra 0-9
TIEP:
CJNE A,#30H,$+3JNC KTRA3SJMP THOATKTRA3:
CJNE A,#3AH,$+3
Trang 24BÀI 5: THÍ NGHIỆM ĐIỀU KHIỂN ADC
1 Thí nghiệm 1: Viết chương trình thực hiện đọc điện áp của biến trở trên
kênh 0 và hiển thị ra led 7 đoạn.
Trang 27BÀI 6: THÍ NGHIỆM VỚI LED MA TRẬN
1 Thí nghiệm 1: Viết chương trình hiển thị kí tự A lên LED ma trận.
Trang 282 Thí nghiệm 2: Viết chương trình chạy chữ A B từ phải sang trái hiển thị lên
Trang 29BÀ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.
Trang 302 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ỳ.
Trang 313 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.
Trang 32CLR TR1
MOV TH1,#HIGH(-200)MOV TL1,#LOW(-200)SETB TR1
SJMP THOAT
NHAY:
CJNE R3,#1,NHAY1DJNZ R7,LOP2
CLR TR1
MOV TH1,#HIGH(-500)MOV TL1,#LOW(-500)SETB TR1
Trang 334 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.
Trang 34MOV A,#01HMOVX @DPTR,AACALL DLCMOV A,#00HMOVX @DPTR,AACALL DLTSJMP KT
NHAY1:
INC R3
DEC R4
MOV A,#01HMOVX @DPTR,AACALL DLCMOV A,#00HMOVX @DPTR,AACALL DLTSJMP KT
DLC:
MOV R6,03HLAP1:
MOV R5,#100DJNZ R5,$
DJNZ R6,LAP1RET
DLT:
MOV R6,04HLAP:
MOV R5,#100DJNZ R5,$
DJNZ R6,LAPRET
END
Trang 35THÍ 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.
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 -
Trang 363 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.
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 <16F690.h>
Trang 375 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.
Trang 38{
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<16F690.h>
#use delay(clock = 4000000)
#use fast_io(c)
Trang 39#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} ;
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
Trang 402 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.
Trang 41adc = read_adc(); adc = adc*4;
output_c(0xff); delay_ms(adc+100); output_c(0x00); delay_ms(adc+100); }
}