Các Transistor A1015 (chúng ta gọi là các đèn T1, T2, T3) được cấp nguồn 5V ở
chân E , chân C của T1 và T2 được nối với 2 chân Vcc của LED 7 thanh, các 
chân B của T1, T2 được nối lần lượt với các chân 20 và 19 của VĐK 
PIC16F877A (cụthểlà nối với các chân RD0 và RD1 là các chân output của 
PORTB). Khi RD1 ởmức thấp thì đầu C của đèn T1 sẽ ởmức cao lúc đó LED 1 
được phân cực đúng và có thểsáng, ngược lại thì LED 1 bịphân cực sai lúc đó nó 
sẽkhông sáng. Tương tựcho chân RD0 và LED còn lại. Đèn T3 cũng nhưvậy 
nhưng thay LED bằng một cái Loa (và chân output là chân RE0 của PORTE) 
dùng đểcảnh báo . 
Đầu ra của sensor nhiệt LM335 sẽ được đưa vào chân 2 của VĐK (là chân Analog 
AN0 của ADC 10 bít tích hợp sẵn trong VĐK PIC, chân AN0 này sẽ được thiết 
lập là chân vào Analog của ADC) .
                
              
                                            
                                
            
 
            
                 20 trang
20 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 4080 | Lượt tải: 1 
              
            Bạn đang xem nội dung tài liệu Đề tài Mạch đo nhiệt độ và cảnh báo, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI 
KHOA ĐIỆN TỬ VIỄN THÔNG 
00O00 
BÁO CÁO BÀI TẬP LỚN MÔN VI XỬ LÝ 
ĐỀ TÀI 
MẠCH ĐO NHIỆT ĐỘ VÀ CẢNH BÁO 
Thầy giáo hướng dẫn: ThS. Hàn Huy Dũng 
 Sinh Viên thực hiện: 
 Nguyễn Thọ Lợi 
 Đặng Đình Tài 
 Nguyễn Huy Hoàng 
 Ngô Thanh Xuân 
 Đặng Đức Cường 
 Lớp : ĐT2-K48 
Hà Nội 05-2006 
 Chức năng của đề tài 
 Đo và hiển thị nhiệt độ của môi trường ở một điểm bất kỳ trong 
khoảng -400C đến 1000C 
 Báo động khi nhiệt độ của môi trường ở trong một khoảng nào đó mà 
ta chọn 
PHẦN MỞ ĐẦU 
GIỚI THIỆU VĐK 8 BÍT PIC16F877 VÀ SO SÁNH 
VỚI VĐK 8051 
Ngµy nay, c¸c bé vi ®iÒu khiÓn ®ang cã øng dông ngµy cµng réng ri trong c¸c lÜnh 
vùc kü thuËt vµ ®êi sèng x héi, ®Æc biÖt lµ trong kü thuËt tù ®éng ho¸ 
vµ ®iÒu khiÓn tõ xa. Giê ®©y víi nhu cÇu chuyªn dông ho¸, tèi −u (thêi gian, kh«ng 
gian, gi¸ thµnh), b¶o mËt, tÝnh chñ ®éng trong c«ng viÖc... ngµy cµng ®ßi 
hái kh¾t khe. ViÖc ®−a ra c«ng nghÖ míi trong lÜnh vùc chÕ t¹o m¹ch ®iÖn tö ®Ó 
®¸p øng nh÷ng yªu cÇu trªn lµ hoµn toµn cÊp thiÕt mang tÝnh thùc tÕ cao. 
Kh¸i niÖm vÒ bé vi ®iÒu khiÓn 
§Ó hiÓu kh¸i niÖm vÒ bé vi ®iÒu khiÓn, ta cã thÓ lµm phÐp so s¸nh nã víi bé 
vi xö lý c«ng dông chung nh− sau: 
Ta biÕt r»ng, c¸c bé vi xö lý c«ng dông chung nh− hä Intel x86 (8086, 
80286, 80386, 80486 vµ Pentium) hoÆc hä Motorola 680x0(6800, 68010, 68020, 
68030, 68040 vv...) kh«ng cã RAM, ROM vµ kh«ng cã c¸c cæng ra vµo trªn chip... 
Víi lý do ®ã mµ chóng ®−îc gäi lµ c¸c bé vi xö lý c«ng dông chung. 
Mét nhµ thiÕt kÕ hÖ thèng sö dông mét bé vi xö lý c«ng dông chung ch¼ng h¹n 
nh− Pentium hay 68040 sÏ ph¶i bæ xung thªm RAM, ROM, c¸c cæng vµo ra 
vµ c¸c bé ®Þnh thêi ngoµi ®Ó lµm cho chóng ho¹t ®éng ®−îc. MÆc dï viÖc bæ xung 
c¸c RAM, ROM, c¸c cæng vµo ra sÏ lµm cho hÖ thèng cång kÒnh lªn nh−ng nã 
l¹i cã −u ®iÓm khi sö dông c¸c bé vi xö lý nµy lµ rÊt linh ho¹t. Ch¼ng h¹n nh− ng−êi 
thiÕt kÕ cã thÓ quyÕt ®Þnh vÒ sè l−îng RAM, ROM, vµ c¸c cæng vµo ra cÇn thiÕt sao 
cho phï hîp víi kh¶ n¨ng, môc ®Ých sö dông cña hÖ thèng. 
§iÒu nµy kh«ng thÓ cã ®èi víi c¸c bé vi ®iÒu khiÓn. Bëi v×, mét bé vi ®iÒu khiÓn 
® cã mét CPU (mét bé vi xö lý) cïng víi mét sè l−îng RAM, ROM, c¸c cæng vµo 
ra vµ mét bé ®Þnh thêi trªn cïng mét chÝp. Hay nãi c¸ch kh¸c lµ bé vi 
xö lý, RAM, ROM, c¸c cæng vµo ra vµ mét bé ®Þnh thêi cïng ®−îc nhóng trªn mét 
chip. Do vËy ng−êi thiÕt kÕ kh«ng thÓ bæ xung thªm bé nhí ngoµi, sè c¸c cæng 
vµo ra hoÆc bé ®Þnh thêi cho nã. Víi sè l−îng RAM, ROM vµ sè c¸c cæng vµo ra cè 
®Þnh nh− vËy lµ mét mÆt h¹n chÕ (kÐm linh ho¹t) xong nã l¹i thËt sù lý t−ëng ®èi víi 
nh÷ng øng dông mang tÝnh chuyªn biÖt, tèi −u vÒ gi¸ thµnh, tèi −u vÒ kh«ng gian... 
HiÖn nay trªn thÞ truêng cã c¸c bé vi ®iÒu khiÓn 8 bÝt chÝnh lµ. 6811 cña 
Motorola, 8051 cña Intel, Z8 cña Xilog vµ Pic16x cña Microchip Technology. 
Mçi lo¹i trªn ®©y ®Òu cã mét tËp lÖnh vµ thanh ghi riªng duy nhÊt, nªn chóng 
®Òu kh«ng t−¬ng thÝch lÉn nhau. Còng cã nh÷ng bé vi ®iÒu khiÓn 16 bÝt vµ 32 bÝt 
®−îc s¶n xuÊt ra bëi c¸c hng s¶n xuÊt chÝp kh¸c nhau. 
Nh÷ng yªu cÇu ®Ó lùa chän mét bé vi ®iÒu khiÓn lµ: 
+ §¸p øng nhu cÇu tÝnh to¸n cña bµi to¸n mét c¸ch hiÖu qu¶ vÒ mÆt gi¸ 
thµnh vµ ®Çy ®ñ chøc n¨ng cã thÓ nh×n thÊy ®−îc, (kh¶ dÜ). 
+ Cã s½n c¸c c«ng cô ph¸t triÓn phÇn mÒm ch¼ng h¹n nh− c¸c tr×nh biªn dÞch 
tr×nh hîp ng÷ vµ gì rèi. 
+ Nguån c¸c bé vi ®iÒu khiÓn cã s½n nhiÒu vµ tin cËy. 
 C¸c tiªu chuÈn lùa chän mét bé vi ®iÒu khiÓn: 
Tiªu chuÈn ®Çu tiªn vµ tr−íc hÕt trong lùa chän mét bé vi ®iÒu khiÓn lµ nã 
ph¶i ®¸p øng nhu cÇu bµi to¸n vÒ mÆt c«ng suÊt tÝnh to¸n, gi¸ thµnh vµ hiÖu qu¶. Trong 
khi ph©n tÝch c¸c nhu cÇu cña mét dù ¸n dùa trªn bé vi ®iÒu khiÓn, chóng 
ta tr−íc hÕt ph¶i biÕt lµ bé vi ®iÒu khiÓn nµo lµ 8 bÝt, 16 bÝt hay 32 bÝt cã thÓ ®¸p øng tèt 
nhÊt nhu cÇu tÝnh to¸n cña bµi to¸n mét c¸ch hiÖu qu¶ nhÊt. 
+ Nh÷ng tiªu chuÈn ®−îc ®−a ra ®Ó c©n nh¾c lµ: 
+ Tèc ®é: Tèc ®é lín nhÊt mµ bé vi ®iÒu khiÓn hç trî lµ bao nhiªu. 
+ KiÓu ®ãng vá: §ã lµ kiÓu 40 ch©n DIP hay QFP hay lµ kiÓu ®ãng vá kh¸c. 
§©y lµ ®iÒu quan träng ®èi víi yªu cÇu vÒ kh«ng gian, kiÓu l¾p r¸p vµ t¹o mÉu thö 
cho s¶n phÈm cuèi cïng. 
+ C«ng suÊt tiªu thô: §iÒu nµy ®Æc biÖt kh¾t khe ®èi víi nh÷ng s¶n phÈm dïng 
pin, ¾c quy. 
+ Dung l−îng bé nhí RAM vµ ROM trªn chÝp. 
+ Sè ch©n vµo – ra, bé ®Þnh thêi, sè ng¾t trªn chÝp. 
+ Kh¶ n¨ng dÔ dµng n©ng cÊp cho hiÖu suÊt cao hoÆc gi¶m c«ng suÊt tiªu thô. 
+ Gi¸ thµnh cho mét ®¬n vÞ: §iÒu nµy quan träng quyÕt ®Þnh gi¸ thµnh cuèi cïng cña 
s¶n phÈm mµ mét bé vi ®iÒu khiÓn ®−îc sö dông. 
Bé Vi ®iÒu khiÓn 8 bit PIC16F877 
§Æc tÝnh næi bËt cña bé vi xö lÝ. 
+ Sö dông c«ng nghÖ tÝch hîp cao RISC CPU. 
+ Ng−êi sö dông cã thÓ lËp tr×nh víi 35 c©u lÖnh ®¬n gi¶n. 
+ TÊt c¶ c¸c c©u lÖnh thùc hiÖn trong mét chu k× lÖnh ngo¹i trõ mét sè c©u lÖnh 
rÏ nh¸nh thùc hiÖn trong 2 chu k× lÖnh. 
+ Tèc ®é ho¹t ®éng lµ: - Xung ®ång hå vµo lµ DC- 20MHz 
- Chu kú lÖnh thùc hiÖn trong 200ns 
+ Bé nhí ch−¬ng tr×nh Flash 8Kx14 words 
+ Bé nhí Ram 368x8 bytes 
+ Bé nhí EFPROM 256x 8 bytes 
Kh¶ n¨ng cña bé vi xö lÝ nµy 
+ Kh¶ n¨ng ng¾t ( lªn tíi 14 nguån ng¾t trong vµ ng¾t ngoµi ) 
+ Ng¨n nhí Stack ®−îc ph©n chia lµm 8 møc 
+ Truy cËp bé nhí b»ng ®Þa chØ trùc tiÕp hoÆc gi¸n tiÕp. 
+ Nguån khëi ®éng l¹i (POR) 
+ Bé t¹o xung thêi gian (PWRT) vµ bé t¹o dao ®éng (OST) 
+ Bé ®Õm xung thêi gian (WDT) víi nguån dao ®éng trªn chÝp (nguån 
dao 
®éng RC ) ho¹t ®éng ®¸ng tin cËy. 
+ Cã m ch−¬ng tr×nh b¶o vÖ. 
+ Ph−¬ng thøc cÊt gi÷ SLEEP 
+ Cã b¶ng lùa chän dao ®éng. 
+ C«ng nghÖ CMOS FLASH /EEPROM nguån møc thÊp ,tèc ®é cao. 
+ ThiÕt kÕ hoµn toµn tÜnh . 
+ M¹ch ch−¬ng tr×nh nèi tiÕp cã 2 ch©n. 
+ Xö lý ®äc /ghi tíi bé nhí ch−¬ng tr×nh . 
+ D¶i ®iÖn thÕ ho¹t ®éng réng : 2.0V ®Õn 5.5V 
+ Nguån sö dông hiÖn t¹i 25 mA 
+ Dy nhiÖt ®é c«ng nghiÖp vµ thuËn lîi . 
+ C«ng suÊt tiªu thô thÊp: 
< 0.6mA víi 5V, 4MHz 
20 uA víi nguån 3V, 32 kHz 
< 1 uA nguån dù phßng. 
C¸c ®Æc tÝnh næi bËt cña thiÕt bÞ ngo¹i vi trªn chip 
+ Timer0: 8 bÝt cña bé ®Þnh thêi, bé ®Õm víi hÖ sè tû lÖ tr−íc 
+ Timer1: 16 bÝt cña bé ®Þnh thêi, bé ®Õm víi hÖ sè tû lÖ tr−íc, cã kh¶ n¨ng 
t¨ng trong khi ë chÕ ®é Sleep qua xung ®ång hå ®−îc cung cÊp bªn ngoµi. 
+ Timer 2: 8 bÝt cña bé ®Þnh thêi, bé ®Õm víi 8 bÝt cña hÖ sè tû lÖ tr−íc, hÖ 
sè 
tû lÖ sau 
+ Cã 2 chÕ ®é b¾t gi÷, so s¸nh, ®iÒu chÕ ®é réng xung(PWM). 
+ ChÕ ®é b¾t gi÷ víi 16 bÝt, víi tèc ®é 12.5 ns, chÕ ®é so s¸nh víi 16 bÝt, 
tèc®é gi¶i quyÕt cùc ®¹i lµ 200 ns, chÕ ®é ®iÒu chÕ ®é réng xung víi 10 bÝt. 
+ Bé chuyÓn ®æi tÝn hiÖu sè sang t−¬ng tù víi 10 bÝt . 
+ Cæng truyÒn th«ng nèi tiÕp SSP víi SPI ph−¬ng thøc chñ vµ I2C(chñ/phô) 
+ Bé truyÒn nhËn th«ng tin ®ång bé, dÞ bé(USART/SCL) cã kh¶ n¨ng ph¸t 
hiÖn 9 bÝt ®Þa chØ. 
+ Cæng phô song song (PSP) víi 8 bÝt më réng, víi RD, WR vµ CS 
®iÒu khiÓn. 
S¬ ®å c¸c ch©n PIC16F87X. 
 S¬ ®å khèi bé vi ®iÒu khiÓn PIC16F87X 
So s¸nh víi bé vi ®iÒu khiÓn 8051 
* Bé vi ®iÒu khiÓn 8051 lµ bé V§K ®Çu tiªn thuéc hä V§K x51 ®−îc s¶n xuÊt 
bëi c«ng ty Intel, Siemens, Advanced Micro Devices, Fujitsu, Philips. 
C¸c ®Æc ®iÓm chung cña bé V§K nµy: 
+ 4KB ROM 
+ 128 B RAM 
+ 4 cæng I/O 8 bit 
+ 2 Timer 16 bit 
+ Cã kh¶ n¨ng qu¶n lý ®−îc 64 KB bé nhí m ch−¬ng tr×nh ngoµi (ROM 
ngoµi). 
+ Cã kh¶ n¨ng qu¶n lý ®−îc 64 KB bé nhí d÷ liÖu ngoµi (RAM ngoµi) 
+ Cã bé xö lý logic riªng (thao t¸c trªn c¸c bit) 
+ Cã thÓ thao t¸c trùc tiÕp ®−îc 210 bit (c¸c bit nµy ® ®−îc ®Þa chØ ho¸) 
+ Cã 5 ng¾t 
+ Dïng nguån dao ®éng ngoµi
+ Dïng ®iÖn ¸p 5V ®Ó cho chip ho¹t ®éng 
*Cæng P0: Cã d¹ng cùc m¸ng hë vµ cã 8 ch©n (8 bit) lµ cæng vµo/ra hoÆc 
lµ cæng chuyÓn d÷ liÖu vµ ®Þa chØ. 
*Cæng P1: Lµ cæng vµo/ra cã 8 ch©n (8 bit). 
*Cæng P2: Cã 8 ch©n (8 bit) lµ cæng vµo/ra hoÆc lµ cæng chuyÓn d÷ liÖu vµ 
®Þa chØ. 
*Cæng P3: Cã 8 ch©n, cæng nµy cã thÓ lµ cæng vµo/ra 8 bit hay cßn cã c¸c 
chøc n¨ng quan träng kh¸c nh− phôc vô cho ng¾t, c¸c bé ®Þnh thêi, viÖc truyÒn 
nhËn d÷ liÖu truyÒn th«ng nèi tiÕp, ®äc vµ ghi c¸c bé nhí ngoµi… 
 S¬ ®å khèi cña V§K 8051 
Nh− vËy cã thÓ thÊy ®Æc ®iÓm ®Çu tiªn mµ PIC16F877 ®em l¹i vµ næi bËt so 
víi V§K 8051 lµ dßng PIC16F877 nh÷ng ®Æc tÝnh kÜ thuËt h¬n h¼n so víi bé 
V§K 8051 thÓ hiÖn ë nh÷ng ®iÓm sau: 
V§K8051 V§K PIC16F877 
§Æc tÝnh Sè l−îng §Æc tÝnh Sè l−îng 
ROM trªn chÝp 
RAM 
Bé ®Þnh thêi 
C¸c ch©n vµo ra 
Cæng nèi tiÕp 
Nguån ng¾t 
4K byte 
128 byte 
2 
32 
1 
6 
ROM trªn chÝp 
RAM 
Bé ®Þnh thêi 
C¸c ch©n vµo ra 
Cæng nèi tiÕp 
Nguån ng¾t 
8K 
368 byte 
3 
40 
2 
14 
Ngoµi nh÷ng ®Æc tÝnh trªn th× bé vi ®iÒu khiÓn PIC16F877 cßn cã mét ®Æc 
®iÓm h¬n h¼n so víi 8051 lµ cã 10 bÝt chuyÓn ®æi A/D trªn chÝp ®iÒu nµy sÏ gióp chóng ta 
kh«ng ph¶i mÊt mét bé chuyÓn ®æi (sÏ dÉn ®Õn kÕt nèi d©y trë nªn phøc 
t¹p). 
Mét ®Æc ®iÓm n÷a lµ bé vi ®iÒu khiÓn PIC16F877 cã bé t¹o dao ®éng chñ trªn chÝp 
®iÒu nµy sÏ tr¸nh ®−îc nh÷ng sai sè kh«ng cÇn thiÕt trong viÖc t¹o xung động, VĐK 
PIC16F877 có khả năng tự RESET bằng bộ WĐT, và có thêm 256 byte EEPROM
 PHẦN I 
THIẾT KẾ PHẦN CỨNG 
Sơ đồ khối của mạch 
♣ Khối xử lý nhiệt độ và khối ADC : Là một sensor nhiệt LM335 và một bộ 
ADC 10 bit 
Sơ đồ của sensor nhiệt LM335 
LM335 cố đầu vào là nhiệt độ môi trường và đầu ra là diện áp 
 Chân 1 là chân mang dấu “-”, thường được nối đất khi phân 
cực 
 Chân 2 là chân mang dấu “+”, được nối với V+ thông qua một 
điện trở và chân 2 cũng là đầu ra của LM335 
 Chân 3 là chân mang chữ “ADJ”, thường được nối với một 
biến trở để điều chỉnh nhiệt độ ban đầu cho phù hợp 
Người ta thường phân cực cho nó như sau: 
Nhiệt độ 
môi trường 
Khối xử lý 
nhiệt độ 
Khối hiển 
thị và cảnh 
báo 
Khối 
ADC 
Khối xử lý 
vào ra 
 Khối xử lý chung 
 Còn bộ biến đổi ADC , ta dùng ADC của PIC là ADC 10 bít 
Nguyên lý làm việc và các công thức tính toán: 
 Đo nhiệt độ môi trường tại một điểm thông qua sensor nhiệt LM335 (Chi 
tiết về LM335 xem thêm trong datasheet). LM335 là sensor đo nhiệt, đo được 
nhiệt độ trong khoảng từ -400C đến 1000C, đầu ra là 10mV/K. Đầu ra này được 
đưa vao chân Analog của bộ ADC (Cụ thể ở đây là đưa vào Chân AN0 ).Vì ở đây 
là tính theo độ K nên để đo độ C ta cần có công thức chuyển đổi giá trị từ độ K 
sang độ C. Ở đây ta dùng ADC của PIC là 10 bit => max=1023, Vref=Vcc, giả thiết 
là Vcc = 5V nên tại 0 độ C hay 273K thì đầu ra của LM335 có giá trị là 2.73V. 
Như vậy khi muốn tính toán ra độ C ta cần phải trừ đi mức điện áp là 2.73V. Lấy 
ví dụ: nhiệt độ là 30 độ C = 303K -> out = 303 x 10mV/K =3.03V. Ta tính toán 
giá trị đọc được từ ADC 10 bit (ADC_Vin là điện áp đưa vào chân ADC của PIC, 
ADC_value là giá trị đầu ra của ADC dưới dạng thập phân): 
ADC_Vin = 5V => ADC_value = 1023 
ADC_Vin = 2.73V => ADC_value = (1023/5)x2.73=558.558 (tương ứng 
0 độ C) 
 ADC_Vin = 3.03V => ADC_value = (1023/5)x3.03=619.938 (tương ứng 
30 độ C) 
Mặt khác do V_ref = Vcc =5V nên ADC_value=1 tương ứng 5/1023 = 
4.887mV 
(~ 5mV). Trong khi đó LM335 cho ra điện áp là 10mV/1K nên để giá trị ADC 
thay đổi 1 đơn vị thì nhiệt độ phải thay đổi là 0.5K (hay gần 5mV) Từ đó ta có 
công thức đầy đủ sau để tính giá trị độ C: 
C=(ADC_value - 558.558)x(4.887mV/10mV) 
 => C=(ADC_value - 558.6)/ 2.046 
♣Khối hiển thị và cảnh báo 
 Ta dùng LED 7 thanh để hiển thị nhiệt độ của môi trường và dùng loa để 
phát ra cảnh báo khi nhiệt độ môi trường ở trong khoảng nguy hiểm. Cụ thể 
trong mạch này ta dùng Hai LED 7 thanh Anot chung (chúng ta cũng có thể 
dùng LCD thay thế) 
Sau đây là sơ đồ mạch nguyên lý: 
Sơ đồ nguyên lý 
LM335Z
1
2
3
10K
4 5
7910
21 3
8 6
a b
cde
fg
VC
C
Vc
c
D
O
T
11
12
21
22
23
24
25
26
27
28
14
13
16
17
40
39
38
37
36
35
34
33
4
5
6
7
8
9
10
29
18
19
20
1
2
3
15
30
32
31
VDD
VSS
RD2/PSP2
RD3/PSP3
RC4/SDI/SDA
RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD4/PSP4
RD5/PSP5
OSC2/CLKO
OSC1/CLKI
RC1/CCP2
RC2/CCP1
RB7/PGD
RB6/PGC
RB5
RB4
RB3/PGM
RB2
RB1
RB0/INT
RA2/AN2
RA3/AN3
RA4
RA5/AN4
RE0/AN5
RE1/AN6
RE2/AN7
RD6/PSP6
RC3/SCK/SCL
RD0/PSP0
RD1/PSP1
VPP
RA0/AN0
RA1/AN1
RC0/T1CKI
RD7/PSP7
VDD1
VSS1
H
I
A1015
4K7
SPEAKER
4K7
HI
4K7
22pF
A1015
22pF
SW2
SW
_
PB
_
SP
ST
H
I
H
I
10MHz
VR10K
1K
Q3
PIC16F877A
HI
HI
4 5
7910
21 3
8 6
a b
cde
fg
VC
C
Vc
c
D
O
T
Giải thích sơ đồ nguyên lý: 
Các Transistor A1015 (chúng ta gọi là các đèn T1, T2, T3) được cấp nguồn 5V ở 
chân E , chân C của T1 và T2 được nối với 2 chân Vcc của LED 7 thanh, các 
chân B của T1, T2 được nối lần lượt với các chân 20 và 19 của VĐK 
PIC16F877A (cụ thể là nối với các chân RD0 và RD1 là các chân output của 
PORTB). Khi RD1 ở mức thấp thì đầu C của đèn T1 sẽ ở mức cao lúc đó LED 1 
được phân cực đúng và có thể sáng, ngược lại thì LED 1 bị phân cực sai lúc đó nó 
sẽ không sáng. Tương tự cho chân RD0 và LED còn lại. Đèn T3 cũng như vậy 
nhưng thay LED bằng một cái Loa (và chân output là chân RE0 của PORTE) 
dùng để cảnh báo . 
Đầu ra của sensor nhiệt LM335 sẽ được đưa vào chân 2 của VĐK (là chân Analog 
AN0 của ADC 10 bít tích hợp sẵn trong VĐK PIC, chân AN0 này sẽ được thiết 
lập là chân vào Analog của ADC) . 
Cuối cùng là VĐK PIC16F877A, ở đây ta chỉ nói đến những tính năng mà ta dùng 
cho đề tài này, nó là một con VĐK tích hợp rất nhiều chức năng mà chúng ta có 
thể tham khảo thêm trong Datasheet của nó. Nhìn vào sơ đồ nguyên lý ta có thể 
thấy ngay rằng các chân 19, 20 là các chân output (đã được nói ở trên) ,ngoài ra 
T1 T2 
T3 
còn có các chân 33 đến 39 cũng là các chân output (chính là các bít RB0 đến 
RB6 được thiết lập là các chân output của PORTB), các chân này được nối với 
LED 7 thanh để hiển thị nhiệt độ, khi LED được phân cực đúng thì nếu các chân 
này ở mưc cao thì LED sẽ sáng. Chân 2 là chân Input, là chân vào Analog của 
ADC 
Các chân 11,12,31,32 là các chân cấp nguồn cho VĐK, riêng chân Vpp (chân 1) 
chính là chân RESET. Chân 13, 14 là các chân dùng cho việc thiêt lập xung Clock 
cho VĐK 
PHẦN II 
THIẾT KẾ PHẦN MỀM 
Trong bài này chúng ta sẽ dùng chương trình CCS (ngôn ngữ C cho PIC của 
Microchip) để viết phần lập trình cho VĐK, ưu điểm của nó là khá nhỏ gọn so với 
khi ta viết bằng MASM nhờ được hỗ trợ khá nhiều hàm, ngoài ra ta còn có thể 
chèn một đoạn chương trình viết bằng ASM giũa hai chỉ thị tiền xử lý là #ASM và 
#ENDASM . Tài liệu tham khảo: “Tài liệu hướng dẫn CCS Tiếng việt” của tác giả 
Trần Xuân Trường, SV K2001, ĐHBK HCM hoặc đầy đủ hơn là phần Hepl trong 
trình cài đặt PIC C Compiler 
Code đầy đủ cho chương trình 
--------------------------------------------------------------------------------------------------- 
#include //Khai báo con PIC ta sử dụng và file khai báo các 
bít,các 
 // thanh ghi quan trọng trong con PIC này 
#include //Khai báo sự định ngiã các thanh ghi và các bít quan 
trọng 
#device *=16 adc=10 // Khai báo dùng poiter 16 bít và ADC 10 bít 
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, 
NOLVP, NOCPD, NOWRT //Khai báo các config 
#use delay(clock=20000000) //Khai báo sử dụng hàm Delay và tần số dao động 
sử dụng 
int8 high,low; //Khai báo các biến số nguyên 1byte (8bít) 
//Khai báo mảng hằng số là số nguyen 1 byte 
int8 const a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 
// Chương trình con tách số hàng chục và hàng đơn vị thành hai số chứa trong hai 
biến 
//đã khai báo ở trên là high và low 
void convert_bcd(int8 x) 
{ 
 low=x%10; //chia lấy phần dư, low=hàng đơn vị 
 high=x/10; 
 high=high%10; //high=số hàng chục 
} 
// Chương trình con giải mã và hiển thị nhiệt độ 
void display() 
{ 
 PORTB=a[low]; // Gửi dữ liệu đến LED 1 
 RD0=0; // Bật LED1, LED1 sẽ hiển thị đúng giá trị của low 
 delay_ms(2); // Cho trễ 2ms 
 RD0=1; // tắt LED 1 
 PORTB=a[high]; // LED 2 
 RD1=0; 
 delay_ms(2); 
 RD1=1; 
} 
//Chương trình con thục hiện việc báo động 
void bao_dong(){ 
int8 i; 
 for(i=0;i<200;i++) 
 { 
 RE0=0;delay_us(100); 
 RE0=1;delay_us(100); 
 } //Kêu 200 tiếng 
} 
// Chương trình chính 
void main() { 
float value; 
int16 i; 
 trisb = 0x00; //thiết lập các chân của PORTB là các chân Output 
 trisc = 0x00; // thiết lập các chân của PORTC là các chân Output 
 trisd = 0x00; // thiết lập các chân của PORTD là các chân Output 
 trise = 0x00; // thiết lập các chân của PORTE là các chân Output 
 trisa = 0xff; // thiết lập các chân của PORTa là các chân Intput 
 portC = 0xff; // thiết lập các chân của PORTC xuất ra điện áp ở mức cao 
 portD = 0xff; // thiết lập các chân của PORTd xuất ra điện áp ở mức cao
 //Thiết lập cho ADC 
 setup_adc(ADC_CLOCK_INTERNAL); //Chỉ ra cách thức hoạt động của 
ADC là thời 
 // gian lấy mẫu bằng xung clock 
//Thiết lâp.chân lấy tín hiệu Analog là chân AN0 
 setup_adc_ports(AN0); 
 setup_ADC_channel(0) 
 delay_us(10); //Trễ 10 us 
 value=(float)read_adc(); 
 value = (value - 558.5)/2.048; 
 convert_bcd((int8)value); 
 i=0; 
 //Vòng lặp vô tận 
 while(1) 
 { 
 i++; 
 value = (float)read_adc(); 
 value = (value - 558.5)/2.048; //for 5V supply 
 if (i==150) { convert_bcd((int8)value);i=0;} 
 if(((int8)value > 40) || ((int8)value < 15)) bao_dong(); 
 display(); 
 } 
} 
 -------------------------------------------------------------------------------------------------- 
Lưu ý: 
 ●Tại sao khi gắn a[low] =PORTB thì LED 1 lại hiển thị giá trị của low? 
Bởi vì mảng hằng số: 
 a[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 
sẽ tương đương với mảng giá trị các số nhị phân như sau: 
a[10] = 
{11000000,11111001,10100100,10110000,10011001,10010010,10000010, 
11111000,10000000,10010000}; 
Kể từ phải qua trái (bỏ qua số nhị phân cuối cùng bởi vì ta không sử dụng chan 
RB7 của PORTB) các số nhị phân này chỉ ra mức điện áp ở các thanh 
a,b,c,d,e,f,g,h của LED 
Tức là mảng này tương ứng với các giá trị hiển thị trên LED là các số: 
0,1,2,3,4,5,6,7,8,9 
 ●Một số các hàm trong CCS đã được sử dụng là: 
Hàm 
 delay_us(time) 
delay_ms(time) 
ví dụ: delay_us(2) ; //tạo trễ 2us 
 delay_ms(2); //tạo trễ 2ms 
Hàm: 
 setup_adc(ADC_CLOCK_INTERNAL); 
 hàm này dùng để xác định cách thức hoạt động của bộ biến đổi ADC, cụ thể 
là xác định thời gian lấy mẫu bằng một xung clock 
Hàm: 
 setup_adc_ports(AN0); 
 setup_ADC_channel(0) 
các hàm này dùng để xác định chân lấy tín hiệu Analog là chân AN0 
Còn đây là file định ngĩa “def_877a.h” mà ta đã khai báo ở trên: 
--------------------------------------------------------------------------------------------------- 
// register definitions 
#define W 0 
#define F 1 
// register files 
#byte INDF =0x00 
#byte TMR0 =0x01 
#byte PCL =0x02 
#byte STATUS =0x03 
#byte FSR =0x04 
#byte PORTA =0x05 
#byte PORTB =0x06 
#byte PORTC =0x07 
#byte PORTD =0x08 
#byte PORTE =0x09 
#byte EEDATA =0x10C 
#byte EEADR =0x10D 
#byte EEDATH =0x10E 
#byte EEADRH =0x10F 
#byte ADCON0 =0x1F 
#byte ADCON1 =0x9F 
#byte ADRESH =0x9F 
#byte ADSESL =0x9F 
#byte PCLATH =0x0a 
#byte INTCON =0x0b 
#byte PIR1 =0x0c 
#byte PIR2 =0x0d 
#byte PIE1 =0x8c 
#byte PIE2 =0x8d 
#byte OPTION_REG =0x81 
#byte TRISA =0x85 
#byte TRISB =0x86 
#byte TRISC =0x87 
#byte TRISD =0x88 
#byte TRISE =0x89 
#byte EECON1 =0x18C 
#byte EECON2 =0x18D 
#byte SSPBUF =0x13 
#byte SSPCON =0x14 
#byte SSPCON2 =0x91 
#byte SSPADD =0x93 
#byte SSPSTAT =0x94 
// SSPCON bit 
#bit SSPWCOL = 0x14.7 
#bit SSPOV = 0x14.6 
#bit SSPEN = 0x14.5 
#bit SSPCKP = 0x14.4 
#bit SSPM3 = 0x14.3 
#bit SSPM2 = 0x14.2 
#bit SSPM1 = 0x14.1 
#bit SSPM0 = 0x14.0 
// SSPSTAT bit 
#bit SSPSMP = 0x94.7 
#bit SSPCKE = 0x94.6 
#bit SSPDA = 0x94.5 
#bit SSPP = 0x94.4 
#bit SSPS = 0x94.3 
#bit SSPRW = 0x94.2 
#bit SSPUA = 0x94.1 
#bit SSPBF = 0x94.0 
//DINH NGHIA BIT 
#bit ra5 =0x05.5 
#bit ra4 =0x05.4 
#bit ra3 =0x05.3 
#bit ra2 =0x05.2 
#bit ra1 =0x05.1 
#bit ra0 =0x05.0 
#bit rb7 =0x06.7 
#bit rb6 =0x06.6 
#bit rb5 =0x06.5 
#bit rb4 =0x06.4 
#bit rb3 =0x06.3 
#bit rb2 =0x06.2 
#bit rb1 =0x06.1 
#bit rb0 =0x06.0 
#bit rC7 =0x07.7 
#bit rC6 =0x07.6 
#bit rC5 =0x07.5 
#bit rC4 =0x07.4 
#bit rC3 =0x07.3 
#bit rC2 =0x07.2 
#bit rC1 =0x07.1 
#bit rC0 =0x07.0 
#bit rD7 =0x08.7 
#bit rD6 =0x08.6 
#bit rD5 =0x08.5 
#bit rD4 =0x08.4 
#bit rD3 =0x08.3 
#bit rD2 =0x08.2 
#bit rD1 =0x08.1 
#bit rD0 =0x08.0 
#bit rE2 =0x09.2 
#bit rE1 =0x09.1 
#bit rE0 =0x09.0 
#bit trisa5 =0x85.5 
#bit trisa4 =0x85.4 
#bit trisa3 =0x85.3 
#bit trisa2 =0x85.2 
#bit trisa1 =0x85.1 
#bit trisa0 =0x85.0 
#bit trisb7 =0x86.7 
#bit trisb6 =0x86.6 
#bit trisb5 =0x86.5 
#bit trisb4 =0x86.4 
#bit trisb3 =0x86.3 
#bit trisb2 =0x86.2 
#bit trisb1 =0x86.1 
#bit trisb0 =0x86.0 
#bit trisc7 =0x87.7 
#bit trisc6 =0x87.6 
#bit trisc5 =0x87.5 
#bit trisc4 =0x87.4 
#bit trisc3 =0x87.3 
#bit trisc2 =0x87.2 
#bit trisc1 =0x87.1 
#bit trisc0 =0x87.0 
#bit trisd7 =0x88.7 
#bit trisd6 =0x88.6 
#bit trisd5 =0x88.5 
#bit trisd4 =0x88.4 
#bit trisd3 =0x88.3 
#bit trisd2 =0x88.2 
#bit trisd1 =0x88.1 
#bit trisd0 =0x88.0 
#bit trise2 =0x89.2 
#bit trise1 =0x89.1 
#bit trise0 =0x89.0 
// INTCON Bits for C 
#bit gie = 0x0b.7 
#bit peie = 0x0b.6 
#bit tmr0ie = 0x0b.5 
#bit int0ie = 0x0b.4 
#bit rbie = 0x0b.3 
#bit tmr0if = 0x0b.2 
#bit int0if = 0x0b.1 
#bit rbif = 0x0b.0 
// PIR1 for C 
#bit pspif = 0x0c.7 
#bit adif = 0x0c.6 
#bit rcif = 0x0c.5 
#bit txif = 0x0c.4 
#bit sspif = 0x0c.3 
#bit ccp1if = 0x0c.2 
#bit tmr2if = 0x0c.1 
#bit tmr1if = 0x0c.0 
//PIR2 for C 
#bit cmif = 0x0d.6 
#bit eeif = 0x0d.4 
#bit bclif = 0x0d.3 
#bit ccp2if = 0x0d.0 
// PIE1 for C 
#bit adie = 0x8c.6 
#bit rcie = 0x8c.5 
#bit txie = 0x8c.4 
#bit sspie = 0x8c.3 
#bit ccp1ie = 0x8c.2 
#bit tmr2ie = 0x8c.1 
#bit tmr1ie = 0x8c.0 
//PIE2 for C 
#bit osfie = 0x8d.7 
#bit cmie = 0x8d.6 
#bit eeie = 0x8d.4 
// OPTION Bits 
#bit not_rbpu = 0x81.7 
#bit intedg = 0x81.6 
#bit t0cs = 0x81.5 
#bit t0se = 0x81.4 
#bit psa = 0x81.3 
#bit ps2 = 0x81.2 
#bit ps1 = 0x81.1 
#bit ps0 = 0x81.0 
// EECON1 Bits 
#bit eepgd = 0x18c.7 
#bit free = 0x18C.4 
#bit wrerr = 0x18C.3 
#bit wren = 0x18C.2 
#bit wr = 0x18C.1 
#bit rd = 0x18C.0 
//ADCON0 
#bit CHS0 =0x1F.3 
#bit CHS1 =0x1F.4 
#bit CHS2 =0x1F.5 
PHẦN TỔNG KẾT 
1. Nhận xét kết quả nhận được 
 Nhiệt độ đo dược khá chuẩn xác, tuy nhiên sai số vẫn còn khá lớn 
(tới một độ C), điều này ta có thể khắc phục được bằng cách dùng ba 
LED để hiển thị, lúc đó sai số sẽ giảm xuống còn 0,1oC (bởi vì ADC 
trong con PIC này là 10 bít => giá trị nó xuất ra tới 1023). Nếu muốn 
chuẩn xác hơn nữa ta có thể dùng ADC ngoài có số bít cao hơn, hoặc 
dùng LCD để hiển thị 
 Ứng dụng của đề tài rất rộng rãi trong cuộc sống, nhất là trong 
các nhà máy bia, các hệ thống làm lạnh trong việc kiểm soát nhiệt độ 
2.Hướng phát triển mở rộng đề tài: 
- Nâng cao độ chính xác hiển thị bằng cách dùng ADC có độ phân giải 
cao hơn (có thể dùng ADC ngoài) 
- Thêm bàn phím giao tiếp để có thể thay đổi trực tiếp khoảng nhiệt độ 
theo dõi, cùng với đó ta thêm vào LED 7 để hiển thị hai giá trị nhiệt độ 
này 
- Sử dụng EEPROM để lưu giá trị nhiệt độ mà người dùng thiết lập, các 
lần thay đổi khác... 
- Ghép nối máy tính để truyền giá trị nhiệt độ đến máy tính 
- Ghép nối LCD và một mạch đếm thời gian thực (DS1307) để ứng với 
mỗi thời điểm chương trình sẽ tự động chọn khoảng thiết lập nhiệt độ 
thích hợp theo từng mùa, từng thời điểm định trước... 
- Sử dụng PID trong điều khiển tự động kết hợp với các mạch điều 
khiển tăng giảm nhiêt độ để đảm bảo nhiệt độ luôn bám theo một giá 
trị cho trước, hệ ổn định nhiệt (giá trị thay đổi là rất nhỏ) 
            Các file đính kèm theo tài liệu này:
 bao_cao_btlvxl_nguyen_tho_loi__3324.pdf bao_cao_btlvxl_nguyen_tho_loi__3324.pdf