TN vi xu ly
THÍ NGHIỆM VI X? LÝ EME – MC8
BÀI 1: THÍ NGHIỆM VỚI NÚT NHẤN VÀ LED ĐƠN
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
Khi nhấn có 2 đèn sáng cùng lúc vì:
-Tác động tới led nối với chân P1.0
-Tác động tới led nối với chân P1.1 thông qua chương trình. Vì chương trình thực thi trong thời gian rất ngắn nên 2 led sáng cùng lúc.
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.
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
LAP:
CPL P1.0
CALL DL500MS
SJMP LAP
DL500MS:
MOV R5,#10
L2:
MOV R6,#100
L1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,L1
DJNZ R5,L2
RET
END
b. Duty cycle: 30% - tần số 0.5Hz
ORG 2000H
LAP:
MOV R1,#3
MOV R2,#7
CLR P1.0
LAP1:
ACALL DL
DJNZ R1,LAP1
SETB P1.0
LAP2:
ACALL DL
DJNZ R2,LAP2
SJMP LAP
DL: ;Chương trình delay 50ms
L2: MOV R5,#4
L1: MOV R6,#200
MOV R7,#250
DJNZ R7,$
DJNZ R6,L1
DJNZ R5,L2
RET
END
Thí nghiệm 3:
a. Viết chương trình tạo xung vuông 1Hz dùng timer 0
ORG 2000H
MAIN:
CPL P1.0
ACALL DL500
SJMP MAIN
DL500:
MOV TMOD,#01H
MOV R7,#10
LOOP:
MOV TH0,#HIGH(-50000) ; giá trị nạp là 50000*10 = 500000us = 0.5s
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ tràn
CLR TF0
CLR TR0
DJNZ R7,LOOP
RET
END
b. Dùng ngắt Timer 0:
ORG 2000H
LJMP MAIN
ORG 200BH
LJMP ISRT0
MAIN:
MOV TMOD,#01H
SETB TF0
MOV IE,#82H
MOV R7,#11
SJMP $
ISRT0:
DJNZ R7,DAT
CPL P1.0
MOV R7,#10
SJMP KT
DAT:
CLR TR0
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
KT: RETI
END
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
ORG 2000H
MAIN:
CPL P1.0
MOV A,#10
MOV R7,A
JB P1.1, GIAM
DEC A ;Khi nhấn P1.1 thì f tăng Chu kỳ giảm giảm R7
MOV R7,A
SJMP LAP ; mỗi lần giảm là 1*25000us = 0.025s
GIAM:
JB P1.2,LAP
INC A
MOV R7,A
LAP:
ACALL DL500
DJNZ R7,LAP
SJMP MAIN
DL500:
MOV TMOD,#01H
MOV TH0,#HIGH(-25000) ; giá trị là 50000*R7 (R7TB = 10) = 500000us = 0.5s
MOV TL0,#LOW(-25000)
SETB TR0
JNB TF0,$ ; đợi cờ TF0 tràn và xóa cờ tràn
CLR TF0
CLR TR0
RET
END
BÀI 2: THÍ NGHIỆM HIỂN THỊ DÙNG LED 7 ĐOẠN
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 2000H
MAIN: MOV R7,#0
L2: MOV A,R7
MOV DPTR,#TABLE
MOVC A,@A+DPTR
INC R7
CJNE R7,#10,L1
MOV R7,#0
L1: MOV DPTR,#0
MOVX @DPTR,A
ACALL DL
SJMP L2
DL: MOV R6,#40
LAP: MOV TMOD,#01H
MOV TH0,#HIGH(-50000)
MOV TL0,#LOW(-50000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
DJNZ R6, LAP
RET
END
TABLE:
DB 0E0H, 0E1H, 0E2H, 0E3H, 0E4H, 0E5H, 0E6H, 0E7H, 0E8H, 0E9H
Thí nghiệm 2:
a. Viết chương trình hiển thị giá trị 1234 lên led 7 đoạn
ORG 2000H
MAIN: MOV R7,#0
L2: MOV DPTR,#TABLE
MOV A,R7
MOVC A,@A+DPTR
INC R7
CJNE R7,#4,L1
MOV R7,#0
L1: MOV DPTR,#0
MOVX @DPTR,A
ACALL DL
SJMP L2
DL: MOV TMOD,#01H
MOV TH0,#HIGH(-1000)
MOV TL0,#LOW(-1000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
TABLE:
DB 71H, 0B2H, 0D3H, 0E4H
b. Thay đổi chương trình để giá trị 1234 có thể hiển thị thông qua mã BCD nén chứa trong cặp thanh ghi R7 & R6,Biết R7 là MSB
ORG 2000H
MAIN: MOV DPTR,#0
L1: MOV A,R7
MOV B,#0
DIV AB
ADD A,#70H
MOVX @DPTR,A
ACALL DL
MOV A,B
ADD A,#0B0H
MOVX @DPTR,A
ACALL DL
MOV A,R6
MOV B,#0
DIV AB
ADD A,#0D0H
MOVX @DPTR,A
ACALL DL
MOV A,B
ADD A,#0E0H
MOVX @DPTR,A
ACALL DL
SJMP L1
DL: MOV TMOD,#01H
MOV TH0,#HIGH(-1000)
MOV TL0,#LOW(-1000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
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
ORG 2000H
MAIN: MOV DPTR,#0
L1: MOVX @DPTR,#70H
ACALL DL
MOV A,R7
MOV B,#10
DIV AB
MOV R6,A
MOV A,B
ADD A,#0E0H
MOVX @DPTR,A
ACALL DL
MOV B,#10
MOV A,R6
DIV AB
ADD A,#0B0H
MOVX @DPTR,A
MOV A,B
ADD A,#0D0H
MOVX @DPTR,A
ACALL DL
SJMP L1
DL: MOV TMOD,#01H
MOV TH0,#HIGH(-1000)
MOV TL0,#LOW(-1000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
BÀI TẬP:
Viết chương trình đếm từ 0-60 rồi lặp lại, mỗi lần đếm cách nhau 1s
ORG 2000H
MOV R6,#0
MOV R7,#0
LOOP1:
MOV R5,#100 ; gán R5 = 100*(5ms+5ms) = 1s để led xuất ra có sự lưu ảnh.
LOOP:
MOV DPTR,#0
MOV A,R7
ADD A,#0E0H
MOVX @DPTR,A
ACALL DL5MS
MOV A,R6
ADD A,#0D0H
MOVX @DPTR,A
ACALL DL5MS
DJNZ R5,LOOP
INC R7
CJNE R7,#0AH,LOOP1
MOV R7,#0
INC R6
CJNE R6,#6,LOOP1
MOV R6,#0
SJMP LOOP1
DL5MS:
MOV TMOD,#01H
MOV TH0,#HIGH(-5000)
MOV TL0,#LOW(-5000)
SETB TR0
JNB TF0,$
CLR TF0
CLR TR0
RET
END
BÀI 3: THÍ NGHI?M HI?N TH? B?NG LCD
Thí nghi?m 1:
a. Hi?n th? chu?i “Hello” lên LCD
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN:
MOV DPTR,#8000H
ACALL INIT_LCD
ACALL HIEN_CHU
SJMP $
INIT_LCD: MOV A,#01H
ACALL WRITECOM
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
WRITECOM: MOV DPTR,#8000H
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
ACALL DELAY_5MS
RET
WRITETEXT: MOV DPTR,#8000H
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
ACALL DELAY_5MS
RET
HIEN_CHU:
MOV A,#'H'
ACALL WRITETEXT
MOV A,#'E'
ACALL WRITETEXT
MOV A,#'L'
ACALL WRITETEXT
MOV A,#'L'
ACALL WRITETEXT
MOV A,#'O'
ACALL WRITETEXT
RET
DELAY_5MS:
MOV R3,#10
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
RET
END
b.Xuất chuỗi ‘HELLO’ dùng phương pháp tra bảng:
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN: CALL INIT_LCD
MOV R4,#0
LAP: MOV DPTR,#BANG
MOV A,R4
MOVC A,@A+DPTR
CALL WRITETEXT
INC R4
CJNE R4,#5,LAP
SJMP $
INIT_LCD: MOV A,#01H
ACALL WRITECOM
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
WRITECOM: MOV DPTR,#8000H
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
ACALL DELAY_5MS
RET
WRITETEXT: MOV DPTR,#8000H
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
ACALL DELAY_5MS
RET
DELAY_5MS:
MOV R3,#10
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
RET
BANG:DB 'HELLO'
END
BÀI 4: THÍ NGHIỆM GIAO TIẾP QUA CỔNG NỐI TIẾP
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
MOV TH1,#-3
SETB TR1
MOV DPTR,#TABLE
LAP:
CLR A
MOVC A,@A+DPTR
INC DPTR
ACALL OUT_CHAR
JNZ LAP
SJMP $
OUT_CHAR:
JNB TI, $
CLR TI
MOV SBUF, A
RET
TABLE:
DB 'Hello world',0
END
Thí nghi?m 2: Nh?n kí t? t? port n?i ti?p hi?n th? ra LCD (t?c đ? port ch?n là 9600pbs)
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN:
MOV DPTR, #8000H
ACALL LCD_INIT
ACALL UART_INIT
LOOP: ACALL CLEAR
MOV R4,#16
LAP1:
ACALL IN_CHAR
ACALL WRITE_TEXT
DJNZ R4,LAP1
MOV R4,#16
MOV A,#0C0H
ACALL WRITE_COM
LAP2:
ACALL IN_CHAR
ACALL WRITE_TEXT
DJNZ R4,LAP2
SJMP LOOP
UART_INIT:
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
RET
OUT_CHAR:
JNB TI, $
CLR TI
MOV SBUF, A
RET
IN_CHAR:
JNB RI, $
CLR RI
MOV A, SBUF
SUBB A,#27
JZ LOOP
ADD A,#27
RET
LCD_INIT:
MOV A,#38H
ACALL WRITE_COM
MOV A,#0CH
ACALL WRITE_COM
MOV A,#06H
ACALL WRITE_COM
RET
CLEAR:
MOV A,#01H
ACALL WRITE_COM
RET
WAIT_LCD:
MOV R7, #100
DEL1:
MOV R6, #250
DJNZ R6, $
DJNZ R7, DEL1
RET
WRITE_TEXT:
ACALL WAIT_LCD
SETB RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
WRITE_COM:
ACALL WAIT_LCD
CLR RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
END
3. 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)
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN:
MOV DPTR, #8000H
ACALL LCD_INIT
ACALL UART_INIT
ACALL CLEAR
LOOP:
MOV R4,#16
LAP1:
ACALL IN_CHAR
ACALL WRITE_TEXT
ACALL OUT_CHAR
DJNZ R4,LAP1
MOV R4,#16
MOV A,#0C0H
ACALL WRITE_COM
LAP2:
ACALL IN_CHAR
ACALL WRITE_TEXT
ACALL OUT_CHAR
DJNZ R4,LAP2
ACALL CLEAR
SJMP LOOP
UART_INIT:
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-12
SETB TR1
RET
OUT_CHAR:
JNB TI, $
CLR TI
MOV SBUF, A
RET
IN_CHAR:
JNB RI, $
CLR RI
MOV A, SBUF
RET
LCD_INIT:
MOV A,#38H
ACALL WRITE_COM
MOV A,#0EH
ACALL WRITE_COM
MOV A,#06H
ACALL WRITE_COM
RET
CLEAR:
MOV A,#01H
ACALL WRITE_COM
RET
WAIT_LCD: MOV R7, #100
DEL1:
MOV R6, #250
DJNZ R6, $
DJNZ R7, DEL1
RET
WRITE_TEXT:
ACALL WAIT_LCD
SETB RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
WRITE_COM:
ACALL WAIT_LCD
CLR RS
MOVX @DPTR, A
SETB EN
CLR EN
RET
END
BÀI 5: THÍ NGHI?M ĐIỀU KHIỂN ADC
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.
ORG 2000H
MAIN:
MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV DPTR,#0000H
MOV B,#10
DIV AB
MOV R7,B
MOV B,#10
DIV AB
ORL A,#0B0H
MOVX @DPTR,A
ACALL DELAY_1MS
MOV A,B
ORL A,#0D0H
MOVX @DPTR,A
ACALL DELAY_1MS
MOV A,R7
ORL A,#0E0H
MOVX @DPTR,A
ACALL DELAY_1MS
SJMP MAIN
DELAY_100US:
MOV R6,#50
DJNZ R6,$
RET
DELAY_1MS:
MOV R6,#5
LOOP:
MOV R5,#100
DJNZ R5,$
DJNZ R6,LOOP
RET
END
Thí nghiệm 2: Viết chương trình đọc điện áp của kênh 0 và hiển thị lên LCD
ORG 2000H
ACALL INIT_LCD
MAIN: MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV B,#10
DIV AB
MOV R2,B ;R2=DON VI
MOV B,#10
DIV AB
MOV R0,A ;R0=TRAM
MOV R1,B ;R1=CHUC
MOV DPTR,#8000H
MOV A,#80H
ACALL WRITECOM
ACALL HIEN_CHU
ACALL DELAY1
SJMP MAIN
INIT_LCD:
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
CLEAR: MOV DPTR,#8000H
MOV A,#01H
ACALL WRITECOM
RET
WRITECOM: MOV DPTR,#8000H
SETB P3.4
CLR P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY_5MS
RET
WRITETEXT: MOV DPTR,#8000H
SETB P3.4
SETB P3.5
MOVX @DPTR,A
CLR P3.4
ACALL DELAY_5MS
RET
HIEN_CHU: MOV A,R0
ADD A,#30H
ACALL WRITETEXT
MOV A,R1
ADD A,#30H
ACALL WRITETEXT
MOV A,R2
ADD A,#30H
ACALL WRITETEXT
RET
DELAY_5MS:
MOV R3,#10
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
RET
DELAY1: ; delay 300ms
MOV R6,#2
LOP1:
MOV R5,#100
LOP:
MOV R4,#250
DJNZ R4,$
DJNZ R5,LOP
DJNZ R6,LOP1
RET
DELAY2: MOV R3,#8
LAP: MOV R7,#250
DJNZ R7,$
DJNZ R3,LAP
RET
DELAY_100US:
MOV R6,#50
DJNZ R6,$
RET
END
BÀI 6: THÍ NGHI?M VỚI LED MA TRẬN
Thí nghiệm 1: Viết chương trình hiển thị kí tự A lên LED ma trận.
ORG 2000H
LOOP:
MOV A,#0
MOV R7,#8
LAP:
MOV R4,A
MOV DPTR,#COT ;quét cột của LED ma trận
MOVC A,@A+DPTR
ACALL XUAT_COT
MOV A,R4
MOV DPTR,#HANG
MOVC A,@A+DPTR
ACALL XUAT_HANG ;quét hàng của LED ma trận
ACALL DL2MS
MOV A,R4
INC A
DJNZ R7,LAP
SJMP LOOP
XUAT_COT:
MOV DPTR,#0C00H ;địa chỉ cột của LED ma trận
MOVX @DPTR,A
RET
XUAT_HANG:
MOV DPTR,#0A00H ;địa chỉ hàng của LED ma trận
MOVX @DPTR,A
RET
DL2MS:
MOV R6,#4
LAP1:
MOV R5,#250
DJNZ R5,$
DJNZ R6,LAP1
RET
COT: DB 01H, 02H, 04H, 08H, 10H, 20H, 40H, 80H
HANG:DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H, 0FFH, 0FFH
END
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 LED ma trận
ORG 2000H
TT:
MOV R4,#10
MOV R0,#0
MOV DPTR,#CHAR
MOV R5,#24
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,
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
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
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
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
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
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:
CJNE R3,#0,NHAY
DJNZ R7,LOP
DJNZ R6,LOP1
INC R3
MOV R6,#20
MOV R7,#250
SJMP LOP2
LOP1:
MOV R7,#250
LOP:
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(-200)
MOV TL1,#LOW(-200)
SETB TR1
SJMP THOAT
NHAY:
CJNE R3,#1,NHAY1
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)
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)
MOV TL1,#LOW(-800)
SETB TR1
SJMP THOAT
THOAT:
RETI
ISRT1:
CLR ACC.0
CLR ACC.1
MOVX @DPTR,A
RETI
END
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
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<16F690.h>
#use delay(clock=4000000)
#use fast_io(C)
void main()
{
set_tris_C(0x00);
output_C(0x00);
while(1)
{
output_high(PIN_C2);
delay_ms(1000);
output_low(PIN_C2);
delay_ms(1000);
}
}
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<16F690.h>
#use delay(clock=4000000)
#use fast_io(C)
void main()
{
set_tris_C(0x00);
output_C(0x00);
while(1)
{
output_C(0x01);
delay_ms(250);
output_C(0x02);
delay_ms(250);
output_C(0x04);
delay_ms(250);
output_C(0x08);
delay_ms(250);
}
}
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 <16F690.h>
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(B)
void main()
{
int value=0;
set_tris_C(0x00);
set_tris_B(0x10);
output_C(0x00);
while(1)
{
if(input(PIN_B4)==0)
{value++;
while(input(PIN_B4)==0);
}
output_C(value);
delay_ms(200);
if(value==16)
value=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 <16F690.h>
#use delay(clock=4000000)
#use fast_io(C)
#use fast_io(B)
void demlen(void);
void demxuong(void);
int value=0;
void main()
{
set_tris_C(0x00);
set_tris_B(0x30);
output_C(0x00);
while(1)
{
while(input(PIN_B4)==1)
demlen();
while(input(PIN_B4)==0)
demxuong();
}
}
void demlen()
{
value++;
output_C(value);
delay_ms(1000);
}
void demxuong()
{
value--;
output_C(value);
delay_ms(1000);
}
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<16F690.h>
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(C)
#use fast_io(B)
void main()
{
int const pa[10]={0,7,1,3,6,2,0,7,0,2};
int const pc[10]={8,12,1,0,4,2,2,8,0,0};
int value=0;
set_tris_a(0x00);
set_tris_c(0x00);
set_tris_b(0x10);
while(1)
{
if(input(PIN_B4)==0)
{value++;
while(input(PIN_B4)==0);
}
output_C(pc[value]);
output_A(pa[value]);
delay_ms(200);
if(value==10)
value=0;
}
}
BÀI 3: THÍ NGHI?M ĐIỀU KHIỂN ADC
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<16F690.h>
#device ADC=10
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(C)
void main()
{
int16 a;
set_tris_A(0x01);
set_tris_C(0x00) ;
setup_adc(adc_clock_internal);
setup_adc_ports(sAN0);
set_adc_channel(0);
while(1)
{
delay_us(10);
a=read_adc();
a=a/64;
output_c(a);
}
}
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<16F690.h>
#device ADC=10
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(C)
int16 a;
void adc(void);
void main()
{
set_tris_A(0x01);
set_tris_C(0x00) ;
setup_adc(adc_clock_internal);
setup_adc_ports(sAN0);
set_adc_channel(0);
while(1)
{
output_C(0x01);
adc();
delay_ms(a);
output_C(0x02);
adc();
delay_ms(a);
output_C(0x04);
adc();
delay_ms(a);
output_C(0x08);
adc();
delay_ms(a);
}
}
void adc(void)
{
delay_us(10);
a=read_adc();
a=a/64;
a*=100;
}
BÀI TẬP LỚN
Đề bài: viết chương trình kiểm tra password nhập từ bàn phím máy tính : “DHBK10”. Nếu đúng thì xuất ra LCD dòng chữ “Successful!”, nếu sai thì xuất “Access denied!” (canh giữa LCD) nhấp nháy với tần số 1Hz
ORG 2000H
EN BIT P3.4
RS BIT P3.5
LOP1: MOV R6,#0
MOV R5,#0
ACALL INIT_LCD
ACALL INIT_UART
MOV A,#85H
ACALL WRITECOM
LOP4: ACALL IN_CHAR
CJNE A,#13,LOP2
CJNE R6,#6,LOP3
ACALL DUNG
LOP3:
ACALL SAI
LOP2: MOV R0,A
MOV DPTR,#PASS
MOV A,R5
MOVC A,@A+DPTR
INC R5
CJNE A,00H,$+4
INC R6
MOV A,#2AH
ACALL WRITETEXT
SJMP LOP4
;CHUONG TRINH DINH DANG LCD
INIT_LCD: MOV A,#01H
ACALL WRITECOM
MOV A,#38H
ACALL WRITECOM
MOV A,#0CH
ACALL WRITECOM
MOV A,#06H
ACALL WRITECOM
RET
;CHUONG TRINH DINH DANG UART
INIT_UART:
MOV SCON,#52H
MOV TMOD,#20H
MOV TH1,#-3
SETB TR1
RET
;CHUONG TRINH NHAP KY TU
IN_CHAR:
JNB RI, $
CLR RI
MOV A, SBUF
RET
;CHUONG TRINH XUAT DATA RA LCD
WRITETEXT: MOV DPTR,#8000H
SETB EN
SETB RS
MOVX @DPTR,A
CLR EN
ACALL DELAY_5MS
RET
;CHUONG TRINH XUAT LENH LCD
WRITECOM: MOV DPTR,#8000H
SETB EN
CLR RS
MOVX @DPTR,A
CLR EN
ACALL DELAY_5MS
RET
;DELAY 5MS
DELAY_5MS: PUSH 03
PUSH 07
MOV R3,#10
LOOP1:
MOV R7,#250
DJNZ R7,$
DJNZ R3,LOOP1
POP 07
POP 03
RET
;CHUONG TRINH CON KIEM TRA PASS
; CHUONG TRINH DELAY 500MS
DELAY500:
MOV R3,#10
LAP1: MOV R2,#100
LAP2: MOV R1,#250
DJNZ R1,$
DJNZ R2,LAP2
DJNZ R3,LAP1
RET
;CHUONG TRINH XUAT SUCCESSFUL
XUAT_SUCCESS:
PUSH ACC
MOV A,#0C2H
CALL WRITECOM
MOV R4,#0
LAP3: MOV DPTR,#BANG1
MOV A,R4
MOVC A,@A+DPTR
CALL WRITETEXT
INC R4
CJNE R4,#11,LAP3
POP ACC
RET
XUAT_DENY:
PUSH ACC
MOV A,#0C2H
CALL WRITECOM
MOV R4,#0
LAP4: MOV DPTR,#BANG2
MOV A,R4
MOVC A,@A+DPTR
CALL WRITETEXT
INC R4
CJNE R4,#13,LAP4
POP ACC
RET
; CHUONG TRINH XOA MAN HINH
XOAMH: PUSH ACC
MOV A,#0C2H
CALL WRITECOM
MOV R4,#0
LAP5: MOV DPTR,#BANG3
MOV A,R4
MOVC A,@A+DPTR
CALL WRITETEXT
INC R4
CJNE R4,#13,LAP5
POP ACC
RET
DUNG:
CALL XUAT_SUCCESS
CALL DELAY500
CALL XOAMH
CALL DELAY500
JNB RI,DUNG
CLR RI
MOV A,SBUF
CJNE A,#27,DUNG
LJMP LOP1
SJMP DUNG
RET
sAI:
CALL XUAT_DENY
CALL DELAY500
CALL XOAMH
CALL DELAY500
JNB RI,SAI
CLR RI
MOV A,SBUF
CJNE A,#27,SAI
LJMP LOP1
SJMP SAI
RET
BANG1: DB 'Successful!'
BANG2: DB 'Access denied'
PASS: DB 'DHBK10'
BANG3: DB' '
END
Bạn đang đọc truyện trên: Truyen247.Pro