في هذا المشروع ، سوف نعرض كيفية صنع ساعة RTC باستخدام متحكم 8051. إذا كنت ترغب في القيام بهذا المشروع باستخدام Arduino ، فتحقق من هذه الساعة الرقمية باستخدام Arduino. المكون الرئيسي لهذا المشروع هو DS1307 وهو ساعة رقمية في الوقت الحقيقي IC. دعنا نعرف عن هذا IC بالتفصيل.
RTC DS1307:
ساعة الوقت الحقيقي التسلسلي DS1307 (RTC) هي ساعة / تقويم عشري ثنائي الترميز (BCD) منخفض الطاقة ، بالإضافة إلى 56 بايت من NV SRAM. تعمل هذه الشريحة على بروتوكول I²C. توفر الساعة / التقويم معلومات الثواني والدقائق والساعات واليوم والتاريخ والشهر والسنة. يتم تعديل تاريخ نهاية الشهر تلقائيًا للأشهر التي يقل عدد أيامها عن 31 يومًا ، بما في ذلك تصحيحات السنة الكبيسة. تعمل الساعة إما بتنسيق 24 ساعة أو 12 ساعة مع مؤشر AM / PM. يحتوي DS1307 على دائرة استشعار طاقة مدمجة تكتشف حالات انقطاع التيار وتتحول تلقائيًا إلى مصدر الطاقة الاحتياطية. تستمر عملية ضبط الوقت بينما يعمل الجزء من الإمداد الاحتياطي. يمكن تشغيل شريحة DS1307 بشكل مستمر حتى 10 سنوات.
ساعة الوقت الفعلي المستندة إلى 8051 هي ساعة رقمية لعرض الوقت الفعلي باستخدام RTC DS1307 ، والتي تعمل على بروتوكول I2C. تعني ساعة الوقت الحقيقي أنها تعمل حتى بعد انقطاع التيار الكهربائي. عند إعادة توصيل الطاقة ، فإنها تعرض الوقت الفعلي بغض النظر عن الوقت والمدة التي كانت في حالة إيقاف التشغيل. في هذا المشروع ، استخدمنا وحدة LCD مقاس 16 × 2 لعرض الوقت بتنسيق - (الساعة ، الدقيقة ، الثواني ، التاريخ ، الشهر والسنة). تُستخدم ساعات الوقت الفعلي بشكل شائع في أجهزة الكمبيوتر والمنازل والمكاتب والأجهزة الإلكترونية لدينا لإبقائها محدثة في الوقت الفعلي.
بروتوكول I2C هو طريقة لتوصيل جهازين أو أكثر باستخدام سلكين بنظام واحد ، ولذلك يُطلق على هذا البروتوكول أيضًا اسم بروتوكول سلكين. يمكن استخدامه لتوصيل 127 جهازًا بجهاز أو معالج واحد. تعمل معظم أجهزة I2C بتردد 100 كيلو هرتز.
خطوات كتابة البيانات الرئيسية إلى التابع (وضع الاستلام التابع)
- يرسل شرط START إلى التابع.
- يرسل عنوان العبد إلى العبد.
- أرسل بت كتابة (0) إلى التابع.
- تلقى بت ACK من العبد
- يرسل كلمات العنوان إلى العبد.
- تلقى بت ACK من العبد
- يرسل البيانات إلى العبد.
- تلقى بت ACK من العبد.
- وأخيرًا يرسل شرط STOP إلى العبد.
خطوات قراءة البيانات من العبد إلى السيد (وضع الإرسال التابع)
- يرسل شرط START إلى التابع.
- يرسل عنوان العبد إلى العبد.
- أرسل قراءة بت (1) إلى التابع.
- تلقى بت ACK من العبد
- البيانات المتلقاة من العبد
- تلقى بت ACK من العبد.
- يرسل شرط STOP إلى العبد.
مخطط الدائرة والوصف
في الدائرة ، استخدمنا 3 مكونات معظمها DS1307 و AT89S52 و LCD. هنا يتم استخدام AT89S52 لقراءة الوقت من DS1307 وعرضه على شاشة LCD مقاس 16 × 2. يرسل DS1307 الوقت / التاريخ باستخدام سطرين إلى وحدة التحكم الدقيقة.
تعتبر توصيلات الدوائر سهلة الفهم وتظهر في الرسم البياني أعلاه. يتم توصيل دبوس رقاقة DS1307 SDA و SCL بدبابيس P2.1 و P2.0 من متحكم 89S52 مع مقاومة سحب تحمل القيمة الافتراضية HIGH في خطوط البيانات والساعة. ومذبذب بلوري 32.768 كيلو هرتز متصل بشريحة DS1307 لتوليد تأخير دقيق لمدة ثانية واحدة. ويتم توصيل بطارية 3 فولت أيضا دبوس إلى 3 الثالثة (BAT) من DS1307 والتي تحافظ على وقت تشغيل بعد فشل الكهرباء. 16x2 LCD متصلة بـ 8051 في وضع 4 بت. يرتبط دبوس التحكم RS و RW و En مباشرة بـ 89S52 pin P1.0 و GND و P1.1. ويتم توصيل دبوس البيانات D0-D7 بـ P1.4-P1.7 من 89S52.
يتم استخدام ثلاثة أزرار وهي SET و INC / CHANGE و Next لضبط وقت الساعة على دبوس P2.4 و P2.3 و P2.2 من 89S52 (منخفض نشط) عندما نضغط على SET ، يتم تنشيط وضع ضبط الوقت والآن نحتاج إلى ضبط الوقت باستخدام زر INC / CHANGE ويستخدم الزر التالي للانتقال إلى الرقم. بعد ضبط الوقت ، تعمل الساعة بشكل مستمر.
وصف البرنامج
في الكود ، قمنا بتضمين مكتبة عائلية 8051 ومكتبة إخراج إدخال قياسية. وحددنا الدبابيس التي استخدمناها ، وأخذنا بعض المتغيرات للحسابات.
#تضمن
ويتم استخدام الوظيفة المحددة لقيادة شاشات الكريستال السائل.
تاريخ باطل () {rs = 1 ؛ أون = 1 ؛ تأخير (1) ؛ أون = 0 ؛ } lcddata باطلة (حرف غير موقعة) {lcdport = ch & 0xf0؛ داتن () ؛ lcdport = (الفصل << 4) & 0xf0 ؛ داتن () ؛ } cmden باطل (باطل) {rs = 0 ؛ أون = 1 ؛ تأخير (1) ؛ أون = 0 ؛ } lcdcmd باطلة (حرف CH غير موقعة)
تُستخدم هذه الوظيفة لتهيئة RTC وقراءة الوقت والتاريخ من نموذج RTC IC.
I2CStart () ، I2CSend (0xD0) ؛ I2CSend (0x00) ؛ I2CStart () ، I2CSend (0xD1) ؛ ثانية = BCDToDecimal (I2CRead (1)) ؛ دقيقة = BCDToDecimal (I2CRead (1)) ؛ ساعة = BCDToDecimal (I2CRead (1)) ؛ يوم 1 = BCDToDecimal (I2CRead (1)) ؛ التاريخ = BCDToDecimal (I2CRead (1)) ؛ mon = BCDToDecimal (I2CRead (1)) ؛ السنة = BCDToDecimal (I2CRead (1)) ؛ I2CStop () ، موعد العرض()؛ // عرض الوقت / التاريخ / تأخير اليوم (1) ؛
تُستخدم هذه الوظائف لتحويل النظام العشري إلى BCD و BCD إلى رقم عشري.
int BCDToDecimal (char bcdByte) {char a، b، dec؛ أ = (((bcdByte & 0xF0) >> 4) * 10) ؛ ب = (bcdByte & 0x0F) ؛ ديسمبر = أ + ب ؛ العودة ديسمبر } char DecimalToBCD (int decimalByte) {char a، b، bcd؛ أ = ((decimalByte / 10) << 4) ؛ ب = (عشري بايت٪ 10) ؛ bcd = أب ؛ عودة bcd ؛ }
يتم استخدام الوظائف الواردة أدناه للاتصالات I2C.
void I2CStart () {SDA = 1؛ SCL = 1، SDA = 0، SCL = 0؛} // وظيفة "start" للتواصل مع ds1307 RTC void I2CStop () {SDA = 0، SCL = 1، SDA = 1 ؛ } // وظيفة "stop" للتواصل مع ds1307 RTC غير موقعة char I2CSend (بيانات char غير الموقعة) // أرسل البيانات إلى ds1307 {char i؛ شار ack_bit ؛ لـ (i = 0 ؛ i <8 ؛ i ++) {if (Data & 0x80) SDA = 1 ؛ آخر SDA = 0 ؛ SCL = 1 ؛ البيانات << = 1 ؛ SCL = 0 ؛ } SDA = 1 ، SCL = 1 ؛ ack_bit = SDA ، SCL = 0 ؛ عودة ack_bit ؛ } غير موقعة char I2CRead (char ack) // تلقي البيانات من ds1307 {unsigned char i، Data = 0؛ SDA = 1 ؛ لـ (i = 0 ؛ i <8 ؛ i ++) {البيانات << = 1 ؛ افعل {SCL = 1 ؛} بينما (SCL == 0) ؛ إذا (SDA) البيانات- = 1 ؛ SCL = 0 ؛ } إذا (ack) SDA = 0 ؛ آخر SDA = 1 ؛ SCL = 1 ؛ SCL = 0 ؛ SDA = 1 ؛ عودة البيانات }
تُستخدم وظيفة set_time لضبط الوقت في الساعة ، وتُستخدم وظيفة show_time أدناه لعرض الوقت على شاشة LCD.
void show_time () // function لعرض الوقت / التاريخ / اليوم على شاشة LCD {char var؛ lcdcmd (0x80) ؛ lcdprint ("التاريخ:") ؛ sprintf (var ، "٪ d" ، التاريخ) ؛ lcdprint (فار) ؛ sprintf (var ، "/٪ d" ، mon) ؛ lcdprint (فار) ؛ sprintf (var، "/٪ d" ، سنة + 2000) ؛ lcdprint (فار) ؛ lcdprint ("") ؛ lcdcmd (0xc0) ؛ lcdprint ("الوقت:") ؛ sprintf (var ، "٪ d" ، ساعة) ؛ lcdprint (فار) ؛ sprintf (var، ":٪ d"، min) ؛ lcdprint (فار) ؛ sprintf (var ، ":٪ d" ، ثانية) ؛ lcdprint (فار) ؛ lcdprint ("") ؛ // يوم (يوم 1) ؛ lcdprint ("") ؛ }