130
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 1

hoan thien DATN 28-4-2008

  • Upload
    huy232

  • View
    1.006

  • Download
    3

Embed Size (px)

Citation preview

Page 1: hoan thien DATN 28-4-2008

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

Page 2: hoan thien DATN 28-4-2008

● 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

Page 3: hoan thien DATN 28-4-2008

đ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

Page 4: hoan thien DATN 28-4-2008

4

Page 5: hoan thien DATN 28-4-2008

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

Page 6: hoan thien DATN 28-4-2008

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 4s.

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.

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

Page 7: hoan thien DATN 28-4-2008

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:

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

Page 8: hoan thien DATN 28-4-2008

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

Page 9: hoan thien DATN 28-4-2008

§©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

Page 10: hoan thien DATN 28-4-2008

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

Page 11: hoan thien DATN 28-4-2008

Đâ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

Page 12: hoan thien DATN 28-4-2008

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

Page 13: hoan thien DATN 28-4-2008

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

Page 14: hoan thien DATN 28-4-2008

®Þ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

14

Page 15: hoan thien DATN 28-4-2008

tr×nh con (ACALL, LCALL) vµ lÖnh trë vÒ (RET, RETI) còng cÊt

vµ phôc håi néi dung cña bé ®Õm ch¬ng tr×nh PC (program

counter).

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

15

BitKý

hiÖu

§Þa

chØM« t¶ bit

PSW.7 CY D7H

Cê nhí (carry flag). Cê nµy ®îc set nÕu cã

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õ

PSW.6 AC D6H

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

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)

PSW.3 RS0 D3H

Chän d·y thanh ghi (bit 0)

00 = bank 0 : ®Þa chØ tõ 00H → 07H

01 = bank 1 : ®Þa chØ tõ 08H → 0FH

10 = bank 2 : ®Þa chØ tõ 10H → 17H

11 = bank3 : ®Þa chØ tõ 18H → 1FH

PSW.2 OV D2H

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

(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

Page 16: hoan thien DATN 28-4-2008

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

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 M1 M0 GATE 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).

 : bit chän chøc n¨ng ®Õm (counter) hay ®Þnh thêi

(timer). Khi = 0 bé Timer/Counter ho¹t ®éng ®Þnh thêi

(dïng xung clock néi cña hÖ thèng). Khi = 1,

Timer/Counter ho¹t ®éng ®Õm (dïng xung clock nhËn tõ ngâ

vµo Tx).

16

Page 17: hoan thien DATN 28-4-2008

M1, M0 : Bit chän chÕ ®é

M1 M0 ChÕ

®é

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

1 1 3

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

®î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

hiÖu

VÞ trÝ §Þa

chØ

M« t¶

TF1TCON.

78FH

Cê trµn bé ®Þnh thêi 1 : ®îc set bëi

phÇn cøng khi bé ®Þnh thêi/®Õm

bÞ trµn, xãa b»ng phÇn mÒm hoÆc

bëi phÇn cøng khi tr×nh phôc vô

ng¾t ®îc trá ®Õn

TR1TCON.

68EH

Bit ®iÒu khiÓn bé ®Þnh thêi 1 ho¹t

®éng, ®îc set/clear bëi phÇn mÒm.

TF0 TCON. 8DH Cê trµn bé ®Þnh thêi 0

17

Page 18: hoan thien DATN 28-4-2008

5

TR0TCON.

48CH

Bit ®iÒu khiÓn bé ®Þnh thêi 0 ho¹t

®éng

IE1TCON.

38BH

Cê ng¾t ngoµi 1, t¸c ®éng c¹nh. §îc

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

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

IT1TCON.

28AH

Bit ®iÒu khiÓn chän lo¹i ng¾t, ®îc

set/xãa ®Ó x¸c ®Þnh ng¾t ngoµi

thuéc lo¹i t¸c ®éng c¹nh ©m

(xuèng) hay t¸c ®éng møc thÊp

IE0TCON.

189H

Cê ng¾t ngoµi 0, t¸c ®éng c¹nh

IT0TCON.

088H

Bit ®iÒu khiÓn chän lo¹i ng¾t

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

18

Page 19: hoan thien DATN 28-4-2008

SM0 SM1 SM2 REN TB8 RB8 TI RI

hiÖu

VÞ trÝ §Þa

chØ

M« t¶

SM0SCON.

79FH

Bit chän chÕ ®é

SM1SCON.

69EH

Bit chän chÕ ®é

SM2SCON.

59DH

Bit nµy cho phÐp truyÒn th«ng ®a

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

®î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Ö.

RENSCON.

49CH

Cho phÐp thu. ViÖc set hoÆc xãa

bit nµy bëi phÇn mÒm sÏ cho phÐp

hoÆc kh«ng cho phÐp ho¹t ®éng

thu.

TB8SCON.

39BH

Bit ph¸t 8, bit thø 9 ®îc ph¸t ë c¸c

chÕ ®é 2 & 3. Bit nµy ®îc set

hoÆc xãa b»ng phÇn mÒm.

RB8 SCON.

2

9AH Bit thu 8. Trong c¸c chÕ ®é 2 & 3,

RB8 lµ bit d÷ liÖu thø 9 thu ®îc.

19

Page 20: hoan thien DATN 28-4-2008

Trong chÕ ®é 1, nÕu SM2 = 0, RB8

lµ bit stop thu ®îc. Trong chÕ ®é

0, RB8 kh«ng ®îc sö dông.

TISCON.

199H

Cê ng¾t ph¸t, cê nµy ®îc set bëi

phÇn cøng ë cuèi thêi gian ph¸t bit

thø trong chÕ ®é 0 hoÆc ë gi÷a

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.

RISCON.

098H

Cê ng¾t thu, cê nµy ®îc set bëi

phÇn cøng ë cuèi thêi gian thu bit

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

dÞch

fosc 12

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

20

Page 21: hoan thien DATN 28-4-2008

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ý

hiÖu

M« t¶

7 SMOD

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 =

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

1 PD Bit chÕ ®é nguån gi¶m. ViÖc set bit nµy b»ng

1 t¸c ®éng ®Õn thao t¸c nguån gi¶m trong

21

Page 22: hoan thien DATN 28-4-2008

c¸c phiªn b¶n CMOS cña 8051.

0 IDL

Bit chÕ ®é nghØ. ViÖc set bit nµy b»ng 1 t¸c

®é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 ®-

î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Õ

22

Page 23: hoan thien DATN 28-4-2008

®é 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Ø .

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

1s. 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.

23

Page 24: hoan thien DATN 28-4-2008

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 vµ ë 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Ø.

RAM cã thÓ giao tiÕp víi 8051 theo cïng c¸ch nh EPROM

nhng kh¸c lµ ®êng nèi víi ®êng cho phÐp xuÊt cña

24

Page 25: hoan thien DATN 28-4-2008

RAM vµ nèi víi ®êng ghi 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 cña c¸c IC nhí.

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

25

Page 26: hoan thien DATN 28-4-2008

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 :

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.

26

Page 27: hoan thien DATN 28-4-2008

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µ

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

27

Page 28: hoan thien DATN 28-4-2008

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

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

28

Page 29: hoan thien DATN 28-4-2008

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ë

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.

29

Page 30: hoan thien DATN 28-4-2008

¦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

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.

30

Page 31: hoan thien DATN 28-4-2008

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

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

31

Page 32: hoan thien DATN 28-4-2008

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.

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.

32

Page 33: hoan thien DATN 28-4-2008

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.

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:

33

Page 34: hoan thien DATN 28-4-2008

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

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

®æi

22

§äc TH A1

§äc TL A2

§äc nhiÖt ®é AA

§äc cÊu h×nh AC

B¾t ®Çu

chuyÓn ®æi

EE

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

34

Page 35: hoan thien DATN 28-4-2008

®ä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

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

35

Page 36: hoan thien DATN 28-4-2008

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

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

36

Page 37: hoan thien DATN 28-4-2008

+ 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

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

37

Page 38: hoan thien DATN 28-4-2008

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

§Ó 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

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Þ

38

Page 39: hoan thien DATN 28-4-2008

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

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

39

Page 40: hoan thien DATN 28-4-2008

+ 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

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,

40

Page 41: hoan thien DATN 28-4-2008

đượ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.

Độ 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

41

Page 42: hoan thien DATN 28-4-2008

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;

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

42

Page 43: hoan thien DATN 28-4-2008

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.

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

43

Page 44: hoan thien DATN 28-4-2008

đ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

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)

44

Page 45: hoan thien DATN 28-4-2008

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

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,

45

Page 46: hoan thien DATN 28-4-2008

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

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

46

Page 47: hoan thien DATN 28-4-2008

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

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ờ

47

Page 48: hoan thien DATN 28-4-2008

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

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

48

Page 49: hoan thien DATN 28-4-2008

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

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

49

Page 50: hoan thien DATN 28-4-2008

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

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à :

50

Page 51: hoan thien DATN 28-4-2008

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

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 :

51

Page 52: hoan thien DATN 28-4-2008

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

+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;

52

Page 53: hoan thien DATN 28-4-2008

TI=0;

}

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,

53

Page 54: hoan thien DATN 28-4-2008

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

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:

54

Page 55: hoan thien DATN 28-4-2008

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

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

55

Page 56: hoan thien DATN 28-4-2008

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

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

56

Page 57: hoan thien DATN 28-4-2008

600 14400 188000

1200 19200 256000

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

57

Page 58: hoan thien DATN 28-4-2008

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

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:

58

Page 59: hoan thien DATN 28-4-2008

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

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.

59

Page 60: hoan thien DATN 28-4-2008

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

Đặ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

ComXon/Xoff

ComRTS

ComRTSXon/Xoff

0 1 2 3 Không băt tay (mặc định) Bắt

tay phần mềm (Xon/Xoff) Bắt

tay phần cứng (RTS/CTS) Bắt

tay phần cứng và phàn mềm

. CommEvent:

60

Page 61: hoan thien DATN 28-4-2008

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)

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

ComCTSTO

ComFrame

ComOver

ComCDTO

ComRxOver

ComRxParity

ComTxFull

1001 1002

1004 1006

1007 1008

1009 1010

Nhận tín hiệu Break Carrier Detect

Timeout Lỗi khung Phần cứng không

đọc ký tự trước khi gởi ký tự kếCarrier

Detect Timeout Tràn bộđệm nhận Lỗi

parity Tràn bộđệm truyền

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:

61

Page 62: hoan thien DATN 28-4-2008

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

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

62

Page 63: hoan thien DATN 28-4-2008

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;

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

63

Page 64: hoan thien DATN 28-4-2008

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:

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ì

64

Page 65: hoan thien DATN 28-4-2008

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

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

65

Page 66: hoan thien DATN 28-4-2008

Atmel 89CI051 và 89C2051

AMD 80C321, 80C521 và 80C541

Dallas 80C320, 80C520 và 80C530

Signetics 8xC750, 8xC751 và 8xC752

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.

66

Page 67: hoan thien DATN 28-4-2008

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.

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

67

Page 68: hoan thien DATN 28-4-2008

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

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

68

Page 69: hoan thien DATN 28-4-2008

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;

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

69

Page 70: hoan thien DATN 28-4-2008

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

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ã

70

Page 71: hoan thien DATN 28-4-2008

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

{

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

Page 72: hoan thien DATN 28-4-2008

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

Page 73: hoan thien DATN 28-4-2008

Khối cảm biến nhiệt có chức năng đo và điêu khiển nhiệt độ từ -550C –

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

Page 74: hoan thien DATN 28-4-2008

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

Page 75: hoan thien DATN 28-4-2008

{}

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

Page 76: hoan thien DATN 28-4-2008

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

Page 77: hoan thien DATN 28-4-2008

{

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

Page 78: hoan thien DATN 28-4-2008

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

Page 79: hoan thien DATN 28-4-2008

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

Page 80: hoan thien DATN 28-4-2008

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

Page 81: hoan thien DATN 28-4-2008

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

Page 82: hoan thien DATN 28-4-2008

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

Page 83: hoan thien DATN 28-4-2008

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

Page 84: hoan thien DATN 28-4-2008

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

Page 85: hoan thien DATN 28-4-2008

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

Page 86: hoan thien DATN 28-4-2008

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

Page 87: hoan thien DATN 28-4-2008

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

Page 88: hoan thien DATN 28-4-2008

break;

}

case 4:

{

if(biendem<1)

{ tai1=0;tai1=0;}

else

{ if(biendem<7)

{

tai1=1;tai2=1;

}

}

break;

}

case5:

{

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

Page 89: hoan thien DATN 28-4-2008

{

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

Page 90: hoan thien DATN 28-4-2008

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

Page 91: hoan thien DATN 28-4-2008

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

Page 92: hoan thien DATN 28-4-2008

{ delayms(2000);

if(setup==0)

{ tai1=1;tai2=1;tai3=1;

xacnhanphim();

}

}

delayms(100);

}

}

92

Page 93: hoan thien DATN 28-4-2008

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

Page 94: hoan thien DATN 28-4-2008

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

Page 95: hoan thien DATN 28-4-2008

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