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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 11-09-2019, 01:18 AM المشاركة 9   
افتراضي



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

الرابط على الموقع المطلوب :

https://up.top4top.net/downloadf-1348f8ne51-rar.html

https://up.top4top.net/downloadf-1348f8ne51-rar.html

اعلانات

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



3- دالة تحويل بيانات الزمن والتاريخ من ثنائى مكود عشرى BCD إلى عشرى لنتمكن من معالجتها

كود:
TransformTime();//Transform Time for IC DS1307 from BCD TO Decimal format

//----Transform Time for IC DS1307------------------//
void TransformTime()
{
     second =((second & 0xf0)>>4)* 10 +(second & 0x0f);
     minute =((minute & 0xf0)>>4)* 10 +(minute & 0x0f);
     hour   =((hour & 0xf0)>>4)* 10 +(hour & 0x0f);
     day    =((day & 0xf0)>>4)* 10 +(day & 0x0f);
     date   =((date & 0xf0)>>4)* 10 +(date & 0x0f);
     month  =((month & 0xf0)>>4)* 10 +(month & 0x0f);
     year   =((year & 0xf0)>>4)* 10 +(year & 0x0f);
}

تحويل من النظام BCD المكون من رقمين إلى النظام العشرى :
عند قراءة بيانات الزمن والتاريخ من الشريحة DS1307 تكون بالنظام BCD ويلزم تحويلها إلى النظام العشرى لاستخدامها بعد ذلك فى دالة العرض DisplayTime للحصول على القيم المناظرة لكود السفن سيجمنت .
المترجم ميكروسى برو يوفر دالة جاهزة للتحويل من BCD إلى عشرى وهى Bcd2Dec ولكن استخدامها يستهلك الذاكرة المتواضعة ، لذلك يفضل عدم استخدامها ولكن تستخدم طريقة التحويل المبينة أعلاه .
فى هذه الطريقة يتم التحويل على خطوات :
• للحصول على الرقم المناظر لرقم العشرات يتم إجراء عملية AND بين متغير البيانات ( وليكن second ) والقيمة 0xf0 للحصول على الاربع بتات (النبل) العلوية وإزاحة النتيجة 4 أماكن ثم الضرب فى 10 (second & 0xf0)>>4)* 10 .
• وللحصول على الرقم المناظر لرقم الآحاد يتم إجراء عملية AND بين متغير البيانات second والقيمة 0x0f للحصول على الأربع بتات السفلية .
• أخيرا يتم جمع رقم العشرات ورقم الآحاد .
ملحوظة : عند استخدام الدالة الجاهزة تكون دالة التحويل بالشكل التالى :

كود:
 //----Transform Time for IC DS1307------------------//
void TransformTime()
{
     second = Bcd2Dec(second);    
     minute = Bcd2Dec(minute); 
     hour   = Bcd2Dec(hour);
     day    = Bcd2Dec(day); 
     date   = Bcd2Dec(date); 
     month  = Bcd2Dec(month); 
     year   = Bcd2Dec(year); 
}

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

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



4- دالة العرض DisplayTime

كود:
 //-----Display Time------------------//
void DisplayTime()
{
    // char x;
     second_d1 = seg[second /10]; // Ten digit >> Segment code from seg[] array
     second_d2 = seg[second %10];// One digit >> Segment code from seg[] array

     minute_d1 = seg[minute /10];
     minute_d2 = seg[minute %10];

     hour_d1 = seg[hour /10];
     hour_d2 = seg[hour %10];

     date_d1 = seg[date /10];
     date_d2 = seg[date %10];

     month_d1 = seg[month /10];
     month_d2 = seg[month %10];

     year_d1 = seg[year /10];
     year_d2 = seg[year %10];
     year_d3 = seg[year /10];
     year_d4 = seg[year %10];
}

من هذه الدالة نحصل على كود السفن سيجمنت (الموجود فى المصفوفة seg ) لكل من وحدة رقم العشرات (_d1) ووحدة رقم الآحاد (_d2) .
فى الدالة السابقة حصلنا على عدد عشرى مكون من رقمين ، وفى هذه الدالة نستخلص رقم العشرات second /10 ورقم الآحاد second %10 وهو عبارة عن رقم عشرى من 0 إلى 9 . هذا الرقم نضعة مكان فهرس index المصفوفة seg ، وهى أيضا مرتبة من 0 إلى 9 وبالتالى نحصل على كود السفن سيجمنت المقابل للرقم seg[second /10] , seg[second %10 .


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



5- عرض الزمن ( الساعات والدقائق) convert = GotoTime على السفن سيجمنت

كود:
convert = GotoTime;   //Goto Time in Interrupt , Show Time(Hour & Minute)

كود:
if (convert == GotoTime)    //Show Time(Hour & Minute)
     {
        portd = 1;   portb = hour_d1;       delay_ms(1);
        portd = 2;   portb = hour_d2 + 128; delay_ms(1);
        portd = 4;   portb = minute_d1;     delay_ms(1);
        portd = 8;   portb = minute_d2;     delay_ms(1);
     }

فى الدالة الرئيسية نستدعى عبارة عرض الزمن :

كود:
convert = GotoTime;   //Goto Time in Interrupt , Show Time(Hour & Minute)
هذا الاستدعاء سوف يتم تنفيذه عند حدوث كل مقاطعة بالمؤقت TMR0 أى كل نصف ثانية حيث يتم الاستجابة لهذا الشرط وعرض كود السفن سيجمنت الخاص بالزمن بطريقة Multiplexing (الانتخاب من متعدد) حيث يتم عرض بيانات الزمن على المنفذ PORTB وانتخاب توصيل وحدات السفن سيجمنت بتوصيل مصعدها المشترك بالجهد الموجب من خلال المنفذ PORTD واحدة تلو الأخرى مع تأخير واحد ملى ثانية ويتكرر ذلك عند كل مقاطعة إى كل نصف ثانية .

وهكذا نكون قد وصلنا إلى نهاية القسم الأول وحصلنا على عرض للزمن (ساعة ودقيقة) .


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


القسم الثانى : استخدام المفاتيح للتحكم فى العرض
يحتوى البرنامج على أربعة مفاتيح : المفتاح Button1 يعمل بنظام القائمة لعرض التاريخ (يوم وشهر) ، وعرض الثوانى ، والعودة لعرض الزمن (ساعة ودقائق) . والمفتاح Button2 يساعد فى عملية ضبط الساعة وهو يعمل أيضا بنظام القائمة لعرض كل من الزمن والتاريخ والعام فى شكل وامض لتغييرها عن طريق المفتاح Button1 ، وحفظ التغييرات . والمفتاح Button3 لعرض الزمن أو الخروج من عملية ضبط الساعة من دون حفظ التغييرات . والمفتاح Button4 لعرض العام year .

1- المفتاح Button1 :


كود:
 if (Button1 == 0 && Button2 == 0){hold = 1;}
		//Button1////////////////////
if (Button1 == 1 && hold == 1)  //Show Date & Second
        {
           hold = 0;
           convert = GotoDate;  //Goto Interrupt
           MenuDateSecond();   //Goto MenuDateSecond();
           //break;
        }
/////////////////////////////////////

if (convert == GotoDate)    //A-Show Date(Date & Month)
     {
        portd = 1;   portb = date_d1;       delay_ms(1);
        portd = 2;   portb = date_d2 + 128; delay_ms(1);//128 to DP on  d1d2.m1m2
        portd = 4;   portb = month_d1;      delay_ms(1);
        portd = 8;   portb = month_d2;      delay_ms(1);
     }


• فى الحالة الابتدائية يكون دخل كل من المفتاح Button1 و Button2 فى الحالة المنخفضة ويتم تذكر هذه الحالة بجعل المتغير hold=1 :

كود:
if (Button1 == 0 && Button2 == 0){hold = 1;}

• عند الضغط على المفتاح Button1 يتحقق شرط العبارة :

كود:
if (Button1 == 1 && hold == 1)  //Show Date & Second

نتيجة لذلك يتم تصفير المتغير hold=0 ثم يتم :
أ‌- عرض بيانات التاريخ (يوم وشهر) . لاحظ إضافة العدد 128 لإضاءة ليد النقط العشرية DP لتوضيح العرض:

كود:
 if (convert == GotoDate)    //A-Show Date(Date & Month)
     {
        portd = 1;   portb = date_d1;       delay_ms(1);
        portd = 2;   portb = date_d2 + 128; delay_ms(1);//128 to DP on  d1d2.m1m2
        portd = 4;   portb = month_d1;      delay_ms(1);
        portd = 8;   portb = month_d2;      delay_ms(1);
     }


ب‌- بعد ذلك يتم الدخول إلى دالة عرض قائمة التاريخ والثوانى :

كود:
 MenuDateSecond();   //Goto MenuDateSecond();

فى هذه الدالة يتم إعلان متغير العداد set وتعينه بالصفر (تصفيره)
char set;

كود:
  set = 0;

ثم الدخول إلى حلقة غير منتهية وفيها يتم :
• تحديث البيانات باستدعاء دوال إنشاء الساعة :

كود:
   ReadI2C();
  Hour12_AM_PM();
 TransformTime();
 DisplayTime();


• عند الضغط على المفتاح Button1 يتم تزايد العداد set بواحد وبناء على ذلك يتم اتخاذ القرارات :
1- إذا كان set=0 يتم عرض التاريخ Date .
2- إذا كان set=1 أى الضغطة التالية يتم عرض الثوانى Second .
3- إذا كانت set>1 إى بعد الضغطة التالية يتم العودة لعرض الزمن والخروج من الحلقة الغير منتهية .
4- إذا كانت set>=1 وتم الضغط على المفتاح Button2 يتم تصفير الثوانى وحفظ الزمن والتاريخ والسنة .

كود:
//----Show Date & Second for Button1-------------------//
void MenuDateSecond()
{
     char set;
     set = 0;
     while(1)
     {
        ReadI2C();
        Hour12_AM_PM();
        TransformTime();
        DisplayTime();
        //DateSecond(set);//set=0 >> GotoDate , set=1 >> GotoSecond , set>1 >> GotoTime

        if (Button1 == 0){hold = 1;}
        if (Button1 == 1 && hold == 1)
        {
           hold = 0;
           set++;
		   /////////////
if(set==0) convert = GotoDate;
if(set==1) convert = GotoSecond;
		   ///////////
           if (set > 1)
           {
              delay_ms(2);
              convert = GotoTime;   //Goto Time in Interrupt
              break;
           }
        }
        //-----------------------------//
        if (set >= 1)
        {
           if (Button2 == 1) //---Second = 0
           {
              second = 0;
              SaveTime();   //---Save Time
           }
        }
     }
}

• دالة حفظ الزمن هى دالة كتابة إلى الشريحة ds1307 بعد تحويل البيانات المحدثة من النظام العشرى إلى النظام الثنائى المكود عشرى :

كود:
//----Save Time & Date for Change------------------//
void SaveTime()
{
     i2c1_start();
     i2c1_wr(0xd0);
     i2c1_wr(0);

     i2c1_wr(dec2bcd(second));
     i2c1_wr(dec2bcd(minute));
     i2c1_wr(dec2bcd(hour));
     i2c1_wr(dec2bcd(day));
     i2c1_wr(dec2bcd(date));
     i2c1_wr(dec2bcd(month));
     i2c1_wr(dec2bcd(year));
     i2c1_stop();
}


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


2- المفتاح Button2 :
فى البداية يعمل مثل المفتاح Button1 حتى يتم استدعاء دالة قائمة تغيير الزمن والتاريخ والعام MenuChangeTime .


كود:
if (Button1 == 0 && Button2 == 0){hold = 1;}

//Button2////////////////////////////
        if (Button2 == 1 && hold == 1)
        {
           hold = 0;
           convert = GotoTime;   //Goto Time in Interrupt
           MenuChangeTime();

////////////////////////////////////////////////////////////////////////////////////////////////////
//----Change Time & Date for Button2----------------------//
void MenuChangeTime()
{
     char set;
     set = 0;
     while(1)
     {
        DisplayTime();// update after off for flashing item  
        SetChangeTime(set);////flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year

        if (Button2 == 0){hold = 1;}
        if (Button2 == 1 && hold == 1)
        {
           hold = 0;
           set ++;
		   
           if (set > 4)   //Save Time
           {
              convert = GotoTime;   //Goto Time in Interrupt
              second = 0;
              SaveTime();
              break;
           }
		   
           if (set > 1) convert = GotoDate;   //Goto Interrupt
           if (set > 3) convert = GotoYear;   //Goto Interrupt
        }
		
        if (Button1 == 1)      //Time & Date ++
        {
           //SetChangeTime(set);//flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year
           ChangeTime(set, 0); //Time & Date ++ sccording to set value : hr, min , date ,....
        }

        if (Button3 == 1)   //No Save, Goto Normal Time
        {
           convert = GotoTime;   //Goto Time in Interrupt
           break;
        }
     }
}

//////////////////////////////////////////////////////////////////////////////////////

• فى بداية هذه الدالة يتم إعلان متغير عداد القائمة set وتصفيره والدخول إلى حلقة غير منتهية .

كود:
 //----Change Time & Date for Button2----------------------//
void MenuChangeTime()
{
     char set;
     set = 0;
     while(1)
     {

• فى هذه الحلقة يتم استدعاء دالة عرض الزمن DisplayTime() لتحديث العنصر المعروض لتوصيل بياناته بعد عمل عملية فصلها لنحصل على وميض العنصر المطلوب بالدالة SetChangeTime(set)

كود:
DisplayTime();// update after off for flashing item  

SetChangeTime(set);////flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year

• عند الضغط على المفتاح Button2 يتم زيادة عداد القائمة set بواحد عند كل ضغطة

كود:
  if (Button2 == 0){hold = 1;}
        if (Button2 == 1 && hold == 1)
        {
           hold = 0;
           set ++;

• تبعا لقيمة المتغير set ( تساوى القيمة 1 أو 2 أو 3 أو 4 ) يتم اتخاذ القرارات وفقا للدالة SetChangeTime(set) حيث يتم فصل العنصر المحدد والتأخير لمدة 500 ملى ثانية ثم إعادة توصيله بالدالة DisplayTime() لنحصل على وميض هذا العنصر (الساعات على سبيل المثال)

كود:
//----Change Time & Date for Button2----------------------//
void SetChangeTime(char set)
{
     switch(set)
     {
        case 0:
             hour_d1 = hour_d2 = 0xff;     delay_us(500);
             break;
        case 1:
             minute_d1 = minute_d2 = 0xff; delay_us(500);
             break;
        case 2:
             date_d1 = date_d2 = 0xff;     delay_us(500);
             break;
        case 3:
             month_d1 = month_d2 = 0xff;   delay_us(500);
             break;
        case 4:
             year_d3 = year_d4 = 0xff;     delay_us(500);
             break;
     }
}

• إذا كانت set > 4 يتم العودة لعرض الزمن (ساعة ودقيقة) ، وتصفير الثوانى second وحفظ التغيرات والخروج من الحلقة الغير منتهية .

كود:
if (set > 4)   //Save Time
           {
              convert = GotoTime;   //Goto Time in Interrupt
              second = 0;
              SaveTime();
              break;
           }

• إما إذا حدث أثناء الوميض (set =1 : set =4) أن تم الضغط على المفتاح Button1 فإنه يتم إستدعاء دالة تغيير العنصر المعروض ChangeTime لزيادة قيمته بواحد عند كل ضغطة :

كود:
            if (set > 1) convert = GotoDate;   //Goto Interrupt
           if (set > 3) convert = GotoYear;   //Goto Interrupt
        }
		
        if (Button1 == 1)      //Time & Date ++
        {
           //SetChangeTime(set);//flashing item >>> set=0:hour, set=1:minute, set=2:date, set=3:month, set=4:year
           ChangeTime(set, 0); //Time & Date ++ sccording to set value : hr, min , date ,....
        }

• فى أى لحظة يتم فيها الضغط على المفتاح Button3 يتم العودة لعرض الزمن (ساعة ودقائق) من دون حفظ التغييرات والخروج من الحلقة الغير منتهية :

كود:
 if (Button3 == 1)   //No Save, Goto Normal Time
        {
           convert = GotoTime;   //Goto Time in Interrupt
           break;
        }


////////////////////////////////////////////////////////////////////////////////////////////////////////
المفتاح Button3 والمفتاح Button4 تعمل بالطريقة العادية :
• الضغط على المفتاح Button3 يعرض الزمن (الساعة والدقائق) .
• الضغط على المفتاح Button4 يعرض العام year .

كود:
if (Button3 == 1)
        {
           convert = GotoTime;   //Goto Time in Interrupt
        }
		/////////////////////
        if (Button4 == 1)
        {
           convert = GotoYear;  //Goto Year in Interrupt
           delay_ms(10);
        }


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


سلم الله يداك
شكرا لك



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