Top Banner
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) 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 LAP: CPL P1.0 CALL DL SJMP LAP DL: MOV R5,#10 L2: MOV R6,#100 L1: MOV R7,#250 DJNZ R7,$ DJNZ R6,L1 DJNZ R5,L2 RET END Dù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ố. 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: MOV R6,#100 L1:
27

Bao Cao TNVXL Nhom3 Senie

Oct 03, 2014

Download

Documents

Akasi Owakada
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Bao Cao TNVXL Nhom3 Senie

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)

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

LAP:

CPL P1.0

CALL DL

SJMP LAP

DL:

MOV R5,#10

L2:

MOV R6,#100

L1:

MOV R7,#250

DJNZ R7,$

DJNZ R6,L1

DJNZ R5,L2

RET

END

Dù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ố.

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:

MOV R6,#100

L1:

Page 2: Bao Cao TNVXL Nhom3 Senie

MOV R7,#250

DJNZ R7,$

DJNZ R6,L1

RET

END

3. 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,NAP

CPL P1.0

MOV R7,#10

SJMP KT

NAP:

CLR TR0

MOV TH0,#HIGH(-50000)

MOV TL0,#LOW(-50000)

SETB TR0

KT: RETI

END

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

ORG 2000H

MAIN:

CPL P1.0

MOV A,#10

JNB P1.1,KT_GIAM

DEC A ;Khi nhấn P1.1 thì f tăng => Chu kỳ giảm => giảm R7

MOV R7,A

Page 3: Bao Cao TNVXL Nhom3 Senie

SJMP LAP ; mỗi lần giảm là 1*25000us = 0.025s

KT_GIAM:

JNB 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 TẬP:

1. Viết chương trình thực hiện cổng logic: XOR 2 ngõ vào ORG 2000H

MAIN:

CLR A

MOV C,P1.0

MOV ACC.0,C

MOV R0,A

MOV C,P1.1

MOV ACC.0,C

XRL A,R0

MOV C,ACC.0

MOV P1.5,C

SJMP MAIN

END

2. Viết chương trình thực hiện mạch đèn chạy: STTTTTT-SSTTTTTT-SSSTTTTT-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)

ORG 2000H

MAIN:

CLR A

MOV DPTR,#TABLE

MOV R7,#8

LAP:

MOVC A,@A+DPTR

ACALL DL500

INC A

DJNZ R7,LAP

SJMP MAIN

DL500:

MOV TMOD,#01H

MOV R6,#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 R6,LOOP

RET

TABLE:

Page 4: Bao Cao TNVXL Nhom3 Senie

DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H,0FFH

END

3. Viết chương trình thực hiện phép logic: P1.5 = (P1.0 XOR P1.1) AND P1.2) ORG 2000H

MAIN:

CLR A

MOV C,P1.0

MOV ACC.0,C

MOV R0,A

MOV C,P1.1

MOV ACC.0,C

XRL A,R0

MOV R0,A ; R0 = P1.0 XOR P1.1

MOV C,P1.2

MOV ACC.0,C

ANL A,R0

MOV C,ACC.0

MOV P1.5,C

SJMP MAIN

END

BÀ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 2000H

MAIN:

MOV R7,#10

MOV R5,#0

LOOP:

MOV DPTR,#TABLE

MOV A,R5

MOVC A,@A+DPTR

ACALL DL2S

MOV DPTR,#0000H

MOVX @DPTR,A

INC R5

DJNZ R7,LOOP

SJMP MAIN

DL2S:

MOV R6,#40

MOV TMOD,#01H

LAP:

MOV TH0,#HIGH(-50000)

MOV TL0,#LOW(-50000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

DJNZ R6,LAP

RET

TABLE:

DB 70H,71H,72H,73H,74H,75H,76H,77H,78H,79H

END

Page 5: Bao Cao TNVXL Nhom3 Senie

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 2000H

MAIN:

MOV R7,#4

MOV R5,#0

LOOP:

MOV DPTR,#TABLE

MOV A,R5

MOVC A,@A+DPTR

ACALL DL2MS

MOV DPTR,#0000H

MOVX @DPTR,A

INC R5

DJNZ R7,LOOP

SJMP MAIN

DL2MS:

MOV TMOD,#01H

MOV TH0,#HIGH(-2000)

MOV TL0,#LOW(-2000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

RET

TABLE:

DB 71H,0B2H,0D3H,0E4H ;tương ứng với giá trị 1234 hiển thị lên Led 1 2 3

4

END

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 R7,#12H

MOV R6,#34H

MOV A,R7

ANL A,#0F0H

SWAP A

ADD A,#70H

MOV R1,A ; R1 chưa gía trị 71H tương ứng với giá trị 1 đươc xuất ra led 1

MOV A,R7

ANL A,#0FH

ADD A,#0B0H

MOV R2,A ; R2 chưa giá trị 0B2H tương ứng với giá trị 1 được xuất ra led 2

MOV A,R6

ANL A,#0F0H

SWAP A

ADD A,#0D0H

MOV R3,A ; R3 chưa giá trị 0D3H tương ứng với giá trị 1 được xuất ra led 3

MOV A,R6

ANL A,#0FH

ADD A,#0E0H

MOV R4,A ; R4 chưa giá trị 0E4H trương ứng với giá trị 1 đươc xuất ra led

4

LAP:

MOV DPTR,#0

MOV A,R1

MOVX @DPTR,A

ACALL DL2MS

MOV A,R2

MOVX @DPTR,A

Page 6: Bao Cao TNVXL Nhom3 Senie

ACALL DL2MS

MOV A,R3

MOVX @DPTR,A

ACALL DL2MS

MOV A,R4

MOVX @DPTR,A

ACALL DL2MS

SJMP LAP

DL2MS:

MOV TMOD,#01H

MOV TH0,#HIGH(-2000)

MOV TL0,#LOW(-2000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

RET

END

3. 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 R7,#254 ; nạp tùy ý giá trị R7 để kiểm tra

MOV B,#10

MOV A,R7

DIV AB

MOV R4,B ; R4 chứa giá trị hàng đơn vị

MOV B,#10

DIV AB

MOV R3,B ; R3 chứa giá trị hàng chục

MOV R2,A ; R2 chưa giá trị hàng trăm

LAP:

MOV DPTR,#0

MOV A,R2

ADD A,#0B0H

MOVX @DPTR,A

ACALL DL2MS

MOV A,R3

ADD A,#0D0H

MOVX @DPTR,A

ACALL DL2MS

MOV A,R4

ADD A,#0E0H

MOVX @DPTR,A

ACALL DL2MS

SJMP LAP

DL2MS:

MOV TMOD,#01H

MOV TH0,#HIGH(-2000)

MOV TL0,#LOW(-2000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

RET

END

Page 7: Bao Cao TNVXL Nhom3 Senie

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 2000H

MAIN:

MOV DPTR,#0

MOV R7,#0

MOV R6,#0

JNB P1.0,NHAY ; nhảy khi nhấn P1.0

SJMP MAIN

NHAY:

INC R7

CJNE R7,0AH,SKIP ; nhảy đến SKIP khi R7 # 0AH

MOV R7,#0

INC R6

SKIP:

MOV A,R7

ADD A,#0E0H

MOVX @DPTR,A

ACALL DL2MS

MOV A,R6

ADD A,#0D0H

MOVX @DPTR,A

JB P1.0,SKIP ; nhảy đến SKIP khi không nhấn P1.0

SJMP NHAY

DL2MS:

MOV TMOD,#01H

MOV TH0,#HIGH(-2000)

MOV TL0,#LOW(-2000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

RET

END

2. 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)

Page 8: Bao Cao TNVXL Nhom3 Senie

MOV TL0,#LOW(-5000)

SETB TR0

JNB TF0,$

CLR TF0

CLR TR0

RET

END

Page 9: Bao Cao TNVXL Nhom3 Senie

BÀ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 ORG 2000H

MAIN:

MOV DPTR,#8000H

ACALL CLEAR

ACALL INIT_LCD

ACALL HIEN_CHU

ACALL DELAY1

SJMP MAIN

;=============================================Chương trình con LCD

INIT_LCD:

MOV A,#38H

ACALL WRITECOM

MOV A,#0EH

ACALL WRITECOM

MOV A,#06H

ACALL WRITECOM

RET

CLEAR:

MOV A,#01H

ACALL WRITECOM

RET

WRITECOM:

SETB P3.4

CLR P3.5

MOVX @DPTR,A

CLR P3.4

ACALL DELAY_50MS

RET

WRITETEXT:

SETB P3.4

SETB P3.5

MOVX @DPTR,A

CLR P3.4

ACALL DELAY2

RET

HIEN_CHU:

MOV A,#'D'

ACALL WRITETEXT

MOV A,#'H'

ACALL WRITETEXT

MOV A,#'E'

ACALL WRITETEXT

MOV A,#'L'

ACALL WRITETEXT

MOV A,#' 'O’

ACALL WRITETEXT

MOV A,#'’W'

ACALL WRITETEXT

MOV A,#'’O'

ACALL WRITETEXT

MOV A,#'’R'

ACALL WRITETEXT

MOV A,#'’L'

ACALL WRITETEXT

MOV A,#'’D'

ACALL WRITETEXT

Page 10: Bao Cao TNVXL Nhom3 Senie

RET

; ===============================================Chương trình DELAY

DELAY_50MS:

MOV R3,#100

LOOP1:

MOV R7,#250

DJNZ R7,$

DJNZ R3,LOOP1

RET

DELAY1: ; delay 300ms

MOV R6,#3

LOP1:

MOV R5,#200

LOP:

MOV R4,#250

DJNZ R4,$

DJNZ R5,LOP

DJNZ R6,LOP1

RET

DELAY2:

MOV R3,#1

LOOP2:

MOV R7,#50

DJNZ R7,$

DJNZ R3,LOOP2

RET

END

BÀI TẬP:

Viết chương trình hiển thị chuỗi: “DHBK TPHCM” chạy trên màn hình, khi hết màn hình thì chạy ngược lại, lặp lại quá trình trên

ORG 2000H

MAIN:

MOV DPTR,#8000H

MOV R1,#6

ACALL CLEAR

ACALL INIT_LCD

ACALL HIEN_CHU

ACALL DELAY

LAP1:

MOV A,#1CH ; dịch phải

ACALL WRITECOM

ACALL DELAY

DJNZ R1,LAP1

MOV R1,#6

LAP:

MOV A,#18H ; dịch trái

ACALL WRITECOM

ACALL DELAY

DJNZ R1,LAP

MOV R1,#6

SJMP LAP1

;=============================================Chương trình con LCD

INIT_LCD:

MOV A,#38H

ACALL WRITECOM

MOV A,#0EH

ACALL WRITECOM

MOV A,#06H

Page 11: Bao Cao TNVXL Nhom3 Senie

ACALL WRITECOM

RET

CLEAR:

MOV A,#01H

ACALL WRITECOM

RET

WRITECOM:

SETB P3.4

CLR P3.5

MOVX @DPTR,A

CLR P3.4

ACALL DELAY_50MS

RET

WRITETEXT:

SETB P3.4

SETB P3.5

MOVX @DPTR,A

CLR P3.4

ACALL DELAY2

RET

HIEN_CHU:

MOV A,#'D'

ACALL WRITETEXT

MOV A,#'H'

ACALL WRITETEXT

MOV A,#'B'

ACALL WRITETEXT

MOV A,#'K'

ACALL WRITETEXT

MOV A,#' '

ACALL WRITETEXT

MOV A,#'T'

ACALL WRITETEXT

MOV A,#'P'

ACALL WRITETEXT

MOV A,#'H'

ACALL WRITETEXT

MOV A,#'C'

ACALL WRITETEXT

MOV A,#'M'

ACALL WRITETEXT

RET

; ===============================================Chương trình DELAY

DELAY_50MS:

MOV R3,#100

LOOP1:

MOV R7,#250

DJNZ R7,$

DJNZ R3,LOOP1

RET

DELAY:

MOV R6,#3

LOP1:

MOV R5,#200

LOP:

MOV R4,#250

DJNZ R4,$

DJNZ R5,LOP

DJNZ R6,LOP1

RET

DELAY2:

MOV R3,#1

LOOP2:

Page 12: Bao Cao TNVXL Nhom3 Senie

MOV R7,#50

DJNZ R7,$

DJNZ R3,LOOP2

RET

END

Page 13: Bao Cao TNVXL Nhom3 Senie

BÀ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

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: ;phát kí tự ra port nối tiếp

JNB TI, $

CLR TI

MOV SBUF, A

RET

TABLE:

DB 'Hello, world',0 ; phát tới khi gặp kí tự 0 thì dừng

END

2. 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

ACALL CLEAR

LOOP:

MOV R4,#16

LAP1:

ACALL IN_CHAR

ACALL WRITE_TEXT

DJNZ R4,LAP1

MOV R4,#16

MOV A,#0C0H ;để con trỏ xuống hàng

ACALL WRITE_COM

LAP2:

ACALL IN_CHAR

ACALL WRITE_TEXT

DJNZ R4,LAP2

ACALL CLEAR

SJMP LOOP

;============================================ Chương trình con port nối tiếp

UART_INIT:

MOV SCON,#52H

MOV TMOD,#20H

MOV TH1,#-3

SETB TR1

RET

OUT_CHAR:

JNB TI, $ ;khi phát hết TI=1

Page 14: Bao Cao TNVXL Nhom3 Senie

CLR TI

MOV SBUF, A

RET

IN_CHAR:

JNB RI, $

CLR RI

MOV A, SBUF

RET

;============================================== Chương trình con LCD

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

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: ; chương trình chính

MOV DPTR, #8000H

ACALL LCD_INIT

ACALL UART_INIT

ACALL CLEAR

LOOP:

MOV R4,#16 ; gán R4 = 16 để nhập chữ đđủ trên hàng 1 rồi

xuống hàng 2

LAP1:

ACALL IN_CHAR

ACALL WRITE_TEXT

Page 15: Bao Cao TNVXL Nhom3 Senie

ACALL OUT_CHAR

DJNZ R4,LAP1

MOV R4,#16

MOV A,#0C0H ; để con trỏ xuống hàng

ACALL WRITE_COM

LAP2:

ACALL IN_CHAR

ACALL WRITE_TEXT

ACALL OUT_CHAR

DJNZ R4,LAP2

ACALL CLEAR

SJMP LOOP

;========================================= Chương trình con port nối tiếp

UART_INIT: ; khởi đđộng port nối tiếp

MOV SCON,#52H

MOV TMOD,#20H

MOV TH1,#-3

SETB TR1

RET

OUT_CHAR: ; phát kí tự ra port nối tiếp

JNB TI, $ ;khi phát hết TI = 1

CLR TI

MOV SBUF, A

RET

IN_CHAR: ; thu kí tự từ port nối tiếp

JNB RI, $

CLR RI

MOV A, SBUF

RET

;============================================== Chương trình con LCD

LCD_INIT: ; khởi đđộng LCD

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: ; chương trình tạo delay chờ cho LCD

MOV R7, #100

DEL1:

MOV R6, #250

DJNZ R6, $

DJNZ R7, DEL1

RET

WRITE_TEXT: ; ghi kí tự ra LCD

ACALL WAIT_LCD

SETB RS

MOVX @DPTR, A

SETB EN

CLR EN

RET

Page 16: Bao Cao TNVXL Nhom3 Senie

WRITE_COM: ; ghi lệnh ra LCD

ACALL WAIT_LCD

CLR RS

MOVX @DPTR, A

SETB EN

CLR EN

RET

END

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

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 NHANKYTU

ACALL OUT_CHAR

DJNZ R4,LAP1

MOV R4,#16

MOV A,#0C0H ;để con trỏ xuống hàng

ACALL WRITE_COM

LAP2:

ACALL IN_CHAR

ACALL NHANKYTU

ACALL OUT_CHAR

DJNZ R4,LAP2

ACALL CLEAR

SJMP LOOP

;=======================================Chương trình con Port nối tiếp

UART_INIT:

MOV SCON,#52H

MOV TMOD,#20H

MOV TH1,#-3

SETB TR1

RET

OUT_CHAR:

JNB TI, $ ;khi phát hết TI = 1

CLR TI

MOV SBUF, A

RET

IN_CHAR:

JNB RI, $

CLR RI

MOV A, SBUF

RET

;========================================== Chương trình con LCD

LCD_INIT:

MOV A,#38H

ACALL WRITE_COM

Page 17: Bao Cao TNVXL Nhom3 Senie

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

;=========Chương trình con kiểm tra kí tự nhận được từ Port nối tiếp về xử lí theo

đề bài

NHANKYTU:

PUSH ACC

;................................... kiểm tra ESC VA ENTER

CJNE A,#13,SKIP1

MOV A,#0C0H ;để con trỏ xuống hàng

ACALL WRITE_COM

SJMP THOAT

SKIP1:

CJNE A,#27,TIEP

ACALL CLEAR

SJMP THOAT

;.................................. kiểm tra 0-9

TIEP:

CJNE A,#30H,$+3

JNC KTRA3

SJMP THOAT

KTRA3:

CJNE A,#3AH,$+3

JC XUAT_LED

;................................... kiểm tra A-Z

CJNE A,#41H,$+3

JNC KTRA1

SJMP THOAT

KTRA1:

CJNE A,#5BH,$+3

Page 18: Bao Cao TNVXL Nhom3 Senie

JC XUAT_LCD ; C=1 thì A < 5AH

;..................................... kiểm tra a-z

CJNE A,#61H,$+3

JNC KTRA2

SJMP THOAT

KTRA2:

CJNE A,#7BH,$+3

JC XUAT_LCD

XUAT_LED:

PUSH DPH

PUSH DPL

MOV DPTR,#0

ANL A,#0FH

ADD A,#0E0H

MOVX @DPTR,A

ACALL DELAY_2MS

POP DPL

POP DPH

SJMP THOAT

XUAT_LCD:

ACALL WRITE_TEXT

THOAT:

POP ACC

RET

;========================Chương trình con tạo trễ tạo sự lưu ảnh trên led 7 đoạn

DELAY_2MS:

MOV R1,#4

LAP9:

MOV R2,#250

DJNZ R2,$

DJNZ R1,LAP9

RET

END

Page 19: Bao Cao TNVXL Nhom3 Senie

BÀ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. ORG 2000H

MAIN:

MOV DPTR,#4000H ;địa chỉ khối ADC

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,#200

DJNZ R6,$

RET

DELAY_1MS:

MOV R6,#5

LOOP:

MOV R5,#100

DJNZ R5,$

DJNZ R6,LOOP

RET

END

2. 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

MAIN:

MOV DPTR,#4000H ;địa chỉ khối ADC

MOV A,#0

MOVX @DPTR,A

ACALL DELAY_100US

MOVX A,@DPTR

MOV B,#10

DIV AB

MOV R2,B

MOV B,#10

DIV AB

MOV DPTR,#8000H

ACALL CLEAR

ACALL INIT_LCD

ACALL HIEN_CHU

Page 20: Bao Cao TNVXL Nhom3 Senie

ACALL DELAY1

SJMP MAIN

;=============================================Chương trình con LCD

INIT_LCD:

MOV A,#38H

ACALL WRITECOM

MOV A,#0EH

ACALL WRITECOM

MOV A,#06H

ACALL WRITECOM

RET

CLEAR:

MOV A,#01H

ACALL WRITECOM

RET

WRITECOM:

SETB P3.4

CLR P3.5

MOVX @DPTR,A

CLR P3.4

ACALL DELAY_50MS

RET

WRITETEXT:

SETB P3.4

SETB P3.5

MOVX @DPTR,A

CLR P3.4

ACALL DELAY2

RET

HIEN_CHU:

ACALL WRITETEXT

MOV A,B

ACALL WRITETEXT

MOV A,R2

ACALL WRITETEXT

RET

; ===============================================Chương trình DELAY

DELAY_50MS:

MOV R3,#100

LOOP1:

MOV R7,#250

DJNZ R7,$

DJNZ R3,LOOP1

RET

DELAY1: ; delay 300ms

MOV R6,#3

LOP1:

MOV R5,#200

LOP:

MOV R4,#250

DJNZ R4,$

DJNZ R5,LOP

DJNZ R6,LOP1

RET

DELAY2:

MOV R3,#1

LOOP2:

MOV R7,#50

DJNZ R7,$

DJNZ R3,LOOP2

RET

DELAY_100US:

Page 21: Bao Cao TNVXL Nhom3 Senie

MOV R6,#200

DJNZ R6,$

RET

END

Page 22: Bao Cao TNVXL Nhom3 Senie

BÀ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.

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

2. 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

Page 23: Bao Cao TNVXL Nhom3 Senie

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

Page 24: Bao Cao TNVXL Nhom3 Senie

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

Page 25: Bao Cao TNVXL Nhom3 Senie

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:

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

Page 26: Bao Cao TNVXL Nhom3 Senie

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

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

Page 27: Bao Cao TNVXL Nhom3 Senie

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