इस परियोजना में, हम 8051 माइक्रोकंट्रोलर का उपयोग करके आरटीसी घड़ी बनाने का प्रदर्शन करने जा रहे हैं । यदि आप Arduino के साथ इस प्रोजेक्ट को करना चाहते हैं, तो Arduino का उपयोग करके इस डिजिटल घड़ी की जाँच करें। इस परियोजना का प्रमुख घटक DS1307 है जो एक वास्तविक समय डिजिटल घड़ी आईसी है। आइए इस आईसी के बारे में विस्तार से जानते हैं।
RTC DS1307:
DS1307 सीरियल रियल-टाइम क्लॉक (RTC) एक कम-शक्ति, पूर्ण बाइनरी-कोडेड दशमलव (BCD) घड़ी / कैलेंडर प्लस NV बाइट के 56 बाइट्स है। यह चिप I chipC प्रोटोकॉल पर काम करती है। घड़ी / कैलेंडर सेकंड, मिनट, घंटे, दिन, दिनांक, माह और वर्ष की जानकारी प्रदान करता है। महीने की तारीख का अंत स्वचालित रूप से 31 दिनों से कम महीनों के लिए समायोजित किया जाता है, जिसमें लीप वर्ष के लिए सुधार भी शामिल है। घड़ी AM / PM इंडिकेटर के साथ 24-घंटे या 12-घंटे के प्रारूप में चलती है। DS1307 में एक बिल्ट-इन पॉवर-सेंस सर्किट होता है जो पावर फेल्योर का पता लगाता है और स्वचालित रूप से बैकअप सप्लाई में बदल जाता है। टाइमकीपिंग ऑपरेशन जारी है जबकि भाग बैकअप आपूर्ति से संचालित होता है। DS1307 चिप लगातार 10 साल तक चल सकती है।
8051 आधारित वास्तविक समय घड़ी आरटीसी डीएस 1307 का उपयोग करके वास्तविक समय प्रदर्शित करने के लिए एक डिजिटल घड़ी है , जो I2C प्रोटोकॉल पर काम करती है। वास्तविक समय की घड़ी का मतलब है कि यह बिजली की विफलता के बाद भी चलता है। जब शक्ति का पुन: संयोजन किया जाता है, तो यह उस समय और अवधि के बावजूद वास्तविक समय को प्रदर्शित करता है जो कि बंद अवस्था में था। इस परियोजना में हमने समय (- घंटा, मिनट, सेकंड, दिनांक, महीना और वर्ष) प्रारूप प्रदर्शित करने के लिए 16x2 एलसीडी मॉड्यूल का उपयोग किया है। वास्तविक समय की घड़ियाँ आमतौर पर हमारे कंप्यूटर, घरों, कार्यालयों और इलेक्ट्रॉनिक्स डिवाइस में उपयोग की जाती हैं ताकि उन्हें वास्तविक समय के साथ अपडेट रखा जा सके।
I2C प्रोटोकॉल एक प्रणाली में दो तारों का उपयोग करके दो या अधिक उपकरणों को जोड़ने की एक विधि है, और इसलिए इस प्रोटोकॉल को दो तार प्रोटोकॉल भी कहा जाता है । इसका उपयोग 127 डिवाइसों को एक डिवाइस या प्रोसेसर से संवाद करने के लिए किया जा सकता है। अधिकांश I2C उपकरण 100Khz आवृत्ति पर चलते हैं।
डेटा लिखने के लिए मास्टर टू स्लेव (दास प्राप्त करने की विधि)
- दास को START शर्त भेजता है।
- दास का पता दास को भेज देता है।
- दास को बिट (0) भेजें।
- दास से एसीके बिट प्राप्त किया
- शब्दों को दास को संबोधित करता है।
- दास से एसीके बिट प्राप्त किया
- गुलाम करने के लिए डेटा भेजता है।
- दास से एसीके बिट प्राप्त किया।
- और अंतिम दास को STOP शर्त भेजता है।
दास से मास्टर तक डेटा पढ़ने के चरण (दास संचारण मोड)
- दास को START शर्त भेजता है।
- दास का पता दास को भेज देता है।
- पठन बिट (1) दास को भेजें।
- दास से एसीके बिट प्राप्त किया
- दास से डेटा प्राप्त किया
- दास से एसीके बिट प्राप्त किया।
- गुलाम करने के लिए STOP शर्त भेजता है।
सर्किट आरेख और विवरण
सर्किट में हमने 3 सबसे अधिक घटकों DS1307, AT89S52 और LCD का उपयोग किया है। यहाँ AT89S52 का उपयोग DS1307 से पढ़ने के समय के लिए किया जाता है और इसे 16x2 LCD स्क्रीन पर प्रदर्शित किया जाता है। DS1307 माइक्रोकंट्रोलर को 2 लाइनों का उपयोग करके समय / तारीख भेजता है।
ऊपर दिए गए आरेख में सर्किट कनेक्शन समझना और दिखाना सरल है। DS1307 चिप पिन SDA और SCL 89S52 माइक्रोकंट्रोलर के P2.1 और P2.0 पिन से जुड़े होते हैं, जो प्रतिरोधक को खींचता है जो डेटा और घड़ी लाइनों पर डिफ़ॉल्ट मान उच्च रखता है। और एक 32.768KHz क्रिस्टल थरथरानवाला सटीक 1 सेकंड देरी उत्पन्न करने के लिए DS1307chip के साथ जुड़ा हुआ है। और एक 3 वोल्ट की बैटरी DS1307 के पिन 3 आरडी (बीएटी) से भी जुड़ी है जो बिजली की विफलता के बाद भी समय पर चलती है। 16x2 एलसीडी 4-बिट मोड में 8051 के साथ जुड़ा हुआ है। कंट्रोल पिन RS, RW और En सीधे 89S52 पिन P1.0, GND और P1.1 से जुड़े हैं। और डेटा पिन D0-D7 89S52 के P1.4-P1.7 से जुड़ा है।
SET, INC / CHANGE और नेक्स्ट तीन बटन 89S52 (सक्रिय कम) के P2.4, P2.3 और P2.2 को पिन करने के लिए घड़ी के समय को सेट करने के लिए उपयोग किए जाते हैं। जब हम सेट को दबाते हैं, तो समय सेट मोड सक्रिय हो जाता है और अब हमें INC / CHANGE बटन का उपयोग करके समय निर्धारित करने की आवश्यकता है और अगला बटन डिजिट में जाने के लिए उपयोग किया जाता है। समय निर्धारित करने के बाद घड़ी लगातार चलती है।
कार्यक्रम विवरण
कोड में हमने 8051 पारिवारिक पुस्तकालय और एक मानक इनपुट आउटपुट लाइब्रेरी को शामिल किया है। और परिभाषित पिन जो हमने उपयोग किया है, और गणना के लिए कुछ चर लिया है।
#शामिल
और दिए गए फ़ंक्शन का उपयोग एलसीडी ड्राइविंग के लिए किया जाता है।
void डेटेन () {rs = 1; एन = 1; देरी (1); एन = 0; } शून्य lcddata (अहस्ताक्षरित चार ch) {lcdport = ch & 0xf0; दातन (); lcdport = (ch << 4) & 0xf0; दातन (); } शून्य cmden (शून्य) {rs = 0; एन = 1; देरी (1); एन = 0; } शून्य lcdcmd (अहस्ताक्षरित चार ch)
इस फ़ंक्शन का उपयोग आरटीसी को आरंभ करने के लिए किया जाता है और फॉर्म आरटीसी आईसी से समय और तारीख को पढ़ता है।
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); घंटे = बीसीडीटीडेसीमल (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); दिनांक = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); वर्ष = BCDToDecimal (I2CRead (1)); I2CStop (); शो टाइम(); // प्रदर्शन समय / तारीख / दिन देरी (1);
इन कार्यों का उपयोग दशमलव को बीसीडी और बीसीडी को दशमलव में परिवर्तित करने के लिए किया जाता है।
int BCDToDecimal (char bcdByte) {चार a, b, dec; a = (((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; वापसी; } char DecimalToBCD (int दशमलवबाइट) {char a, b, bcd; a = ((दशमलव -10 / 10) << 4); बी = (दशमलव बाइट 10%); bcd = ab; वापसी bcd; }
नीचे दिए गए कार्यों का उपयोग I2C संचार के लिए किया जाता है।
void I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // ds1307 RTC void I2CStop () {SDA = 0, SCL = 1, SDA = 1 के साथ संवाद के लिए "प्रारंभ" समारोह; } // "स्टॉप" फ़ंक्शन के लिए wit ds1307 RTC अहस्ताक्षरित char I2CSend (अहस्ताक्षरित चार डेटा) // ds1307 {char i पर डेटा भेजें; चार ack_bit; for (i = 0; i <8; i ++) {if (डेटा और 0x80) SDA = 1; और एसडीए = 0; एससीएल = 1; डेटा << = 1; एससीएल = 0; } एसडीए = 1, एससीएल = 1; ack_bit = SDA; एससीएल = 0; ack_bit वापस; } अहस्ताक्षरित चार I2CRead (char ack) // ds1307 से डेटा प्राप्त करें {अहस्ताक्षरित चार i, डेटा = 0; एसडीए = 1; के लिए (i = 0; मैं <8; मैं ++) {डेटा << = 1; do {SCL = 1;} जबकि (SCL == 0); if (SDA) डेटा- = 1; एससीएल = 0; } if (ack) SDA = 0; और एसडीए = 1; एससीएल = 1; एससीएल = 0; एसडीए = 1; डेटा वापस करें; }
Set_time फ़ंक्शन का उपयोग घड़ी में समय सेट करने के लिए किया जाता है और नीचे show_time फ़ंक्शन का उपयोग एलसीडी पर समय प्रदर्शित करने के लिए किया जाता है।
void show_time () // फ़ंक्शन को एलसीडी {चार संस्करण पर समय / तारीख / दिन प्रदर्शित करने के लिए; lcdcmd (0x80); एलसीडीप्रिंट ("तिथि:"); स्प्रिंटफ (var, "% d", दिनांक); lcdprint (var); स्प्रिंटफ (var, "/% d", सोम); lcdprint (var); स्प्रिंटफ (var, "/% d", वर्ष + 2000); lcdprint (var); एलसीडीप्रिंट (""); lcdcmd (0xc0); एलसीडीडप्रिंट ("समय:"); स्प्रिंटफ (var, "% d", घंटा); lcdprint (var); स्प्रिंटफ (var, ":% d", मिनट); lcdprint (var); स्प्रिंटफ (var, ":% d", सेकंड); lcdprint (var); एलसीडीडप्रिंट (""); // दिन (दिन 1); एलसीडीडप्रिंट (""); }