Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
----------KHOA ĐIỆN – ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ
BÁO CÁO THÍ NGHIỆM VI XỬ LÍ
Lớp : DD07TD
Nhóm : 01
Tổ : 07
Họ và tên SV:
Nguyễn Thành Nam
Vũ Xuân Tầm
Dương Lâm Phương
Nguyễn Thanh Nam
Phương
Lê Bá Tấn
MSSV:
40701531
40702162
40701876
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Phần 1:
Nhóm 07
Làm việc với Vi điều khiển 89C51
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 việc đọc liên tục trạng trạng thái của nút nhấn P1.0 và hiển thị ra
LED được nối tại chân P1.1
Code:
ORG 2000H
;Doc trang thai cua chan P1.0 va xuat ra P1.1
LOOP:
MOV C, P1.0
MOV P1.1, C
SJMP LOOP
END
Thí nghiệm 2: Viết chương trình tạo xung vuông 1Hz ra chân P1.0,biết tần số dao động được dùng trong KIT
là 11.059MHz
Code:
ORG 2000H
;Tao xung vuong 1Hz tren P1.0 dung vong lap
LAP:
CPL P1.0
ACALL DL500
SJMP LAP
DL500:
PUSH 05
PUSH 06
PUSH 07
MOV R5, #10
L2:
MOV R6, #100
L1:
MOV R7, #250
DJNZ R7, $
DJNZ R6, L1
DJNZ R5, L2
Thí nghiệm Vi xử lí – Học kì hè 09-10
POP 07
POP 06
POP 05
RET
END
Thí nghiệm 2: (Mở rộng)
Thay đổi tần số xung vuông thành 0.5Hz, với chu kì nhiệm vụ là 30%
Code:
ORG 2000H
;Tao xung tan so 0.5Hz tren P1.0 voi chu ki nhiem vu 30%
LAP:
SETB P1.0 ;
LCALL DL150 ;
CLR P1.0 ;
LCALL DL350 ;
SJMP LAP ;
DL150: PUSH 07
PUSH 06
PUSH 05
MOV R5, #2 ;
L1_2:
MOV R6, #150 ;
L1_1:
MOV R7, #250 ;
DJNZ R7, $ ;
DJNZ R6, L1_1;
DJNZ R5, L1_2;
POP 05
POP 06
POP 07
RET
DL350: PUSH 07
PUSH 06
PUSH 05
MOV R5, #7 ;
L2_2:
MOV R6, #100 ;
L2_1:
MOV R7, #250 ;
DJNZ R7, $ ;
DJNZ R6, L2_1;
DJNZ R5, L2_2;
POP 05
POP 06
POP 07
RET
END
Thí nghiệm 3:
Viết chương trình tạo xung vuông 1 Hz dùng Timer0
Code:
ORG 2000H
;Tao xung vuong 1Hz tren P1.0 su dung Timer0
LAP:
CPL P1.0
CALL DL500
SJPM LAP
DL500: MOV TMOD, #01H ;Goi Timer0, Mode1
PUSH 05
MOV R5, #10
LOOP:
MOV TH0, #HIGH(-50000)
MOV TL0, #LOW(-50000)
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
SETB TR0
JNB TF0, $
CLR TF0
CLR TR0
DJNZ R5, LOOP
POP R5
RET
END
Thí nghiệm 3: (Mở rộng)
Tận dụng ngắt Timer để tạo xung
Code:
ORG 2000H
;Tao xung 1Hz tren P1.0 dung ngat Timer0
LJMP MAIN
ORG 200BH
INC R5
CJNE R5, #10, ISRT0
MOV R5, #1
CPL P1.0
ISRT0: CLR TR0
CLR TF0
MOV TH0, #HIGH(-50000)
MOV TL0, #LOW(-50000)
SETB TR0
RETI
ORG 2030H
MAIN:
MOV TMOD ,#01H
SETB TF0
MOV IE, #82H
SJMP $
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ể thay đổi được bằng cách nhấn
P1.1 (tăng) hoặc P1.2 (giảm)
Code:
ORG 2000H
;Tao xung tren P1.0 va thay doi theo P1.1 (tang), P1.2 (giam)
MOV TMOD, #01H
MOV A,#10
LOOP:
JNB P1.1,TANG
JNB P1.2,GIAM
;Tan so 1Hz lam trung binh,neu ko nhan nut nao thi van giu nguyen tan so cu
CALL XUNG
SJMP LOOP
TANG:
;Xet xem A co la 255 hay chua
CJNE A, #255, TANG1
SJMP LOOP
; A khac 255
TANG1:
INC A
CALL XUNG
SJMP LOOP
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
GIAM:
CJNE A, #1, GIAM1
SJMP LOOP
GIAM1:
DEC A
CALL XUNG
SJMP LOOP
XUNG:
MOV R5, A
DL50:
MOV TH0, #HIGH(-50000)
MOV TL0, #LOW(-50000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
DJNZ R5, DL50
CPL P1.0
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 đến 9 và hiển thị ra LED 7 đoạn,mỗi lần cách nhau 2s
Code:
ORG 2000H
;bo dem tu 0 toi 9, hien thi tren LED 7 doan, moi lan cach nhau 2s
CLR A
MAIN:
MOV R1, #10
MOV A,#0E0H
LOOP:
MOV DPTR, #0000H
MOVX @DPTR, A
INC A
CALL DL2000
DJNZ R1,LOOP
SJMP MAIN
DL2000: PUSH 05 ;Delay 2s
PUSH 06
PUSH 07
MOV R5, #20
DL2:
MOV R6, #200
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6, DL1
DJNZ R5, DL2
POP 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
POP 06
POP 05
RET
END
Thí nghiệm 2: Viết chương trình hiển thị giá trị 1234 ra LED 7 đoạn.
Code:
ORG 2000H
;Bai 2, Thi nghiem 2
;Hien thi 1234 len 4 LED 7 doan
AGAIN: CLR A
MOV R1, #4
LOOP:
MOV DPTR, #TABLE
MOVC A,@A+DPTR
DJNZ R1,NEXT
SJMP AGAIN ;lien tuc de tao hinh anh tren mat
NEXT:
CALL XUAT
CALL DL3
INC DPTR
SJMP LOOP
XUAT:
PUSH DPH
PUSH DPL
MOV DPTR, #0000H
MOVX @DPTR, A
POP DPL
POP DPH
RET
DL3:
PUSH 05
PUSH 06
MOV R5, #12
L1:
MOV R6, #250
DJNZ R6, $
DJNZ R5, L1
POP 06
POP 05
RET
TABLE: DB 71H,0B2H,0D3H,0E4H
END
Thí nghiêm 2: Mở rộng
Code:
ORG 2000H
;Bai 2 Thi nghiem 2 mo rong
;Hien thi gia tri la ma BCD nen trong R7_R6 ra 4 LED
;R7=1_2, R6=3_4
MOV R7, #00010010B
MOV R6, #00110100B
CALL BP_2_B
LOOP:
;Copy R5=>A,roi OR voi 70H
MOV A,R5
ORL A, #70H
CALL XUAT
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
;Copy R4=>A,OR voi 0B0H
MOV A, R4
ORL A, #0B0H
CALL XUAT
;Copy R3=>A,OR voi 0D0H
MOV A, R3
ORL A, #0D0H
CALL XUAT
;Copy R2=>A,OR voi 0E0H
MOV A,R2
ORL A, #0E0H
CALL XUAT
SJMP LOOP
BP_2_B: ;R7=>R5_R4,R6=>R3_R2
MOV A,R7
PUSH ACC
ANL A, #0FH
MOV R4, A
POP ACC
ANL A, #0F0H
SWAP A
MOV R5,A
MOV A,R6
PUSH ACC
ANL A, #0FH
MOV R2, A
POP ACC
ANL A, #0F0H
SWAP A
MOV R3,A
RET
XUAT:
;Xuat + Delay 3ms
MOV DPTR, #0000H
MOVX @DPTR, A
;Delay 3ms
PUSH 00
PUSH 01
MOV R0, #6
L1:
MOV R1, #250
DJNZ R1, $
DJNZ R0, L1
POP 01
POP 00
RET
END
Thí nghiệm 3: Viết chương trình thể hiện giá trị nhị phân trong thanh ghi R7 ra LED 7 đoạn.
Code:
ORG 2000H
;Bai 2 Thi nghiem 3
;Hien thi gia tri nhi phan trong R7 len LED 7 doan
MOV R7, #0A0H ;Example R7= 160
Thí nghiệm Vi xử lí – Học kì hè 09-10
MOV A, R7
CALL BIN_2_BCD
LOOP:
;R6=>A,OR voi 0B0H roi xuat ra LED_2
MOV A, R6
ORL A, #0B0H
CALL XUAT
;R5=>A,OR voi 0D0H xuat ra LED_3
MOV A, R5
ORL A, #0D0H
CALL XUAT
;R4=>A,OR voi 0E0H xuat ra LED_4
MOV A, R4
ORL A, #0E0H
CALL XUAT
SJMP LOOP
BIN_2_BCD:
;R7=R6_R5_R4
MOV B, #10
DIV AB
MOV R4,B
MOV B, #10
DIV AB
MOV R6, A
MOV R5, B
RET
XUAT:
;Xuat + Delay 3ms
MOV DPTR, #0000H
MOVX @DPTR, A
;Delay 3ms
PUSH 02
PUSH 03
MOV R2, #6
L1:
MOV R3, #250
DJNZ R3, $
DJNZ R2, L1
POP 03
POP 02
RET
END
Bài 3:
Thí nghiệm hiển thị dùng LCD
Thí nghiệm 1:
Code:
ORG
2000H
;****************************************************
;Hien thi chuoi "Hello" tren LCD
;****************************************************
EN
BIT
P3.4
RS
BIT
P3.5
CALL
INIT_LCD
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
MAIN:
MOV
CLR
MOVC
CJNE
SJMP
CALL
INC
SJMP
LOOP:
NEXT:
Nhóm 07
DPTR, #TABLE
A
A, @A+DPTR
A, #0, NEXT
$
WRITE_LCD
DPTR
LOOP
;-----------------------------------------------------INIT_LCD:
SETB
EN
CLR
RS
MOV
A, #38H
CALL
SEND_COM
MOV
A, #06H
CALL
SEND_COM
MOV
A, #0EH
CALL
SEND_COM
RET
SEND_COM:
PUSH
PUSH
SETB
CLR
MOV
MOVX
CLR
LCALL
POP
POP
RET
DPH
DPL
EN
RS
DPTR, #8000H
@DPTR, A
EN
WAIT_LCD
DPH
DPL
PUSH
PUSH
SETB
SETB
MOV
MOVX
CLR
LCALL
POP
POP
RET
DPH
DPL
EN
RS
DPTR, #8000H
@DPTR, A
EN
WAIT_LCD
DPH
DPL
MOV
MOV
DJNZ
DJNZ
RET
R6,
R7,
R7,
R6,
DB
END
'Hello',0
WRITE_LCD:
WAIT_LCD:
DL1:
TABLE:
•
#200
#250
$
DL1
Thí nghiệm thêm: viết chương trình hiển thị lên LCD chữ “DHBK TPHCM” dịch trái và dịch phải:
Thí nghiệm Vi xử lí – Học kì hè 09-10
ORG 2000H
RS BIT P3.5
EN BIT P3.4
CALL LCD_INIT
MOV DPTR, #TABLE
MAIN: CLR A
MOVC A,@A+DPTR
CJNE A,#0,NEXT
SJMP KT
NEXT: CALL WRITE_LCD
INC DPTR
SJMP MAIN
KT:
MOV R1, #6
KT1:
MOV A,#1CH
CALL WRITE_COM
CALL WAIT_LCD
DJNZ R1,KT1
MOV R1,#6
KT2:
MOV A,#18H
CALL WRITE_COM
CALL WAIT_LCD
DJNZ R1,KT2
SJMP KT
LCD_INIT:
MOV A,#01H
CALL WRITE_COM
MOV A,#38H
CALL WRITE_COM
MOV A, #0EH
CALL WRITE_COM
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
MOV A,#06H
CALL WRITE_COM
RET
WRITE_COM:
PUSH DPH
PUSH DPL
MOV DPTR, #8000H
CLR RS
SETB EN
MOVX @DPTR, A
CLR EN
CALL WAIT_LCD
POP DPL
POP DPH
RET
WAIT_LCD:
MOV R6 ,#250
LOOP: MOV R7,# 250
DJNZ R7,$
DJNZ R6, LOOP
RET
WRITE_LCD:
PUSH DPH
PUSH DPL
MOV DPTR ,#8000H
SETB RS
SETB EN
MOVX @DPTR,A
CLR EN
LCALL WAIT_LCD
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
POP DPL
POP DPH
RET
TABLE:
DB 'DHBK TPHCM',0
END
Bài 4:
Thí nghiệm giao tiếp qua cổng nối tiếp
Thí nghiệm 1: Viết chương trình phát chuỗi ký tự “Hello, world” lên máy tính thông qua Hyper Terminal với
tốc độ 19200pbs.
Code:
MAIN:
NEXT:
SEND:
ORG 2000H
MOV TMOD, #20H
MOV SCON, #42H
MOV TH1, #-3
SETB TR1
MOV DPTR, #TABLE
CLR A
MOVC A, @A+DPTR
CJNE A, #0, SEND
SJMP $
JNB TI,$
CLR TI
MOV SBUF,A
INC DPTR
SJMP NEXT
TABLE: DB 'HELLO, WORLD',0
END
Thí nghiệm 2: Viết chương trình nhận các ký tự từ máy tính gửi đến EME-MC8 thông qua Hyper Terminal
(bằng cách gõ các ký tự trên bàn phím khi đang ở trong chương trình Hyper Terminal) và hiển thị lên LCD.
Code:
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MAIN:
LOOP:
MOV DPTR,#8000H
CALL LCD_INTL
CALL CLR_LCD
CALL UART_INTL
CALL IN_CHAR
CALL WRT_TXT
SJMP LOOP
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
UART_INTL:
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
CALL CLR_LCD
MOV A,SBUF
RET
LCD_INTL:
MOV A,#38H
CALL WRT_COM
MOV A,#0EH
CALL WRT_COM
MOV A,#06H
CALL WRT_COM
MOV A,#0CH
CALL WRT_COM
RET
WAIT_LCD:
MOV R7,#50
DEL:
MOV R6,#250
DJNZ R6,$
DJNZ R7,DEL
RET
WRT_TXT:
CALL WAIT_LCD
SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
WRT_COM:
CALL WAIT_LCD
CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
CLR_LCD:
LCALL WAIT_LCD
MOV A,#01H
CALL WRT_COM
RET
END
Thí nghiệm 3: Viết chương trình nhận một ký tự từ cổng nối tiếp hiển thị lên LCD đồng thời phát ra cổng nối
tiếp. Tốc độ tuỳ chọn.
Code:
Thí nghiệm Vi xử lí – Học kì hè 09-10
MAIN:
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MOV DPTR,#8000H
CALL LCD_INTL
CALL CLR_LCD
CALL UART_INTL
LOOP:
CALL IN_CHAR
CALL WRT_TXT
CALL OUT_UART
SJMP LOOP
UART_INTL:
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
RET
LCD_INTL:
MOV A,#38H
CALL WRT_COM
MOV A,#0EH
CALL WRT_COM
MOV A,#06H
CALL WRT_COM
MOV A,#0CH
CALL WRT_COM
RET
WAIT_LCD:
MOV R7,#50
DEL:
MOV R6,#250
DJNZ R6,$
DJNZ R7,DEL
RET
WRT_TXT:
CALL WAIT_LCD
SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
WRT_COM:
CALL WAIT_LCD
CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
OUT_UART:
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
PUSH ACC
MOV SBUF, A
JNB TI,$
CLR TI
POP ACC
RET
CLR_LCD:
LCALL WAIT_LCD
MOV A,#01H
CALL WRT_COM
RET
END
BÀI TẬP THÊM : Viết chương trình nhận ký tự từ cổng nối tiếp, đông thới phát ra cổng nối tiếp, với điều kiện:
- Nếu ký tự nhân được là số thì xuất ra Led
- Nếu ký tự nhân được là chữ A-Z, a-z thì xuất ra LCD
- Nếu ký tự nhận được là Enter thì xuống hàng , là ESC thì xóa trong màn hình LCD. Mã ASCII của Enter là 13,
ESC là 27
ORG 2000H
EN BIT P3.4
RS BIT P3.5
MOV TMOD,#20H
MOV TL1,#-3
MOV TH1,#-3
MOV SCON,#52H
SETB TR1
MOV R1,#0
MOV DPTR,#8000H
ACALL LCD_INIT
LAP:
ACALL RECEIVE
CJNE A,#13,TT
; kiểm tra phím nhấn Enter
MOV A,#0C0H
ACALL WRITE_CMD
SJMP THOAT
TT:
CJNE A,#27,TT1
; kiểm tra phím nhấn ESC
MOV A,#01H
ACALL WRITE_CMD
SJMP THOAT
TT1:
CJNE A,#30H,SO
; bắt đầu kiểm tra phím nhấn là số
SO:
JC THOAT
CJNE A,#3AH,CHU ; kết thúc kiểm tra phím nhấn là số
CHU:
JC LED
CJNE A,#41H,KHAC ; bắt đầu kiểm tra phím nhấn là chữ hoa
KHAC:
JC THOAT
CJNE A,#5BH,HOA ; kết thúc kiểm tra phím nhấn là chữ hoa
HOA:
JC NHO
CJNE A,#61H,KHAC1 ; bắt đầu kiểm tra phím nhấn là chữ thường
KHAC1:
JC THOAT
CJNE A,#7BH,THUONG ; kết thúc kiểm tra phím nhần là chữ thường
THUONG:
JC NHO
SJMP THOAT
NHO:
MOV DPTR,#8000H
INC R1
CJNE R1,#17,XUONG
; kiểm tra nếu hiển thị hết hàng đầu tiên thì xuông hàng trong màn hình LCD
Thí nghiệm Vi xử lí – Học kì hè 09-10
XUONG:
JC XUATLCD
PUSH ACC
MOV A,#0C0H
ACALL WRITE_CMD
POP ACC
MOV R1,#0
XUATLCD:
ACALL WRITE_cHAR
SJMP THOAT
LED:
MOV DPTR,#0000H
ANL A,#0FH
ORL A,#0E0H
MOVX @DPTR,A
THOAT:
MOV DPTR,#8000H
ACALL SEND
SJMP LAP
LCD_INIT:
MOV A, #38H
ACALL WRITE_CMD
MOV A, #0EH
ACALL WRITE_CMD
MOV A, #06H
ACALL WRITE_CMD
MOV A, #01H
ACALL WRITE_CMD
RET
WAIT_LCD: MOV R7,#100
LOOP: MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET
WRITE_CHAR:
ACALL WAIT_LCD
SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
WRITE_CMD:
ACALL WAIT_LCD
CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
RET
RECEIVE:
JNB RI,RECEIVE
MOV A, SBUF
CLR RI
RET
SEND:
JNB TI,SEND
MOV SBUF,A
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
CLR TI
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.
Code:
ORG 2000H
MAIN:
LOOP:
MOV TMOD,#20H
MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
CALL DELAY100US
MOVX A,@DPTR
CALL BINTOBCD
MOV DPTR,#0000H
MOV A,R2
ORL A,#0E0H
MOVX @DPTR,A
CALL DELAY3MS
MOV A,R3
ORL A,#0D0H
MOVX @DPTR,A
CALL DELAY3MS
MOV A,R4
ORL A,#0B0H
MOVX @DPTR,A
CALL DELAY3MS
SJMP LOOP
DELAY100US:
MOV TH1,#-100
MOV TL1,#-100
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
BINTOBCD:
MOV
DIV
MOV
MOV
DIV
MOV
MOV
RET
B,#10
AB
R2,B
B,#10
AB
R3,B
R4,A
DELAY3MS:
MOV R5,#10
LOOP1: MOV R6,#150
DJNZ R6,$
DJNZ R5,LOOP1
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
RET
END
Thí nghiệm 2: 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 LCD.
Code:
MAIN:
ORG 2000H
CALL LCD_INIT
MOV TMOD,#21H
LOOP:
MOV DPTR,#4000H
MOV A,#0
MOVX @DPTR,A
CALL DELAY100US
MOVX A,@DPTR
CALL BINTOASCII
CALL CLR_LCD
MOV A,R4
CALL WRITE_TEXT
MOV A,R3
CALL WRITE_TEXT
MOV A,R2
CALL WRITE_TEXT
CALL DELAY3MS
CALL DELAY3MS
SJMP LOOP
DELAY100US:
MOV TH1,#-100
MOV TL1,#-100
SETB TR1
JNB TF1,$
CLR TF1
CLR TR1
RET
BINTOASCII:
MOV
DIV
MOV
MOV
DIV
MOV
MOV
MOV
ADD
MOV
MOV
ADD
MOV
MOV
ADD
MOV
RET
DELAY3MS:
B,#10
AB
R2,B
B,#10
AB
R3,B
R4,A
A,#30H
A,R2
R2,A
A,#30H
A,R3
R3,A
A,#30H
A,R4
R4,A
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
CLR TF0
MOV TH0,#HIGH(-10000)
MOV TL0,#LOW(-10000)
SETB TR0
JNB TF0,$
CLR TR0
RET
LCD_INIT:
MOV DPTR,#8000H
SETB P3.4
CLR P3.5
MOV A,#38H
MOVX @DPTR,A
CLR P3.4
CALL DELAY3MS
SETB P3.4
CLR P3.5
MOV A,#0EH
MOVX @DPTR,A
CLR P3.4
CALL DELAY3MS
SETB P3.4
CLR P3.5
MOV A,#06H
MOVX @DPTR,A
CLR P3.4
CALL DELAY3MS
RET
WRITE_TEXT:
MOV DPTR,#8000H
SETB P3.4
SETB P3.5
MOVX @DPTR,A
CLR P3.4
CALL DELAY3MS
RET
CLR_LCD:
MOV DPTR,#8000H
SETB P3.4
CLR P3.5
MOV A,#01H
MOVX @DPTR,A
CLR P3.4
CALL DELAY3MS
RET
END
BÀI TẬP THÊM : Viết chương trình đọc điện áp thực của kênh 0 và hiển thị lên LCD
ORG 2000H
RS BIT P3.5
EN BIT P3.4
MOV DPTR,#8000H
ACALL LCD_INIT
LAP:
MOV DPTR,#4000H
MOV A,#0
Thí nghiệm Vi xử lí – Học kì hè 09-10
MOVX @DPTR,A
ACALL DELAY_100US
MOVX A,@DPTR
MOV DPTR,#8000H
ACALL CHIA
MOV A, #80H
ACALL WRITE_CMD
SJMP LAP
LCD_INIT:
MOV A, #38H
ACALL WRITE_CMD
MOV A, #0CH
ACALL WRITE_CMD
MOV A, #04H
ACALL WRITE_CMD
MOV A, #01H
ACALL WRITE_CMD
RET
WAIT_LCD:
LOOP:
MOV R7,#100
MOV R6, #250
DJNZ R6,$
DJNZ R7, LOOP
RET
WRITE_CHAR:
SETB RS
MOVX @DPTR,A
SETB EN
CLR EN
ACALL WAIT_LCD
RET
WRITE_CMD:
CLR RS
MOVX @DPTR,A
SETB EN
CLR EN
ACALL WAIT_LCD
RET
DELAY_100US:
MOV R6,#200
DJNZ R6,$
RET
CHIA:
PUSH ACC
PUSH B
MOV B,#51
DIV AB
ORL A,#30H
ACALL WRITE_CHAR
MOV A,#0A5H
ACALL WRITE_CHAR
MOV A,B
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
MOV B,#5
DIV AB
ORL A,#30H
ACALL WRITE_CHAR
POP B
POP ACC
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ị chữ A ra LED ma trận
Code:
ORG
2000H
;========================================
;Xuat ky tu A tren LED ma tran
;========================================
MAIN:
MOV
A, #01H
MOV
R0, #0
LAP:
ACALL
QUET_COT
ACALL
QUET_HANG
INC
R0
ACALL
DELAY
CJNE
R0, #5, LAP
SJMP
MAIN
;----------------------------------------QUET_COT:
PUSH
DPH
PUSH
DPL
RR
A
MOV
DPTR, #
MOVX
@DPTR, A
POP
DPH
POP
DPL
RET
QUET_HANG:
PUSH
PUSH
PUSH
MOV
ACALL
MOVX
POP
POP
POP
RET
ACC
DPH
DPL
DPTR, #
DU_LIEU_HANG
@DPTR, A
ACC
DPH
DPL
Nhóm 07
Thí nghiệm Vi xử lí – Học kì hè 09-10
Nhóm 07
DU_LIEU_HANG:
PUSH
PUSH
MOV
MOV
MOVC
POP
POP
RET
DPH
DPL
A, R0
DPTR, #CHAR_A
A, @A+DPTR
DPH
DPL
DELAY:
MOV
LAPC1: MOV
DJNZ
DJNZ
RET
R7,
R6,
R6,
R7,
#4
#250
$
LAPC1
CHAR_A: DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H
END
Thí nghiệm 2: Viết lại chương trình hiển thị chữ A ra LED ma trận có sử dụng chương trình con
Code:
ORG
2000H
;==========================================
;Xuat ky tu A tren LED ma tran (dung CTCon)
;==========================================
MAIN:
MOV
R0, #8
MOV
R1, #30H
MOV
DPTR, #CHAR_A
MOV
A, #0
LAP:
MOVC
A, @A+DPTR
MOV
@R1, A
INC
R1
INC
A
DJNZ
R0, LAP
ACALL
XUAT
;----------------------------------------XUAT:
PUSH
ACC
PUSH
R0
PUSH
R1
MOV
A, #01H
MOV
R0, #0
MOV
R1, #30H
LAPC:
ACALL
QUET_COT
ACALL
QUET_HANG
INC
R0
INC
R1
ACALL
DELAY
CJNE
R0, #7, LAPC
PUSH
ACC
PUSH
R0
Thí nghiệm Vi xử lí – Học kì hè 09-10
PUSH
SJMP
RET
R1
XUAT
QUET_COT:
PUSH
PUSH
RR
MOV
MOVX
POP
POP
RET
DPH
DPL
A
DPTR, #
@DPTR, A
DPH
DPL
QUET_HANG:
PUSH
PUSH
PUSH
MOV
MOV
MOVX
POP
POP
POP
RET
ACC
DPH
DPL
DPTR, #
A, @R1
@DPTR, A
ACC
DPH
DPL
DELAY:
MOV
LAPC1: MOV
DJNZ
DJNZ
RET
Nhóm 07
R7,
R6,
R6,
R7,
#4
#250
$
LAPC1
CHAR_A: DB 03H, 0EDH, 0EEH, 0EEH, 0EDH, 03H
END
Bài 7:
Thí nghiệm với động cơ DC
Thí nghiệm1: 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.
Code:
MAIN:
NEXT:
ORG 2000H
MOV TMOD, #01H
MOV R1, #40
MOV DPTR, #0E000H
CLR A
CALL THUAN
Thí nghiệm Vi xử lí – Học kì hè 09-10
MOVX
CALL
CALL
MOVX
CALL
CALL
MOVX
CALL
CALL
MOVX
CALL
SJMP
@DPTR,
DELAY
NGHI
@DPTR,
DELAY
NGHICH
@DPTR,
DELAY
NGHI
@DPTR,
DELAY
NEXT
Nhóm 07
A
A
A
A
NGHICH:
NGHI:
THUAN:
DELAY:
LAP:
SETB ACC.0
CLR ACC.1
RET
CLR ACC.0
CLR ACC.1
RET
CLR ACC.0
SETB ACC.1
RET
PUSH 01
MOV TH0, #HIGH(-50000)
MOV TL0, #LOW(-50000)
SETB TR0
JNB TF0, $
CLR TR0
CLR TF0
DJNZ R1,LAP
POP 01
RET
Thí nghiệm2: 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ỳ
Code:
ORG 2000H
LJMP MAIN
ORG 200BH
LJMP ISR_T0
ORG 201BH
LJMP ISR_T1
MAIN:
MOV TMOD,#11H
MOV IE,#10001010B
MOV DPTR,#0E000H
SJMP $
ISR_T0:
CLR TR0
MOV TH0,#HIGH(-50000)