You are on page 1of 95

MỞ ĐẦU

Ngµy nµy tù ®éng ho¸ ra ®êi vµ ph¸t triÓn liªn tôc kh«ng
ngõng lµ do c¸c níc trªn thÕ giíi ngµy cµng ph¸t triÓn m¹nh nÒn
c«ng nghiÖp hiÖn ®¹i vµ chóng ta ®· thÊy râ tù ®éng ho¸
kh«ng chØ gi¶m nhÑ hoÆc gi¶i phãng søc lao ®éng cho con
ngêi mµ cßn lµm t¨ng ®¸ng kÓ n¨ng suÊt lao ®éng. Nói riêng về
“Vi điều khiển” thì chúng ta cũng thấy nhiều sản phẩm điện tử được dùng trong
công nghiệp và gia dụng như các bộ điều khiển từ xa, máy in hóa đơn điện thoại,
bộ điều chỉnh công suất tự động, máy giặt tự động hay bán tự động, lò vi sóng,
xe ô tô, động cơ, các thiết bị đo và hiển thị và các sản phẩm tương tự khác. Việc
sử dụng vi điều khiển không chỉ giảm chi phí cho quá trình tự động hóa mà còn
làm cho quá trình trở nên linh hoạt hơn và linh kiÖn nµy cã thÓ lËp
tr×nh ®îc ®Ó lµm cho hÖ thèng trë nªn th«ng minh.
Đo và điều khiển nhiệt độ là một trong những ứng dụng thường gặp nhất
của vi điều khiển. Vì đây là phương pháp đo lường điện tử nên cần có một
cảm biến để chuyển đổi nhiệt độ thành tín hiệu điện. Có nhiều loại cảm biến
nhiệt độ khác nhau, nhưng thường gặp nhất là bốn loại : cặp nhiệt điện làm
bằng kim loại, điện trở nhiệt làm bằng kim loại, điện trở nhiệt làm bằng vật
liệu ôxyt, và cuối cùng là các cảm biến nhiệt dưới dạng vi mạch. Mỗi loại
cảm biến đều có những ưu nhược điểm riêng nên được sử dụng cho đúng mục
đích ta cần hiểu rõ các đặc điểm của từng loại cảm biến, từ đó mới xây dựng
được các mạch điện thích hợp để có được những kết quả đo lường, giám sát
và điều khiển tin cậy.
Những đặc tính cơ bản của các loại cảm biến khác nhau có thể kể ra là :

1
● Cặp nhiệt điện: đôi khi gọi tắt là cặp nhiệt, có giá thành không đắt và là
loại cảm biến nhiệt được sử dụng rộng rãi nhất trong một dải nhiệt độ rộng.
Cặp nhiệt điện hoạt động dựa trên nguyên tắc là khi hai kim loại khác nhau
được nối với nhau, sẽ xuất hiện một điện áp ở hai phía điểm tiếp xúc giữa hai
kim loại. Hiện tượng này đã được Thomas Sieback nghiên cứu vào năm 1821.
Bằng cách đo điện áp này ta có thể đọc được nhiệt độ tương ứng. Khi nối các
kim loại khác nhau sẽ tạo ra điện áp cặp nhiệt điện khác nhau và vì vậy có
nhiều loại nhiệt điện dùng cho các ứng dụng khác nhau. Cặp nhiệt điện tạo ra
điện áp rất nhỏ, thường là 50 μV/ ºC. Vì tín hiệu rất yếu nên có một mạch
chuẩn dạng tín hiệu được thiết kế đặc biệt để loại đi các tín hiệu nhiễu. Cặp
nhiệt điện có mối quan hệ phi tuyến giữa điện áp và nhiệt độ đo được và vì
vậy phải tuyến tính hóa các đường đặc trưng hoặc là dùng phương pháp tra
bảng để nhận được đúng nhiệt độ từ điện áp đã đo.
● Điện trở nhiệt làm từ kim loại : Loại thường gặp nhất là từ platin và có
điện trở bằng 100 Ω ở 0ºC. Do các điện trở nhiệt là một loại điện trở nên khi
có dòng điện chạy qua sẽ gây nên sự sụt áp và giá trị của điện áp này có thể
đo được. Sự thay đổi của điện trở theo nhiệt độ là rất nhỏ (chỉ khoảng 0,4
Ω/ºC) vì vậy cần những mạch đặc biệt để phát hiện và đo sự thay đổi này theo
nhiệt độ. Một nhược điểm của các điện trở nhiệt làm bằng kim loại là sự thay
đổi không tuyến tính của điện trở theo nhiệt độ.
● Điện trở nhiệt được làm từ vật liệu bán dẫn oxit kim loại : có điện trở
thay đổi theo nhiệt độ. Một trong những ưu điểm của điện trở nhiệt loại này là
thời gian đáp ứng nhanh và độ nhạy cao. Thí dụ, một điện trở nhiệt có điện trở
nhiệt có điện trở thông thường có 50 kΩ tại 25ºC, nhưng có điện trở chỉ 2 kΩ
tai 85ºC. Giống như điện trở nhiệt làm từ vật liệu kim loại, một dòng điện
chạy qua điện trở nhiệt và điện áp 2 đầu điện trở nhiệt được đo. Điện trở nhiệt
là linh kiện phi tuyến và các bảng đối chiếu thường được sử dụng để chuyển đổi

2
điện áp đo được thành nhiệt độ. Điện trở nhiệt thường có kích thước rất nhỏ và có
nhược điểm là có thể tự nóng khi dòng điện đi qua có cường độ lớn. Tất nhiên là
khi nhiệt độ của linh kiện tăng do tự nóng có thể cho kết quả không đúng.
● Cảm biến nhiệt nhiệt dưới dạng vi vạch : các cảm biến nhiệt độ tích hợp
thường là các linh kiện tích cực với 3 hoặc 8 chân, thường cần có một nguồn
nuôi để hoạt động và cho ra một điện áp tỷ lệ thuận với nhiệt độ. Về cơ bản
có thể chia ra các cảm biến analog khoảng 10 mV/ºC, điện áp này tỷ lệ thuận
với nhiệt độ, các cảm biến nhiệt độ có lối ra số cung cấp dữ liệu nối tiếp theo
khung truyền chứa 8 hoăc 9 bit dữ liệu có giá trị tỷ lệ thuận với nhiệt độ.
Với sinh viên học chuyên nghành điều khiển tự động phải nắm bắt được tất
cả những kiến thức cơ sở, tổng quát nhất để từ đó có thể giải quyết được các
bài toán điều khiển đặt ra trong công việc sau này. Một trong những kiến thức
cần phải có đó là nghiên cứu và thiết kế mạch ứng dụng sử dụng bộ vi điều
khiển. Do đó em đã chọn đề tài :
“Thiết kế mô hình đo và điều khiển nhiệt độ dùng DS1620 có cổng
truyền thông RS-232 gép nối giữa máy tính và vi điều khiển”
Đồ án gồm có 4 chương :
Chương I : Vi điều khiển 8051
Chương II : Các thiết bị ngoại vi dùng cho bộ đo và điều khiển nhiệt độ
Chương III : Mở rộng phần giao tiếp cổng nối tiếp
Chương IV : Thiết kế chương trình
Đồ án tốt nghiệp được thực hiện trong một thời gian ngắn nên em không
thể tránh khỏi những thiếu xót. Rất mong được sự đóng góp của các thầy, cô
giáo để đồ án của em được hoàn thiện hơn.
Cuối cùng em xin gửi lời cảm ơn chân thành đến thầy Nguyễn Văn
Xuân đã tận tình hướng dẫn em trong thời gian thực hiện đồ án.

3
4
CHƯƠNG 1

VI ĐIỀU KHIỂN 8051

I. Tổng quan về vi điều khiển 8051


Nh÷ng ®Æc ®iÓm chÝnh vµ nguyªn t¾c ho¹t ®éng cña
c¸c bé vi ®iÒu khiÓn kh¸c nhau kh«ng nhiÒu. Khi ®· sö dông
thµnh th¹o mét lo¹i vi ®iÒu khiÓn th× ta cã thÓ nhanh chãng
vËn dông kinh nghiÖm ®Ó lµm quen vµ lµm chñ c¸c øng dông
cña mét bé vi ®iÒu khiÓn kh¸c. V× vËy ®Ó cã nh÷ng hiÓu
biÕt cô thÓ vÒ c¸c bé vi ®iÒu khiÓn th× ta t×m
hiÓu mét bé vi ®iÒu khiÓn c¬ b¶n vµ th«ng dông nhÊt, ®ã lµ
hä MSC-51.
NÕu nh hä MSC-51 lµ hä vi xö lý ®iÓn h×nh th× 8051 l¹i
chÝnh lµ ®¹i diÖn tiªu biÓu. Bªn c¹nh nh÷ng th«ng sè chung
vi xö lý 8051 cã bé nhí ch¬ng tr×nh ROM ®Õn 4 kbyte, 128
byte RAM ®îc tÝch hîp ngay trong chÝp vµ nh vËy cã thÓ
h×nh thµnh chän vÑn mét m¸y tÝnh. MSC-51 lµ hä vi ®iÒu
khiÓn cña Intel. C¸c nhµ s¶n xuÊt IC kh¸c nh Siemens,
Advanced Micro Devices, Fujitsu vµ philips ®îc cÊp phÐp lµm
c¸c nhµ cung cÊp thø hai cho c¸c chip cña hä MCS-51.
Ch¬ng nµy giíi thiÖu vÒ cÊu tróc phÇn cøng cña hä MCS-51.
Chip 8051 cã c¸c ®Æc trng ®îc tãm t¾t nh sau:
• 4KB ROM
• 128 byte RAM.
• 4 port xuÊt nhËp (I/O port) 8 bit.

• 2 bé ®Þnh thêi 16-bit.

5
• M¹ch giao tiÕp nèi tiÕp.
• Kh«ng gian nhí ch¬ng tr×nh(m·) ngoµi 64K.
• Kh«ng gian nhí d÷ liÖu ngoµi 64K.
• Bé xö lý bit (thao t¸c trªn c¸c bit riªng rÏ)
• 210 vÞ trÝ nhí ®îc ®Þnh ®Þa chØ, mçi vÞ chÝ mét
bÝt.
• Nh©n/chia trong 4µ s.
C¸c thµnh viªn kh¸c cña hä MSC-51 cã c¸c tæ hîp ROM
(EPROM), RAM trªn chÝp kh¸c nhau hoÆc cã thªm bé ®Þnh
thêi thø ba.

1 4 0
2 P 1 . 0 V C C3 9
3 P 1 . 1 P 0. 30 8
4 P 1 . 2 P 0. 31 7
5 P 1 . 3 P 0. 32 6
P 1 . 4 P 0. 33 5
6
7 P
P
1
1
.
.
5
6
8 0 5 P
P
1
0
0
. 34 4
. 35 3
8
9 P 1 . 7 P 0. 36 2
1 0 R E S E T P 0. 37 1
1 1 R X D E A / V 3 P0
1 2 T X D A L E 2/ P 9
1 3 I N T 0 P S E 2N 8
1 4 I N T 1 P 2 . 27 7
1 5 T 0 P 2 . 26 6
1 6 T 1 P 2 . 25 5
1 7 W R P 2 . 24 4
1 8 R D P 2 . 23 3
1 9 X 2 P 2 . 22 2
2 0 X 1 P 2 . 21 1
V S S P 2 . 0

Hình 1: C¸ch s¾p xÕp ch©n cña vi ®iÒu khiÓn 8051


I.1 cÊu h×nh vµ chøc n¨ng c¸c ch©n

6
C¸c ch©n vµ tªn gäi c¸c ch©n ®îc m« t¶ trªn h×nh 1,
cßn cÊu h×nh tèi thiÓu ®îc m« t¶ trªn h×nh 2:

V C C

31

40
U 2
+ 2 9 3 9
C 3
3 0 P S E N P 0 . 30

E A /V P

VC C
R E S E T 1 0 u 8
A L E / P P 0 . 31 7
P 0 . 32 6
P 0 . 33 5
9 P 0 . 34 4
R 1 R E S E T P 0 . 35 3
8 . 2 k C 1 P 0 . 36 2
3 3 p 1 8 P 0 . 7
X 2 2 1
P 2 . 20 2
P 2 . 21 3
X 1 P 2 . 22 4
C 2 P 2 . 23 5
3 3 p 1 9 P 2 . 24 6
X 1 P 2 . 25 7
1 P 2 . 26 8
2 P 1 . 0 P 2 . 7
3 P 1 . 1 1 7
4 P 1 . 2 RD 1 6
5 P 1 . 3 W R 1 5
6 P 1 . 4 T 1 1 4
7 P 1 . 5 T 0 1 3
8 P 1 . 6 I N T 11 2
P 1 . 7 I N T 10 1
T X D 1 0
VSS

8 0 5 1
R X D
20

H×nh 2: CÊu h×nh tèi thiÓu cña


8051
Ch©n RST
§©y lµ ch©n lèi vµo RESET. Lèi vµo nµy b×nh thêng ë møc
logic 0. Khi thùc hiÖn thao t¸c RESET, ch©n RESET bÞ gi÷ ë

7
møc l«gic 1 Ýt nhÊt lµ trong hai chu kú m¸y. Khi ®îc cÊp
nguån,vi ®iÒu khiÓn còng tù ®éng Reset, qu¸ tr×nh nµy
diÔn ra nhê mét tô ®iÖn (10u) vµ mét ®iÖn trë 8.2k vµo
ch©n nµy nh trªn h×nh trªn.
Ch©n 40 VCC
Đ©y lµ ch©n cÊp nguån nu«i 5v
Ch©n 20 GND
Đ©y lµ ch©n nèi ®Êt
Ch©n XTAL1 vµ XTAL2
Hai ch©n nµy dïng ®Ó nèi víi bé céng hëng
th¹ch anh ë bªn ngoµi ®Ó t¹o nªn mét dao ®éng bªn trong vi
m¹ch. Thêng cã thªm hai tô ®iÖn 33p ®îc nèi víi bé céng h-
ëng th¹ch anh nh chØ ra trªn h×nh 2. Độ lớn của một chu kỳ máy
có thể nhận được bằng cách chia tần số của bộ cộng hưởng thạch anh cho 12.
Như vậy, chu kỳ máy sẽ bằng sẽ 2 micro giây nếu tần số của bộ cộng hưởng
thạch anh bằng 12MHz. Hầu hết các lệnh (íntruction) máy đều được thực hiện
trong một chu kỳ máy.
Ch©n EA/VPP
Đ©y lµ ch©n cho phÐp truy cËp bé nhí bªn ngoµi trªn c¸c
vi ®iÒu khiÓn 8051 chuÈn. Ch©n EA ph¶i ®îc nèi víi nguån
VCC khi thùc thi ch¬ng tr×nh bªn ngoµi.
Chân PSEN
§©y lµ ch©n cho phÐp lu tr÷ ch¬ng tr×nh trªn c¸c vi
®iÒu khiÓn 8051 chuÈn.Chân này được kích hoạt khi vi điều khiển
thực thi các mã lệnh từ bộ nhớ bên ngoài.
Ch©n ALE/PROG

8
§©y lµ ch©n cho phÐp chèt ®Þa chØ trªn c¸c vi ®iÒu
khiÓn chuÈn. Ch©n nµy ®îc sö dông ®Ó chèt thấp (LOW) của
®Þa chØ trong khi truy cËp ®Õn bé nhí bªn ngoµi.
Cæng P0
§©y lµ cæng vµo/ra. B×nh thêng th× cæng nµy lµ cæng
ra, ®Ó cæng nµy lµ cæng vµo th× ph¶i thiÕt lËp ë møc cao.
Do cæng nµy kh«ng cã ®iÖn trë kÐo (cùc colector hë) nªn
ph¶i nèi cæng nµy víi ®iÖn trë kÐo 10k víi d¬ng nguån. Cã
thÓ truy cËp cæng P0 theo Byte hoÆc truy cËp tõng Bit.
Cæng P1
§©y lµ cæng vµo/ra, ë chÕ ®é mÆc ®Þnh th× cæng nµy
lµ cæng ra. §Ó lµm cæng ®Çu vµo th× ph¶i ghi møc l«gic cao
ë cæng nµy. Cæng P1 cã s½n ®iÖn trë kÐo lªn d¬ng nguån
v× vËy kh«ng ph¶i nèi nh ë cæng P0. Cæng P1 còng cã thÓ
truy cËp theo Byte hoÆc theo Bit.
Cæng P2, P3
C¸c cæng P2, P3 còng t¬ng tù nh ë cæng P1.
Tuy nhiªn cæng P3 cã mét chøc n¨ng ®Æc biÖt sau:
P3.0
Đây là chân vào/ ra hai hướng (bit 0 của cổng 3) với một điện trở kéo lên
nguồn dương đã đặt sẵn trên chip. Ch©n nµy ho¹t ®éng nh mét lèi
vµo nhËn d÷ liÖu (RxD) khi vi ®iÒu khiÓn ®îc sö dông nh
mét bé truyÒn nhËn kh«ng ®ång bé (UART) ®Ó truyÒn nhËn
d÷ liÖu nèi tiÕp.
P3.1
Đây là một chân vào/ ra hai hướng (bit 1 của cổng 3) với một điện trở kéo
lên nguồn dương đã đặt sẵn trên chíp. Ch©n nµy ho¹t ®éng nh mét

9
lèi ra truyÒn d÷ liÖu (TxD) khi vi ®iÒu khiÓn ®îc sö dông nh
mét bé truyÒn nhËn kh«ng ®ång bé (UART) ®Ó truyÒn nhËn
d÷ liÖu nèi tiÕp.
P3.2
Đây là một chân vào/ ra hai hướng (bit 2 của cổng 3) với một điện trở kéo lên
nguồn dương đã đặt sẵn trên chíp. ch©n này cũng là chân ng¾t ngoµi cã
sè hiÖu lµ ng¾t 0(INT0). Đặc điểm này cần được chú ý đối với chân
P3.2 (và cả chân P3.3) vì không ít trường hợp sử dụng hai chân này
như một chân vào/ ra hai hướng thông thường đã dẫn đến những
trục trặc khi cho chạy chương trình.
P3.3
Đây là một chân vào/ra hai hướng (bit 3 của cổng 3) với một điện trở kéo
lên nguồn dương. Chân này cũng lµ ch©n ng¾t ngoµi cã sè hiÖu
lµ ng¾t 1(INT1).

P3.4
Đây là một chân vào/ ra hai hướng (bit 4 của cổng 3) với một điện trở kéo
lên nguồn dương. Chân này cũng là chân lối vào của bộ đếm 0 (T0)
P3.5
Đây là một chân vào/ ra hai hướng (bit 5 của cổng 3) với một điện trở kéo
lên nguồn dương. Chân này cũng là chân lối vào bé ®Õm 1 (counter 1)
P3.6
Đây là một chân vào/ ra hai hướng. Chân này không có trên AT89C2051.
Đây cũng là chân ghi vào bộ nhớ ngoài (WR).
P3.7

10
Đây là một chân vào/ ra hai hướng dùng cho bit 7 của cổng 3. Trên các vi
điều khiển 8051 chuẩn, chân này cũng là chân đọc bộ nhớ dữ liệu bên ngoài
(RD).
I.2 CÊu tróc cña c¸c cæng xuÊt/nhËp
ViÖc ghi ®Õn mét ch©n cña port sÏ n¹p d÷ liÖu bé chèt
®iÒu khiÓn cña port, ngâ ra Q cña bé chèt ®iÒu khiÓn cña
mét transistor trêng vµ transistor nµy nèi víi ch©n cña port.
Kh¶ n¨ng fanout cña port 1,2,3 lµ 4 t¶i vi m¹ch TTL lo¹i
schottky c«ng suÊt thÊp cßn cña port 0 lµ 8 t¶i lo¹i LS.
Lu ý: khi ®iÖn trë kÐo lªn sÏ kh«ng cã ë port 0 (trõ khi port
lµm nhiÖm vô cña bus ®Þa chØ/d÷ liÖu ®a hîp). Do vËy mét
®iÖn trë kÐo lªn bªn ngoµi ph¶i ®îc cÇn ®Õn. Gi¸ trÞ cña
®iÖn trë nµy phô thuéc vµo ®Æc tÝnh ngâ vµo cña thµnh
phÇn ghÐp nèi víi ch©n cña port.

Hình 3 :Mạch bên trong các port xuất/nhập


I.3 Tæ chøc bé nhí 8051
8051 cã kh«ng gian bé nhí riªng cho ch¬ng tr×nh vµ d÷
liÖu: c¶ 2 bé nhí ch¬ng tr×nh vµ d÷ liÖu ®Òu ®Æt bªn trong

11
chip, tuy nhiªn vÉn cã thÓ më réng bé nhí ch¬ng tr×nh vµ bé
nhí d÷ liÖu b»ng c¸ch sö dông chip nhí bªn
ngoµi víi dung lîng tèi ®a 64Kbyte cho bé nhí ch¬ng tr×nh vµ
bé nhí d÷ liÖu.

Hình 4 : Không gian nhớ của chip 8051


Bé nhí néi trong chip bao gåm c¶ RAM vµ ROM. RAM trªn
chip bao gåm vïng RAM ®a chøc n¨ng, vïng RAM víi tõng bit
®îc ®Þnh ®Þa chØ, d·y thanh ghi (bank register) vµ c¸c
thanh ghi chøc n¨ng ®Æc biÖt SFR (special function register).
Hai ®Æc tÝnh ®¸ng lu ý lµ :
c¸c thanh ghi vµ c¸c port xuÊt/nhËp ®îc ®Þnh ®Þa chØ
theo kiÓu ¸nh x¹ bé nhí (memory mapped) vµ ®îc truy xuÊt
nh mét vÞ trÝ nhí trong bé nhí
vïng stack thêng tró trong RAM trªn chip (RAM néi) thay v×
ë trong RAM ngoµi nh c¸c bé vi xö lý.

Vïng RAM ®a môc ®Ých


Vïng RAM ®a môc ®Ých cã 80 byte ®Æt ë ®Þa chØ tõ 30H
®Õn 7FH, bªn díi vïng nµy tõ ®Þa chØ 00H ®Õn 2FH lµ vïng

12
nhí cã thÓ ®îc sö dông t¬ng tù. BÊt kú vÞ trÝ nhí nµo trong
vïng RAM ®a môc ®Ých ®Òu cã thÓ ®îc truy xuÊt tù do b»ng
c¸ch sö dông c¸c kiÓu ®Þnh ®Þa chØ trùc tiÕp hoÆc gi¸n
tiÕp.

Vïng RAM ®Þnh ®Þa chØ bit


8051 chøa 210 vÞ trÝ bit ®îc ®Þnh ®Þa chØ trong ®ã 128
bit chøa trong c¸c byte ë ®Þa chØ tõ 20H ®Õn 2FH (16 byte
x 8 bit = 128 bit) vµ phÇn cßn l¹i chøa trong c¸c thanh ghi
®Æc biÖt. Ngoµi ra 8051 cßn cã c¸c port xuÊt/nhËp cã thÓ
®Þnh ®Þa chØ tõng bit, ®iÒu nµy lµm ®¬n gi¶n viÖc giao
tiÕp b»ng phÇn mÒm víi c¸c thiÕt bÞ xuÊt/nhËp ®¬n bit.

C¸c d·y thanh ghi


32 vÞ trÝ thÊp nhÊt cña bé nhí néi chøa c¸c d·y thanh ghi .
C¸c lÖnh cña 8051 hç trî 8 thanh ghi tõ R0 ®Õn R7 thuéc d·y
0 (bank 0). §©y lµ d·y mÆc ®Þnh sau khi reset hÖ thèng. C¸c
thanh ghi nµy ë c¸c ®Þa chØ tõ 00H ®Õn 07H. LÖnh sö dông
c¸c thanh ghi tõ R0 ®Õn R7 lµ c¸c lÖnh ng¾n vµ thùc hiÖn
nhanh h¬n so víi c¸c lÖnh t¬ng ®¬ng sö dông kiÓu ®Þnh
®Þa chØ trùc tiÕp. C¸c gi¸ trÞ d÷ liÖu thêng ®îc sö dông nªn
chøa trong c¸c thanh ghi nµy. D·y thanh ghi ®ang ®îc sö
dông gäi lµ d·y thanh ghi tÝch cùc.

I.3.1 C¸c thanh ghi chøc n¨ng ®Æc biÖt (SFR)


Còng nh c¸c thanh ghi tõ R0 ®Õn R7, ta cã 21 thanh ghi
chøc n¨ng ®Æc biÖt SFR chiÕm phÇn trªn cña RAM néi tõ
®Þa chØ 80H ®Õn FFH. Ta cÇn lu ý lµ kh«ng ph¶i tÊt c¶ 128

13
®Þa chØ tõ 80H ®Õn FFH ®Òu ®îc ®Þnh nghÜa mµ chØ cã
21 ®Þa chØ ®îc ®Þnh nghÜa.Tõ tr¹ng th¸i ch¬ng tr×nh
PSW ( Program Status Word)
§Þa chØ byte: D0H
7 6 5 4 3 2 1 0
CY AC F0 RS1 RS0 OV - P

Thanh ghi B
Thanh ghi B ë ®Þa chØ F0H ®îc dïng chung víi thanh
chøa A trong c¸c phÐp to¸n nh©n, chia. LÖnh MUL AB nh©n
2 sè 8 bit kh«ng dÊu chøa
trong A vµ B vµ chøa kÕt qu¶ 16 bit vµo cÆp thanh ghi B,
A (thanh chøa A cÊt byte thÊp vµ thanh ghi B cÊt byte cao).
LÖnh chia DIV AB chia A bëi B, th¬ng sè cÊt trong thanh
chøa A vµ d sè cÊt trong thanh ghi B. Thanh ghi B cßn ®îc xö
lý nh mét thanh ghi nh¸p. C¸c bit ®îc ®Þnh ®Þa chØ cña
thanh ghi B cã ®Þa chØ tõ F0H ®Õn F7H.
Con trá stack (Stack pointer)
Con trá stack SP (stack pointer) lµ 1 thanh ghi 8 bit ë ®Þa
chØ 81H. SP chøa ®Þa chØ cña d÷ liÖu hiÖn ®ang ë ®Ønh
cña stack. C¸c lÖnh liªn quan ®Õn stack bao gåm lÖnh cÊt
d÷ liÖu vµo stack vµ lÖnh lÊy d÷ liÖu ra khái stack. ViÖc cÊt
vµo stack lµm t¨ng SP tríc khi ghi d÷ liÖu vµ viÖc lÊy d÷ liÖu
ra khái stack sÏ gi¶m SP. Vïng stack cña 8051 ®îc gi÷ trong
RAM néi vµ ®îc giíi h¹n ®Õn c¸c ®Þa chØ truy xuÊt ®îc bëi
kiÓu ®Þnh ®Þa chØ gi¸n tiÕp. C¸c lÖnh PUSH vµ POP sÏ cÊt
d÷ liÖu vµo stack vµ lÊy d÷ liÖu tõ stack, c¸c lÖnh gäi ch¬ng
tr×nh con (ACALL, LCALL) vµ lÖnh trë vÒ (RET, RETI) còng cÊt

14
vµ phôc håi néi dung cña bé ®Õm ch¬ng tr×nh PC (program
counter).
Ký §Þa
Bit M« t¶ bit
hiÖu chØ
Cê nhí (carry flag). Cê nµy ®îc set nÕu cã
PSW.7 CY D7H bit nhí tõ bit 7 trong phÐp céng hoÆc ®îc
set nÕu cã bit mîn cho bit 7 trong phÐp trõ
Cê nhí phô. Cê nµy ®îc set trong phÐp céng
nÕu cã bit nhí tõ bit 3 sang bit 4 hoÆc nÕu
PSW.6 AC D6H
kÕt qu¶ trong 4 bit thÊp n»m trong kho¶ng
tõ 0AH → 0FH
PSW.5 F0 D5H Cê O, cê nµy dµnh cho ngêi sö dông
PSW.4 RS1 D4H Chän d·y thanh ghi (bit 1)
Chän d·y thanh ghi (bit 0)
00 = bank 0 : ®Þa chØ tõ 00H → 07H
PSW.3 RS0 D3H 01 = bank 1 : ®Þa chØ tõ 08H → 0FH
10 = bank 2 : ®Þa chØ tõ 10H → 17H
11 = bank3 : ®Þa chØ tõ 18H → 1FH
Cê trµn (Overflow flag), cê nµy ®îc set sau
khi céng hoÆc trõ nÕu cã 1 sè trµn sè häc
PSW.2 OV D2H (nghÜa lµ trµn trªn c¸c phÐp to¸n sè cã dÊu:
kÕt qu¶ cña phÐp to¸n lín h¬n +127 hoÆc
nhá h¬n -128)
PSW.1 -- D1H Dù tr÷
Cê kiÓm tra ch½n/lÎ. Cê nµy ®îc set hoÆc
clear bëi phÇn cøng sau mçi 1 chu kú lÖnh,
PSW.0 P D0H
®Ó chØ ra r»ng cã 1 sè ch½n hoÆc sè lÎ bit
Con trá d÷ liÖu DPTR
Con trá d÷ liÖu DPTR (data pointer) ®îc dïng ®Ó truy
xuÊt bé nhí ch¬ng tr×nh ngoµi hoÆc bé nhí d÷ liÖu ngoµi.
DPTR lµ mét thanh ghi 16 bit cã ®Þa chØ lµ 82H (DPL, byte
thÊp) vµ 83H (DPH, byte cao).
C¸c thanh ghi port
C¸c port xuÊt/nhËp cña 8051 bao gåm Port 0 t¹i ®Þa chØ
80H, Port 1 t¹i ®Þa chØ 90H, Port 2 t¹i ®Þa chØ A0H vµ Port 3

15
t¹i ®Þa chØ B0H. TÊt c¶ c¸c port ®Òu ®îc ®Þnh ®Þa chØ
tõng bit nh»m cung cÊp c¸c kh¶ n¨ng giao tiÕp m¹nh.
C¸c thanh ghi ®Þnh thêi TMOD (Timer Mode Register) vµ
TCON (Timer/Counter Control Register)
8051 cã 2 bé ®Õm/®Þnh thêi (counter/timer) 16 bit ®Ó
®Þnh c¸c kho¶ng thêi gian hoÆc ®Ó ®Õm c¸c sù kiÖn.
Bé ®Þnh thêi 0 cã ®Þa chØ 8AH (TL0, byte thÊp) vµ 8CH
(TH0, byte cao).
Bé ®Þnh thêi 1 cã ®Þa chØ 8BH (TL1, byte thÊp) vµ 8DH
(TH1, byte cao).
Ho¹t ®éng cña bé ®Þnh thêi ®îc thiÕt lËp bëi thanh ghi
chÕ ®é ®Þnh thêi TMOD (Timer Mode Register) ë ®Þa chØ
88H. ChØ cã TCON ®îc ®Þnh ®Þa chØ tõng bit.
TMOD : cã chøc n¨ng ®iÒu khiÓn chän chÕ ®é ®Þnh
thêi/®Õm. §Þa chØ byte lµ 89H, kh«ng ®îc ®Þnh ®Þa chØ bit
7 6 5 4 3 2 1 0
GATE C / T M1 M0 GATE C / T M1 M0
GATE : Bit ®iÒu khiÓn cæng. Khi bit TRx trong TCON ®îc
set = 1 vµ GATE = 1 th× bé Timer/Counter chØ ho¹t ®éng
trong khi INTx ë møc cao (®iÒu khiÓn cøng). Khi GATE = 0 bé
Timer/Counter chØ ho¹t ®éng khi TRx =1 (®iÒu khiÓn mÒm).
C /T : bit chän chøc n¨ng ®Õm (counter) hay ®Þnh thêi
(timer). Khi C /T = 0 bé Timer/Counter ho¹t ®éng ®Þnh thêi
(dïng xung clock néi cña hÖ thèng). Khi C /T = 1,
Timer/Counter ho¹t ®éng ®Õm (dïng xung clock nhËn tõ ngâ
vµo Tx).
M1, M0 : Bit chän chÕ ®é
M1 M0 ChÕ
®é

16
0 0 0 Bé ®Þnh thêi 13 bit
0 1 1 Bé ®Þnh thêi/®Õm 16 bit
1 0 2 Bé ®Þnh thêi/®Õm 8 bit tù ®éng n¹p l¹i
Bé ®Þnh thêi 0: TL0 lµ bé ®Þnh thêi/®Õm
8 bit ®îc ®iÒu khiÓn bëi c¸c bit ®iÒu khiÓn
bé ®Þnh thêi 0. TH0 lµ bé ®Þnh thêi 8 bit
1 1 3
®îc ®iÒu khiÓn bëi c¸c bit ®iÒu khiÓn bé
®Þnh thêi 1.
Bé ®Þnh thêi/®Õm 1 ngng ho¹t ®éng
TCON : cã chøc n¨ng ®iÒu khiÓn bé ®Þnh thêi/®Õm. §Þa
chØ byte lµ 88H, cã ®Þnh ®Þa chØ bit
7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

Ký VÞ trÝ §Þa M« t¶
hiÖu chØ
Cê trµn bé ®Þnh thêi 1 : ®îc set bëi
phÇn cøng khi bé ®Þnh thêi/®Õm
TCON.
TF1 8FH bÞ trµn, xãa b»ng phÇn mÒm hoÆc
7
bëi phÇn cøng khi tr×nh phôc vô
ng¾t ®îc trá ®Õn
TCON. Bit ®iÒu khiÓn bé ®Þnh thêi 1 ho¹t
TR1 8EH
6 ®éng, ®îc set/clear bëi phÇn mÒm.
TCON. Cê trµn bé ®Þnh thêi 0
TF0 8DH
5
TCON. Bit ®iÒu khiÓn bé ®Þnh thêi 0 ho¹t
TR0 8CH
4 ®éng
IE1 TCON. 8BH Cê ng¾t ngoµi 1, t¸c ®éng c¹nh. §îc
3 set bëi phÇn cøng khi ph¸t hiÖn cã
ng¾t ngoµi t¸c ®éng c¹nh, ®îc xãa

17
bëi phÇn cóng khi ng¾t ®· ®îc xö

Bit ®iÒu khiÓn chän lo¹i ng¾t, ®îc
TCON. set/xãa ®Ó x¸c ®Þnh ng¾t ngoµi
IT1 8AH
2 thuéc lo¹i t¸c ®éng c¹nh ©m
(xuèng) hay t¸c ®éng møc thÊp
TCON. Cê ng¾t ngoµi 0, t¸c ®éng c¹nh
IE0 89H
1
TCON. Bit ®iÒu khiÓn chän lo¹i ng¾t
IT0 88H
0

Thanh ghi cña cæng nèi tiÕp (Serial Port)


Bªn trong 8051 cã mét port nèi tiÕp ®Ó truyÒn th«ng víi
c¸c thiÕt bÞ nèi tiÕp nh c¸c thiÕt bÞ ®Çu cuèi hoÆc modem,
hoÆc ®Ó giao tiÕp víi c¸c IC kh¸c cã m¹ch giao tiÕp nèi tiÕp
(nh c¸c thanh ghi dÞch ch¼ng h¹n). ChÕ ®é ho¹t ®éng cña
cæng nèi tiÕp ®îc thiÕt lËp b»ng c¸ch ghi tõ ®iÒu khiÓn lªn
thanh ghi chän chÕ ®é SCON( Serial Port Control Register).
SCON cã ®Þa chØ byte lµ 98H, ®Þnh ®Þa chØ bit.
7 6 5 4 3 2 1 0
SM0 SM1 SM2 REN TB8 RB8 TI RI

Ký VÞ trÝ §Þa M« t¶
hiÖu chØ
SCON. Bit chän chÕ ®é
SM0 9FH
7
SCON. Bit chän chÕ ®é
SM1 9EH
6
SM2 SCON. 9DH Bit nµy cho phÐp truyÒn th«ng ®a

18
xö lý ë c¸c chÕ ®é 2 & 3. Trong
chÕ ®é 2 hoÆc 3 nÕu SM2 = 1, RT
sÏ kh«ng ®îc tÝch cùc nÕu bit nhËn
5 ®îc thø 9 (RB8) b»ng = 0. Trong
chÕ ®é 1, nÕu SM2 = 1, RI sÏ
kh«ng ®îc tÝch cùc nÕu ta kh«ng
nh©n ®îc bit stop hîp lÖ.
Cho phÐp thu. ViÖc set hoÆc xãa
SCON. bit nµy bëi phÇn mÒm sÏ cho phÐp
REN 9CH
4 hoÆc kh«ng cho phÐp ho¹t ®éng
thu.
Bit ph¸t 8, bit thø 9 ®îc ph¸t ë c¸c
SCON.
TB8 9BH chÕ ®é 2 & 3. Bit nµy ®îc set hoÆc
3
xãa b»ng phÇn mÒm.
Bit thu 8. Trong c¸c chÕ ®é 2 & 3,
RB8 lµ bit d÷ liÖu thø 9 thu ®îc.
SCON.
RB8 9AH Trong chÕ ®é 1, nÕu SM2 = 0, RB8
2
lµ bit stop thu ®îc. Trong chÕ ®é 0,
RB8 kh«ng ®îc sö dông.
Cê ng¾t ph¸t, cê nµy ®îc set bëi
phÇn cøng ë cuèi thêi gian ph¸t bit
SCON. thø trong chÕ ®é 0 hoÆc ë gi÷a
TI 99H
1 thêi gian cña bit stop trong c¸c chÕ
®é kh¸c. Cê TI ph¶i ®îc xãa b»ng
phÇn mÒm.
RI SCON. 98H Cê ng¾t thu, cê nµy ®îc set bëi
0 phÇn cøng ë cuèi thêi gian thu bit

19
thø 8 trong chÕ ®é 0 hoÆc ë gi÷a
thêi gian cña bit stop trong c¸c chÕ
®é kh¸c. Cê RI ph¶i ®îc xãa bëi
phÇn mÒm.
SM0 SM1 ChÕ M« t¶ Tèc ®é baud
®é
0 0 0 Thanh ghi fosc ÷ 12
dÞch
0 1 1 8-bit UART Thay ®æi
1 0 2 9-bit UART fosc ÷ 64 hoÆc fosc ÷
32
1 1 3 9-bit UART Thay ®æi

C¸c thanh ghi ng¾t

8051 cã cÊu tróc ng¾t víi 2 møc u tiªn vµ 5 nguyªn nh©n


ng¾t (5 source, 2 priority level interrupt structure). C¸c ng¾t
bÞ v« hiÖu hãa sau khi reset hÖ thèng vµ sau ®ã ®îc cho
phÐp b»ng c¸ch ghi vµo thanh ghi cho phÐp ng¾t IE
(Interrupt Enable register) ë ®Þa chØ A8H. Møc u tiªn ng¾t
®îc thiÕt lËp qua thanh ghi u tiªn ng¾t IP (Interrupt Priority
register) ë ®Þa chØ B8H. C¶ 2 thanh ghi nµy ®Òu ®îc ®Þnh
®Þa chØ tõng bit.
Thanh ghi ®iÒu khiÓn nguån
Thanh ghi ®iÒu khiÓn nguån PCON (Power Control
Register) cã ®Þa chØ 87H chøa c¸c bit ®iÒu khiÓn ®îc tãm
t¾t trong b¶ng sau ®©y
Bit Ký M« t¶
hiÖu

20
T¨ng gÊp ®«i tèc ®é baud. NÕu bé ®Þnh thêi
1 ®îc dïng ®Ó t¹o ra tèc ®é baud vµ SMOD =
7 SMOD
1, tèc ®é baud ®îc t¨ng gÊp ®«i khi Port nèi
tiÕp ®îc sö dông ë c¸c chÕ ®é 1, 2 hoÆc 3.
6 - Dù tr÷
5 - Dù tr÷
4 - Dù tr÷
3 GF1 Bit cê ®a môc ®Ých 1
2 GF0 Bit cê ®a môc ®Ých 0
Bit chÕ ®é nguån gi¶m. ViÖc set bit nµy b»ng
1 PD 1 t¸c ®éng ®Õn thao t¸c nguån gi¶m trong
c¸c phiªn b¶n CMOS cña 8051.
Bit chÕ ®é nghØ. ViÖc set bit nµy b»ng 1 t¸c
0 IDL ®éng ®Õn chÕ ®é nghØ trong c¸c phiªn b¶n
CMOS cña 8051.

● ChÕ ®é nguån gi¶m


LÖnh thiÕt lËp bit PD b»ng 1 sÏ lµ lÖnh sau cïng ®îc thùc
thi tríc khi ®i vµo chÕ ®é nguån gi¶m. ë chÕ ®é nguån gi¶m
:
• m¹ch dao ®éng trªn chip ngõng ho¹t ®éng
• mäi chøc n¨ng ngõng ho¹t ®éng
• néi dung cña RAM trªn chip ®îc duy tr×
• c¸c ch©n port duy tr× møc logic cña chóng
• ALE vµ PSEN ®îc gi÷ ë møc thÊp. ChØ ra khái chÕ ®é
nµy b»ng c¸ch reset hÖ thèng.
Trong suèt thêi gian ë chÕ ®é nguåm gi¶m, Vcc cã ®iÖn
¸p lµ 2V. CÇn ph¶i gi÷ cho Vcc kh«ng thÊp h¬n sau khi ®¹t ®-

21
îc chÕ ®é nguån gi¶m vµ cÇn phôc håi Vcc = 5V tèi thiÓu 10
chu kú dao ®éng tríc khi ch©n RST ®¹t møc thÊp lÇn n÷a.
● ChÕ ®é nghØ
LÖnh thiÕt lËp bit IDL b»ng 1 sÏ lµ lÖnh sau cïng ®îc thùc
thi tríc khi ®i vµo chÕ ®é nghØ. ë chÕ ®é nghØ, tÝn hiÖu
clock néi ®îc khãa kh«ng cho ®Õn CPU nhng kh«ng khãa ®èi
víi c¸c chøc n¨ng ng¾t, ®Þnh thêi vµ port nèi tiÕp. Tr¹ng th¸i
cña CPU ®îc duy tr× vµ néi dung cña tÊt c¶ c¸c thanh ghi
còng ®îc gi÷ kh«ng ®æi. C¸c ch©n port còng ®îc duy tr×
c¸c møc logic cña chóng. ALE vµ PSEN ®îc gi÷ ë møc cao. ChÕ
®é nghØ kÕt thóc b»ng c¸ch cho phÐp ng¾t hoÆc b»ng c¸ch
reset hÖ thèng. C¶ hai c¸ch võa nªu ®Òu xãa bit IDL.
I.3.2 Bé nhí ngoµi
C¸c bé vi ®iÒu khiÓn cÇn cã kh¶ n¨ng më réng c¸c tµi
nguyªn trªn chip, cÊu tróc cña MCS-51 cho ta kh¶ n¨ng më
réng kh«ng gian bé nhí ch¬ng tr×nh ®Õn 64K vµ kh«ng gian
bé nhí d÷ liÖu ®Õn 64K. ROM vµ RAM ngoµi ®îc thªm vµo khi
cÇn. C¸c IC giao tiÕp ngo¹i vi còng cã thÓ ®îc thªm vµo ®Ó
më réng kh¶ n¨ng xuÊt / nhËp. Chóng trë thµnh mét phÇn cña
kh«ng gian bé nhí d÷ liÖu ngoµi b»ng c¸ch sö dông c¸ch
®Þnh ®Þa chØ kiÓu I/O ¸nh x¹ bé nhí. Khi bé nhí ngoµi ®îc sö
dông, port 0 kh«ng lµm nhiÖm vô cña port xuÊt /nhËp, port
nµy trë thµnh bus ®Þa chØ (A0-A7) vµ bus d÷ liÖu (D0-D7)
®a hîp. Ngâ ra ALE chèt byte thÊp cña ®Þa chØ ë thêi ®iÓm
b¾t ®Çu mçi mét chu kú bé nhí ngoµi. Port 2 thêng lµm byte
cao cña bus ®Þa chØ .

22
Truy xuÊt bé nhí ch¬ng tr×nh ngoµi
Bé nhí ch¬ng tr×nh ngoµi lµ bé nhí chØ ®äc ®îc cho
phÐp bëi tÝn hiÖu PSEN . Khi cã 1 EROM ngoµi ®îc sö dông
th× port 0 vµ port 2 ®Òu kh«ng cßn lµ c¸c port xuÊt/ nhËp.
Mét chu kú m¸y cña 8051 cã 12 chu kú dao ®éng. NÕu
mét dao ®éng trªn chip cã tÇn sè 12 MHz, mét chu kú dµi
1µ s. trong mét chu kú m¸y ®iÓn h×nh, ALE cã hai xung vµ 2
byte cña lÖnh ®îc ®äc tõ bé nhí ch¬ng tr×nh.

Hình 5 : Bộ nhớ chương trình ngoài

Truy xuÊt bé nhí d÷ liÖu ngoµi


Bé nhí d÷ liÖu ngoµi lµ bé nhí ®äc/ghi ®îc cho phÐp bëi
c¸c tÝn hiÖu RD vµ WR ë c¸c ch©n P3.7 vµ P3.6, lÖnh dïng
®Ó truy xuÊt bé nhí d÷ liÖu ngoµi lµ MOVX, sö dông hoÆc
con trá d÷ liÖu 16 bit DPTR hoÆc R0, R1 lµm thanh ghi chøa
®Þa chØ.

23
RAM cã thÓ giao tiÕp víi 8051 theo cïng c¸ch nh EPROM
nhng kh¸c lµ ®êng RD nèi víi ®êng cho phÐp xuÊt OE cña
RAM vµ WR nèi víi ®êng ghi W cña RAM. C¸c kÕt nèi víi bus
d÷ liÖu vµ bus ®Þa chØ gièng EPROM, vµ dung lîng RAM
ngoµi lªn ®Õn 64K ®îc kÕt nèi víi 8051.

NÕu cã nhiÒu EPROM hoÆc nhiÒu RAM hoÆc c¶ 2 giao


tiÕp víi 8051 ta cÇn ph¶i cã thªm bé gi¶i m· ®Þa chØ. Mét IC
gi¶i m· ®iÓn h×nh lµ 74HC138 ®îc dïng víi c¸c ngâ ra ®îc nèi
víi c¸c ngâ chän chip CS cña c¸c IC nhí.

24
Ho¹t ®éng Reset

8501 ®îc reset b»ng c¸ch gi÷ ch©n RST ë møc cao tèi
thiÓu 2 chu kú m¸y vµ sau ®ã chuyÓn vÒ møc thÊp. RST cã
thÓ t¸c ®éng b»ng tay hoÆc ®îc t¸c ®éng khi cÇn nguån
b»ng c¸ch dïng mét m¹ch RC. Quan träng nhÊt trong c¸c
thanh ghi nµy cã lÏ lµ thanh ghi PC ®îc n¹p 0000H. Khi RST
trë l¹i møc thÊp, viÖc thùc hiÖn ch¬ng tr×nh lu«n lu«n b¾t
®Çu ë vÞ trÝ ®Çu tiªn trong bé nhí ch¬ng tr×nh: ®Þa chØ
0000H. Néi dung cña RAM trªn chip kh«ng bÞ ¶nh hëng bëi
ho¹t ®éng cña Reset.

Hai m¹ch dïng reset hÖ thèng :

25
a)Reset b»ng tay b) Reset khi cÊp nguån

I.4 Ho¹t ®éng ®Þnh thêi


8051 cã hai bé ®Þnh thêi/®Õm. Chóng cã thÓ ®îc dïng lµm
bé ®Þnh thêi ®Ó t¹o trÔ thêi gian hoÆc lµm c¸c bé ®Õm ®Ó
®Õm c¸c sù kiÖn x¶y ra bªn ngoµi bé vi ®iÒu khiÓn.
I.4.1 C¸c bé ®Þnh thêi cña 8051
8051 cã hai bé ®Þnh thêi lµ Timer 0 vµ Timer 1. C¶ hai bé
®Þnh thêi Timer0 vµ Timer1 ®Òu cã ®é dµi 16 bit. Do 8051
cã cÊu tróc 8 bit, nªn mçi bé ®Þnh thêi ®îc truy cËp díi d¹ng
hai thanh ghi ®éc lËp lµ byte thÊp vµ byte cao.
Thanh ghi cña bé Timer 0: Thanh ghi 16 bit cña bé Timer 0
®îc truy cËp theo hai byte lµ byte cao vµ byte thÊp. Thanh
ghi byte thÊp ®îc gäi lµ TL0 vµ thanh ghi byte cao lµ TH0. C¸c
thanh ghi nµy cã thÓ ®îc truy cËp nh lµ mäi thanh ghi kh¸c.
VÝ dô, lÖnh "MOV TL0, #4FH" lµ chuyÓn gi¸ trÞ 4FH vµo TL0 -
byte thÊp cña bé ®Þnh thêi 0.
Thanh ghi cña bé Timer 1: Bé ®Þnh thêi Timer 1 còng dµi
16 bit vµ thanh ghi 16 bit còng ®îc chia ra thµnh hai byte lµ

26
TL1 vµ TH1. C¸c thanh ghi nµy ®îc truy cËp vµ ®îc ®äc gièng
nh c¸c thanh ghi cña bé Timer 0 ë trªn.
I.4.2 Thanh ghi chÕ ®é bé ®Þnh thêi TMOD
C¶ hai bé ®Þnh thêi Timer 0 vµ Timer 1 ®Òu dïng chung 1
thanh ghi ®îc gäi lµ TMOD ®Ó thiÕt lËp c¸c chÕ ®é lµm viÖc
kh¸c nhau cña bé ®Þnh thêi. Thanh ghi TMOD lµ thanh ghi 8
bit gåm cã 4 bit thÊp dµnh cho bé Timer 0 vµ 4 bit cao dµnh
cho bé Timer 1. Trong ®ã 2 bit thÊp cña chóng dïng ®Ó thiÕt
lËp chÕ ®é cña bé ®Þnh thêi, cßn 2 bit cao dïng ®Ó x¸c
®Þnh phÐp to¸n.
C¸c chÕ ®é ®Þnh thêi vµ cê trµn
Do ta cã hai bé ®Þnh thêi trªn chip 8051, ta dïng ký hiÖu
“x” ®Ó chØ bé ®Þnh thêi 0 hoÆc bé ®Þnh thêi 1. VÝ dô :
THx cã nghÜa lµ TH0 hoÆc TH1 tuú theo bé ®Þnh thêi 0 hay
1.
● ChÕ ®é ®Þnh thêi 13-bit (chÕ ®é 0)
ChÕ ®é 0 lµ chÕ ®é ®Þnh thêi 13-bit cung cÊp kh¶ n¨ng t-
¬ng thÝch víi bé vi ®iÒu khiÓn tiÒn nhiÖm 8048. Byte cao
cña bé ®Þnh thêi THx ®îc ghÐp cascade víi 5-bit thÊp cña
byte thÊp cña bé ®Þnh thêi TLx ®Ó t¹o thµnh mét bé ®Þnh
thêi 13-bit. Ba bit cao cña TLx kh«ng sö dông.
● ChÕ ®é ®Þnh thêi 16-bit (chÕ ®é 1)
ChÕ ®é 1 lµ chÕ ®é ®Þnh thêi 16-bit vµ cã cÊu h×nh
gièng chÕ ®é ®Þnh thêi 13-bit. Xung clock ®Æt vµo c¸c
thanh ghi ®Þnh thêi cao vµ thÊp kÕt hîp (TLx/THx). Khi cã
xung clock ®Õn, bé ®Þnh thêi ®Õm lªn: 0000H, 0001H mét
trµn sÏ xuÊt hiÖn khi cã sù chuyÓn sè ®Õm tõ FFFFH xuèng

27
0000H, sù kiÖn nµy sÏ set cê trµn b»ng 1 vµ bé ®Þnh thêi
tiÕp tôc ®Õm.
● ChÕ ®é tù n¹p l¹i 8-bit (chÕ ®é 2)
ChÕ ®é 2 lµ chÕ ®é tù n¹p l¹i 8-bit. Byte thÊp cña bé ®Þnh
thêi (TLx) ho¹t ®éng ®Þnh thêi 8-bit trong khi byte cao cña
bé ®Þnh thêi lu gi÷ gi¸ trÞ n¹p l¹i. Khi sè ®Õm trµn tõ FFH
xuèng 00H, kh«ng chØ cê trµn cña bé ®Þnh thêi ®îc set lªn 1
mµ gi¸ trÞ trong THx cßn ®îc n¹p vµo TLx. ViÖc ®Õm sÏ tiÕp
tôc tõ gi¸ trÞ nµy cho ®Õn khi x¶y ra mét trµn (FFH xuèng
00H).
● ChÕ ®é ®Þnh thêi chia xÎ (chÕ ®é 3)
ChÕ ®é 3 lµ chÕ ®é ®Þnh thêi chia xÎ vµ cã ho¹t ®éng kh¸c
nhau cho tõng bé ®Þnh thêi. Bé ®Þnh thêi 0 ë chÕ ®é 3 ®îc
chia thµnh 2 bé ®Þnh thêi 8-bit ho¹t ®éng riªng rÏ TL0 vµ
TH0, mçi bé ®Þnh thêi sÏ set c¸c cê trµn t¬ng øng TF0 vµ TF1
khi x¶y ra mét trµn.
I.4.3 Nguån xung clock ®Þnh thêi
Bé ®Þnh thêi lu«n cÇn cã xung ®ång hå ®Ó gi÷ nhÞp. NÕu
C/T = 0 th× tÇn sè th¹ch anh trªn chip 8051 ®îc lµm nguån
cho ®ång hå cña bé ®Þnh thêi. §iÒu ®ã cã nghÜa lµ gi¸ trÞ
cña tÇn sè th¹ch anh cña 8051 quyÕt ®Þnh tèc ®é ®ång hå
cña c¸c bé ®Þnh thêi 8051. TÇn sè cña bé ®Þnh thêi lu«n
b»ng 1/12 tÇn sè cña th¹ch anh trªn chip 8051. NÕu C/T=1 bé
®Þnh thêi b©y giê ®Õm sù kiÖn, sè c¸c sù kiÖn ®îc x¸c
®Þnh trong phÇn mÒm b»ng c¸ch ®äc c¸c thanh ghi ®Þnh
thêi (TLx/THx), gi¸ trÞ 16-bit trong c¸c thanh ghi nµy t¨ng theo
mçi sù kiÖn. Hai ch©n cña port 3 ( P3.4 vµ P3.5) b©y giê trë

28
thµnh ngâ vµo xung clock cho c¸c bé ®Þnh thêi. Ch©n P3.4 lµ
ngâ vµo xung clock cho bé ®Þnh thêi, ch©n P3.5 lµ ngâ vµo
xung clock cho bé ®Þnh thêi 1. NÕu C/T =0 bé ®Þnh thêi
dïng ®Ó ®Þnh thêi mét kho¶ng thêi gian.
I.5 Ho¹t ®éng ng¾t
I.5.1 Tæ chøc ng¾t cña 8051
Cã 5 nguyªn nh©n t¹o ra ng¾t ®èi víi 8051: hai ng¾t do bªn
ngoµi, hai ng¾t do bé ®Þnh thêi vµ mét ng¾t do port nèi
tiÕp. Khi ta thiÕt lËp tr¹ng th¸i ban ®Çu cho hÖ thèng (gäi lµ
reset hÖ thèng), tÊt c¶ c¸c ng¾t ®Òu bÞ v« hiÖu ho¸ vµ sau
®ã chóng ®îc cho phÐp riªng rÏ b»ng phÇn mÒm.
Cho phÐp vµ kh«ng cho phÐp ng¾t
Mçi mét nguyªn nh©n ng¾t ®îc cho phÐp hoÆc kh«ng cho
phÐp riªng rÏ th«ng qua thanh ghi chøc n¨ng ®Æc biÖt ®Þnh
®Þa chØ bit. Thanh ghi cho phÐp ng¾t IE cã ®Þa chØ byte lµ
0A8H. Mçi mét bit cña thanh ghi nµy cho phÐp hoÆc kh«ng
cho phÐp tõng nguyªn nh©n ng¾t riªng rÏ, thanh ghi IE ®ång
thêi cßn cã mét bit toµn côc cho phÐp hoÆc kh«ng cho phÐp
ng¾t.
¦u tiªn ng¾t
Mçi mét nguyªn nh©n ng¾t ®îc lËp tr×nh riªng rÏ ®Ó cã
mét trong hai møc u tiªn th«ng qua thanh ghi chøc n¨ng ®Æc
biÖt ®îc ®Þnh ®Þa chØ bit, thanh ghi u tiªn ng¾t IP, thanh
ghi nµy cã ®Þa chØ lµ 0B8H.
Khi hÖ thèng ®îc thiÕt lËp l¹i tr¹ng th¸i ban ®Çu, thanh ghi
IP sÏ mÆc ®Þnh ®Æt tÊt c¶ c¸c ng¾t ë møc u tiªn thÊp. ý t-
ëng “ c¸c møc u tiªn” cho phÐp mét tr×nh phôc vô ng¾t ®îc

29
t¹m dõng bëi mét ng¾t kh¸c nÕu ng¾t míi nµy cã møc u tiªn
cao h¬n møc u tiªn cña ng¾t hiÖn ®ang ®îc phôc vô. NÕu cã
ng¾t víi møc u tiªn cao xuÊt hiÖn, tr×nh phôc vô ng¾t cho
ng¾t cã møc u tiªn thÊp ph¶i t¹m dõng. Ta kh«ng thÓ t¹m
dõng mét ch¬ng tr×nh phôc vô ng¾t cã møc u tiªn cao.
Chuçi vßng
NÕu cã hai ng¾t cã cïng møc u tiªn xuÊt hiÖn ®ång thêi,
chuçi vßng cè ®Þnh sÏ x¸c ®Þnh ng¾t nµo ®îc phôc vô tríc.
Chuçi vßng nµy sÏ lµ: ng¾t ngoµi 0, ng¾t do bé ®Þnh thêi 0,
ng¾t ngoµi 1, ng¾t do bé ®Þnh thêi 1, ng¾t do port nèi tiÕp.
Ng¾t do port nèi tiÕp lµ kÕt qu¶ OR cña cê ng¾t khi thu RI
(cê ng¾t thu) víi cê ng¾t khi ph¸t (cê ng¾t ph¸t).
I.5.2 Xö lý ng¾t
Khi cã mét ng¾t xuÊt hiÖn vµ ®îc CPU chÊp nhËn, ch¬ng
tr×nh chÝnh bÞ ng¾t. C¸c thao t¸c sau ®©y x¶y ra:
- Hoµn tÊt viÖc thùc thi lÖnh hiÖn hµnh.
- Bé ®Õm ch¬ng tr×nh PC ®îc cÊt vµo stack.
- Tr¹ng th¸i cña ng¾t hiÖn hµnh ®îc lu gi÷.
- C¸c ng¾t ®îc chÆn l¹i ë møc ng¾t.
- Bé ®Õm ch¬ng tr×nh PC ®îc n¹p ®Þa chØ vector cña tr×nh
phôc vô ng¾t ISR (Interrupt Service Routine).
- ISR ®îc thùc thi.
ISR ®îc thùc thi ®Ó ®¸p øng c«ng viÖc cña ng¾t. ViÖc
thùc thi ISR kÕt thóc khi gÆp lÖnh RETI. LÖnh nµy lÊy gi¸ trÞ
cò cña bé ®Õm ch¬ng tr×nh PC tõ stack vµ phôc håi tr¹ng
th¸i cña ng¾t cò. ViÖc thùc thi ch¬ng tr×nh chÝnh ®îc tiÕp
tôc ë n¬i bÞ t¹m ngõng.

30
I.5.3 C¸c vector ng¾t
Khi mét ng¾t ®îc chÊp nhËn, gi¸ trÞ ®îc n¹p cho bé ®Õm
ch¬ng tr×nh PC ®îc gäi lµ vector ng¾t. Vector ng¾t lµ ®Þa
chØ b¾t ®Çu cña tr×nh phôc vô ng¾t cña nguyªn nh©n
ng¾t t¬ng øng. Khi mét tr×nh phôc vô ng¾t ®îc trá tíi, cê
g©y ra ng¾t sÏ tù ®éng ®îc xo¸ vÒ 0 bëi phÇn cøng. C¸c
ngo¹i lÖ bao gåm c¸c cê RI vµ TI ®èi víi c¸c ng¾t trong port
nèi tiÕp.
I.5.4 C¸c ng¾t do port nèi tiÕp
C¸c ng¾t do port nèi tiÕp xuÊt hiÖn khi cê ng¾t ®îc ph¸t
TI hoÆc cê ng¾t ®îc thu RI ®îc set b»ng 1. Mét ng¾t ph¸t
xuÊt hiÖn khi viÖc ph¸t mét ký tù ®· ghi vµo SBUF hoµn tÊt.
Mét ng¾t thu xuÊt hiÖn nh mét ký tù ®îc thu nhËn ®Çy ®ñ
vµ ®ang ë trong SBUF ®Ó chê ®îc ®äc. Nh vËy ng¾t ph¸t
x¶y ra khi bé ®Öm ph¸t SBUF rçng, cßn ng¾t thu x¶y ra khi
bé ®Öm thu SBUF ®Çy.
I.5.5 C¸c ng¾t ngoµi
Ng¾t ngoµi x¶y ra khi cã møc thÊp hoÆc cã c¹nh ©m trªn
ch©n INT0 hoÆc INT1 cña 8051. Thùc tÕ c¸c cê t¹o ra c¸c
ng¾t nµy lµ c¸c bit IE0 vµ IE1 cña thanh ghi TCON. Khi mét
ng¾t ngoµi ®îc t¹o ra, cê t¹o ra ng¾t ®îc xo¸ bëi phÇn cøng
khi CPU trá ®Õn tr×nh phôc vô ng¾t chØ nÕu ng¾t thuéc
lo¹i t¸c ®éng c¹nh. NÕu ng¾t thuéc lo¹i t¸c ®éng møc,
nguyªn nh©n ng¾t ngoµi sÏ ®iÒu khiÓn møc cña thay v× lµ
phÇn cøng trªn chip.

31
CHƯƠNG 2
CÁC THIẾT BỊ NGOẠI VI DÙNG CHO BỘ ĐO VÀ
ĐIỀU KHIỂN NHIỆT ĐỘ

II.1 C¶m biÕn nhiÖt víi lèi ra sè DS1620


DS1620 lµ mét linh kiÖn ®îc thiÕt kÕ ®Ó sö dông vµo
viÖc ®o nhiÖt ®é hoÆc ®iÒu khiÓn nhiÖt ®é (trong các máy
điều chỉnh nhiệt độ hay thường gọi là thermostat). Vì vậy đôi khi còn gọi là
vi mạch nhiệt kế. §Æc ®iÓm næi bËt cña vi m¹ch nµy lµ tÝn
hiÖu ra (chân 1) lµ tÝn hiÖu díi d¹ng sè, ®îc ®a ra Theo khu«n
mẫu 9 bit nèi tiÕp, trong đó chứa các thông tin cho phép hiển thị ra
nhiệt độ của vi mạch. C¸ch s¾p xÕp ch©n vµ gäi tªn cña c¸c
ch©n linh kiÖn ®îc chØ ra trªn h×nh dưới đây. VDD lµ ch©n
nguån thêng ®îc nèi víi ®iÖn ¸p +5v. DQ lµ ch©n xuÊt nhËp
d÷ liÖu. CLK lµ lèi vµo xung nhÞp. RST lµ ch©n lèi vµo Reset.
DS1620 ho¹t ®éng nh mét bé ®iÒu chØnh nhiÖt ®é. THIGH
®îc ®iÒu khiÓn ë møc cao nÕu nhiÖt ®é cña DS1620 lín h¬n
hoÆc b»ng nhiÖt ®é TH do ngêi sö dông ®Æt. T¬ng tù TLOW
®îc ®iÒu khiÓn ë møc HIGH nÕu nhiÖt ®é cña DS1620 nhá
h¬n hoÆc b»ng nhiÖt ®é TL do ngêi dïng quy ®Þnh. TCOM
®îc ®iÒu khiÓn ë møc cao khi nhiÖt ®é vît qu¸ TH vµ vÉn
gi÷ ë møc cao cho tíi khi nhiÖt ®é IC thÊp h¬n TL.

32
V× một vµi th«ng sè c¬ b¶n trªn c¶m biÕn cã thÓ ®îc ngêi
dïng quy ®Þnh lµm cho ph¶n øng cña c¶m biÕn, thÓ hiÖn
trªn d÷ liÖu ®îc xuÊt ra ë ch©n DQ , phï hîp víi ý ®Þnh mµ
ngêi dïng ®Æt ra nªu nªn ë mét møc ®é nµo ®Êy cã thÓ xem
DS1620 nh lµ mét c¶m biÕn th«ng minh.
D÷ liÖu ®îc xuÊt ra nèi tiÕp theo khu«n mÉu 9 bit theo
mét khung truyÒn, trong ®ã bÝt cã träng sè thÊp nhÊt ®îc
xuÊt ra tríc. NhiÖt ®é ®îc ®a ra díi d¹ng m· bï 2 tõ -55°C tíi
125°C, mçi bíc lµ 0.5°C .

● Ho¹t ®éng cña DS1620:


ViÖc nhËp vµo vµ xuÊt ra d÷ liÖu ®îc thùc hiÖn qua ch©n
DQ. Khi lèi vµo RST ë møc cao, d÷ liÖu nèi tiÕp cã thÓ ®îc
ghi hoÆc ®äc tõ linh kiÖn theo hai phÇn. Tríc hÕt mét giao
thøc ®îc göi, sau ®ã lµ d÷ liÖu ®îc ®äc hoÆc ghi. Giao thøc
bao gåm 8 bit d÷ liÖu vµ c¸c ®Þnh nghÜa giao thøc ®îc cho
trong b¶ng 4 . ThÝ dô , ®Ó ghi gi¸ trÞ nhiÖt ®é cÇn æn ®Þnh
TH, tríc hÕt ta göi d÷ liÖu vÒ giao thøc 01 tíi linh kiÖn. Sau

33
khi dïng lÖnh nµy, 9 chu k× ®ång hå tiÕp Theo gi÷ nhÞp cho
9 bit d÷ liÖu nhiÖt ®é giíi h¹n ®Ó ®Æt ngìng cho ho¹t ®éng
cña lèi ra THIGH.
Giao thøc D÷ liÖu giao
thøc
Ghi TH 01
Ghi TL 02
Ghi cÊu h×nh 0C
Ngõng biÕn 22
®æi
§äc TH A1
§äc TL A2
§äc nhiÖt ®é AA
§äc cÊu h×nh AC
B¾t ®Çu EE
chuyÓn ®æi
Thanh ghi cÊu h×nh/tr¹ng th¸i ®îc sö dông ®Ó thiÕt lËp
c¸c chÕ ®é ho¹t ®éng kh¸c nhau cña linh kiÖn. Thanh ghi
nµy ®îc ghi gi¸ trÞ tÝnh theo °C (hệ đếm 16) vµ tr¹ng th¸i ®îc
®äc víi giao thøc AC (cũng hệ đếm 16). Một số bit quan trọng
trong thanh ghi cấu hình/ trạng thái được giải thích như sau:
Bit 0: Đây là chế độ 1 shot. Nếu bit này 1, DS1620 thực hiện một
quá trình chuyển đổi nhiệt độ ngay khi giao thức “bắt đầu chuyển
đổi” được gửi. Nếu bit này bằng 0, DS1620 sẽ thực hiện quá trình
chuyển đổi nhiệt độ liên tục.
Bit 1: Bit này được đặt là 1 để DS1620 hoạt động với vi điều khiển
hoặc vi sử lý.
Bit 5: Đây là bit cờ TLF và nó được đặt là 1 khi nhiệt độ nhỏ hơn hoặc
bằng giá trị TL

34
Bit 6: Đây là bít THF và được đặt là 1 khi nhiệt độ lớn hơn hoặc bằng
giá trị TH
Bit 7: Đây là bit DONE, bit này bằng 1 khi một quá trình chuyển đổi
thực hiện xong.
§Ó lÊy ®îc nhiÖt ®é cña DS1620 th× ta ph¶i khëi t¹o
cho nã ho¹t ®éng, díi ®©y lµ mét c¸ch khëi t¹o :
+ Ghi cÊu h×nh cho DS 1620
+ §Æt giíi h¹n møc cao
+ §Æt giíi h¹n møc thÊp
+ B¾t ®Çu chuyÓn ®æi nhiÖt ®é
NhiÖt ®é ®îc chuyÓn ®æi liªn tôc ®îc chuyÓn ®æi liªn
tôc sau khi khởi tạo
● Mở rộng thiết bị cảm biến nhiệt họ LM34 và LM35
LM34 là họ cảm biến nhiệt, mạch tích hợp, chính xác cao có điện áp đầu
ra
tỷ lệ tuyến tính với nhiệt độ Fahrenheit. Họ này cho điện áp ra thay đổi 10
mV ứng với thay đổi nhiệt độ 1ºC. LM35 cũng là họ cảm biến nhiệt mạch tích
hợp chính xác cao có điện áp đầu ra tỷ lệ tuyến tính với nhiệt độ theo thang
độ
Celsius. Họ cảm biến này cũng không yêu cầu căn chỉnh ngoài vì vốn nó đã
được căn chỉnh. Họ này cho ra điện áp 10mV ứng với thay đổi nhiệt độ là
1ºC. Bảng giới thiệu một số thông số kỹ thuật chính của họ LM34 và LM35

Mã ký hiệu Dải nhiệt độ Độ chính xác Đầu ra


LM34A -55 F to + 300 C + 2.0 F 10mV/F
LM34 -55 F to + 300 C + 3.0 F 10mV/F
LM34CA -40 F to + 230 C + 2.0 F 10mV/F
LM34C -40 F to + 230 C + 3.0 F 10mV/F

35
LM34D -32 F to + 212 C + 4.0 F 10mV/F
LM35A -55 C to + 150 C + 1.0 C 10mV/F
LM35 -55 C to + 150 C + 1.5 C 10mV/F
LM35CA -40 C to + 110 C + 1.0 C 10mV/F
LM35C -40 C to + 110 C + 1.5 C 10mV/F
LM35D 0 C to + 100 C + 2.0 C 10mV/F

Qua bảng trên ta thấy được ưu điểm của cảm biến nhiệt DS1620 là có độ
chính xác tới 0.5 ºC.
II.2 Thiết bị hiển thị LCD
Trong nh÷ng n¨m gÇn ®©y, mµn h×nh tinh thÓ láng
ngµy cµng ®îc sö dông réng r·i vµ ®ang thay thÕ dÇn c¸c
®Ìn LED (7 ®o¹n vµ nhiÒu ®o¹n ) bëi v×:
+ Mµn h×nh LCD cã gi¸ thµnh h¹.
+ Kh¶ n¨ng hiÓn thÞ sè, kÝ tù vµ ®å ho¹ tèt h¬n nhiÒu so
víi ®Ìn LED
+ Sö dông thªm mét bé ®iÒu khiÓn lµm t¬i LCD vµ nh vËy
gi¶i phãng
CPU khái c«ng viÖc nµy, cßn ®Ìn LED lu«n cÇn CPU ®Ó
duy tr× viÖc hiÓn
thÞ d÷ liÖu.
+ DÔ dµng lËp tr×nh c¸c kÝ tù vµ ®å ho¹.
● M« t¶ ch©n cña LCD

36
LCD ë ®©y cã 14 ch©n, chøc n¨ng cña c¸c ch©n ®îc thÓ
hiÖn trong b¶ng
- VCC, VSS lµ ch©n cÊp nguån +5v vµ ch©n ®Êt cßn
ch©n VEE ®îc dïng ®Ó ®iÒu khiÓn ®é t¬ng ph¶n cña LCD.
- RS ch©n chän thanh ghi: cã hai thanh ghi rÊt quan
träng trong LCD. Ch©n RS ®îc dïng ®Ó chän c¸c thanh ghi
nµy. NÕu RS=0 th× thanh ghi m· lÖnh ®îc chän, cho phÐp
ngêi dïng göi mét lÖnh ch¼ng h¹n nh xo¸ mµn h×nh, ®a con
trá vÒ ®Çu dßng. NÕu RS=1 d÷ liÖu ®îc chän vµ cho phÐp
ngêi sö dông göi d÷ liÖu lªn mµn hiÓn thÞ lªn LCD
- R/W ch©n ®äc ghi : ch©n ®äcghi cho phÐp ngêi dïng
®äc ghi th«ng tin tõ / lªn LCD R/W =1 th× ®äc, cßn R/W=0
th× ghi.
- ENABLE ch©n cho phÐp: ch©n cho phÐp ®îc sö dông
®Ó chèt d÷ liÖu. Khi d÷ liÖu ®îc cÊp ®Õn ch©n d÷ liÖu th×
mét xung møc cao xuèng thÊp ®îc ¸p ®Õn ch©n E ®Ó LCD
chèt d÷ liÖu, xung nµy ph¶i cã ®é réng 45m
- D0-D7 §©y lµ ch©n d÷ liÖu 8 bit, ®îc dïng ®Ó göi
th«ng tin lªn LCD ho¨c ®äc néi dung cña thanh ghi trong LCD.

37
§Ó hiÓn thi ch÷ c¸I vµ con sè, m· ASCII cña chóng ®îc göi
®Õn c¸c ch©n nµy va ch©n RS=1. còng cã thÓ sö dông RS
=0 ®Ó kiÓm tra cê bËn xem LCD ®· s½n sµng nhËn th«ng tin
cha . Khi RW=1vµ RS=0 th× cê bËn D7 thùc hiÖn c¸c chøc
n¨ng sau : nÕu D7=1 cã nghÜa lµ LCD ®ang bËn c¸c c«ng
viÖc bªn trong vµ sÏ kh«ng nhËn bÊt cø th«ng tin míi nµo, cßn
nÕu cê bËn D7=0 th× LCD ®· s½n sµng nhËn th«ng tin míi
M« t¶ ch©n cña LCD

M· hexa LÖnh ®Õn thanh ghi cña LCD


1 Xo¸ mµn h×nh hiÓn thÞ
2 Trë vÒ ®Çu dßng
4 dÞch con trá sang tr¸i
5 dÞch hiÓn thÞ sang ph¶i
6 dÞch con trá sang ph¶i
7 DÞch hiÓn thÞ sang tr¸i
8 T¾t con trá, t¾t hiÓn thÞ
A T¾t hiÓn thÞ, bËt con trá
C BËt hiÓn thÞ, t¾t con trá
E BËt hiÓn thÞ, nhÊp nh¸y con
trá
F T¾t con trá nhÊp nh¸y con trá
10 DÞch vÞ trÝ con trá sang tr¸i
14 DÞch vÞ trÝ con trá sang ph¶i
18 DÞch toµn bé hiÓn thÞ sang
tr¸i
1C DÞch toµn bé hiÓn thÞ sang
ph¶i
80 Trë vÒ ®Çu dßng thø nhÊt
C0 Trë vÒ ®Çu dßng thø hai
38 Hai dßng vµ ma trËn 5x7

38
VÝ dô : Muèn göi d÷ liÖu lªn LCD th× lµm theo c¸c bíc :
+ Ch©n RS=0 // chän chÕ ®é ghi
+ Ch©n RW=1 // chän thanh ghi DL
+ D0-D7= d÷ liÖu
+ Ch©n E =1; E=0; xung tõ cao xuèng thÊp
Muèn göi mét lÖnh lªn LCD:
+ Ch©n RS=0 // chän chÕ ®é ghi
+ Ch©n RW=0 // chän thanh ghi DL
+ D0-D7= d÷ liÖu
+ Ch©n E =1; E=0; xung tõ cao xuèng thÊp
Nh vËy chØ víi hai lÖnh ghi d÷ liÖu vµ ghi lÖnh lªn LCD
vµ c¸ch khëi t¹o th× ta cã thÓ lµm ®îc rÊt nhiÒu c«ng viÖc
trªn LCD . VÝ dô nh dÞch toµn bé hiÓn thÞ sang bªn ph¶i mµn
h×nh ho¨c dÞch toµn bé hiÓn thÞ sang bªn tr¸i mµn h×nh,
®Æt hiÓn thÞ t¹i bÊt cø vÞ trÝ nµo trªn mµn h×nh….
Minh häa ghÐp nèi gi÷a LCD víi 8051

39
II.3 Tổng quan về cổng truyền thông RS-232
RS232 là một chuẩn truyền thông nối tiếp cho phép truyền dữ liệu dưới
dạng các bít nối tiếp giữa 2 thiết bị. Qua cổng RS232 dữ liệu được truyền và
nhận theo “dòng bít” nối tiếp từ một điểm tới một điểm khác. Chuẩn RS232
thích hợp với việc truyền dữ liệu trên khoảng cách 25m (ban đầu quy định là
15m) tuy vậy khi truyền trên khoảng cách xa phải sử dụng cáp nối đặc biệt,
được bọc kim và có tổn hao thấp. Có bốn thông số đặc trưng cho việc truyền
theo chuẩn RS232 giữa 2 thiết bị, đó là tốc độ baud, độ rộng dữ liệu, bít chẵn
lẻ, các bít dừng. Các thông số này có thể mô tả vắn tắt như sau:
Tốc độ baud: được xác định bởi lượng thông tin tính bằng bít được truyền
trong khoảng thời gian là 1 giây, nên đơn vị bằng bit/s. Tốc độ baud thường
được lựa chọn giữa 110 và 78.600, tốc độ bằng 9.600 baud có nghĩa là 9.600
bít thông tin được truyền trong mỗi giây.

40
Độ rộng dữ liệu : có thể là 8 bit hoặc 7 bit tùy thuộc vào bản chất của dữ
liệu được truyền.
Bit chẵn lẻ được sử dụng để kiểm tra lỗi và sửa lỗi xuất hiện trong quá trình
truyền hoặc nhận dữ liệu. Bít chẵn lẻ có thể là chẵn hoặc lẻ, cũng có thể
không dùng bit chẵn lẻ .
Bit dừng: là bít được sử dụng để đánh dấu sự kết thúc một khung truyền có
thể sử dụng 1 hoặc 2 bit dừng.
Bit dữ liệu được truyền và nhận theo từng khung, trong một khung bao
gồm :

1 bit bắt đầu 7 hoặc 8 bit dữ liệu 1 bit chẵn lẻ tùy chọn 1 hoặc 2 bit dừng

Trong nhiều trường hợp, 10 bít được sử dụng để hình thành 1 khung truyền,
trong đó bao gồm: 1 bit bắt đầu , 8 bit dữ liệu, không có bit chẵn lẻ và 1 bit
dừng. Thí dụ chữ “A”có mẫu bít ASSCII là : “01000001” và được truyền như
chỉ ra trong hình dưới đây với 1 bít bắt đầu, 8 bít dữ liệu, không có bít chẵn lẻ
và 1 dòng bit dừng. Dữ liệu được truyền theo trình tự : bít có trọng số thấp
nhất được truyền trước tiên, rồi dần tới bít có trọng số cao nhất.
Start 0 1 2 3 4 5 6 P Stop

Tốc độ baud Thời gian bit


300 3.33ms
600 1,66ms
1200 833 μs
2400 416 μs
4800 208 μs
9600 104
19200 52;

41
Khi mười bít được sử dụng để hình thành khung truyền, thời gian cần
thiết để cần truyền hoặc nhận mỗi bít có thể suy ra từ tốc độ baud. Từ bảng
hình vẽ trên cho ta thấy thời gian cần thiết để truyền hoặc nhận 1 bit với
những giá trị tốc độ baud thường được sử dụng.

Hình : Sơ đồ chân cổng nối tiếp

Cổng COM có hai dạng : đầu nối DB25 (25 chân) và đầu nối DB9 (9
chân)

Trong thực tế ta chỉ sử dụng các chân RxD chân TxD và chân GND

Các mức tín hiệu RS 232


Tín hiệu theo chuẩn RS232 là tín hiệu lưỡng cực trong đó điện áp nằm
trong khoảng+3V tới khoảng +15V tương ứng với mức logic 0, còn điện áp
nằm trong khoảng -3V tới -15V ứng với mức logic 1. Nghĩa là ngược so với
quan niệm thông thường về mức logic. Trên thực tế các trạng thái ON và OFF
có thể tạo ra các mức điện áp thấp hơn nhiều so với 15V.

42
Hình : Quy định trạng thái logic của tín hiệu RS-232

Hình 5 : Tên gọi và cách bố trí các chân của vi mạch MAX232.
Các linh kiện logic TTL tiêu chuẩn, trong đó có vi điều khiển 8051 hoạt
động với mức logic TTL, nằm giữa điện áp 0 tới +5V. Vì vậy để ghép nối vi
điều khiển với cổng RS232 cần có một bộ chuyển đổi mức điện áp cụ thể là
chuyển đổi mức điện áp TTL và RS232. Một vi mạch chuyển đổi mức được
sử dụng rộng rãi nhất là loại Max232 có 16 chân được tích hợp thành hai bộ
truyền và hai bộ nhận tín hiệu trên mạch điện , vi mạch này cần có thêm 4 tụ điện

43
loại tụ hóa cỡ 1- 10 microfara, nên chọn các tụ có cùng giá trị giống nhau.
II.3.1 Hệ thống MODBUS
Chế độ truyền
Khi thực hiện Modbus trên các mạng khác như Modbus Plus hoặc MAP,
các thông báo Modbus được đưa vào các khung theo giao thức vận
chuyển/liên kết dữ liệu cụ thể. Ví dụ, một lệnh yêu cầu đọc nội dung các
thanh nghi có thể được sử có thể được thực hiện giữa hai bộ điều khiển ghép
nối qua Modbus Plus.
Đối với các thiết bị ghép nối qua mạng Modbus chuẩn, có thể sử dụng một
trong 2 chế độ truyền là ASCII hoặc RTU. Người sử dụng lựa chọn chế độ
theo ý muốn, cùng với các tham số truyền qua cổng nối tiếp như tốc độ
truyền, parity chẵn/lẻ.vvv.. Chế độ truyền cũng như các tham số phải giống
nhau đối với tất cả các thành viên của một mạng Modbus.
● Chế độ ASCII
Khi các thiết bị trong một mạng Modbus chuẩn giao tiếp với chế độ
ASCII, mỗi byte trong thông báo được gửi thành 2 ký tự ASCII 7 bít, trong đó
mỗi ký tự biểu diễn một chữ số hex. Ưu điểm của chế độ truyền này là nó cho
phép một khoảng thời gian trống tối đa một giây giữa 2 ký tự mà không gây
ra lỗi. Cấu trúc một ký tự khung gửi đi được thể hiện như sau:
Stat 0 1 2 3 4 5 6 P Stop

Mỗi ký tự khung bao gồm


 1 bít khởi đầu (Start bit)
 7 bit biểu diễn một chữ số hex của byte cần gửi dưới dạng ký tự ASCII,
trong bit thấp nhất được gửi đi trước
 1 bit parity chẵn/lẻ, nếu sử dụng parity

44
 1 bit kết thúc (stopbit) nếu sử dụng parity hoặc 2 bit kết thúc nếu không
sử sử dụng parity.
● Chế độ RTU
Khi các thiết bị trong một mạng Modbus chuẩn được đặt chế độ RTU, mỗi
byte trong thông báo được gửi thành một ký tự 8 bit. Ưu điểm chính của chế
độ truyền cao hơn. Tuy nhiên, mỗi thông báo phải được truyền thành một
dòng liên tục. Cấu trúc một ký tự khung gửi được thực hiện như sau:
Mỗi ký tự khung bao gồm
Stat 0 1 2 3 4 5 6 P Stop
• 1 bít khởi đầu (Start bit)
• 8 bit của byte thông báo cần gửi, trong đó bit thấp nhất được gửi đi
trước
• 1 bit parity chẵn/lẻ, nếu sử dụng parity
• 1 bit kết thúc (stopbit) nếu sử dụng parity hoặc 2 bit kết thúc nếu không
sử sử dụng parity.
Cấu trúc bức điện
Một thông báo Modbus gồm nhiều thành phần và có chiều dài có thể khác
nhau.Trong một mạng Modbus chuẩn, nếu một trong hai chế độ truyền
(ASCII hoặc RTU) được chọn, một thông báo sẽ được đóng khung. Mỗi
khung bao gồm nhiều ký tự khung có cấu trúc như được mô tả ở trên. Các ký
tự này sẽ được truyền đi liên tục thành dong ở chế độ RTU, hoặc có thể gián
đoạn với khoảng cách thời gian tối đa một giây ở chế độ ASC11. Mục đích
của việc đóng khung là để đánh dấu khởi điểm và kết thúc của một thông báo,
cũng như bổ xung thông tin kiểm lỗi.Trường hợp thông báo không được
truyền trọn vẹn có thể phát hiện được và báo lỗi.
Hai chế độ truyền ASCII và RTU không những chỉ khác nhau ở cách mã
hóa thông tin gửi đi và cấu trúc ký tự khung, mà còn khác nhau ở cấu trúc một

45
bức điện gửi đi hay nói cách khác là cấu trúc khung thông báo, cũng như biện
pháp kiểm lỗi.
Trong một mạng khác như MAP hay Modicon Plus, giao thức mạng có
quy định riêng về cấu trúc thông báo.Hình thức định địa chỉ và phương thức
truyền cũng hoàn toàn do giao thức mạng cụ thể định nghĩa, vì vậy phần địa
chỉ nằm trong một thông báo một thông báo Modbus có thể trở nên không cần
thiết trong quá trình truyền dẫn. Tuy nhiên, một địa chỉ Modbus sẽ được
chuyển đổi thành một địa chỉ trạm tương ứng của mạng phía dưới.
● Khung ASCII
Trong chế độ ASCII, một thông báo bắt đầu với daauss hai chấm(:), tức ký
tự ASCII 3A, và kết thúc bằng hai dấu quay lại- xuốn dòng (CRLF), tức hai
ký tự ASCII và OA hình dưới, mỗi byte trong thông báo được truyền đi bằng
hai ký tự ASCII, vì vậy các ký tự được phép xuất hiện trong các phần còn lại
của khung là 0-9 va A-F.
Khởi đầu Địa chỉ Mã hàm Dữ liệu Mã LCR Kết thúc
1 ký tự 2 ký tự 2 ký tự n ký tự 2 ký tự 2 ký tự
: CR + LF

Hình: Khung thông báo Modbus chế độ ASCII


Mỗi thiết bị tham gia mạng có trách nhiệm liên tục theo dõi đường truyền
và phát hiện sự xuất hiện của dấu hai chấm. khi dấu hai chấm nhận được thì
hai ký tự tiếp theo sẽ mang địa chỉ của thiết bị được yêu cầu nhận thông báo
hoặc thiết bị đã gửi thông báo đáp ứng, khoảng cách thời gian tối đa cho phép
giữa hai ký tự trong một thông báo là một giây. Nếu vươt quá giá trị này, bên
nhận sẽ coi là có lỗi.
Khung ASCII sử dụng phương pháp LRC để cho việc kiểm lỗi.
● Khung RTU

46
Trong chế độ RTU, một thông báo bắt đầu với một khoảng trống yên lặng
tối thiểu là 3.5 thời gian ký tự. Thực tế, người ta chọn thời gian đó bằng một
số nguyên lần ký tự, như được biểu thị bằng dãy (….) trên hình dưới đây. Ô
đầu tiên được truyền sẽ là 8 bit địa chỉ mã hàm, một số byte tùy ý dữ liệu và
cuối cùng là thông tin kiểm lỗi CRC. Sau khi truyền ký tự cuối cùng của mã
CRC, khung thông báo cũng được kết thúc bằng khoảng trống im lặng tối
thiểu là 3.5 thời gian ký tự, trước khi bắt đầu bằng một thông báo mới. Thực
chất, khoảng trống kết thúc của một thông báo cũng có thể chính là phần khởi
đầu bắt buộc của thông báo tiếp theo.
Khởi đầu Địa chỉ Mã hàm Dữ liệu Mã CRC Kết thúc
(……) 8 bit 8 bit n *8 bit 16 bit (……)
Hình : khung thông báo Modbus chế độ RTU
Khác với chế độ ASCII, toàn bộ khung thông báo RTU phải được
truyền thành một dòng liên tục. Nếu một khoảng trống yên lặng lớn hơn 1.5
lần thời gian ký tự xuất hiện trước khi truyền xong toàn bộ khung thiết bị
nhận sẽ hủy bỏ thông báo chưa đầy đủ đó và cho rằng byte tiếp theo sẽ là một
địa chỉ của thông báo mới.
Phần địa chỉ trong một khung thông báo bao gồm 2 ký tự ASCII hoặc 8
bit RTU
Các giá trị địa chỉ phù hợp trong khoảng 0-247 trong đó địa chỉ 0 dành
riêng cho các thông báo gửi đồng tới tất cả các trạm tớ. Nếu Modbus được sử
dụng trên một mạng khác có thể phương thức gửi đồng loạt không được hỗ
trợ hoặc có thể được thay thế bằng một phương pháp khác. Một thiết bị chủ
sử dụng ô địa chỉ để chỉ định thiết bị nhận thông báo yêu cầu sau khi thực
hiện yêu cầu thiết bị đưa địa chỉ của mình vòa khung thông báo đáp ứng nhờ
vậy thiết bị chủ xác định được thiết bị tớ nào đã trả lời trong một mạng
Modbus chuẩn chỉ có một trạm chủ duy nhất vì thế ô địa chỉ không cần thiết
phải chứa cả địa chỉ trạm gửi và trạm nhận.
Mã hàm

47
Giống như địa chỉ, phần mã hàm trong một thông báo bao gồm hai ký tự
(ASCII) hoặc 8 bit (RTU). Các giá trị hợp lệ nằm trong khoảng từ 1-255,
trong đó các mã hàm trong thông báo yêu cầu chỉ được phép từ 1-277.
Tuy nhiên, hầu hết các thiết bị chỉ hỗ trợ một phần nhỏ số hàm trên và một số
mã hàm được dữ trữ cho sau này.
Khi một thông báo gửi từ thiết bị chủ tớ một thiết bị tớ, mã hàm chỉ
định hành động mà thiết bị tớ cần thực hiện. Khi thiết bị tớ trả lời, nó cũng
dùng chính mã hàm đó trong thông báo đáp ứng bình thường. Trong trường
hợp xảy ra lỗi, mã hàm trả lại sẽ là mã hàm trong yêu cầu với bit cao nhất
được băng 1 và phần dữ liệu sẽ chứa thông tin chi tiết về lỗi đã Trong
một thông báo yêu cầu, nội dung phần dữ liệu nói lên chi tiết hành động mà
bên nhận cần thực hiện. Ví dụ trong một yêu cầu đọc các thanh nghi thì phần
dữ liệu chứa thông tin về địa chỉ thanh ghi đầu tiên, số lượng các thanh ghi
cần đọc và chiều dài thực tế của chính phần dữ liệu.
Trong trường hợp bình thường, phần dữ liệu trong thông báo đáp ứng
sẽ chứa kết quả của hành động đã thực hiện, ví dụ nội dung các thanh ghi đã
đọc. Nếu xảy ra lỗi, phần dữ liệu chứa mã ngoại lệ nhờ đó mà thiết bị chủ xác
định hành động tiếp theo cần thực hiện. Lưu ý rằng, một số hàm không đòi
hỏi tham số, vì vậy phần dữ liệu có thể trống.
Bảo toàn dữ liệu
Mạng Modbus chuẩn sử dụng hai biện pháp bảo toàn dữ liệu ở hai mức:
kiểm soát khung thông báo và kiểm soát ký tự khung. Đối với hai chế độ
truyền ASCII hay RTU, có thể lựa chọn kiểm tra bit chẵn/lẻ cho từng ký tự
chung. Hơn thế nữa, cả khung thông báo lại đươc kiểm soát một lần nữa bằng
mã LRC (chế độ ASCII) hoặc mã CRC (chế độ RTU).
Khi đặt cấu hình cho một thiết bị chủ, có thể chọn một khoảng thời gian
timeout mà nó có thể chờ đợi đáp ứng từ trạm tớ, khoảng thời gian này cần
phải đủ lớn để bất cứ thiết bị tớ nào cũng có thể trả lời trong điều kiện bình
thường. Trường hợp thiết bị tớ phát hiện lỗi ở thông báo yêu cầu, nó sẽ không

48
trả lời. Vì thế thiết bị chủ cũng tự động nhận biết lỗi và chương trình chủ sẽ
có trách nhiệm thực hiện các hành động cần thiết. Lưu ý rằng, một thông báo
gửi tới địa chỉ một trạm không tồn tại cũng sẽ gây ra timeout.
Các mạng khác như MAP hoặc Modbus Plus sử dụng biện pháp kiểm
lỗi riêng cho cả khung ( bao gồm cả nội dung thông báo Modbus ), vì vậy các
ô CRC hoặc LRC không được đưa vào trong khung thông báo Modbus
nguyên bản. Trong trường hợp xảy ra lỗi truyền, giao thức mạng cụ thể sẽ báo
với thiết bị gửi và cho phép thực hiện gửi lại. Nếu thông báo được gửi tới đích
nhưng trạm tớ không thể trả lời, lỗi timeout cũng sẽ được chương trình chủ
phát hiện.
● Kiểm soát LRC
Trong chế độ ASCII, phần thông tin kiểm lỗi của khung thông báo dựa
trên phương pháp LRC ( Longitudinal Redundancy Check). Dãy bit nguồn
được áp dụng để tính mã LRC bao gồm phần địa chỉ, mã hàm và phần dữ liệu.
Các ô khởi đầu cũng như kết thúc khung không tham gia vào tính toán. Mã
LRC ở đây dài 8 bit ( truyền hai ký tự ASCII), được tính bằng cách cộng đại
số toàn bộ các byte của dãy bit nguồn ( không để ý tới tràn), sau đó lấy phần
bù hai của kết quả.
● Kiểm soát CRC
Mã CRC được áp dụng trong chế độ RTU dài 16 bit. Đa thức phát được
sử dụng G = 1010 0000 0000 0001. Khi đưa vào khung thông báo, byte thấp
của mã CRC được gửi đi trước, tiếp sau là byte cao.

CHƯƠNG 3
MỞ RỘNG PHẦN TRUYỀN THÔNG NỐI TIẾP

III.1 Lập trình truyền thông nối tiếp cho 8051


a) Một số thanh ghi truyền thông nối tiếp

49
Khi muốn tiến hành truyền thông qua cổng RS232, cụ thể là đưa cổng
RS-232 vào sử dụng, chúng ta cần phải tìm hiểu về một số thanh ghi truyền
thông nối tiếp của 8051.
 Thanh ghi SBUF
SBUF là thanh ghi 8 bit được dùng cho truyền thông nối tiếp của 8051. Để
byte dữ liệu được truyền qua đường TxD thì cần đặt dữ liệu trong thanh ghi
SBUF. Tương tự, SBUF lưu một byte dữ liệu khi nó được nhận qua đường
RxD 8051. SBUF có thể được mọi thanh ghi của 8051 truy cập.
Ví dụ SBUF = ‘A’; nạp mã ASCII của A vào SBUF
P2 = SBUF; lưu giá trị của SBUF ra cổng P2
Khi byte dữ liệu được ghi vào thanh ghi SBUF thì bute sẽ được định khung
với bit Start và bit Stop được truyền nối tiếp qua chân TxD. Tương tự như vậy
khi các bit được nhận từ chân RxD thì 8051 mở khung tức là loại trừ các bít
Start và bit Stop để lấy ra một byte dữ liệu nhận được và đặt vào thanh ghi
SBUF.
 Thanh ghi điều khiển nối tiếp SCON

SCON là thanh ghi 8 bit được dùng cho một số công việc, trong đó có lập
trình bit khởi động Start, bit dừng Stop và các bit dữ liệu khi định khung dữ
liệu. Sau đây là mô tả các bit của SCON
SM0,SM1 các bít này xác định các chế độ khung dữ liệu bằng cách xác
định số bít của một kí tự và các bít Start và Stop. Tổ hợp của chúng là :
SM0 SM1
0 0 chế độ nối tiếp 0
0 1 chế độ nối tiếp 1, 8 bit dữ liệu,Start,Stop

50
1 0 chế độ nối tiếp2
1 1 chế độ nối tiếp 3
Trong bốn chế độ trên thì chúng ta chỉ quan tâm đến chế độ 1. Ở chế độ 1 dữ
liệu được định khung gồm 8 bit dữ liệu 1 bit Start và 1 bit Stop không dùng
bit chẵn lẻ để tương thích với cổng COM của máy tính . Đáng chú ý hơn nữa
là chế độ 1 cho phép tốc độ baud thay đổi và do Timer1 của 8051 thiết lập.
Như vậy ở chế độ 1 thì mỗi kí tự gồm có 10 bit được truyền, trong đó đầu tiên
là bit Start sau đó là 8 bit dữ liệu kết thúc là bit Stop.
REN là bit cho phép thu.Khi bit REN ở mức cao thì nó cho phép 8051
thu dữ liệu trên chân RxD. Như vậy nếu muốn 8051 vừa thu vừa phát thì phải
đặt bit REN lên 1.Thanh ghi SCON là thanh ghi định địa chỉ bít nên có thể
SET hoặc CLEAR bit REN này.
TI và RI
Ngắt phát(TI) và ngắt thu (RI) là các bit cờ rất quan trọng trong thanh ghi
SCON . Khi 8051 kết thúc phát một kí tự 8 bit thì cờ TI được bật lên 1 để báo
rằng bộ vi điều khiển sẵn sàng phát byte tiếp theo. Bit RI được bật khi bắt đầu
bít Stop. Khi 8051 nhận dữ liệu nối tiếp qua chân RxD thì tiến hành tách các
bit Start và bit Stop để lấy 8 bit dữ liệu và đặt vào thanh ghi SBUF. Sau khi
quá trình này hoàn tất thì cờ RI =1để báo rằng bộ vi điều khiển đã nhận xong
1byte và cần phải được cất đi nếu không sẽ bị mất. Cờ RI được bật khi đang
tách bit Stop .

b) Lập trình truyền, nhận dữ liệu nối tiếp


 Các bước khi lập trình 8051 truyền các byte kí tự nối tiếp như sau :
+B1: Nạp giá trị 20H vào thanh ghi TMOD báo sử dụng timer1 ở chế độ 2
để thiết lập chế độ baud.

51
+B2: Nạp giá trị cho thanh ghi Th1 để thiết lập tốc độ baud truyền dữ liệu nối
tiếp (với thạch anh 11.0592 thì TH1=0xfd )
+B3: Nạp giá trị 50H vào thanh ghi SCON báo chế độ nối tiếp 1 để định
khung 8 bit dữ liệu 1 bit Start và 1 bit Stop
+B4: Bật TR1 để khởi động Timer1
+B5: xóa cờ TI bằng lệnh TI = 0 ;
+B6: Ghi byte dữ liệu cần truyền vào SBUF
+B7: Kiểm tra cờ TI để báo hoàn tất việc truyền kí tự
+B8: Quay trở lại bước 5 để truyền kí tự tiếp theo
Đoạn chương trình sau giới thiệu về cách khởi tạo cổng nối tiếp
Void serial_init()
{ SCON=0X50; // chế độ 8 bit dữ liệu, 1 bit stop, không có
TMOD=0X20; // chẵn lẻ.
TH1=0XFD;
TR1=1;
TI=1;
}
Sau khi đã khởi tạo được cổng nối tiếp thì chúng ta có thể truyền nhận dữ liệu
trên cổng COM.
Đoạn chương trình về truyền dữ liệu
Void transmit()
{ SBUF = data;
While(TI= = 0)
{ }
SBUF=data;
TI=0;
}

52
 Các bước lập trình nhận dữ liệu nối tiếp
+B1: nạp giá trị 20h vào thanh ghi TMOD báo sử dụng bộ timer1 chế độ 2 tự
nạp lại để thiết lập tốc độ baud.
+B2: Nạp giá trị 0xfd vào thanh ghi TH1 để tạp ra tốc độ baud với giả thiết
tần số thạch anh là 11,0592 Mhz.
+B3: Nạp giá trị 50 h vào thanh ghi SCON báo sử dụng chế độ 1 truyền nối
tiếp định khung dữ liệu là 1 bit Start , 8 bit dữ liệu và 1 bit Stop.
+B4: Bật TR1=1 để khởi động timer1
+B5: Xóa cờ ngắt RI.
+B6: Kiểm tra bít cờ ngắt RI để xem đã nhận được toàn bộ kí tự chưa.
+B7: Khi cờ RI đã được bật thì thực hiện lấy dữ liệu từ thanh ghi SBUF
+B8: Quay trở lại B5 để thực hiện nhận kí tự tiếp theo.
Đoạn chương trình sau giới thiệu về nhận dữ liệu sau khi đã khởi tạo được
cổng COM.
Serial_init ( );
Void receiver()
{ while(RI= =0)
{ } // chờ cho đến khi nhận được một byte thì lấy dữ
Data=SBUF; // liệu ở thanh ghi đệm và xóa cờ RI
RI=0;
}
Từ trên nhận thấy rằng vai trò của hai cờ TI và RI như:

+Cờ TI : thông qua việc kiểm tra cờ TI ta có thể biết được 8051 đã sẵn sàng
truyền một byte . Cờ TI được bật khi đã hoàn tất việc truyền một byte dữ liệu,
còn xóa cờ TI là do người lập trình thực hiện bằng lệnh TI = 0. Chú ý rằng

53
khi cờ TI đang được bật hoặc chưa bật thì có thể gây ra mất dữ liệu. Có thể
kiểm tra cờ TI bằng lệnh “ while (TI = = 0) { } ”. Hoặc sử dụng ngắt .
+Cờ RI : Thông qua việc kiểm tra cờ RI mà ta có thể biết được 8051 đã nhận
đầy đủ 1 byte hay chưa. Cờ RI được bật lên khi đã có một byte dữ liệu nhận
nhận được nằm trong thanh ghi SBUF và chờ cho lập trình viên lấy dữ liệu đó
ra và thực hiện việc xóa cờ RI đi để cho việc nhận dữ liệu lần tiếp theo. Chú ý
nếu không lấy dữ liệu trên thanh ghi SBUF ngay thì ta có thể bị mất dữ liệu
khi đã xóa cờ RI. Có thể dùng ngắt để kiểm tra cờ RI.
Như ở các phần trên chúng ta liên tục kiểm tra trạng thái của 8051 và vì vậy
không thể làm được các thao tác khác trong thời gian này. Đây là một điều
lãng phí. Ở 8051 cung cấp các ngắt và vì vậy chúng ta có thể để cho vi điều
khiển thực hiện nhiều việc ( không phải là đồng thời cùng một lúc nhưng nó
có mức ưu tiên ). Vì vậy chương mục tiếp theo em xin được giới thiệu về
phương pháp ngắt.
III.2 Truyền thông nối tiếp dùng ACTIVE

Mô tả

Việc truyền thông nối tiếp trên Windows được thực hiện thông qua một
ActiveX có sẵn là Microsoft Comm Control.. ActiveX này dược lưu trữ trong
file MSCOMM32.OCX. Quá trình này có hai khả năng thực hiện điều khiển
trao đổi thông tin:
-Điều khiển sự kiện:

Truyền thông điều khiển sự kiện là phương pháp tốt nhất trong quá trình
điều khiển việc trao đổi thông tin. Quá trình điều khiển thực hiện thông qua
sự kiện OnComm.

-Hỏi vòng:

Quá trinh điều khiển bằng phương pháp hỏi vòng thực hiện thông qua

54
kiểm tra các giá trị của thuộc tính CommEvent sau một chu kỳ nào đó để xác
định xem có sự kiện nào xảy ra hay không. Thông thường phương pháp này
sử dụng cho các chương trình nhỏ.

ActiveX MsComm được bổ sung vào một Visual Basic Project thông qua
menu Project > Components:

Hình 4.5 – Bổ sung đối tượng MsComm vào VBP Biểu :

• và các thuộc tính cơ bản mô tả như sau: Hình 4.6 – Các thuộc tính của
đối tượng MSComm

Thuộc tính Mô tả
CommPort Số thứ tự cổng truyền thông
Input Nhận ký tự từ bộ đệm
Output Xuất ký tự ra cổng nối tiếp
PortOpen Mở / đóng cổng

55
Settings Xác định các tham số truyền

Các thuộc tính


. Settings:

Xác định các tham số cho cổng nối tiếp. Cú pháp:

MSComm1.Settings = ParamString
MSComm1: tên đối tượng ParamString: là một chuỗi có dạng như sau:
"BBBB,P,D,S" BBBB: tốc độ truyền dữ liệu (bps) trong đó các giá trị hợp lệ là:

` 2400 38400
300 9600 (măc định) 56000
600 14400 188000
120
19200 256000
0

56
P: kiểm tra chẵn lẻ, với các giá trị:

Giá trị Mô tả
O Odd (kiểm tra lẻ)
E Even (kiểm tra chẵn)
M Mark (luôn bằng 1)
S Space (luôn bằng 0)
N Không kiểm tra

D: số bit dữ liệu (4, 5, 6, 7 hay 8), mặc định là 8 bit


S: số bit stop (1, 1.5, 2)VD:MSComm1.Settings = "9600,O,8,1" sẽ
xác định tốc độ truyền 9600bps,

kiểm tra parity chẵn với 1 bit stop và 8 bit dữ liệu.


. CommPort:
Xác định số thứ tự của cổng truyền thông, cú pháp:
MSComm1.CommPort = PortNumber
PortNumber là giá trị nằm trong khoảng từ 1  99, mặc định là
1.VD:MSComm1.CommPort = 1 xác định sử dụng COM1
. PortOpen:

Đặt trạng thái hay kiểm tra trạng thái đóng / mở của cổng nối tiếp. Nếu dùng
thuộc tính này để mở cổng nối tiếp thì phải sử dụng trước 2 thuộc tính
Settings và CommPort. Cú pháp:

MSComm1.PortOpen = True | False

Giá trị xác định là True sẽ thực hiện mở cổng và False đểđóng cổng đồng thời
xoá nội dung của các bộđệm truyền, nhận.

VD: Mở cổng COM1 với tốc độ truyền 9600 bps


MSComm1.Settings = "9600,N,8,1" MSComm1.CommPort =
1MSComm1.PortOpen = True

57
Các thuộc tính nhận dữ liệu:Input: nhận một chuỗi ký tự và xoá khỏi
bộđệm. Cú pháp:
InputString = MSComm1.Input

Thuộc tính này kết hợp với InputLen để xác định số ký tựđọc vào. Nếu
InputLen = 0 thì sẽđọc toàn bộ dữ liệu có trong bộđệm.

InBufferCount: số ký tự có trong bộđệm nhận. Cú pháp:

Count = MSComm1.InBufferCount

Thuộc tính này cùng dược dùng để xoá bộđệm nhận bắng cách gán giá trị 0.

MSComm1.InBufferCount = 0

InBufferSize: đặt và xác định kích thước bộđệm nhận (tính bằng byte). Cú
pháp:

MSComm1.InBufferCount = NumByte

Giá trị măc định là 1024 byte. Kích thước bộđệm này phải đủ lớn để tránh
tình trạng mất dữ liệu.

VD: Đọc toàn bộ nội dung trong bộđệm nhận nếu có dữ liệu
MSComm1.InputLen = 0
If MSComm1.InBufferCount <> 0 Then
InputString = MSComm1.Input
End If
Các thuộc tính xuất dữ liệu:

Bao gồm các thuộc tính Output, OutBufferCount và OutBufferSize,


chức năng của các thuộc tính này giống như các thuộc tính nhập.

. CDTimeout:

Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) từ lúc phát hiện

58
sóng mang cho đến lúc có dữ liệu. Nếu quá khoảng thời gian này mà vẫn chưa
có dữ liệu thì sẽ gán thuộc tính CommEvent là CDTO (Carrier Detect
Timeout Error) và tạo sự kiện OnComm. Cú pháp:

MSComm1.CDTimeout = NumTime

. DSRTimeout:

Xác định thời gian chờ tín hiệu DSR trước khi xảy ra sự kiện OnComm.

. CTSTimeout:

Đặt và xác định khoảng thời gian lớn nhất (tính bằng ms) đợi tín hiệu CTS
trước khi đặt thuộc tính CommEvent là CTSTO và tạo sự kiện OnComm. Cú
pháp:

MSComm1.CTSTimeout = NumTime

. CTSHolding:

Xác định đã có tín hiệu CTS hay chưa, tín hiệu này dùng cho quá trình bắt
tay bằng phần cứng (cho biết DCE sẵn sàng nhận dữ liệu), trả về giá trị True
hay False.

. DSRHolding:

Xác định trạng thái DSR (báo hiệu sự tồn tại của DCE), trả về giá trị True
hay False.

. CDHolding:

Xác định trạng thái CD, trả về giá trị True hay False.

. DTREnable:

Đặt hay xoá tín hiệu DTR để báo sự tồn tại của DTE. Cú pháp:

MSComm1.DTREnable = True | False

. RTSEnable:

59
Đặt hay xoá tín hiệu RTS để yêu cầu truyền dữ liệu đến DTE. Cú pháp:

MSComm1.RTSEnable = True | False

. NullDiscard:

Cho phép nhận các ký tự NULL (rỗng) hay không (= True: cấm). Cú pháp:

MSComm1.NullDiscard = True | False

. SThreshold:
Số byte trong bộđệm truyền làm phát sinh sự kiện OnComm. Nếu giá trị
này bằng 0 thì sẽ không tạo sự kiện OnComm. Cú pháp:

MSComm1.SThreshold = NumChar

. HandShaking:

Chọn giao thức bắt tay khi thực hiện truyền dữ liệu. Cú pháp:

MSComm1.HandShaking = Protocol

Các giao thức truyền bao gồm:

Protocol Giá trị Mô tả


ComNone 0123 Không băt tay (mặc định) Bắt
ComXon/Xoff tay phần mềm (Xon/Xoff) Bắt
ComRTS tay phần cứng (RTS/CTS) Bắt
ComRTSXon/Xoff tay phần cứng và phàn mềm
. CommEvent:

Trả lại các lỗi truyền thông hay sự kiện xảy ra tại cổng nối tiếp

Các sự kiện:

Sự kiện Giá trị Mô tả


ComEvSend 1 Đã truyền ký tự
ComEvReceive 2 Khi có ký tự trong bộ đệm nhận
ComEvCTS 3 Có thay đổi trên CTS (Clear To Send)

60
ComEvDSR 4 Có thay đổi trên DSR (Data Set Ready)
ComEvCD 5 Có thay đổi trên CD (Carrier Detect)
ComEvRing 6 Phát hiện chuông
ComEvEOF 7 Nhận ký tự kết thúc file
Các lỗi truyền thông

Lỗi Giá trị Mô tả


ComBreak 1001 1002 Nhận tín hiệu Break Carrier Detect
ComCTSTO 1004 1006 Timeout Lỗi khung Phần cứng không
ComFrame 1007 1008 đọc ký tự trước khi gởi ký tự kếCarrier
ComOver 1009 1010 Detect Timeout Tràn bộđệm nhận Lỗi
ComCDTO parity Tràn bộđệm truyền
ComRxOver
ComRxParity
ComTxFull

Khi thực hiện giao tiếp với vi điều khiển, ta phải dùng thêm mạch chuyển
mức logic từ TTL-232 và ngược lại. Các vi mạch thường sử dụng là MAX232
của Maxim. Mạch chuyển mức logic mô tả như sau:

Hình 4.9 – Mạch chuyển mức logic TTL ↔ RS232

61
Tuy nhiên, khi sử dụng mạch chuyển mức logic dùng các vi mạch thì đòi
hỏi phải dùng chung GND giữa máy tính và vi mạch có khả năng làm hỏng
cổng nối tiếp khi xảy ra hiện tượng chập mạch ở mạch ngoài. Do đó, ta có thể
dùng thêm opto 4N35 để cách ly về lập trình cho cổng nối tiếp
Khi muốn tiến hành truyền thông qua cổng RS232, cụ thể là đưa cổng RS-
232 vào sử dụng, ta cần phải đặt giá trị cho một số thanh ghi khác nhau :
SCON: đây là thanh ghi điều khiển cổng nối tiếp. Cần đặt giá trị thập lục là
0x50 dùng trong chế độ dữ liệu 8 bit.
TMOD: thanh ghi này điều khiển các bộ định thời để thiết lập tốc độ baud và
ta cần phải đặt giá trị thập lục phân 0x20 để cho phép timer1 hoạt động ở chế
độ 8 bit tự nạp lại.
TH1: thanh ghi này cần được nạp vào một hằng số sao cho tốc độ baud cần có
được thích hợp. bảng sau giới thiệu các giá trị cần được nạp vào thanh ghi TH1 và
các tốc độ baud tương ứng dùng cho cả hai tốc độ xung nhịp khác nhau:
Đoạn chương trình sau giới thiệu về cách khởi tạo cổng nối tiếp
Void serial_init()
{ SCON=0X50; // chế độ 8 bit dữ liệu, 1 bit stop, không có
TMOD=0X20; // chẵn lẻ.
TH1=0XFD;
TR1=1;
TI=1;
}
Đoạn chương trình sau giới thiệu về nhận dữ liệu
Void receiver()
{ while(RI= =0)
{ }
Data=BUFE;

62
RI=0;
}
Đoạn chương trình tiếp theo là nói về truyền dữ liệu đi
Void transmit()
{ BUFE = data;
While(TI= = 0)
{ }
BUFE=data;
TI=0;
}
II.3 Truyền thông giữa hai nút
Các sơ đồ khi kết nối dùng cổng nối tiếp:

DTE1 DTE2 DTE DCE


Hình II.3.1 – Kết nối đơn giản trong truyền thông nối tiếp
Khi thực hiện kết nối như trên, quá trình truyền phải bảo đảm tốc độ ở đầu
phát và thu giống nhau. Khi có dữ liệu đến DTE, dữ liệu này sẽ được đưa vào
bộ đệm và tạo ngắt. Ngoài ra, khi thực hiện kết nối giữa hai DTE, ta còn dùng
sơđồ sau:

63
DTE1 DTE2

Hình II.3.2 – Kết nối trong truyền thông nối tiếp dùng tín hiệu bắt tay

Khi DTE1 cần truyền dữ liệu thì cho DTR tích cực tác động lên DSR của
DTE2 cho biết sẵn sàng nhận dữ liệu và cho biết đã nhận được sóng mang của
MODEM (ảo). Sau đó, DTE1 tích cực chân RTS để tác động đến chân CTS
của DTE2 cho biết DTE1 có thể nhận dữ liệu. Khi thực hiện kết nối giữa DTE
và DCE, do tốc độ truyền khác nhau nên phải thực hiện điều khiển lưu lượng.
Quá trình điều khiển này có thể thực hiện bằng phần mềm hay phần cứng.
Quá trình điều khiển bằng phần mềm thực hiện bằng hai ký tự Xon và Xoff.
Ký tự Xon được DCE gởi đi khi rảnh (có thể nhận dữ liệu). Nếu DCE bận thì
sẽ gởi ký tự Xoff. Quá trình điều khiển bằng phần cứng dùng hai chân RTS và
CTS. Nếu DTE muốn truyền dữ liệu thì sẽ gởi RTS để yêu cầu truyền, DCE
nếu có khả năng nhận dữ liệu (đang rảnh) thì
CHƯƠNG 4
THIẾT KẾ CHƯƠNG TRÌNH

IV.1 Giới thiệu phần mềm lập trình keilC

64
Có thể nói C là một ngôn ngữ lập trình bậc cao được sử dụng rất rộng rãi
và đa năng, chương trình viết ra rất hiệu quả và chặt chẽ, đồng thời cho phép
thể hiện rõ tính có cấu trúc của chương trình. Thực tế cho thấy đối với nhiều
vấn đề ứng dụng liên quan đến điều khiển và giám sát, việc lựa chọn sử dụng
ngôn ngữ C tỏ ra hiệu quả hơn so với bất kỳ một ngôn ngữ nào khác. Ngôn
ngữ C đã được phát triển để dùng cho máy tính lớn, máy tính mini và cả máy
tính cá nhân. Cho đến ngày nay, ngôn ngữ lập trình C còn có thể sử dụng cho
hầu hết các vi điều khiển và vi sử lý.
Chương này viết ra không phải để hướng dẫn học ngôn ngữ lập trình C, mà
xem như ta đã thông thạo với việc lập trình C. Mục đích chính của chương
này là giới thiệu những đặc điểm riêng của ngôn ngữ C khi sử dụng để lập
trình cho các vi điều khiển. Trong trình dịch C được tối ưu hóa thành các trình
dịch dùng cho vi điều khiển, chẳng hạn với MCS- 51 là C51 theo tiêu chuẩn
công nghiệp sẽ được sử dụng xuyên suốt trong nhiều ứng dụng.
Cho đến nay, đã có nhiều trình dịch ngôn ngữ bậc cao khác nhau được sử
dụng cho vi điều khiển, chẳng hạn như các trình dịch PASCAL, BASIC,
BASCOM và các trình dịch C khác. Có một trình dịch được nhiều người biết
đến khi làm việc với các vi điều khiển thuộc họ 8051 là C51. Đây là một
trong số các trình dịch đáp ứng tiêu chuẩn công ngiệp và được sử dụng rộng
rãi nhất cho họ 8051 và có thể tạo ra mã máy cho hầu hết các vi điều khiển 8051
với 20 chân và 40 chân, cũng như các thế hệ mới của vi điều khiển sau đây :
• Intel 8051, 80C51 và 87C51 hoặc của các công ty khác
• Atmel 89C51, 89C52, 89C55, 89S8252 và 89S53
• Atmel 89CI051 và 89C2051
• AMD 80C321, 80C521 và 80C541
• Dallas 80C320, 80C520 và 80C530
• Signetics 8xC750, 8xC751 và 8xC752

65
• Siemens 80C517 và 80C537
Có thể nói C51 là một trình dịch mang tính chuyên nghiệp, đáp ứng tiêu chuẩn
công nghiệp với nhiều đặc tính hấp dẫn, bao gồm một số lớn các hàm dựng sẵn.
Các kiểu dữ liệu
Trình dịch C51 tạo ra các kiểu dữ liệu C tiêu chuẩn và bổ xung thêm một
vài kiểu dữ liệu mở rộng được giới thiệu để hỗ trợ cho họ vi điều khiển 8051.
Bảng sau liệt kê danh sách các kiểu dữ liệu thường gặp
Kiểu dữ liệu Lượng bit Vùng giá trị
Bit 1 0 hoặc 1
Signed char 8 -128 tới+127
Unsigned char 8 0 tới +255
Enum 16 -32768 tới 32767
Signed short 16 -32768 tới 32767
Unsigned short 16 0 tới 65535
Signed int 16 -32768 tới 32767
Unsigned int 16 0 tới 65535
Signed long 32 -2147483648 tới +2147483647
Unsigned long 32 0 tới 4294967295
Float 32
Sbit 1 0 hoặc 1
Sfr 8 0 tới 255
Sfr16 16 0 tới 65535
Một số kiểu dữ liệu được mô tả tương đối chi tiết trong phần tiếp theo đây.
Kiểu dữ liệu này có thể được sử dụng để khai báo các biến một bit
Thí dụ
Bit my_flag;
my_flag=1;
Signed char/ unsigned char
Các kiểu dữ liệu này giống như trong ngôn ngữ C tiêu chuẩn và được sử
dụng để khai báo các biến kí tự có dấu và không có dấu. Mỗi biến kí tự có độ
dài là 1 byte. Phạm vi giá trị biến kí tự có dấu nằm trong khoảng từ -128 đến
+127; còn giá trị các biến kí tự không có dấu bao gồm từ 0 tới 255.

66
Thí dụ :
Unsigned char var1,var2; // khai báo 2 biến var1 và var2
var1=0x89; // gan gia tri 0x89 cho biến var1
var2=var1; // gán giá trị của biến var1 cho biến var2
Signed short / unsigned short
Các kiểu dữ liệu này giống như trong ngôn ngữ C tiêu chuẩn và được sử
dụng để khai báo các biến short có dấu và các không có dấu. Mỗi biến short
có độ dài 2 byte. Phạm vi các biến short có dấu nằm trong khoảng từ -32.768
tới +32.767 còn phạm vi các biến short không có dấu nằm trong khoảng từ 0
tới 65.535.
thí dụ
unsigned short temp ; // khai biến temp là dạng không dấu
unsigned short bien ; // tương tự như trên
temp =0x0c20; // gán giá trị 0c20 cho biến temp
bien=temp; // gán giá trị của temp cho bien
Signed int / unsigned int
Giống như trong ngôn ngữ C tiêu chuẩn, các kiểu dữ liệu này được sử
dụng để khai báo các biến nguyên có dấu và không có dấu. Các biến nguyên
có độ dài là 2 byte Phạm vi các biến short có dấu nằm trong khoảng từ
-32.768 tới +32.767 còn phạm vi các biến short không có dấu nằm trong
khoảng từ 0 tới 65.535.
Thí dụ
unsigned int n1 , n2; // khai báo 2 biến thuộc kiểu nguyên không dấu
n1=10; // gán giá trị 10 cho biến n1
n2=n1+2; // cộng n1 với 2 rồi đưa vào biến n2
n2=n2+n1; // cộng n1 với n2 rồi đưa vào n2
Signed long / unsigned long

67
Các kiểu dữ liệu này giống như trong ngôn ngữ C tiêu chuẩn và được sử
dụng để khai báo các biến nguyên có dấu và không có dấu. Mỗi biến long
integer có độ dài là 4 byte
Thí dụ
Unsigned long temp;
Temp=100000;
Float
Kiểu dữ liệu này có thể được sử dụng để khai báo một biến có dấu phảy
động
thí dụ
float timer1, timer2;
timer1=24.49;
timer2=sin(timer1);
Sbit
Kiểu dữ liệu này được đưa ra để dùng cho họ 8051 và được sử dụng để
khai báo một bít riêng lẻ trong SFR của họ 8051. thí dụ, khi ta sử dụng kiểu
dữ liệu này ta có thể truy nhập lên các bit riêng biệt của một cổng vào ra
Thí dụ
sbit w1 = P2^1;
w1=1;delay();
w1=0;delay();
Sfr
Kiểu dữ liệu này tương tự với sbit nhưng được sử dụng để khai báo các
biến kiểu 8 bit
Thí dụ
sfr P1=0x90;

68
sfr P2=0xA0;
unsigned char my_data;
my_data=P1;
P2=my_data++;
Sfr16
Kiểu dữ liệu này tương tự với sfr nhưng được sử dụng để khai báo các biến
16 bit. Khi sử dụng kiểu dữ liệu này, byte thấp sẽ đi trước byte cao
Thí dụ
Bộ định thời timer của vi điều khiển 8051 sử dụng các địa chỉ 0xcc và
0xcd cho các byte thấp và byte cao. Có thể khai báo biến T2 để truy
cập các vị trí của timer
sfr16=0xc0;
T2=0xAE01;

Các kiểu bộ nhớ


Kiến trúc 8051 hỗ trợ cả chương trình( hoặc mã ) và (các) vùng bộ nhớ dữ
liệu . Bộ nhớ chương trình là loại chỉ đọc và vì vậy không thể ghi vào. Tùy
thuộc vào loại bộ xử lí được sử dụng mà dung lượng của bộ nhớ chương trình
có sẵn bên trong cũng khác nhau. Thí dụ, 8051 có 4 kbyte bộ nhớ chương
trình bên trong, nhưng 89C2051 chỉ có 2 kbyte bộ nhớ chương trình bên
trong. Bộ nhớ chương trình có thể được làm tăng dung lượng bằng cách nối
thêm bộ nhớ chương trình bên ngoài với vi điều khiển cơ sở. Biện pháp cho
phép mơ rộng bộ nhớ chương trình lên tới 64 Kbyte.
Bộ nhớ dữ liệu nằm sẵn trong CPU của vi điều khiển 8051 có thể đọc ra
ghi vào. Bộ nhớ dữ liệu có thể có dung lượng tới 256 byte, tùy thuộc vào loại
vi điều khiển được sử dụng

69
Kiểu bộ nhớ sẽ quy định kiểu bộ nhớ nào được sử dụng cho một ứng dụng
cụ thể. Có 3 kiểu bộ nhớ với tên gọi là nhỏ(small), xếp chặt(compact) và lớn
(large) và kiểu bộ nhớ được chỉ định bằng cách sử dụng hướng dẫn cho trình
dịch. Kiểu bộ nhớ small được sử dụng nếu tất cả các biến đều nằm trong bộ
nhớ dữ liệu bên trong của 8051. Kiểu bộ nhớ này tạo ra mã nhanh nhất và
hiệu quả nhất, vì vậy có thể sử dụng bất cứ khi nào có thể. Trong kiểu bộ nhớ
Compact , tất cả các biến đều nằm trong một trang của bộ nhớ dữ liệu bên
ngoài. Có thể sử dụng nhiều nhất là 256 byte của các biến. kiểu bộ nhớ này
không hiệu quả bằng kiểu small. Trong kiểu bộ nhớ LARGE , tất cả các biến
đều nằm trong bộ nhớ dữ liệu bên ngoài.Có thể sử dụng nhiều nhất là 64
Kbyte dữ liệu. Kiểu bộ nhớ LARGE tạo ra nhiều mã hơn so với 2 kiểu còn lại
và vì vậy kiểu này tỏ ra không hiệu quả lắm.
Việc dịch chương trình trong kiểu bộ nhớ SMALL luôn tạo ra mã nhanh
nhất và dung lượng nhỏ nhất do việc truy nhập bộ nhớ bên trong bao giờ cũng
nhanh hơn khi truy nhập lên bất cứ bộ nhớ bên ngoài nào.
Các Ngắt
Trình dịch C51 cho phép ta khai báo các đoạn chương trình phục vụ ngắt
(ISR) trong mã C của ta và sau đó chương trình sẽ tự động nhảy tới đoạn mã
này khi một ngắt xuất hiện. Trình dịch tự động phát ra các vector ngắt và mã
nhập vào (entry) và đi ra (exit) dùng cho các đoạn chương trình phục vụ ngắt.
Một chương trình phục vụ ngắt (ISR) được khai báo tương tự như khai báo
một hàm nhưng số hiệu ngắt được chỉ định giống như một phần của khai báo
hàm. Thí dụ chỉ ra việc khai báo chương trình phục vụ ngắt dùng cho các ngắt
của bộ định thời Time 1 (ngắt số 3) :
Void time 1 ( ) interrup 3
{

70
interrup service code goes in here
}
Tương tự, chương trình ISR dùng cho bộ định thời Time 0 ( ngắt số 1) được
khai báo là :
Void time0 ( ) interrup 1
{
interrup service code goes in here
}
Chú ý ta có thể chỉ định dãy thanh nghi (register bank) cần được sử dụng
cho ISR bằng cách sử dụng thuộc tính hàm :
Void time 0 ( ) interrup 1 using 2
{
interrup service code goes in here
}

71
IV.2 Thiết kế phần cứng
Sơ đồ khối đo và điều khiển nhiệt độ

● Chức năng của các khối :


Khối cấp nguồn có chức năng cung cấp nguồn cho toàn bộ hệ thống mạch
điều khiển.
Khối vi điều khiển là khối trung tâm có chức năng điều khiển các khối
trong toàn bộ hệ thống mạch.
Khối truyền thông có chức năng truyền nhận thông tin về máy tính và
hiện thị trên LCD.
Khối bàn phím có chức năng cài đặt ,reset, và tăng giảm nhiệt độ tuỳ ý.
Khối hiển thị LCD có chức năng hiển thị khi ta đo và điều khiển nhiệt độ.
Khối tác động có chức năng làm cho cảm biến nhiệt hoạt động đuợc
tốt.

72
Khối cảm biến nhiệt có chức năng đo và điêu khiển nhiệt độ từ -55 0C –
1250C và có độ chính xác đo tới 0.50C.
Sơ đồ nguyên lý đo và điều khiển nhiệt độ
Sơ đồ mạch nguyên lý bao gồm :
• 1 Chip vi điều khiển AT 89C51
• 1 thiết bị hiển thị LCD : 16×2
• 1 cảm biến nhiệt DS1620
• 1 cổng truyền thông RS-232
• 1 cổng com DB 9 chân
• 3 PC 817, 3 IRF 540
• 5 tụ 10 µC, 2 tụ 33 PF
• điện trở : 17 R = 10 kΩ, 3 R = 1kΩ, 1 R = 8.2 KΩ
• 1 dao động thạch anh 11.0592 MHz
• 4 nút bấm
• 1 quạt làm mát nhiệt

73
IV.3 Thiết kế phần mềm
Chương trình phần mềm
● Tạo thời gian trễ
#include<REGX51.h>
void delayms(unsigned int time)
{ unsigned int n;
for(n=0;n<time;n++)
{
TMOD=0x21;
TH0=0xfc;
TL0=0x18;
TR0=1;
while(TF0==0)

74
{}
TF0=0;
TR0=0;
}
}
void delayus(unsigned char time)
{
unsigned char k,n;
for(n=0;n<time;n++)
{ for(k=0;k<20;k++);
}
}
● Khâu chính
#include<REGX51.h>
#include<do nhiet do.h>
#include<string.h>
/
**************************************************************
**********/
// dinh nghia cac bien phan cung
sbit rs=P1^1;
sbit rw=P1^0;
sbit enable=P1^2;
sbit dq=P2^7;
sbit clk=P2^6;
sbit reset=P2^5;
sbit tai1=P2^2;

75
sbit tai2=P2^1;
sbit tai3=P2^0;
sbit setup=P3^6;
sbit up=P3^5;
sbit down=P3^7;
//cac bien phan mem
unsigned char chiso,dat,chedo,biendem;
int temp;
unsigned char a[]={0x0d,0x0a,0};
/
**************************************************************
**********/
// chuong trinh gui du lieu len LCD
void LCD_write(unsigned char x) // gui du lieu len man hinh
{
rs=1; //chon thanh ghi du lieu
rw=0; // chon che do ghi du lieu
P0= x; // dua ra tren cong P0 gia tri du lieu
enable=1; // dua chan cho phep tu cao xuong thap de chot du lieu
enable=0;
delayus(20);
}
/
**************************************************************
**********/
// chuong trinh gui lenh len LCD
void LCD_cmd(unsigned char x) //gui lenh len man hinh

76
{
rs=0; //chon thanh ghi lenh
rw=0; // chon che do ghi du lieu
P0= x; // dua ra tren cong P0 gia tri du lieu
enable=1; // dua chan cho phep tu cao xuong thap de chot du lieu
enable=0;
delayus(20);
}
/
**************************************************************
**********/
// chuong trinh khoi tao LCD
void LCD_init()
{
LCD_cmd(0x01); // xoa man hinh
delayus(100);
LCD_cmd(0x38); // hai hang ma tran 5x7
LCD_cmd(0x0c); // bat man hinh tat con tro
LCD_cmd(0x06); // dich con tro sang phai mot don vi
LCD_cmd(0x80);
}
/
**************************************************************
**********/
// chuong trinh doc nhiet do cua DS1620
unsigned char read_ds1620_bit()
{

77
unsigned char b;
dq=1; // dua P2.7=1 de lam dau vao
clk=0;// dua xung clock tu thap len cao de chot du lieu
b=dq; // lay du lieu tu ds1620
clk=1;
return(b);
}
/
**************************************************************
**********/
// chuong trinh ghi tung bit len DS1620

void write_ds1620_bit(unsigned char b)


{
clk=0; // dua xung thap len cao o chan clock de chot du lieu
dq=b; // gui du lieu toi ds1620
clk=1;
}
/
**************************************************************
**********/
//chuong trinh ghi mot byte len DS1620
void write_ds1620(unsigned char func,unsigned char dsdata,unsigned char
dem)
{
unsigned char b,i;
reset=1; // chan reset duoc dat o muc cao de cho phep thuc hien thao tac

78
for(i=0;i<8;i++)
{
b=func>>i; // gan b=func dich phai i bit
b=b&0x01; //thuc hien andlogic voi 0x01
write_ds1620_bit(b); //gui du len lcd
}
for(i=0;i<dem;i++)
{
b=dsdata>>i; // gan b=dsdata dich phai i bit
b=b&0x01; //thuc hien andlogic voi 0x01
write_ds1620_bit(b); //gui du len lcd
}
reset=0;
}
/
**************************************************************
**********/
// chuong trinh doc du lieu tu DS1620
int read_ds1620(unsigned char func,unsigned char dem)
{
int dsdata;
unsigned char b,i;
reset=1;
dsdata=0;
for(i=0;i<8;i++)
{
b=func>>i; // gan b=func dich phai i bit

79
b=b&0x01; //thuc hien andlogic voi 0x01
write_ds1620_bit(b); //gui du len lcd
}
for(i=0;i<dem;i++)
{
dsdata=dsdata|read_ds1620_bit()<<i;
}
reset=0;
return(dsdata);
}
/
**************************************************************
**********/
// chuong trinh hien thi du lieu len man hinh
void display()
{ unsigned char temp4,temp5;
unsigned char temp1,temp2,temp3;
temp=read_ds1620(0xaa,9)*5;
if(temp>=20)
{
temp1=temp/100;
temp2=(temp-temp1*100)/10;
temp3=temp-temp1*100-temp2*10;
temp4=dat/10;
temp5=dat-temp4*10;
LCD_cmd(0x8c);
LCD_write(temp1+48);

80
LCD_write(temp2+48);
LCD_write(46);
LCD_write(temp3+48);
LCD_cmd(0xcc);
LCD_write(temp4+48);
LCD_write(temp5+48);
}
else
{
temp2=temp/10;
temp3=temp-temp2*10;
temp4=dat/10;
temp5=dat-temp4*10;
LCD_cmd(0x8c);
LCD_write(32);
LCD_write(temp2+48);
LCD_write(46);
LCD_write(temp3+48);
LCD_cmd(0xcc);
LCD_write(temp4+48);
LCD_write(temp5+48);
}
}
/
**************************************************************
******************/
// hien thi dong thong bao

81
void LCD_text()
{ unsigned char n;
char H1[16]="Temp do(C): ";
char H2[16]="Temp dat(C): ";
LCD_cmd(0x80);
for(n=0;n<strlen(H1);n++)
{ LCD_write(H1[n]);delayus(15); }
LCD_cmd(0xc0);delayus(100);
for(n=0;n<strlen(H2);n++)
{ LCD_write(H2[n]);delayus(15); }
}
/
**************************************************************
******************/
// doan chuong trinh khoi tao cho DS1620

void init_DS1620() // khoi tao DS1620


{
write_ds1620(0x0c,2,8); // ghi cau hinh cho ds1620
write_ds1620(0x01,140,8); // dat muc nguong cao
write_ds1620(0x02,40,8); // dat nguong thap
write_ds1620(0xee,0,0); // bat dau chuuyen doi
}
/
**************************************************************
*******************/
// doan chuong trinh thuc hien khoi tao cong noi tiep

82
void serial_init()
{ SCON=0x50;
TMOD=0x21;
TH1=0xfd;
TL1=0xfd;
EA=1;
ES=1;
TR1=1;
RI=0;
TI=0;
}
void init_timer0()
{
TMOD=0x22;
TH0=0x9c;
TL0=0x9c;
TR0=1;
EA=1;
}
/
**************************************************************
********************/
//gui thong bao toi man hinh
void send(unsigned char *s)
{
while(*s!=0)
{

83
SBUF=*s;
while(TI==0)
{}
TI=0;
s++;
}
TI=0;
}
void sendword(unsigned char n)
{
SBUF=n;
while(TI==0)
{}
TI=0;
}
/
**************************************************************
******************/
// doan chuong trinh phuc vu ngat cua cong noi tiep
interruptserial() interrupt 4
{ unsigned char n1,n2,n3;
int temp;
unsigned char H[6];
if(RI==1)
{
H[chiso]=SBUF;
RI=0;

84
if(chiso==2)
{ ES=0;
if((H[0]=='D')&(H[1]=='O')&(H[2]=='C'))
{
send(a);
send(" Nhiet do do duoc la :");
temp=read_ds1620(0xaa,9)*5;
n1=temp/100;
n2=(temp-n1*100)/10;
n3=temp-n1*100-n2*10;
sendword(n1+48);
sendword(n2+48);
sendword(46);
sendword(n3+48);
chiso=0;
for(n1=0;n1<5;n1++)
{ H[n1]=0;}
delayus(250);
}
else
{
if((H[0]=='D')&(H[1]=='A')&(H[2]=='T'))
{
while(RI==0)
{}
H[3]=SBUF;
RI=0;

85
while(RI==0)
{}
H[4]=SBUF;
RI=0;
n1=H[3]-48;
n2=H[4]-48;
dat=n1*10+n2;
}
chiso=0;
for(n1=0;n1<5;n1++)
{ H[n1]=0;}
delayms(250);
}
ES=1;
}
else // dat nhiet do
{
chiso=chiso+1;
}
}
}
interrupt_timer0() interrupt 1
{
switch(chedo)
{
case 1: // che do bat day tai
{ tai1=~tai1;

86
tai2=~tai2;
break;
}
case 2: // che do 1/2 tai
{ if(biendem<1)
{ tai1=0;
tai2=0;
}
else
{ if(biendem<3)
{ tai1=1;tai2=1;}
else
{ biendem=0;}
}
break;
}
case 3:
{
if(biendem<1)
{ tai1=0;tai2=0;}
else
{
if(biendem<5)
{tai1=1; tai2=1; }
else
{ biendem=0; }
}

87
break;
}
case 4:
{
if(biendem<1)
{ tai1=0;tai1=0;}
else
{ if(biendem<7)
{
tai1=1;tai2=1;
}
}
break;
}
case 5:
{
tai3=~tai3;
}
}
}
void xacnhanphim()
{ unsigned char m,i,s1,s2;
char thongbao[]="Dang cai dat";
up=1;down=1;
LCD_cmd(0x01);
LCD_cmd(0x80);
for(i=0;i<strlen(thongbao);i++)

88
{
LCD_write(thongbao[i]);
}
m=0;
while(m==0)
{
s1=dat/10;
s2=dat-s1*10;
LCD_cmd(0xc5);
LCD_write(s1+48);
LCD_write(48+s2);
if((up==0)&(down==0))
{ dat=dat;delayms(100); }
else
{
if((up==0)&(down==1))
{
delayms(100);
if((up==0)&(down==1))
{
if(dat==99)
{ dat=99; }
else
{ dat=dat+1; }

}
}

89
else
{ if((up=1)&(down==0))
{ delayms(100);
if((up=1)&(down==0))
{ if(dat<=10)
{ dat=dat;}
else
{ dat=dat-1;}
}
}
}
}
if(setup==0)
{ delayms(2000);
if(setup==0)
{ m=m+1; }
}
}
init_timer0();
LCD_cmd(0x01);delayus(100);
LCD_text();
}
main()
{ int x;
delayus(10);
LCD_init();
init_DS1620();

90
serial_init();
init_timer0();
LCD_text();
dat=25;chiso=0;
tai1=1;tai2=1;tai3=1;
for(;;)
{ setup=1;up=0;down=0;
display();
x=temp/10;
if(x<(dat-10))
{ chedo=1;ET0=1;tai1=1;tai2=1;tai3=1;}
else
{
if(x<(dat-6))
{ chedo=2;ET0=1;tai1=1;tai2=1;tai3=1;biendem=0;}
else
{ if(x<(dat-1))
{
chedo=3;ET0=1;tai1=1;tai2=1;tai3=1;biendem=0; }
else
{
chedo=4;ET0=1;tai1=1;tai2=1;tai3=1;biendem=0; }
}
}
if(x>(dat-1))
{ chedo=5;ET0=1;tai1=1;tai2=1;}
if(setup==0)

91
{ delayms(2000);
if(setup==0)
{ tai1=1;tai2=1;tai3=1;
xacnhanphim();
}
}
delayms(100);
}
}

92
KẾT LUẬN

Sau một thời gian cố gắng của bản thân cùng với sự giúp đỡ của thầy
giáo Nguyễn Văn Xuân, đồ án tốt nghiệp đã được hoàn thành đúng thời gian
quy định của trường Học Viện KTQS.

93
MỤC LỤC

Chương1 VI ĐIỀU KHIỂN......................................................... 4


I. Tổng quát về điều khiển.................................................. ..........................4
I.1 Cấu hình và chức năng các chân............................................................. 5
I.2 Cấu trúc của các cổng xuất nhập.................................... .........................9
I.3 Tổ chức bộ nhớ.......................................................................................10
I.3.1 Các thanh ghi chức năng đặc biệt........................................................12
I.3.2 Bộ nhớ ngoài....................................................................................... 19
I.4 Hoạt động bộ định thời........................................................................... 22
I.4.1 Các bộ định thời của 8051.................................................................. 22
I.4.2 Thanh ghi chế độ bộ định thời TMOD................................................ 23
I.4.3 Nguồn xung clock định thời.................................................................24
I.5 Hoạt động ngắt....................................................................................... 24
I.5.1 Tổ chức ngắt của 8051.........................................................................24
I.5.2 Xử lý ngắt............................................................................................ 25
I.5.3 C¸c vector
ng¾t..................................................................................... 26
I.5.4 C¸c ng¾t do port nèi
tiÕp...................................................................... 26
I.5.5 C¸c ng¾t
ngoµi......................................................................................
26
Chương 2 CÁC THIẾT BỊ NGOẠI VI DÙNG CHO BỘ ĐO VÀ
ĐIỀU KHIỂN NHIỆT ĐỘ......................................................... 27
II.1 Cảm biến nhiệt với lối ra số DS1620......................................27

94
II.2 Thiết bị hiển thị LCD............................................................. 30
II.3 Tổng quan về cổng truyền thông RS-232.............................. 33
II.3.1 Hệ thống MODBUS............................................................ 37

Chương 3.
MỞ RỘNG PHẦN TRUYỀN THÔNG NỐI TIẾP..................43
III.1 Lập trình truyền thông nối tiếp cho 8051……………………………. 43
III.2 Truyền thông nối tiếp dùng ACTIVE................................................. 47
III.3. Truyền thông giữa hai nút……………………………………………56
Chương 4. THIẾT KẾ CHƯƠNG TRÌNH……………………………...58
IV.1. Giới thiệu phần mềm lập trình keilC…………………………………58
IV.2. Thiết kế phần cứng…………………………………………………...65
IV.3. Thiết kế phần mềm …………………………………………………..67
KẾT LUẬN
TÀI LIỆU THAM KHẢO

95

You might also like