Tải bản đầy đủ (.pdf) (27 trang)

Báo cáo thí nghiệm vi xử lý

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (198.71 KB, 27 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA TP.HCM

BÁO CÁO
THÍ NGHIỆM VI XỬ LÝ

Giáo viên hướng dẫn: PHẠM ĐĂNG LÂM
Nhóm: L18
Sinh viên thực hiện:
1. Lương Trần Duy
2. Nguyễn Đình Trọng
3. Hồ Ngọc Uyên
4. Nguyễn Văn Trung

1510462
1513701
1513983
1513739

1


BÀI TN 1:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ LED
Thí nghiệm 1: Viết chương trình thực hiện việc đọc liên tục trạng thái của nút nhấn
được nối đến P1.0 và hiển thị ra led được nối tại chân P3.0 (bit thứ 0 của led thanh
BL202).
ORG 2000H
LAP: MOV C, P1.0
MOV P3.0, C
SJMP LAP
END


Thínghiệm 3:Viết chương trình tạo xung vng 1 Khz, chu kỳ nhiệm vụ 50% trên
P3.0
ORG 2000H
LOOP:
MOV R2, #250
DJNZ R2, $
CPL P3.0
SJMP LOOP
END

Thí nghiệm 4:Viết chương trình con Delay1sIns và dùng chương trình con này để
chớp tắt LED đơn gắn vào P1.0 sau mỗi khoảng thời gian 1s.
ORG 2000H

LAP1: MOV R6, #250

MAIN:

LAP: MOV R5, #250

CPL P1.0

DJNZ R5, $

ACALL Delay1sIns

DJNZ R6, LAP

SJMP MAIN


DJNZ R7, LAP1

Delay1sIns:

RET

MOV R7, #8

END

2


Thí nghiệm 5: Viết chương trình tạo hiệu ứng quay LED: các LED đơn trên
BARLED1 sáng lần lượt từ trái sang phải sau thời gian 1s và lặp lại. Sử dụng chương
trình con 1s đã viết ở trên.
ORG 2000H

Delay1sIns:

TT: MOV A, #0FEH

MOV R7, #8

LAP: MOV P1, A

LAP1: MOV R6, #250

ACALL Delay1sIns


LAP2: MOV R5, #250

RL A

DJNZ R5, $

CJNE A, #FFH, LAP

DJNZ R6, LAP2

SJMP TT

DJNZ R7, LAP1
RET
END

BÀI TN2:LẬP TRÌNH CHO TIMER VÀ HIỂN THỊ LED 7
ĐOẠN
Thí nghiệm 1: Viết chương trình tạo sóng vng 1 Khz trên chân P1.0 sử dụng timer
0 ở chế độ 1
tH = 500 µs tL = 500 µs
ORG 2000H

JNB TF0

MOV TMOD, #01H

CLR TF0

LOOP: CPL P1.0


CLR TR0

MOV TH0, #HIGH(-500)

SJMP LOOP

MOV TL0,#LOW(-500)

END

SETB TR0

3


Thí nghiệm 2: Viết chương trình tạo sóng vng 10 Khz trên chân P1.0 sử dụng timer
0 ở chế độ 2
tH = 50 µs tL = 50 µs
ORG 2000H

LOOP: CPL P1.0

SETB P1.0

JNB TF0

MOV TMOD, #02H

CLR TF0


MOV TH0, #-50

SJMP LOOP

MOV TL0, #-50

END

SETB TR0

Thínghiệm 3:
-

Viết chương trình con DisplayLed0 hiển thị lên LED 7 đoạn số 0 giá trị chứa
trong thanh ghi R0

-

Viết chương trình chính hiển thị số 9 lên LED 7 đoạn số 0 bằng cách cho R0
bằng 9 và gọi chương trình con DisplayLed0

ORG 2000H
MOV R0, #9
ACALL DisplayLed0
DisplayLed0:
MOV A, R0
ORL A, #0E0H
MOV DPTR, #0000H
MOVX @DPTR, A

RET
END

Thí nghiệm 4: Viết chương trình hiển thị lên LED 7 đoạn số 0 các con số từ 0 đến 9
sau các khoảng thời gian 1s
ORG 2000H

MOV TMOD, #01H

4


LAP: MOV R0, #0

Delay1s:

LOOP: LCALL DisplayLed0

MOV R7, #20

LCALL Delay1s

LVONG:

INC R0

MOV TH0, #HIGH(-50000)

CJNE R0, #10, LOOP


MOV TL0, #LOW(-50000)

SJMP LAP

SETB TR0
JNB TF0, $

DisplayLed0:

CLR TF0

MOV A, R0

CLR TR0

ORL A, #0E0H

DJNZ R7, LVONG

MOV DPTR, #0000H

RET

MOVX @DPTR, A

END

RET

BÀI TN3:QUÉT LED 7 ĐOẠN VÀ GIAO TIẾP LCD

Thí nghiệm 1:
Viết chương trình con DisplayLED xuất giá trị chứa trong thanh ghi R0 lên LED 7
đoạn có số thứ tự chứa trong thanh ghi R1.
R0 nằm trong tầm từ 0-9 và R1 trong tầm từ 0-3.
Sau đó dùng chương trình con này viết chương trình chính xuất giá trị 1 lên LED 7
đoạn số 3.
ORG 2000H

SJMP $

MOV R0, #1

DisplayLED:

MOV R1, #3

MOV A, R1

LCALL DisplayLED

MOV DPTR, #POT

5


MOVC A, @A +DPTR

RET

ORL A, R0


POT: DB 0E0H, 0D0H, 0B0H, 70H

MOV DPTR, #0000H
MOVX @DPTR, A

END

Thí nghiệm 2: Viết chương trình hiển thị số 1 lên LED7 đoạn 0, sau đó 1s hiển thị số
2 lên LED 7 đoạn 1, sau đó 1s hiển thị số 3 lên LED 7 đoạn 2, sau đó 1s hiển thị số 4
lên LED 7 đoạn 3. Quá trình này lặp đi lặp lại. Việc hiển thị này sử dụng chương trình
con DisplayLED đã viết ở trên.
ORG 2000H

JNB TF0, $

MOV TMOD, #01H

CLR TF0

TTUC: MOV R0, #1

CLR TR0
DJNZ R7, LVONG

MOV R1, #0

RET

LAP: LCALL DisplayLED

LCALL DELAY1s
INC R0
INC R1
CJNE R0, #5, LAP
SJMP TTUC

DisplayLED:
MOV A, R1
MOV DPTR, #POT
MOVC A, @A +DPTR
ORL A, R0

Delay1s:
MOV R7, #20
LVONG:
MOV TH0, #HIGH(-50000)

MOV DPTR, #0000H
MOVX @DPTR, A
RET
POT: DB 0E0H, 0D0H, 0B0H, 70H

MOV TL0, #LOW(-50000)
SETB TR0

END

Thí nghiệm 3: Viết chương trình hiển thị ra LCD tên của sinh viên ở hàng đầu.
LCD_E BIT P3.3


LCD_RS BIT P3.5

6


LCD_ADDR EQU 6000H
ORG 2000H

RET
WRITETEXT:

MOV TMOD, #01H

MOV DPTR, #LCD_ADDR

MOV DPTR, #LCD_ADDR

SETB LCD_E

LCALL LCD_INT

SETB LCD_RS

LCALL DISPLAY

MOVX @DPTR, A

SJMP $

CLR LCD_E


LCD_INT:

CALL WAIT

MOV A, #38H
LCALL WRITECOM

RET
DISPLAY:

MOV A, #0EH

MOV R3, #15

LCALL WRITECOM

MOV A, #0

MOV A, #06H

LOP:

LCALL WRITECOM

MOV DPTR, #TEXT
MOV R0, A

RET


MOVC A, @A + DPTR

WRITECOM:

JZ EXIT

MOV DPTR, #LCD_ADDR
CLR LCD_RS

CALL WRITETEXT
LU:

MOV A, R0

SETB LCD_E

INC A

MOVX @DPTR, A

DJNZ R3, LOP

CLR LCD_E

MOV A, #0C0H

LCALL WAIT

;tựđộngxuốnghàngthư 2 khichuỗidàihơn 16
kítự


RET

LCALL WRITECOM

WAIT:

MOV R3, #15

MOV R6,#10

SJMP LU

DL1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1

EXIT:

RET
TEXT: DB "LuongTranDuy",0

7


END

Thínghiệm 4: - Viết thêm chương trình con CLRSCREEN để xóa màn hình LCD
- Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD
đến hàng x cột y, với x chứa trong R0, y chứa trong R1

- Sửa chương trình để hiển thị thêm số nhóm ở hàng thứ 2
CLRSCREEN:

GOTOXY:

PUSH ACC

PUSH ACC

MOV A, #01H

MOV A, R1;hàng x → R0

CALL WRITECOM

CLR C

POP ACC

;cột y

→ R1

SUBB A, #1

RET

JZ GOTO
MOV A, #40H
GOTO: ADD A, #7FH

ADD A, R2
LCALL WRITECOM
POP ACC
RET

LCD_E BIT P3.3
LCD_RS BIT P3.5

SJMP $
LCD_INT:

LCD_ADDR EQU 6000H

MOV A, #38H

ORG 2000H

LCALL WRITECOM

MOV R1, #2

MOV A, #0EH

MOV R2, #1

LCALL WRITECOM

MOV TMOD, #01H

MOV A, #06H


MOV DPTR, #LCD_ADDR

LCALL WRITECOM

LCALL LCD_INT
LCALL CLRSCREEN
LCALL DISPLAY

RET
WRITECOM:
MOV DPTR, #LCD_ADDR

8


CLR LCD_RS

LU:

MOV A, R0

SETB LCD_E

INC A

MOVX @DPTR, A

DJNZ R3, LOP


CLR LCD_E

EXIT: LCALL GOTOXY

LCALL WAIT
RET

MOV A, #0
LOP1: MOV DPTR, #TEXT1

WAIT:

MOV R0, A
MOV R6,#10

MOVC A, @A + DPTR

DL1: MOV R7,#250

JZ EXIT1

DJNZ R7,$

LCALL WRITETEXT

DJNZ R6,DL1

MOV A, R0

RET


INC A

WRITETEXT:
MOV DPTR, #LCD_ADDR

SJMP LOP1
EXIT1:

RET

SETB LCD_E

TEXT: DB "LuongTranDuy",0

SETB LCD_RS

TEXT1: DB “Nhom 1” ,0

MOVX @DPTR, A

RET

CLR LCD_E
LCALL WAIT
RET

PUSH ACC

DISPLAY:


LOP:

GOTOXY:

MOV A, R1

MOV R3, #15

CLR C

MOV A, #0

SUBB A, #1

MOV DPTR, #TEXT

JZ GOTO

MOV R0, A

MOV A, #40H

MOVC A, @A + DPTR

GOTO: ADD A, #7FH

JZ EXIT

ADD A, R2


LCALL WRITETEXT

LCALL WRITECOM

9


POP ACC
RET

CALL WRITECOM
POP ACC
RET

CLRSCREEN:
PUSH ACC

END

MOV A, #01H

BÀI TH4:LẬP TRÌNH GIAO TIẾP PHÍM ĐƠN VÀ BÀN PHÍM
SỐ HEX
Thínghiệm 1: Viết chương trình đếm số lần nhấn SW310 (phím đơn kết nối vào
P1.0), hiển thịl ên LCD theo cấu trúc: Push Number = xx (xx là số lần nhấn)
(khơng có chống rung phím)
LCD_E BIT P3.4
LCD_RS BIT P3.5


MOV R0, #48

LCD_ADDR EQU 6000H

MOV A, #48
TT: LCALL CLEAR

ORG 2000H

MOV R2, #2

MOV R1, #1

LCALL GOTOXY

MOV R2, #1

PUSH ACC

MOV TMOD, #01H

MOV A, R0

MOV DPTR, #LCD_ADDR

LCALL WRITETEXT

LCALL LCD_INT

POP ACC


10


MOV R2, #3

CLR LCD_E

LCALL GOTOXY

LCALL WAIT

LCALL WRITETEXT

RET

JNB P1.0, $

WAIT:

JB P1.0, $

PUSH 06H

INC A

PUSH 07H

CJNE A, #58, TT


MOV R6, #10

MOV A, #48

DL1: MOV R7, #250

INC R0

DJNZ R7, $

CJNE R0,#58, TT

DJNZ R6, DL1

MOV R0, #48

POP 07H

SJMP TT

POP 06H
RET

LCD_INT:
MOV A, #38H

WRITETEXT:

LCALL WRITECOM


MOV DPTR, #LCD_ADDR

MOV A, #0EH

SETB LCD_E

LCALL WRITECOM

SETB LCD_RS

MOV A, #06H

MOVX @DPTR, A

LCALL WRITECOM

CLR LCD_E

RET

LCALL WAIT
RET

WRITECOM:
MOV DPTR, #LCD_ADDR
CLR LCD_RS

CLEAR:
PUSH ACC


SETB LCD_E

MOV A, #01H

MOVX @DPTR, A

CALL WRITECOM

11


POP ACC

JZ GOTO

RET

MOV A, #40H
GOTO: ADD A, #7FH
ADD A, R2

GOTOXY:

LCALL WRITECOM

PUSH ACC
MOV A, R1
CLR C
SUBB A, #1


POP ACC
RET
END

Thí nghiệm 2: viết lại chương trình trên có chống rung phím

LCD_E BIT P3.3

PUSH ACC

LCD_RS BIT P3.5

MOV A, R0

LCD_ADDR EQU 6000H

LCALL WRITETEXT

ORG 2000H
;R1 hàng, 1-2
;R2 cột, 1-16
MOV R1, #1

POP ACC
MOV R2, #3
LCALL GOTOXY
LCALL WRITETEXT

MOV R2, #1


MOV R4, #20

MOV TMOD, #01H

SS1: JB P1.0, $

MOV DPTR, #LCD_ADDR

LCALL DELAY1ms

LCALL LCD_INT

DJNZ R4, SS1

LCALL GOTOXY

MOV R4, #20
SS2: JNB P1.0, $

MOV R0, #48

LCALL DELAY1ms

MOV A, #48

DJNZ R4, SS2

TT: LCALL CLEAR
MOV R2, #2
LCALL GOTOXY


INC A
CJNE A, #58, TT

12


MOV A, #48

DL1: MOV R7,#250

INC R0

DJNZ R7,$

CJNE R0,#58, TT

DJNZ R6,DL1

MOV R0, #48

POP 07H

SJMP TT

POP 06H
RET

LCD_INT:
MOV A, #38H


WRITETEXT:

LCALL WRITECOM

MOV DPTR, #LCD_ADDR

MOV A, #0EH

SETB LCD_E

LCALL WRITECOM

SETB LCD_RS

MOV A, #06H

MOVX @DPTR, A

LCALL WRITECOM

CLR LCD_E

RET

LCALL WAIT
RET

WRITECOM:
MOV DPTR, #LCD_ADDR


CLEAR:

CLR LCD_RS

PUSH ACC

SETB LCD_E

MOV A, #01H

MOVX @DPTR, A

CALL WRITECOM

CLR LCD_E
LCALL WAIT

POP ACC
RET

RET
GOTOXY:
WAIT:

PUSH ACC

PUSH 06H

MOV A, R1


PUSH 07H

CLR C

MOV R6,#10

SUBB A, #1

13


JZ GOTO

DELAY1ms:

MOV A, #40H

MOV TH0, #HIGH(-1000)

GOTO: ADD A, #7FH

MOV TL0, #LOW(-1000)

ADD A, R2

SETB TR0

LCALL WRITECOM


JNB TF0, $

POP ACC

CLR TR0

RET

CLR TF0
RET
END

Thí nghiệm 3: Viết chương trình con SCANKEY qt bàn phím ma trận 4x4 trên
board thí nghiệm. Các giá trị trả vềt ừ 0-15 nếu có phím được nhấn hoặc 255 nếu
khơng có phím được nhấn. Kết quả chứa trong R0.
Sử dụng chương trình con này viết chương trình gửi lên máy tính các ký tự từ '0' cho
đến 'F' ứng với phím được nhấn trên bàn phím, baudrate là 19200.
ORG 2000H
MAIN:

MOV P1, #0EFH
MOV SCON, #52H

CALL WAIT

MOV TMOD, #20H

MOV A, P1

MOV TH1, #-3


CJNE A, #0EEH, BUT01

MOV A, PCON

MOV A, “0”

SETB ACC.7
MOV PCON, A
CALL SCANKEY
CJNE A, #255, TT
SJMP MAIN
TT:

LCALL PHAT
SJMP MAIN

JMP DONE
BUT01: CJNE A, #0EDH, BUT02
MOV A, “4”
JMP DONE
BUT02: CJNE A, #0EBH, BUT03
MOV A, “8”
JMP DONE
BUT03: CJNE A, #0E7H, OW

SCANKEY:

MOV A, “C”


14


JMP DONE

MOV A, “D”
JMP DONE

OW:
MOV P1, #0DFH

OW2:

LCALL WAIT

MOV P1, #07FH

MOV A, P1

LCALL WAIT

CJNE A, #0DEH, BUT11

MOV A, P1

MOV A, “1”

CJNE A, #07EH, BUT31

JMP DONE


MOV A, “3”

BUT11: CJNE A, #0DDH, BUT12

JMP DONE

MOV A, “5”

BUT31: CJNE A, #07DH, BUT32

JMP DONE

MOV A, “7”

BUT12: CJNE A, #0DBH, BUT13

JMP DONE

MOV A, “9”

BUT32: CJNE A, #07BH, BUT33

JMP DONE

MOV A, “B”

BUT13: CJNE A, #0D7H, OW1

JMP DONE


MOV A, “D”

BUT33: CJNE A, #077H, OW3

JMP DONE

MOV A, “F”

OW1:

JMP DONE
MOV P1, #0BFH
CALL WAIT

OW3: MOV A, #255

MOV A, P1

DONE: NOP

CJNE A, #0BEH, BUT21

RET

MOV A, “2”
JMP DONE

WAIT:


BUT21: CJNE A, #0BDH, BUT22
MOV A, “6”

MOV R7, #40;
LAP:

JMP DONE

DJNZ R6, $

BUT22: CJNE A, #0BBH, BUT13
MOV A, “A”

MOV R6, #250;

DJNZ R7, LAP
RET

JMP DONE
BUT23: CJNE A, #0B7H, OW2

15


PHAT:

MOV SBUF, A
JNB TI, $

RET


CLR TI

END

BÀI TH5:LẬP TRÌNH GIAO TIẾP SERIAL PORT VÀ ADC
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 HyperTerminal với tốc độ baud 19200 pbs mỗi khi SW 310 (gắnvào P1.0)
đượcnhấn
ORG 2000H
MOV TMOD ,#20h

MOVC A, @A+DPTR

MOV TH1,#-3

MOV SBUF, A

MOV SCON,#52H

MOV A, R0

MOV A, PCON

INC A

SETB ACC.7

CLR TI


MOV PCON, A

SJMP LOOP

MOV DPTR, #TEXT

TEXT: DB "Hello, world"

MOV A , #0

DELAY1ms:

SETB TR1
LOOP: MOV R1, #20
SS1:

PUSH 01h
PUSH 02h

JNB P1.0, $
LCALL DELAY1ms

SS2:

MOV R0,A

MOV R1, #2
LL:

MOV R2, #250


DJNZ R1, SS1

DJNZ R2, $

MOV R1, #20

DJNZ R1, LL

JB P1.0, $

POP 02h

LCALL DELAY1ms

POP 01h

DJNZ R1, SS2
JNB TI, $

RET
END

16


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 HyperTerminal (bằng cách gõ các ký tự trên bàn phím khi đang ở trong
chương trình HyperTerminal) và hiển thị lên LCD như sau:
Nếu ký tự là chữ thì hiển thị lên LCD; Enter thì xuống hàng; ESC thì xóa màn hình

LCD; Backspace thì xóa ký tự bên trái dấu nháy.
LCD_E BIT P3.3

LCALL WRITECOM

LCD_RS BIT P3.5

MOV A, #0

LCD_ADDR EQU 6000H

LCALL WRITETEXT

ORG 2000H

CLR RI

;R1hàng, 1-2

SJMP LAP

;R2cột 1-16

TT:

CJNE A, #10, TT1

MOV R1, #1

;ENTER


MOV R2, #1

PUSH 01H

MOV TMOD, #01H

PUSH 02H

MOV DPTR, #LCD_ADDR

MOV R1,#2

LCALL LCD_INT

MOV R2,#1

MOV TMOD, #20H

LCALL GOTOXY

MOV TH1, #-3

POP 02H

MOV SCON , #50H

POP 01H

MOV A, PCON


CLR RI

SETB ACC.7

SJMP LAP

MOV PCON, A

TT1:

SETB TR1
LAP:

CJNE A, #27, TT2
;XOA MAN HINH

JNB RI, $

LCALL CLEAR

MOV A, SBUF

CLR RI

CJNE A, #8, TT

SJMP LAP

;XOA KT

MOV A, #10H;

TT2:

CJNE A, #65,$+3
JC LAP

17


CJNE A, #91, $+3

CLR LCD_E

JNC TT3

LCALL WAIT

LCALL WRITETEXT

RET

CLR RI
SJMP LAP
TT3:

WAIT:

CJNE A, #97, $+3


MOV R6,#10

JC LAP

DL1: MOV R7,#250

CJNE A, #123, $+3

DJNZ R7,$

JNC LAP

DJNZ R6,DL1

LCALL WRITETEXT

RET

CLR RI
SJMP LAP

WRITETEXT:
MOV DPTR, #LCD_ADDR
SETB LCD_E

LCD_INT:

SETB LCD_RS

MOV A, #38H


MOVX @DPTR, A

LCALL WRITECOM

CLR LCD_E

MOV A, #0EH

CALL WAIT

LCALL WRITECOM

RET

MOV A, #06H
LCALL WRITECOM

CLEAR:

RET

MOV A, #01H
CALL WRITECOM

WRITECOM:

RET

MOV DPTR, #LCD_ADDR

CLR LCD_RS

GOTOXY:

SETB LCD_E

MOV A, R1

MOVX @DPTR, A

CLR C

18


SUBB A, #1

ADD A, R2

JZ GOTO

LCALL WRITECOM

MOV A, #40H

RET

GOTO: ADD A, #7FH

END


Thí nghiệm 3: Viết chương trình con READADC thực hiện đọc giá trị của kênh 0 và
trả về giá trị trong R0
Viết chương trình hiển thị giá trị của kênh 0 của ADC lên LCD dùng chương trình con
READADC đã viết
LCD_E BIT P3.3

ACALL WRITETEXT

LCD_RS BIT P3.5

SJMP LAP

LCD_ADDR EQU 6000H
ORG 2000H

READADC:
MOV A, #0

MOV R2, #1

MOV R7,#100

MOV TMOD, #01H

MOV DPTR, #4000H
MOVX @DPTR, A

ACALL LCD_INT


DJNZ R7,$

ACALL LCD_CLR

MOVX A, @DPTR

LAP:

MOV R0, A

MOV R1,#1

RET

ACALL GOTOXY
ACALL READADC

LCD_INT:

MOV B, #100

MOV A, #38H

DIV AB

LCALL WRITECOM

ADD A, #48

MOV A, #0EH


ACALL WRITETEXT

LCALL WRITECOM

MOV A, B

MOV A, #06H

MOV B, #10

LCALL WRITECOM

DIV AB

RET

ADD A, #48
ACALL WRITETEXT

WRITECOM:

MOV A, B

MOV DPTR, #LCD_ADDR

ADD A, #48

CLR LCD_RS


19


SETB LCD_E

GOTOXY:

MOVX @DPTR, A

PUSH ACC

CLR LCD_E

MOV A, R2

LCALL WAIT

CLR C

RET

SUBB A, #1
JZ GOTO

WAIT:

MOV A, #40H
MOV R6,#10

GOTO:


DL1: MOV R7,#250

ADD A, R1

DJNZ R7,$

LCALL WRITECOM

DJNZ R6,DL1

POP ACC

RET

ADD A, #7FH

RET

WRITETEXT:
MOV DPTR, #LCD_ADDR

LCD_CLR:

SETB LCD_E

PUSH ACC

SETB LCD_RS


MOV A, #01H

MOVX @DPTR, A

ACALL WRITECOM

CLR LCD_E

POP ACC

CALL WAIT

RET

RET
END

Thí nghiệm 4: Viết chương trình con CALADC tính tốn giá trị điện áp thực tế đặt
vào kênh 0 ADC từ giá trị đo được của ADC
Chương trình có giá trị vào chứa trong R0 (là kết quả của chương trình con
READADC)
Giá trị trả về chứa trong R0 và R1, R0 chứa giá trị nguyên và R1 chứa giá trị thập
phân.
LCD_E BIT P3.3

LCD_ADDR EQU 6000H

LCD_RS BIT P3.5

ORG 2000H


20


MOV A, #0
MOV R2, #1

MOV R7,#100

MOV TMOD, #01H

MOV DPTR, #4000H

MOV DPTR, #LCD_ADDR

MOVX @DPTR, A

LCALL LCD_INT

DJNZ R7,$

ACALL LCD_CLR

MOVX A, @DPTR
MOV R0, A

LAP:

RET
MOV R3, #1

ACALL GOTOXY
ACALL READADC

LCD_INT:

ACALL CALADC

MOV A, #38H

MOV A,R0

LCALL WRITECOM

ACALL WRITETEXT

MOV A, #0EH

MOV A, #2EH

LCALL WRITECOM

ACALL WRITETEXT

MOV A, #06H

MOV A, R1

LCALL WRITECOM

ACALL WRITETEXT

SJMP LAP

RET
WRITECOM:

CALADC:

MOV DPTR, #LCD_ADDR

MOV B, #50

CLR LCD_RS

DIV AB

SETB LCD_E

ADD A, #48

MOVX @DPTR, A

MOV R0, A

CLR LCD_E

MOV A, B

LCALL WAIT

MOV B, #5

DIV AB

RET
WAIT:

ADD A, #48

MOV R6,#10

MOV R1, A

DL1: MOV R7,#250

RET

DJNZ R7,$
DJNZ R6,DL1

READADC:

RET

21


WRITETEXT:

MOV A, #40H

MOV DPTR, #LCD_ADDR


GOTO: ADD A, #7FH

SETB LCD_E

ADD A, R3

SETB LCD_RS

LCALL WRITECOM

MOVX @DPTR, A
CLR LCD_E

POP ACC
RET

CALL WAIT
RET

LCD_CLR:
PUSH ACC

GOTOXY:

MOV A, #01H

PUSH ACC

ACALL WRITECOM


MOV A, R2

POP ACC

CLR C

RET

SUBB A, #1
JZ GOTO

END

BÀI TH 6: LẬP TRÌNH NGẮT
Thí nghiệm 1:Viết chương trình làm song song 2 công việ sau:
Nhận 1 byte từ máy tính và xuất ngược lại (echo) lên màn hình terminal. Bật LED gắn
vào P1.1 khi SW 317 (gắn vào P1.0) được nhấn, và tắt LED khi phím được nhả.
ORG 2000H

MOV SCON , #52H

JMP MAIN

MOV A, PCON

ORG 2023H

SETB ACC.7


JMP ISRPORT

MOV PCON, A

MAIN:

SETB TR1
MOV TMOD, #20H

MOV IE, #10010000B

MOV TH1, #-3

LOOP: MOV R1, #20

22


SS1:

JNB P1.0, $

MOV A, SBUF

LCALL DELAY1ms

MOV SBUF, A

DJNZ R1, SS1


SS2:

JMP DONE

MOV R1, #20

SKIP: CLR TI

SETB P1.1

DONE: RETI

JB P1.0, $

DELAY1ms:

LCALL DELAY1ms
DJNZ R1, SS2

MOV R7, #2
VONG: MOV R6, #250

CLR P1.1

DJNZ R6, $

JMP LOOP

DJNZ R7, VONG


ISRPORT:

RET

JNB RI, SKIP

END

CLR RI

Thí nghiệm 2: Viết chương trình hiển thị lên 4 LED 7 đoạn một số có 4 chữ số, 4 ký số
này chứa trong các ô nhớ 20H, 21H, 22H và 23H. Ô nhớ 20H chứa số hàng nghìn.

ORG 2000H

MOV TH0, #HIGH(-1000)

JMP MAIN

SETB TR0

ORG 200BH

MOV IE, #10000010B

JMP ISRT0

MOV R3, #20H

MAIN:


MOV R1, #3

MOV 20H, #1

SJMP $

MOV 21H, #3

ISRT0:

CLR TR0

MOV 22H, #1

MOV TL0, #LOW(-1000)

MOV 23H, #8

MOV TH0, #HIGH(-1000)

MOV TMOD, #01H

MOV A, R3

MOV TL0, #LOW(-1000)

ADD A, R1

23



MOV R0, A

MOV R2, A

LCALL DISPLAYLED

MOV A, @R0

DEC R1

SKIP:

CJNE R1, #0FFH, SKIP

ORL A, R2

MOV R1, #3

MOV DPTR, #0000H

SETB TR0

MOVX @DPTR, A

RETI

RET


DISPLAYLED:
MOV A, R1

POT: DB 070H, 0B0H, 0D0H, 0E0H

MOV DPTR, #POT
MOVC A, @A+DPTR

END

Thí nghiệm 3: Viết chương trình đếm số lần nhấn phím SW317, hiển thị lên 4 LED 7
đoạn
ORG 2000H

MOV TMOD, #01H

JMP MAIN

MOV TH0, #HIGH(-10000)

ORG 200BH

MOV TL0, #LOW(-10000)

JMP IRST0

MOV IE, #82H

ORG 2030H


SETB TR0

MAIN:
MOV R3, #23H

SKIP: MOV R7, #20

MOV R1, #0

T: JNB P1.7, $
LCALL DELAY1MS

MOV 20H, #0

DJNZ R7, T

MOV 21H, #0

MOV R7, #20

MOV 22H, #0

LOP: JB P1.7, $

MOV 23H, #0

LCALL DELAY1MS

24



DJNZ R7, LOP

MOV R0, A
LCALL FORLED

INC 23H

INC R1

MOV A, 23H

CJNE R1, #4, CONTI

CJNE A, #10, SKIP

MOV R1, #0

MOV 23H, #0

CONTI:

INC 22H

RETI

MOV A, 22H

FORLED:


CJNE A, #10, SKIP

MOV A, R1

MOV 22H, #0

MOV DPTR, #POT

INC 21H

MOVC A, @A + DPTR

MOV A, 21H

MOV R6,A

CJNE A, #10, SKIP

MOV A, @R0

MOV 21H, #0

ORL A, R6

INC 20H

MOV DPTR, #0000H

MOV A, 20H


MOVX @DPTR, A

CJNE A, #10, SKIP

RET

MOV 20H, #0

POT: DB 0E0H, 0D0H, 0B0H, 070H

SJMP SKIP

DELAY1MS:
MOV R4, #2

IRST0:MOV TH0, #HIGH(-10000)
MOV TL0, #LOW(-10000)

LAP: MOV R5, #250
DJNZ R5, $
DJNZ R4, LAP

MOV A, R3

RET

CLR C

END


SUBB A, R1

Thí nghiệm 4:Viết chương trình thực hiện đồng hồ bấmgiây, hiển thị lên LED 7 đoạn.
Hai LED 3 và 2 thể hiện số giây, 2 LED 1 và 0 thể hiện phần tram của giây.
Khi SW310 nhấn, đồnghồ reset về 0
SW 311 nhấn, đồng hồ bắt đầu chạy

25


×