Đề tài Mạch đo nhiệt độ và cảnh báo

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

pdf20 trang | Chia sẻ: lvcdongnoi | Lượt xem: 3782 | Lượt tải: 1download
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:

  • pdfbao_cao_btlvxl_nguyen_tho_loi__3324.pdf