قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 08-09-2019, 10:04 PM المشاركة 1   
افتراضي شرح ساعة وقت وتاريخ تستخدم PIC16F877A و DS1307 و السفن سيجمنت مع المقاطعة Twitter FaceBook Google+



شرح ساعة وقت وتاريخ تستخدم PIC16F877A و DS1307 و السفن سيجمنت مع المقاطعة وتقنيات البرمجة بلغة السى مع المترجم ميكروسى برو وبرنامج المحاكاة بروتيس

المرجع :

https://www.mediafire.com/file/hozzp...-7Seg.rar/file

احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً عبدالله حجازى, مسلم11 ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى, مسلم11 ( أعجبته المشاركة )
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 09-09-2019, 12:04 PM المشاركة 2   
افتراضي


مقدمة :
خطوات تنفيذ البرنامج (الخوارزمية) :

بعد إعدادات المنافذ والمقاطعة وتهيئة الناقل I2C :
1- كتابة (إرسال) الزمن والتاريخ الابتدائى StartTime إلى الشريحة DS1307 .
2- عمل حلقة غير منتهية وفيها يتم :
أ‌- قراءة الزمن والتاريخ ReadI2C من الشريحة DS1307 ، البيانات بالثنائى المكود عشرى BCD .
ب‌- تحويل البيانات من BCD إلى العشرى TransformTime .
ت‌- تهيئة الساعة لتعمل بنظام 12 ساعة مع وضع AM-PM ، Hour12_AM_PM .
ث‌- استخلاص قيم الآحاد والعشرات لكل بند والحصول على القيم السداسية عشرى الخاصة بكود السفن سيجمنت المقابل تمهيدا لوضعها على المنفذ PORTB لعرضها باستخدام المقاطعة DisplayTime .
ج‌- عرض الزمن Time (Hour & Minute) باستخدام المقاطعة GotoTime .
ح‌- القيام باختيار أحد المفاتيح واتخاذ القرار بناء على هذا الاختيار :
1- الضغط على المفتاح Button1 : يؤدى إلى
• عرض التاريخ GotoDate .
• الضغطة الثانية تعرض الثوانى GotoSecond .
• الضغطة الثالثة تعرض التاريخ مرة أخرى GotoTime .
2- الضغط على المفتاح Button2 يؤدى إلى :
• عرض الزمن GotoTime .
• الضغطة الثانية تؤدى إلى الدخول فى نظام تغيير الزمن والتاريخ حيث يتم البدء بوميض الساعة hour عندئذ يمكن بالستخدام المفتاح Button1 زيادة قيمة الساعة ، والضغطة الثانية تعرض وميض الدقائق وهكذا ، حتى نصل إلى السنة year وفى النهاية يتم حفظ التغييروالعودة إلى الوضع العادى بعرض الزمن . فى حالة الضغط على المفتاح Button3 أثناء إجراء التغيير يتم إلغاء التغيير والعودة إلى عرض الزمن من دون حفظ التغيير .
3- الضغط على المفتاح Button3 يؤدى إلى : عرض الزمن علاوة على العمل السابق .
4- الضغط على المفتاح Button4 يؤدى إلى عرض السنة .

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 09-09-2019, 12:54 PM المشاركة 3   
افتراضي


أولا : الإعلان عن المتغيرات العمومية Global واستخدام موجه قبل المعالج #define فى تعريف بعض الثوابت بأسماء ذات معنى :

كود:
char second, minute, hour, day, date, month, year;
char second_d1, second_d2, minute_d1, minute_d2, hour_d1, hour_d2;
char date_d1, date_d2, month_d1, month_d2, year_d1, year_d2, year_d3, year_d4;
char convert, hold;
char seg[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; //Segment 0-9
//----Buttons-----------------------------//
#define Button1   PORTC.f0   //Show Date & Second, Date & Second ++
#define Button2   PORTC.f1   //Change Time & Date
#define Button3   PORTC.f2   //Show Time & No Save Time & Date
#define Button4   PORTC.f5   //Show Year
//----In Interrupt-----------------------------------//
#define GotoTime     0
#define GotoSecond   1
#define GotoDate     2
#define GotoYear     3
//#define GotoClear    4
//----Hour 12 (AM-PM)---------------------//
#define AM   PORTE.f0   //Hour12(AM)
#define PM   PORTE.f1   //Hour12(PM)


ملاحظات :
• جميع المتغيرات صغيرة الحجم ولذلك يتم إعلانها من نوع الحرف char ، كما يمكن استخدام النوع unsigned short فكلاهما بحجم واحد بايت أى مداه 0-255 .
• عبارة التوجيه #define لا تنتهى بفاصلة منقوطة .

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 09-09-2019, 10:02 PM المشاركة 4   
افتراضي


ثانيا : الدالة الرئيسية main
أ‌- فى البداية يتم :
• إعداد وتهيئة منافذ الميكروكونترولر : المنفذ PORTB مخارج ، والمنفذ PORTC مداخل ، والمنفذ PORTD مخارج ، والمنفذ PORTE مخارج .
• إعداد سجلات التحكم فى المقاطعة ، ففى سجل التحكم فى المقاطعة INTCON يتم تحديد بت المقاطعة بالمؤقت TMR0 ( البت BIT5 ) T0IE وكذلك تحديد set بت عموم المقاطعات (BIT7 ) GIE ، ومسح clear بت علم المقاطعة بالمؤقت TMR0 (BIT2) T0IF . وفى سجل الخيارات OPTION_REG يتم مسح الثلاثة بتات الأولى لاختيار معامل قسمة التردد prescaler بالقيمة 2 وبهذه الطريقة تحدث المقاطعة بسجل المؤقت TMR0 كل 255 ميكروثانية (باعتبار تردد الكريستال المستخدم 4 ميجا هرتز ) مضروبا فى 2 أى كل حوالى نصف ملى ثانية .عند حدوث المقاطعة يتم تحديد بت علم المقاطعة حيث يتم مسحها يدويا فى نهاية دالة المقاطعة تمهيدا للمقاطعة التالية .
• تهيئة الناقل I2C للإتصال بتردد 100 كيلو هرتز .
• وإرسال (كتابة) زمن وتاريخ ابتدائى إلى الشريحة DS1307 باستخدام الدالة StartTime.


كود:
    trisB = 0;   trisC = 0xff;   trisD = 0;   trisE = 0;
     option_reg = 0b10000000; intcon = 0b10100000;       	//Registers
     i2c1_init(100000);   					//Init I2C(IC DS1307)
     StartTime(0x00, 0x19, 0x09, 5, 0x05, 0x09, 0x19);   	//Start Time

دالة الكتابة إلى الشريحة DS1307 :


كود:
//----Start Time for IC DS1307------------------------------//
void StartTime(char second, char minute, char hour, char day, char date, char month, char year)
{
     i2c1_start();
     i2c1_wr(0xd0);
     i2c1_wr(0);

     i2c1_wr(second);
     i2c1_wr(minute);
     i2c1_wr(hour);
     i2c1_wr(day);
     i2c1_wr(date);
     i2c1_wr(month);
     i2c1_wr(year);
     i2c1_wr(0x10); // 1Hz
     i2c1_stop();
}

هذه الدالة وسائطها المتغيرات المحلية local من نوع الحرف second و minute و hourو day و dateو month و year .

خطوات كتابة الوقت والتاريخ
• إصدار حالة البداية i2c1_start() .
• إرسال (كتابة) عنوان الشريحة DS1307 وهو 0xd0 مع جعل البت الأدنى LSB بصفر لتحديد وضع الكتابة i2c1_wr(0xd0) .
• أرسال عنوان السجل المطلوب الكتابة إليه (على سبيل المثال 0x00 للكتابة إلى سجل الثوانى second ). يضبط (يعين) هذا النقل مؤشر السجل داخل الشريحة i2c1_wr(0) .

• إرسال قيمة الثواني بتنسيق BCD i2c1_wr(second) . باتباع إجراء الكتابة إلى سجل الثواني ، سيزداد المؤشر في RTC تلقائيًا. ستتم كتابة البيانات التالية في موقع 0x01 وهو سجل الدقيقة minute i2c1_wr(minute).
• الأرسال حتى يتم كتابة سجل العام year i2c1_wr(year) . السجل الأخير يمكن عن طريقة الحصول على نبضات خرج من الشريحة بتردد 1Hz i2c1_wr(0x10) .
• قم بإنهاء الاتصال بإصدار حالة التوقف i2c1_stop( .


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 09-09-2019 الساعة 10:42 PM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-09-2019, 12:44 PM المشاركة 5   
افتراضي


ب‌- الحلقة الغير منتهية :
يمكن تقسيم ما بداخل الحلقة الغير منتهية إلى قسمين
القسم الأول : قسم إنشاء الساعة ، والقسم الثانى : قسم مفاتيح التحكم .

القسم الأول : قسم إنشاء الساعة :


كود:
while(1)
     {
        ReadI2C();			//I2C Read for IC DS1307 in BCD format
        Hour12_AM_PM();		//Hour 12 (AM-PM)
        TransformTime();//Transform Time for IC DS1307 from BCD TO Decimal format
       DisplayTime(); // get ten and one part of each item then get 7 segment code value that applied to PORTB  
        convert = GotoTime;   //Goto Time in Interrupt , Show Time(Hour & Minute)


1- نبدأ بدالة قرأء بيانات الزمن والتاريخ ReadI2C() من الشريحة DS1307 من خلال الناقل I2C وتكون بالشكل الثنائى المكود عشرى BCD :

كود:
//----I2C Read for IC DS1307----------------//
void ReadI2C()
{
     i2c1_start();		// start condition

     i2c1_wr(0xd0);		// slave address with write mode
     i2c1_wr(0);		// address of seconds register written to the pointer

     i2c1_repeated_start();

     i2c1_wr(0xd1);		// slave address with read mode

     second = i2c1_rd(1);	// Read the slave with ACK
     minute = i2c1_rd(1);
     hour   = i2c1_rd(1);
     day    = i2c1_rd(1);
     date   = i2c1_rd(1);
     month  = i2c1_rd(1);
     year   = i2c1_rd(0);	// Read the slave with not-ACK
     
    i2c1_stop();			//i2c stop condition
}

خطوات قراءة الزمن والتاريخ :
• إصدار حالة البدء START . i2c1_start()
• إرسال عنوان الشريحة RTC مع جعل البت الأدنى بصفر (0xD0) للوصول إلى RTC في وضع الكتابة . i2c1_wr(0xd0)
• إرسال عنوان أول سجل وهو سجل الثوانى لتحديد وضع المؤشر . i2c1_wr(0)
• إعادة حالة البدء . i2c1_repeated_start()
• إرسال عنوان الشريحة RTC مع جعل البت الأدنى بواحد (0xD1) للوصول إلى RTC في وضع القراءة.
• الآن ستقوم RTC بإرسال البيانات من سجلاتها واحد تلو الآخر . يجب الانتباه إلى أنه سيتم إخراج البيانات في السجل الذي يتم تخزين عنوانه حاليًا في المؤشر. إذا احتاج المستخدم إلى قراءة سجل معين ، فيجب أولاً الوصول إلى RTC في وضع الكتابة ويجب كتابة عنوان السجل المطلوب على المؤشر. ثم مرة أخرى ، يجب معالجة RTC في وضع القراءة بعد إصدار إعادة حالة البدء
• يجب أن يعترف ACK الماستر بكل بايت يستقبله (يقرأه) لاستقبال البايت التالية ، متمثلا بالواحد كوسيط لدالة القراءة .
• بعد استلام آخر بايت فإن الماستر يجب أن يرسل إشارة NACK إلى RTC متمثلا بالصفر كوسيط لدالة القراءة.
• إنهاء الاتصالات بإصدار حالة STOP على الناقل I2C .

ملاحظات :
• جميع قيم سجلات الزمن والتاريخ تكون بتنسيق ثنائى مكود عشرى BCD ، لذلك تحتاج إلى تحويلها التنسيق العشرى / السداسى عشرى لبدء المعالجة .
• جميع المتغيرات المذكورة فى هذه الدالة هى متغيرات عمومية global أى يمكن الوصول إليها ومعالجتها من جميع الدوال .


الصورة الرمزية مسلم11
مسلم11
:: عضو ذهبي ::
تاريخ التسجيل: Jun 2009
الدولة: بلاد الشام
المشاركات: 3,803
نشاط [ مسلم11 ]
قوة السمعة:185
قديم 10-09-2019, 09:26 PM المشاركة 6   
افتراضي


السلام عليكم
اخي الكريم موقع mediafire اصبح محجوبا لدينا لذلك في وقت فراغك ارجو منك ان ترفع ما رفعت على الموقع على موقع آخر
مثل top4top او اي موقع رفع عربي اريد ارشفته عندي ربما احتاجه في يوم ما .
حياك الله


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-09-2019, 10:04 PM المشاركة 7   
افتراضي


وعليكم السلام

إن شاء الله

مع تمنياتى بدوام التوفيق

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب مسلم11 ( أعجبته المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 10-09-2019, 10:07 PM المشاركة 8   
افتراضي


2- دالة العمل بنظام 12 ساعة مع بيان AM/PM باستخدام ليدات :


كود:
 //----Hour 12 (AM-PM)----------------------//
void Hour12_AM_PM()
{
     if (hour < 0x12)//case 1 hour<12
     {
        if (hour == 0)
        {
           hour = 0x12;
           AM = 1;
        }
        else AM = 1;
     }
	 
     else if (hour == 0x12)//case 2 hour=12
     {
        PM = 1;
     }
	 
     else if (hour > 0x12 && hour < 0x20)//case 3 hour>12 && hour < 20
     {
        hour = hour - 0x12;
        PM = 1;
     }
	 
     else if (hour == 0x20)//case 4
     {
        hour = 0x08;
        PM = 1;
     }
	 
     else if (hour == 0x21)//case 5
     {
        hour = 0x09;
        PM = 1;
     }
	 
     else if (hour == 0x22)//case 6
     {
        hour = 0x10;
        PM = 1;
     }
	 
     else if (hour == 0x23)//case 7
     {
        hour = 0x11;
        PM = 1;
     }
	 
	 
}

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 09:51 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025