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

vi xử lý hệ thống điều khiển bộ đếm

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 (621.72 KB, 14 trang )


KHOA CÔNG NGHỆ ĐIỆN TỬ
BỘ MÔN ĐIỆN TỬ CÔNG NGHIỆP




T
T
À
À
I
I


L
L
I
I


U
U


H
H
Ư
Ư



N
N
G
G


D
D


N
N


T
T
H
H
Í
Í


N
N
G
G
H
H
I
I



M
M


-
-


T
T
H
H


C
C


H
H
À
À
N
N
H
H




















K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Giáo trình thực hành vi xử lý. 2 Biên soạn: Phạm Quang Trí

A. MỤC ĐÍCH:

• Thực hành lập trình ứng dụng trên máy tính, biên dịch chương trình, nạp vào vi điều khiển và sử dụng mô
hình thí nghiệm để kiểm chứng.
• Điều khiển thiết bị ngoại vi bằng các port của vi điều khiển.
• Tìm hiểu các chế độ hoạt động của Timer và Counter.
• Khảo sát nguyên lý hoạt động và phương pháp lập trình điều khiển Timer và Counter.
• Thiết kế các ứng dụng thực tế có sử dụng các bộ định thời gian (Timer) và các bộ đếm sự kiện (Counter).

B. YÊU CẦU:


• Nắm vững tập lệnh của vi điều khiển MCS-51.
• Nắm vững phương pháp vận hành các Timer và Counter có trong chip vi điều khiển.
• Biết cách lập trình Timer và Counter ở các chế độ khác nhau, cách tính toán các khoảng thời gian định thời
mong muốn.
• Thiết kế và điều khiển được các ứng dụng có sử dụng Timer và Counter như: đồng hồ, bộ đếm sản phẩm,




K. H THNG IU KHIN TIMER/COUNTER.
Bi 1: Chng trỡnh iu khin m liờn tc s lng xung (0000 9999) c a vo chõn T1 ca vi iu
khin v hin th s lng xung ny lờn cỏc LED 7 on (PULSE c ni vi chõn T1, LED7 LED4
c ni vi Port0, SEL IN1 c ni vi Port1).
Giỏo trỡnh thc hnh vi x lý. 3 Biờn son: Phm Quang Trớ
1 Trỡnh t tin hnh thớ nghim:
1.1 Kt ni thit b thớ nghim.
Tt ngun cp cho mụ hỡnh thớ nghim.
Dựng dõy bus 4 ni J64 (PORT1) khi vi iu khin vi J1 (SEL IN1) khi LED 7 on (chỳ ý l ta
ch ni 4 bit thp ca J64 vi J1).
Dựng dõy bus 8 ni J63 (PORT0 / DATA) khi vi iu khin vi J4 (7SEG IN MUL) khi gii mó.
Dựng dõy bus 1 ni J33 (PULSE) khi to xung vi J66 (PORT3 / FUNCTION) khi vi iu khin
(chỳ ý l ta ch ni bit 5 (chõn T1) ca J66 v J33 li vi nhau).
Dựng dõy bus 3 ni J113 (POWER) khi to xung v J110 (POWER) khi LED 7 on vi ngun
+5V khi ngun.
LED 7 ẹOAẽN
7SEG7 IN
SEL IN2POWER SEL IN1
7SEG6 IN 7SEG5 IN 7SEG4 IN
7SEG7 IN

MUL
SEL LED IN
VI ẹIEU KHIEN
PORT 0
A0 A7
PORT 1PORT 3PORT 2
SELECT
CHIP
CLOCK
OUT
PORT 1PORT 3
40 PINS
20 PINS
POWER
SW
8
4
NGUON
+5V
3
TAẽO XUNG
POWER
PULSE
3
1

1.2 S nguyờn lý ca h thng:
AD7
AD0
AD0

AD1
AD2
AD3
AD4
AD5
AD6
AD7
AD6
AD5
AD4
AD3
AD2
AD1
A
B
C
D
E
F
G
A
B
C
D
E
F
G
AD0 A
AD1 B
AD2 C

AD3 D
AD4 E
AD5 F
AD6 G
A
B
C
D
E
F
G
A
B
C
D
E
F
G
P1.3
P1.0
P1.1
P1.2
P1.3
P1.2
P1.1
P1.0
XTAL2
18
XTAL1
19

ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3

P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21

P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
C1
33p
C2
33p
X1
12MHz
2
3
4
5
6
7
8
9
1
RP1

10K
+5V
MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹEM XUNG)
MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹEM XUNG)MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹEM XUNG)
MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹEM XUNG)
LED7
Q1
A1015
+5V
LED6
Q2
A1015
+5V
R2
1K
R3
1K
R4
56
R5
56
R6
56
R7
56
R8
56
R9
56
R10

56
LED5
Q3
A1015
+5V
LED4
Q4
A1015
+5V
R11
1K
R12
1K
C3
10uF
R1
10k
+5V
A
B
U1(P3.5/T1)

K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 1: Chương trình điều khiển đếm liên tục số lượng xung (0000 – 9999) được đưa vào chân T1 của vi điều
khiển và hiển thị số lượng xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 – LED4
được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 4 Biên soạn: Phạm Quang Trí
1.3 Vẽ lưu đồ giải thuật và viết chương trình điều khiển.
BCD4TO7SEG
(XEM CTC NÀY TẠI VÍ DỤ B6 M7I)

DISP7SEGMUL4
(XEM CTC NÀY TẠI VÍ DỤ B6 MBI)
DELAYLED
(XEM CTC NÀY TẠI VÍ DỤ B3.1 MBI)
VÙNG DỮ LIỆU CODE7SEG
C0H,F9H,A4H,B0H,99H,92H,82H,F8H,80H,90H
KHỞI ĐỘNG TIMER
(COUNTER 1, MODE 1)
(TMOD) = 50H
XÓA COUNTER 1
(TH1/TL1) = 0000H
CHO COUNTER HOẠT ĐỘNG
(TR1) = 1
MAIN:
K1
BEGIN
MP1:
ĐỌC SỐ XUNG ĐẾM ĐƯỢC
(R7) = TH1
(R6) = TL1
GỌI CTC CHUYỂN ĐỔI SỐ BIN SANG SỐ BCD
BIN16TOBCD
GỌI CTC CHUYỂN ĐỔI SỐ BCD SANG MÃ 7 ĐOẠN
BCD4TO7SEG
GỌI CTC QUÉT - HIỂN THỊ
DISP7SEGMUL4
BIN16TOBCD
(XEM CTC NÀY TẠI PHẦN HƯỚNG
DẪN CỦA VÍ DỤ K3)
DIV16TO8

(XEM CTC NÀY TẠI PHẦN HƯỚNG
DẪN CỦA VÍ DỤ K3)

;***************************************************
;CHUONG TRINH DIEU KHIEN TIMER/COUNTER DEM (0000 - 9999) VA HIEN THI XUNG TAI CHAN T1
;***************************************************
;KET NOI: PORT0 -> 7 SEGMENT (DP -> A)
; PORT1 -> SELECT LED
; PULSE -> T1 PIN
;***************************************************
ORG 00H
MAIN:
MOV TMOD,#50H ;COUNTER 16 BIT (MODE 1)
MOV TH1,#0 ;XOA COUNTER 1
MOV TL1,#0
SETB TR1 ;CHO PHEP COUNTER BAT DAU HOAT DONG
MP1:
MOV R7,TH1 ;CHUYEN SO XUNG DEM DUOC (TH1, TL1) RA HIEN THI
MOV R6,TL1
ACALL BIN16TOBCD ;DOI MA BIN SANG MA BCD
ACALL BCD4TO7SEG ;DOI MA BCD SANG MA 7 DOAN
ACALL DISP7SEGMUL4 ;HIEN THI GIA TRI LEN LED
SJMP MP1
;***************************************************
BIN16TOBCD: ;CTC CHUYEN DOI SO BINARY 16 BIT (<= 9999) SANG SO BCD.
PUSH ACC
PUSH B
MOV B,#10
ACALL DIV16TO8 ;LAY R7,R6 CHIA CHO 10
PUSH B ;CAT SO HANG DON VI

MOV B,#10
ACALL DIV16TO8 ;TIEP TUC CHIA CHO 10
PUSH B ;CAT SO HANG CHUC
MOV B,#10
MOV A,R6
DIV AB ;TIEP TUC CHIA CHO 10
PUSH B ;CAT SO HANG TRAM, ACC CHUA SO HANG NGAN
SWAP A ;DUA SO HANG NGAN LEN 4 BIT CAO
POP B ;LAY SO HANG TRAM TU STACK
ORL A,B ;KET HOP SO HANG NGAN VA SO HANG TRAM
MOV R7,A ;R7 = NGAN - TRAM
POP ACC ;LAY SO HANG CHUC TU STACK
SWAP A ;DUA SO HANG CHUC LEN 4 BIT CAO
POP B ;LAY SO HANG DON VI TU STACK
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 1: Chương trình điều khiển đếm liên tục số lượng xung (0000 – 9999) được đưa vào chân T1 của vi điều
khiển và hiển thị số lượng xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 – LED4
được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 5 Biên soạn: Phạm Quang Trí
ORL A,B ;KET HOP SO HANG CHUC VA SO HANG DON VI
MOV R6,A ;R6 = CHUC - DON VI
POP B
POP ACC
RET
;***************************************************
DIV16TO8: ;CTC CHIA SO BINARY 16 BIT CHO SO BINARY 8 BIT.
PUSH 02H ;CAT THANH GHI R2
PUSH ACC ;CAT THANH GHI A
MOV R2,#16 ;CHO PHEP DICH 16 LAN
CLR A

DIVIDE:
CLR C
XCH A,R6 ;DICH BIT 7 CUA R6 VAO
RLC A ;CARRY, BIT 0 CUA R6
XCH A,R6 ;BANG 0.
XCH A,R7 ;DICH BIT CARRY VAO
RLC A ;BIT 0 CUA R7
XCH A,R7
RLC A ;DICH BIT 7 CUA R7 VAO A.
CJNE A,B,NOT_EQUAL ;XEM SO BIT DA DICH >=
SJMP A_GREATER_EQ_B ;SO CHIA CHUA ?
NOT_EQUAL:
JC BELOW ;N: THUONG SO = 0 TRONG R6.
A_GREATER_EQ_B:
SUBB A,B ;Y: SO DU CAT TRONG A.
XCH A,R6
ORL A,#1 ;THUONG SO = 1
XCH A,R6 ;CAT TRONG R6
BELOW:
DJNZ R2,DIVIDE ;DICH TIEP DEN 16 LAN.
XCH A,B ;SAU 16 LAN DICH TA DUOC B = SO DU.
POP ACC
POP 02H
RET
;***************************************************
BCD4TO7SEG: ;CTC GIAI MA TU SO BCD NEN SANG MA 7 DOAN (2 SO BCD NEN).
PUSH DPH ;CAT TAM THOI GIA TRI CAC THANH GHI
PUSH DPL
PUSH ACC
MOV DPTR,#CODE7SEG ;DIA CHI VUNG MA 7 DOAN

MOV A,R6 ;LAY SO BCD CAN GIAI MA
ANL A,#0FH ;XOA 4 BIT CAO
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 60H,A ;CAT BCD HANG DON VI VAO O NHO
MOV A,R6 ;LAY SO BCD CAN GIAI MA
ANL A,#0F0H ;XOA 4 BIT THAP
SWAP A ;HOAN CHUYEN CAO - THAP
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 61H,A ;CAT BCD HANG CHUC VAO O NHO
MOV A,R7 ;LAY SO BCD CAN GIAI MA
ANL A,#0FH ;XOA 4 BIT CAO
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 62H,A ;CAT BCD HANG TRAM VAO O NHO
MOV A,R7 ;LAY SO BCD CAN GIAI MA
ANL A,#0F0H ;XOA 4 BIT THAP
SWAP A ;HOAN CHUYEN CAO - THAP
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 63H,A ;CAT BCD HANG NGAN VAO O NHO
POP ACC ;PHUC HOI GIA TRI CHO CAC THANH GHI
POP DPL
POP DPH
RET
CODE7SEG:
;VUNG CHUA MA 7 DOAN (0 -> 9)
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;***************************************************
DISP7SEGMUL4: ;CTC QUET HIEN THI LED 7 DOAN (4 LED 7 DOAN).
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 1: Chương trình điều khiển đếm liên tục số lượng xung (0000 – 9999) được đưa vào chân T1 của vi điều
khiển và hiển thị số lượng xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 – LED4

được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 6 Biên soạn: Phạm Quang Trí
PUSH ACC ;CAT TAM THOI GIA TRI CAC THANH GHI
PUSH 00H
MOV A,#0F7H ;MA QUET
MOV R0,#63H ;DIA CHI VUNG MA HIEN THI
DISP:
MOV P0,@R0 ;XUAT MA HIEN THI
MOV P1,A ;XUAT MA QUET
LCALL DELAYLED
MOV P1,#0FFH ;CHONG LEM
DEC R0 ;LAY MA HIEN THI KE TIEP
RR A ;CHUYEN SANG LED KE TIEP
CJNE R0,#5FH,DISP ;KIEM TRA DA QUET XONG CHUA
POP 00H ;PHUC HOI GIA TRI CHO CAC THANH GHI
POP ACC
RET
;***************************************************
DELAYLED: ;CHUONG TRINH CON TAO THOI GIAN TRE 2.5MS
PUSH 00H
PUSH 01H
MOV R1,#5
DEL:
MOV R0,#250
DJNZ R0,$
DJNZ R1,DEL
POP 01H
POP 00H
RET
END

1.4 Lưu chương trình và biên dịch chương trình.
1.5 Kiểm tra lỗi và hiệu chỉnh lỗi nếu có.
1.6 Gắn chip vi điều khiển thí nghiệm vào socket tương ứng trên khối nạp chip và bật nguồn cho khối nạp chip
hoạt động.
1.7 Nạp chương trình vào vi điều khiển.
1.8 Sử dụng vi điều khiển vừa nạp gắn vào socket tương ứng trên khối vi điều khiển.
1.9 Bật nguồn cho mô hình thí nghiệm. Quan sát kết quả hoạt động, nếu kết quả hoạt động không đúng yêu
cầu của đề bài thì phải quay lại kiểm tra việc kết nối mạch, hiệu chỉnh chương trình và làm lại các bước từ
bước 3 đến bước 9.
2 Bài tập:
(xem thêm trong phần hướng dẫn và phần bài tập của Bài 3)

K. H THNG IU KHIN TIMER/COUNTER.
Bi 2: Chng trỡnh iu khin o tn s ca xung (0000 9999, n v l Hz) c a vo chõn T1 ca vi
iu khin v hin th tn s ca xung ny lờn cỏc LED 7 on (PULSE c ni vi chõn T1, LED7
LED4 c ni vi Port0, SEL IN1 c ni vi Port1).
Giỏo trỡnh thc hnh vi x lý. 7 Biờn son: Phm Quang Trớ
1 Trỡnh t tin hnh thớ nghim:
1.1 Kt ni thit b thớ nghim.
Quỏ trỡnh kt ni thit b thớ nghim tng t nh Bi 1.
1.2 S nguyờn lý ca h thng:
AD7
AD0
AD0
AD1
AD2
AD3
AD4
AD5
AD6

AD7
AD6
AD5
AD4
AD3
AD2
AD1
A
B
C
D
E
F
G
A
B
C
D
E
F
G
AD0 A
AD1 B
AD2 C
AD3 D
AD4 E
AD5 F
AD6 G
A
B

C
D
E
F
G
A
B
C
D
E
F
G
P1.3
P1.0
P1.1
P1.2
P1.3
P1.2
P1.1
P1.0
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29

RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3
36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6

P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0
12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24

P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
C1
33p
C2
33p
X1
12MHz
2
3
4
5
6
7
8
9
1
RP1
10K
+5V
MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹO TAN SO XUNG)
MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹO TAN SO XUNG)MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹO TAN SO XUNG)
MAẽCH ẹIEU KHIEN TIMER/COUNTER (ẹO TAN SO XUNG)
LED7

Q1
A1015
+5V
LED6
Q2
A1015
+5V
R2
1K
R3
1K
R4
56
R5
56
R6
56
R7
56
R8
56
R9
56
R10
56
LED5
Q3
A1015
+5V
LED4

Q4
A1015
+5V
R11
1K
R12
1K
C3
10uF
R1
10k
+5V
A
B
U1(P3.5/T1)

1.3 V lu gii thut v vit chng trỡnh iu khin.
;***************************************************
;CHUONG TRINH DIEU KHIEN TIMER/COUNTER DO TAN SO XUNG TAI CHAN T1
;***************************************************
;KET NOI: PORT0 -> 7 SEGMENT (DP -> A) PORT1 -> SELECT LED; PULSE -> T1 PIN
;***************************************************
ORG 00H ;DIEM NHAP RESET
SJMP MAIN
ORG 0BH ;DIEM NHAP ISR TIMER0
LJMP T0ISR
ORG 30H ;DIEM NHAP CHUONG TRINH CHINH
MAIN:
MOV TMOD,#51H ;TIMER1: COUNTER 16 BIT (MODE 1), TIMER0: TIMER 16 BIT (MODE 1)
MOV TH0,#HIGH(-50000) ;NAP GIA TRI THOI GIAN TRE 50 MS

MOV TL0,#LOW(-50000)
SETB TR0 ;CHO TIMER BAT DAU CHAY
MOV IE,#82H ;CHO PHEP NGAT TIMER0 HOAT DONG
MP1:
MOV 40H,#0 ;NAP GIA TRI BIEN DEM SO LAN NGAT TIMER0
MOV R7,TH1 ;CHUYEN SO XUNG DEM DUOC (TH1, TL1) RA HIEN THI
MOV R6,TL1
MOV TH1,#0 ;XOA COUNTER 1, CHUAN BI CHO LAN DEM XUNG TIEP THEO
MOV TL1,#0
SETB TR1 ;COUNTER BAT DAU DEM
ACALL BIN16TOBCD ;DOI MA BIN SANG MA BCD
ACALL BCD4TO7SEG ;DOI MA BCD SANG MA 7 DOAN
MP2:
ACALL DISP7SEGMUL4 ;HIEN THI GIA TRI LEN LED
MOV A,40H
CJNE A,#20,MP2 ;KIEM TRA DU 20 LAN NGAT = 1S
CLR TR1 ;DUNG COUNTER SAU 1S -> SO XUNG TRONG 1S = TAN SO XUNG
SJMP MP1
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 2: Chương trình điều khiển đo tần số của xung (0000 – 9999, đơn vị là Hz) được đưa vào chân T1 của vi
điều khiển và hiển thị tần số của xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 –
LED4 được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 8 Biên soạn: Phạm Quang Trí
;***************************************************
BIN16TOBCD: ;CTC CHUYEN DOI SO BINARY 16 BIT (<= 9999) SANG SO BCD.
PUSH ACC
PUSH B
MOV B,#10
ACALL DIV16TO8 ;LAY R7,R6 CHIA CHO 10
PUSH B ;CAT SO HANG DON VI

MOV B,#10
ACALL DIV16TO8 ;TIEP TUC CHIA CHO 10
PUSH B ;CAT SO HANG CHUC
MOV B,#10
MOV A,R6
DIV AB ;TIEP TUC CHIA CHO 10
PUSH B ;CAT SO HANG TRAM, ACC CHUA SO HANG NGAN
SWAP A ;DUA SO HANG NGAN LEN 4 BIT CAO
POP B ;LAY SO HANG TRAM TU STACK
ORL A,B ;KET HOP SO HANG NGAN VA SO HANG TRAM
MOV R7,A ;R7 = NGAN - TRAM
POP ACC ;LAY SO HANG CHUC TU STACK
SWAP A ;DUA SO HANG CHUC LEN 4 BIT CAO
POP B ;LAY SO HANG DON VI TU STACK
ORL A,B ;KET HOP SO HANG CHUC VA SO HANG DON VI
MOV R6,A ;R6 = CHUC - DON VI
POP B
POP ACC
RET
;***************************************************
DIV16TO8: ;CTC CHIA SO BINARY 16 BIT CHO SO BINARY 8 BIT.
PUSH 02H ;CAT THANH GHI R2
PUSH ACC ;CAT THANH GHI A
MOV R2,#16 ;CHO PHEP DICH 16 LAN
CLR A
DIVIDE:
CLR C
XCH A,R6 ;DICH BIT 7 CUA R6 VAO
RLC A ;CARRY, BIT 0 CUA R6
XCH A,R6 ;BANG 0.

XCH A,R7 ;DICH BIT CARRY VAO
RLC A ;BIT 0 CUA R7
XCH A,R7
RLC A ;DICH BIT 7 CUA R7 VAO A.
CJNE A,B,NOT_EQUAL ;XEM SO BIT DA DICH >=
SJMP A_GREATER_EQ_B ;SO CHIA CHUA ?
NOT_EQUAL:
JC BELOW ;N: THUONG SO = 0 TRONG R6.
A_GREATER_EQ_B:
SUBB A,B ;Y: SO DU CAT TRONG A.
XCH A,R6
ORL A,#1 ;THUONG SO = 1
XCH A,R6 ;CAT TRONG R6
BELOW:
DJNZ R2,DIVIDE ;DICH TIEP DEN 16 LAN.
XCH A,B ;SAU 16 LAN DICH TA DUOC B = SO DU.
POP ACC
POP 02H
RET
;***************************************************
BCD4TO7SEG: ;CTC GIAI MA TU SO BCD NEN SANG MA 7 DOAN (2 SO BCD NEN).
PUSH DPH ;CAT TAM THOI GIA TRI CAC THANH GHI
PUSH DPL
PUSH ACC

MOV DPTR,#CODE7SEG ;DIA CHI VUNG MA 7 DOAN

MOV A,R6 ;LAY SO BCD CAN GIAI MA
ANL A,#0FH ;XOA 4 BIT CAO
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG

K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 2: Chương trình điều khiển đo tần số của xung (0000 – 9999, đơn vị là Hz) được đưa vào chân T1 của vi
điều khiển và hiển thị tần số của xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 –
LED4 được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 9 Biên soạn: Phạm Quang Trí
MOV 60H,A ;CAT BCD HANG DON VI VAO O NHO

MOV A,R6 ;LAY SO BCD CAN GIAI MA
ANL A,#0F0H ;XOA 4 BIT THAP
SWAP A ;HOAN CHUYEN CAO - THAP
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 61H,A ;CAT BCD HANG CHUC VAO O NHO

MOV A,R7 ;LAY SO BCD CAN GIAI MA
ANL A,#0FH ;XOA 4 BIT CAO
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 62H,A ;CAT BCD HANG TRAM VAO O NHO

MOV A,R7 ;LAY SO BCD CAN GIAI MA
ANL A,#0F0H ;XOA 4 BIT THAP
SWAP A ;HOAN CHUYEN CAO - THAP
MOVC A,@A+DPTR ;LAY MA 7 DOAN TUONG UNG
MOV 63H,A ;CAT BCD HANG NGAN VAO O NHO

POP ACC ;PHUC HOI GIA TRI CHO CAC THANH GHI
POP DPL
POP DPH
RET
CODE7SEG: ;VUNG CHUA MA 7 DOAN (0 -> 9)
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

;***************************************************
DISP7SEGMUL4: ;CTC QUET HIEN THI LED 7 DOAN (4 LED 7 DOAN).
PUSH ACC ;CAT TAM THOI GIA TRI CAC THANH GHI
PUSH 00H
MOV A,#0F7H ;MA QUET
MOV R0,#63H ;DIA CHI VUNG MA HIEN THI
DISP:
MOV P0,@R0 ;XUAT MA HIEN THI
MOV P1,A ;XUAT MA QUET
LCALL DELAYLED
MOV P1,#0FFH ;CHONG LEM
DEC R0 ;LAY MA HIEN THI KE TIEP
RR A ;CHUYEN SANG LED KE TIEP
CJNE R0,#5FH,DISP ;KIEM TRA DA QUET XONG CHUA
POP 00H ;PHUC HOI GIA TRI CHO CAC THANH GHI
POP ACC
RET
;***************************************************
DELAYLED: ;CHUONG TRINH CON TAO THOI GIAN TRE 2.5MS
PUSH 00H
PUSH 01H
MOV R1,#5
DEL:
MOV R0,#250
DJNZ R0,$
DJNZ R1,DEL
POP 01H
POP 00H
RET
;***************************************************

T0ISR: ;ISR TIMER0 - 50MS
CLR TR0
CLR TF0
MOV TH0,#HIGH(-50000) ;NAP GIA TRI THOI GIAN TRE 50 MS
MOV TL0,#LOW(-50000)
INC 40H ;TANG BIEN DEM SO LAN NGAT - 1 LAN = 50MS
SETB TR0
RETI
END
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 2: Chương trình điều khiển đo tần số của xung (0000 – 9999, đơn vị là Hz) được đưa vào chân T1 của vi
điều khiển và hiển thị tần số của xung này lên các LED 7 đoạn (PULSE được nối với chân T1, LED7 –
LED4 được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 10 Biên soạn: Phạm Quang Trí

1.4 Thực hiện lần lượt các bước từ 1.3 đến 1.8 tương tự như bài trên.
2 Bài tập:
(xem thêm trong phần hướng dẫn và phần bài tập của Bài 3)
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 3: Chương trình điều khiển đo độ rộng của xung (đơn vị là ms) được đưa vào chân INT0 của vi điều khiển
và hiển thị độ rộng của xung này lên các LED 7 đoạn (PULSE được nối với chân INT0, LED7 – LED4
được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 11 Biên soạn: Phạm Quang Trí
1 Trình tự tiến hành thí nghiệm:
1.1 Kết nối thiết bị thí nghiệm.
• Tắt nguồn cấp cho mô hình thí nghiệm.
• Dùng dây bus 4 nối J64 (PORT1) ở khối vi điều khiển với J1 (SEL IN1) ở khối LED 7 đoạn (chú ý là ta
chỉ nối 4 bit thấp của J64 với J1).
• Dùng dây bus 8 nối J63 (PORT0 / DATA) ở khối vi điều khiển với J4 (7SEG IN MUL) ở khối giải mã.
• Dùng dây bus 1 nối J33 (PULSE) ở khối tạo xung với J66 (PORT3 / FUNCTION) ở khối vi điều khiển

(chú ý là ta chỉ nối vào bit 2 (chân INT0) của J66).
• Dùng dây bus 3 nối J113 (POWER) ở khối tạo xung và J110 (POWER) ở khối LED 7 đoạn với nguồn
+5V ở khối nguồn.
PORT 0PORT 1PORT 3PORT 2
PORT 1PORT 3
40 PINS
20 PINS
4
POWER
PULSE

1.2 Sơ đồ nguyên lý của hệ thống:
AD7
AD0
AD0
AD1
AD2
AD3
AD4
AD5
AD6
AD7
AD6
AD5
AD4
AD3
AD2
AD1
A
B

C
D
E
F
G
A
B
C
D
E
F
G
AD0 A
AD1 B
AD2 C
AD3 D
AD4 E
AD5 F
AD6 G
A
B
C
D
E
F
G
A
B
C
D

E
F
G
P1.3
P1.0
P1.1
P1.2
P1.3
P1.2
P1.1
P1.0
XTAL2
18
XTAL1
19
ALE
30
EA
31
PSEN
29
RST
9
P0.0/AD0
39
P0.1/AD1
38
P0.2/AD2
37
P0.3/AD3

36
P0.4/AD4
35
P0.5/AD5
34
P0.6/AD6
33
P0.7/AD7
32
P1.0
1
P1.1
2
P1.2
3
P1.3
4
P1.4
5
P1.5
6
P1.6
7
P1.7
8
P3.0/RXD
10
P3.1/TXD
11
P3.2/INT0

12
P3.3/INT1
13
P3.4/T0
14
P3.7/RD
17
P3.6/WR
16
P3.5/T1
15
P2.7/A15
28
P2.0/A8
21
P2.1/A9
22
P2.2/A10
23
P2.3/A11
24
P2.4/A12
25
P2.5/A13
26
P2.6/A14
27
U1
AT89C51
C1

33p
C2
33p
X1
12MHz
2
3
4
5
6
7
8
9
1
RP1
10K
+5V
MAÏCH ÑIEÀU KHIEÅN TIMER/COUNTER (ÑO ÑOÄ ROÄNG XUNG)
MAÏCH ÑIEÀU KHIEÅN TIMER/COUNTER (ÑO ÑOÄ ROÄNG XUNG)MAÏCH ÑIEÀU KHIEÅN TIMER/COUNTER (ÑO ÑOÄ ROÄNG XUNG)
MAÏCH ÑIEÀU KHIEÅN TIMER/COUNTER (ÑO ÑOÄ ROÄNG XUNG)
LED7
Q1
A1015
+5V
LED6
Q2
A1015
+5V
R2
1K

R3
1K
R4
56
R5
56
R6
56
R7
56
R8
56
R9
56
R10
56
LED5
Q3
A1015
+5V
LED4
Q4
A1015
+5V
R11
1K
R12
1K
C3
10uF

R1
10k
+5V
A
B
U1(P3.5/T1)

1.3 Vẽ lưu đồ giải thuật và viết chương trình điều khiển.

1.4 Thực hiện lần lượt các bước từ 1.3 đến 1.8 tương tự như bài trên.
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 3: Chương trình điều khiển đo độ rộng của xung (đơn vị là ms) được đưa vào chân INT0 của vi điều khiển
và hiển thị độ rộng của xung này lên các LED 7 đoạn (PULSE được nối với chân INT0, LED7 – LED4
được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 12 Biên soạn: Phạm Quang Trí
2 Bài tập:
• Bài 1: Hãy viết chương trình điều khiển tạo xung 1 Hz (sử dụng Timer) tại chân P1.0 và hiển thị mức logic
tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED.
• Bài 2: Hãy viết chương trình điều khiển tạo xung 3 Hz (sử dụng Timer) tại chân P1.0 và hiển thị mức logic
tại chân này lên LED. Tự lựa chọn phương pháp kết nối LED.
• Bài 3: Hãy viết chương trình điều khiển tạo xung 1 Hz hoặc 3 Hz (sử dụng Timer) tại chân P1.0 tùy thuộc
vào ta nhấn hay nhả nút nhấn KEY0 và hiển thị mức logic tại chân này lên LED. Tự lựa chọn phương pháp
kết nối LED và nút nhấn.
• Bài 4: Hãy viết chương trình điều khiển đếm liên tục số lượng xung được đưa vào chân T0 của vi điều
khiển và hiển thị số lượng xung này lên các LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo
xung và các LED 7 đoạn.
• Bài 5: Hãy viết chương trình điều khiển đo tần số của xung (đơn vị tính là Hz) được đưa vào chân T0 của
vi điều khiển và hiển thị giá trị tần số lên LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo xung
và các LED 7 đoạn.
• Bài 6: Hãy viết chương trình điều khiển đo độ rộng xung (đơn vị tính là ms) được đưa vào chân T0 của vi

điều khiển và hiển thị giá trị độ rộng xung lên LED 7 đoạn. Tự lựa chọn phương pháp kết nối thiết bị tạo
xung và các LED 7 đoạn.
• Bài 7: Thực hiện thay đổi tần số của thiết bị tạo xung (bằng cách điều chỉnh biến trở trên thiết bị) hoặc thay
đổi nguồn tạo xung khác vào. Thực hiện lại các bài tập trên và quan sát trên LED 7 đoạn để nhận xét sự
thay đổi của chương trình.
• Bài 8: Sinh viên tự mình suy nghĩ và phát triển thêm chương trình.
3 Hướng dẫn:
Chế độ Counter:
o Sử dụng Timer1 ở chế độ 1 counter.
o Khi cho Timer1 chạy, đọc liên tục các giá trị của TH1 và TL1.
o Đổi qua mã BCD nén và hiển thị lên LED 7 đoạn.
Chế độ đo tần số:
o Viết chương trình đếm số xung trong 1s và hiển thị lên LED 7 đoạn (trong khi đếm thì không hiển
thị số đếm mà vẫn hiển thị giá trị tần số trước đó).
Chế độ đo độ rộng xung (chế độ Gate = 1):
o Viết chương trình sử dụng Timer0 ở chế độ Gate = 1.
Đổi số nhị phân 16 bit thành mã BCD nén:
o Công việc thực hiện tương tự như đối với số nhị phân 8 bit là lần lượt chia giá trị cần chuyển đổi
cho 10. Tuy nhiên, cần phải tạo ra một chương trình con thực hiện việc chia số 16 bit cho 10 (vì giá trị cần đổi
lúc này là số 16 bit).
o Chương trình mẫu:
;***************************************************
;CTC CHUYEN DOI SO BINARY 16 BIT (<= 9999) SANG SO BCD.
;***************************************************
;NAME: BIN16TOBCD.
;INPUT: R7 = SO BIN 16 BIT (BYTE CAO).
; R6 = SO BIN 16 BIT (BYTE THAP).
;OUTPUT: R7,R6 = SO BCD (NGÀN-TRAM - CHUC - DON VI).
;***************************************************
BIN16TOBCD: ;CTC CHUYEN DOI SO BINARY 16 BIT (<= 9999) SANG SO BCD.

PUSH ACC
PUSH B
MOV B,#10
ACALL DIV16TO8 ;LAY R7,R6 CHIA CHO 10
PUSH B ;CAT SO HANG DON VI
MOV B,#10
ACALL DIV16TO8 ;TIEP TUC CHIA CHO 10
PUSH B ;CAT SO HANG CHUC
MOV B,#10
MOV A,R6
DIV AB ;TIEP TUC CHIA CHO 10
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 3: Chương trình điều khiển đo độ rộng của xung (đơn vị là ms) được đưa vào chân INT0 của vi điều khiển
và hiển thị độ rộng của xung này lên các LED 7 đoạn (PULSE được nối với chân INT0, LED7 – LED4
được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 13 Biên soạn: Phạm Quang Trí
PUSH B ;CAT SO HANG TRAM, ACC CHUA SO HANG NGAN
SWAP A ;DUA SO HANG NGAN LEN 4 BIT CAO
POP B ;LAY SO HANG TRAM TU STACK
ORL A,B ;KET HOP SO HANG NGAN VA SO HANG TRAM
MOV R7,A ;R7 = NGAN - TRAM
POP ACC ;LAY SO HANG CHUC TU STACK
SWAP A ;DUA SO HANG CHUC LEN 4 BIT CAO
POP B ;LAY SO HANG DON VI TU STACK
ORL A,B ;KET HOP SO HANG CHUC VA SO HANG DON VI
MOV R6,A ;R6 = CHUC - DON VI
POP B
POP ACC
RET
;***************************************************

;CTC THUC HIEN PHEP CHIA SO BINARY 16 BIT CHO SO BINARY 8 BIT.
;***************************************************
;NAME: DIV16TO8.
;INPUT: R7 = SO BIN 16 BIT (BYTE CAO) – SO BI CHIA.
; R6 = SO BIN 16 BIT (BYTE THAP) – SO BI CHIA.
; B = SO BIN 8 BIT – SO CHIA.
;OUTPUT: R7 = THUONG SO (BYTE CAO) CỦA PHÉP CHIA.
; R6 = THUONG SO (BYTE THAP) CỦA PHÉP CHIA.
; B = SO DU CUA PHEP CHIA.
;***************************************************
DIV16TO8: ;CTC CHIA SO BINARY 16 BIT CHO SO BINARY 8 BIT.
PUSH 02H ;CAT THANH GHI R2
PUSH ACC ;CAT THANH GHI A
MOV R2,#16 ;CHO PHEP DICH 16 LAN
CLR A
DIVIDE:
CLR C
XCH A,R6 ;DICH BIT 7 CUA R6 VAO
RLC A ;CARRY, BIT 0 CUA R6
XCH A,R6 ;BANG 0.
XCH A,R7 ;DICH BIT CARRY VAO
RLC A ;BIT 0 CUA R7
XCH A,R7
RLC A ;DICH BIT 7 CUA R7 VAO A.
CJNE A,B,NOT_EQUAL ;XEM SO BIT DA DICH >=
SJMP A_GREATER_EQ_B ;SO CHIA CHUA ?
NOT_EQUAL:
JC BELOW ;N: THUONG SO = 0 TRONG R6.
A_GREATER_EQ_B:
SUBB A,B ;Y: SO DU CAT TRONG A.

XCH A,R6
ORL A,#1 ;THUONG SO = 1
XCH A,R6 ;CAT TRONG R6
BELOW:
DJNZ R2,DIVIDE ;DICH TIEP DEN 16 LAN.
XCH A,B ;SAU 16 LAN DICH TA DUOC B = SO DU.
POP ACC
POP 02H
RET
;***************************************************
o Lưu đồ:
K. HỆ THỐNG ĐIỀU KHIỂN TIMER/COUNTER.
Bài 3: Chương trình điều khiển đo độ rộng của xung (đơn vị là ms) được đưa vào chân INT0 của vi điều khiển
và hiển thị độ rộng của xung này lên các LED 7 đoạn (PULSE được nối với chân INT0, LED7 – LED4
được nối với Port0, SEL IN1 được nối với Port1).
Giáo trình thực hành vi xử lý. 14 Biên soạn: Phạm Quang Trí
DIV16TO8
NAME: DIV16TO8.
INPUT: R7 = SỐ NHỊ PHÂN 16 BIT (BYTE CAO) - SỐ BỊ CHIA.
R6 = SỐ NHỊ PHÂN 16 BIT (BYTE THẤP) - SỐ BỊ CHIA.
B = SỐ NHỊ PHÂN 8 BIT - SỐ CHIA.
OUTPUT: R7 = THƯƠNG SỐ (BYTE CAO) CỦA PHÉP CHIA.
R6 = THƯƠNG SỐ (BYTE THẤP) CỦA PHÉP CHIA.
B = SỐ DƯ CỦA PHÉP CHIA.
MODE: PHÉP CHIA SỐ NHỊ PHÂN 16 BIT CHO SỐ NHỊ PHÂN 8
BIT (PHƯƠNG PHÁP DỊCH BIT VÀ TRỪ).
DIV16TO8:
CẤT TẠM GIÁ TRỊ CỦA ACC, R2
VÀO STACK
NẠP SỐ LẦN DỊCH BIT

(R2) = 16
XÓA THANH GHI A
(A) = 00H
DIVIDE:
XÓA CỜ CY (BIT TRUNG GIAN)
(CY) = 0
DỊCH TRÁI 16 BIT THANH GHI R7-R6
(CỜ CY ← MSB VÀ LSB ← 0)
XCH A,R6
RLC A
XCH A,R6
XCH A,R7
RLC A
XCH A,R7
DỊCH MSB VÀO THANH GHI A
RLC A
SO SÁNH ĐỂ
THỰC HIỆN TRỪ CỦA PHÉP CHIA
(A) ≥ (B)
(A) < (B)
(A)
(B)
(B)
LẤY PHẦN TRÍCH RA TỪ SỐ BỊ
CHIA (A) TRỪ CHO SỐ CHIA (B)
(A) = (A) – (B) - PHẦN DƯ
PHẦN THƯƠNG BẰNG 1
LSB ← 1
BELOW:
Đ

S
GIÃM SỐ LẦN DỊCH BIT
CHƯA DỊCH XONG
16 BIT
CHUYỂN SỐ DƯ VÀO THANH GHI B
(B) ↔ (A)
LẤY LẠI GIÁ TRỊ CHO ACC, R2
TỪ STACK
RET
THƯƠNG SỐ → R7-R6
SỐ DƯ → B
BIN16TOBCD
NAME: BIN16TOBCD.
INPUT: R7 = SỐ NHỊ PHÂN CẦN CHUYỂN ĐỔI (BYTE CAO).
R6 = SỐ NHỊ PHÂN CẦN CHUYỂN ĐỔI (BYTE THẤP)
OUTPUT: R7 = HÀNG NGÀN/TRĂM CỦA SỐ BCD.
R6 = HÀNG CHỤC/ĐƠN VỊ CỦA SỐ BCD.
MODE: CHUYỂN ĐỔI SỐ NHỊ PHÂN 16 BIT THÀNH SỐ BCD
CÓ GIÁ TRỊ TRONG KHOẢNG (0 – 9999).
BIN16TOBCD:
CẤT TẠM GIÁ TRỊ CỦA ACC, B
VÀO STACK
NẠP HẰNG SỐ CHO PHÉP CHIA
(B) = 10
GỌI CTC CHIA SỐ NHỊ PHÂN 16
BIT CHO SỐ NHỊ PHÂN 8 BIT
DIV16TO8
CẤT TẠM GIÁ TRỊ CỦA HÀNG ĐƠN VỊ
(B) VÀO STACK
NẠP HẰNG SỐ CHO PHÉP CHIA

(B) = 10
GỌI CTC CHIA SỐ NHỊ PHÂN 16
BIT CHO SỐ NHỊ PHÂN 8 BIT
DIV16TO8
CẤT TẠM GIÁ TRỊ CỦA HÀNG CHỤC
(B) VÀO STACK
NẠP HẰNG SỐ CHO PHÉP CHIA
(B) = 10
NẠP SỐ NHỊ PHÂN CẦN CHUYỂN ĐỔI
(A) = (R6)
TÁCH HÀNG NGÀN VÀ HÀNG TRĂM
DIV AB → (A) : 10
(A) = HÀNG NGÀN
(B) = HÀNG TRĂM
CẤT TẠM GIÁ TRỊ CỦA HÀNG TRĂM
(B) VÀO STACK
ĐỔI VỊ TRÍ GIÁ TRỊ CỦA HÀNG NGÀN TRONG BYTE
SWAP A
(A) = 0XH / X: GIÁ TRỊ CỦA HÀNG NGÀN
ĐỔI VỊ TRÍ THÀNH
(A) = X0H / X: GIÁ TRỊ CỦA HÀNG NGÀN
LẤY LẠI GIÁ TRỊ CỦA HÀNG
TRĂM (B) TỪ STACK
KẾT HỢP GIÁ TRỊ CỦA HÀNG NGÀN VÀ
HÀNG TRĂM VÀO TRONG BYTE
(A) = (A) OR (B)
(A) = X0H / X: GIÁ TRỊ CỦA HÀNG NGÀN
(B) = 0YH / Y: GIÁ TRỊ CỦA HÀNG TRĂM
KẾT HỢP THÀNH
(A) = XYH

LƯU GIÁ TRỊ HÀNG NGÀN/TRĂM CỦA SỐ BCD
(R7) = (A)
LẤY LẠI GIÁ TRỊ CỦA HÀNG
CHỤC (A) TỪ STACK
ĐỔI VỊ TRÍ GIÁ TRỊ CỦA HÀNG CHỤC TRONG BYTE
SWAP A
(A) = 0XH / X: GIÁ TRỊ CỦA HÀNG CHỤC
ĐỔI VỊ TRÍ THÀNH
(A) = X0H / X: GIÁ TRỊ CỦA HÀNG CHỤC
LẤY LẠI GIÁ TRỊ CỦA HÀNG
ĐƠN VỊ (B) TỪ STACK
KẾT HỢP GIÁ TRỊ CỦA HÀNG CHỤC VÀ
HÀNG ĐƠN VỊ VÀO TRONG BYTE
(A) = (A) OR (B)
(A) = X0H / X: GIÁ TRỊ CỦA HÀNG CHỤC
(B) = 0YH / Y: GIÁ TRỊ CỦA HÀNG ĐƠN VỊ
KẾT HỢP THÀNH
(A) = XYH
LƯU GIÁ TRỊ HÀNG CHỤC/ĐƠN VỊ CỦA SỐ BCD
(R6) = (A)
LẤY LẠI GIÁ TRỊ CHO ACC, B
TỪ STACK
RET

×