בפרויקט זה אנו נדגים ביצוע שעון 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 בגודל 16x2 כדי להציג את השעה בתבנית - (שעה, דקה, שניות, תאריך, חודש ושנה). בדרך כלל משתמשים בשעונים בזמן אמת במחשבים, בבתים, במשרדים ובמכשירי האלקטרוניקה שלנו כדי לעדכן אותם בזמן אמת.
פרוטוקול I2C הוא שיטה לחיבור שני התקנים או יותר המשתמשים בשני חוטים למערכת אחת, ולכן נקרא פרוטוקול זה גם כפרוטוקול דו חוטי. באמצעותו ניתן לתקשר 127 מכשירים למכשיר או מעבד יחיד. מרבית מכשירי ה- I2C פועלים בתדר של 100 קילו-הרץ.
צעדים עבור מאסטר לכתיבת נתונים לעבד (מצב קבלת עבדים)
- שולח תנאי START לעבד.
- שולח כתובת עבד לעבד.
- שלח סיבית כתיבה (0) לעבד.
- קיבל קצת ACK מהעבד
- שולח מילה לכתובת לעבד.
- קיבל קצת ACK מהעבד
- שולח נתונים לעבד.
- קיבל קצת ACK מהעבד.
- ואחרון שולח תנאי STOP לעבד.
צעדים לקריאת נתונים מעבד למורה (מצב העברת עבדים)
- שולח תנאי START לעבד.
- שולח כתובת עבד לעבד.
- שלח סיבית קריאה (1) לעבד.
- קיבל קצת ACK מהעבד
- נתונים שהתקבלו מהעבד
- קיבל קצת ACK מהעבד.
- שולח תנאי STOP לעבד.
תרשים מעגל ותיאור
במעגל השתמשנו ברוב 3 הרכיבים DS1307, AT89S52 ו- LCD. כאן AT89S52 משמש לזמן קריאה מ- DS1307 ולהציגו על מסך LCD בגודל 16x2. DS1307 שולח זמן / תאריך באמצעות שתי שורות למיקרו-בקר.
חיבורי מעגלים פשוטים להבנה ומוצגים בתרשים לעיל. פין שבב DS1307 SDA ו- SCL מחוברים לסיכות P2.1 ו- P2.0 של מיקרו-בקרה 89S52 עם נגע משיכה המחזיק בערך ברירת המחדל HIGH בקווי נתונים ושעון. ומתנד קריסטל של 32.768KHz מחובר עם שבב DS1307 ליצירת עיכוב של שנייה מדויקת. וסוללת וולט 3 מחובר גם להצמיד 3 rd (BAT) של DS1307 אשר שומר זמן רץ אחרי כישלון חשמל. LCD 16x2 מחובר עם 8051 במצב 4 סיביות. סיכת בקרה RS, RW ו- En מחוברים ישירות לסיכה 89S52 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 ולחצן Next משמש למעבר לספרה. לאחר הגדרת שעון השעון פועל ברציפות.
תיאור התוכנית
בקוד כללנו 8051 ספרייה משפחתית וספריית פלט קלט סטנדרטית. והגדרנו סיכות שהשתמשנו בהן, ולקחנו משתנה כלשהו לחישובים.
#לִכלוֹל
והפונקציה הנתונה משמשת לנהיגת LCD.
בטל נתונים () {rs = 1; en = 1; עיכוב (1); en = 0; } בטל lcddata (char ch לא חתום) {lcdport = ch & 0xf0; daten (); lcdport = (ch << 4) & 0xf0; daten (); } ריק cmden (ריק) {rs = 0; en = 1; עיכוב (1); en = 0; } בטל lcdcmd (char ch לא חתום)
פונקציה זו משמשת לאתחול RTC ולקריאת זמן ותאריך מטופס RTC IC.
I2CStart (); I2CSend (0xD0); I2CSend (0x00); I2CStart (); I2CSend (0xD1); sec = BCDToDecimal (I2CRead (1)); min = BCDToDecimal (I2CRead (1)); שעה = BCDToDecimal (I2CRead (1)); day1 = BCDToDecimal (I2CRead (1)); תאריך = BCDToDecimal (I2CRead (1)); mon = BCDToDecimal (I2CRead (1)); שנה = BCDToDecimal (I2CRead (1)); I2CStop (); show_time (); // זמן תצוגה / תאריך / יום עיכוב (1);
פונקציות אלה משמשות להמרת עשרוני ל- BCD ו- BCD לעשרוני.
int BCDToDecimal (char bcdByte) {char a, b, dec; a = ((((bcdByte & 0xF0) >> 4) * 10); b = (bcdByte & 0x0F); dec = a + b; החזרת דצמבר; } char DecimalToBCD (int decimalByte) {char a, b, bcd; a = ((decimalByte / 10) << 4); b = (decimalByte% 10); bcd = ab; להחזיר bcd; }
הפונקציות שלהלן משמשות לתקשורת I2C.
בטל I2CStart () {SDA = 1; SCL = 1, SDA = 0, SCL = 0;} // פונקציית "התחלה" לתקשורת עם ds1307 RTC בטל I2CStop () {SDA = 0, SCL = 1, SDA = 1; } // פונקציית "עצירה" לתקשורת עם ds1307 RTC ללא חתום I2CSend (נתונים ללא char חתום) // לשלוח נתונים ל- ds1307 {char i; char 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 {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.
חלל show_time () // פונקציה להצגת זמן / תאריך / יום ב- LCD {char var; lcdcmd (0x80); lcdprint ("תאריך:"); sprintf (var, "% d", תאריך); lcdprint (var); sprintf (var, "/% d", mon); lcdprint (var); sprintf (var, "/% d", שנה + 2000); lcdprint (var); lcdprint (""); lcdcmd (0xc0); lcdprint ("זמן:"); sprintf (var, "% d", שעה); lcdprint (var); sprintf (var, ":% d", min); lcdprint (var); sprintf (var, ":% d", sec); lcdprint (var); lcdprint (""); // יום (יום 1); lcdprint (""); }