ما هو الميكروكونترولر Microcontroller ؟

صفحة 2 من اصل 5 الصفحة السابقة  1, 2, 3, 4, 5  الصفحة التالية

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:10 pm

تدريبات تمهيدية متدرجة على مفاهيم البرمجة بلغة السى :
الدائرة الكهربية :
سوف نستخدم الميكروكونترولر PIC16F877A ، ومذبذب ساعة بتردد 4MHz . يتم توصيل 8 ليدات إلى أطراف المنفذ PORTB المسماة RB0,RB1,….RB7 ، كما فى الشكل أدناه .
ملحوظة:
بتات السجل TRISB فى الحالة الافتراضية ، فى بداية التشغيل وعند كل إعادة تشغيل Reset ، تكون فى الحالة المرتفعة (آحاد) أى تكون أطراف المنفذ PORTB كمداخل ، لذلك يجب تهيئتها فى بداية الدالة الرئيسية بأصفار عند الرغبة فى أن تكون أطراف المنفذ PORTB مخارج Output .




التدريب الأول :
الغرض :
بيان ما يلى
• رأس البرنامج و نوعى التعليقات .
• الدالة الرئيسية .
• الكتابة إلى سجل التحكم فى الاتجاه TRISB ، وسجل المنفذ PORTB .
• تمثيل البيانات بالنظام العشرى والثنائى والسداسى عشر .


الكود:
/* HEADER
*************************
***************
*/

void main()              // بداية البرنامج بالدالة الرئيسية بهذه الصيغة
{                           // ثم قوس فتح الدالة الرئيسية

            // نبدأبعد ذلك بجسم الدالة الرئيسية وهو محتوى البرنامج

TRISB=0b00000000;    //bin:0B  , dec:0 , hex:0x00    تهيئة المنفذ ليكون مخارج بالثنائى وبالعشرى وبالهكسا 

PORTB=0b00001111;    //dec= 15, hex = 0x0F        جعل الأربع خانات الأدنى مرتفعة والأقصى منخفضة

}                                    // قوس نهاية الدالة الرئيسية والبرنامج

 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:15 pm

التدريب الثانى :
الغرض :
• وميض جميع الليدات المتصلة بأطراف المنفذ PORT B .
• التدريب على حلقة goto البسيطة .
• استخدام دالة التأخير .
1- حلقة goto تبدأ بعنوان أو اسم label يلية نقطتى تنصيص وهو هنا "start : " ثم جسم أو أوامر الحلقة . فى نهاية الحلقة نكتب الأمر "goto start ; " لتكرار الحلقة .
2- دالة التأخير هى "Delay_ms(250) " وهى تسبب إنتظار البرنامج فى مكانه للفترة الزمنية المدونة بين القوسين بالملى ثانية .


الكود:
void main()    // مرة أخرى هذه هى صيفة الدالة الرئيسية
{      // وهذا هو قوس فتح الدالة الرئيسية

  TRISB=0;    // تهيئة جميع أطراف المنفذ الثمانية لتكون مخارج
      // لا تنسى الفاصلة المنقوطة
  PORTB=0;   // جميع المخارج بأصفار أى الحالة المنخفضة ، كحالة ابتدائية 

   // نبدأ الحلقة بوضع اسم لعنوان للعودة إليه عند ذكره فيما بعد
  start:         // صيغة اسم العنوان لاحظ النقطتين

   PORTB=0xFF;   // جعل جميع أطراف المنفذ آحاد أى فى الحالة المرتفعة 
            // نتيجة لذلك تضىء الليدات المتصلة بها 
   Delay_ms(250);   //  إنتظار أو تأخير لمدة 250 ملى ثانية
 
   PORTB=0;      // جعل جميع أطراف المنفذ بأصفار أى فى الحالة المنخفضة
            //نتيجة لذلك تنطفأ جميع الليدات
   Delay_ms(250);   // فترة انتظار والليدات مطفأة قدرها 250 ملى ثانية أيضا
 
   goto start;   // الذهاب إلى بداية الحلقة حيث يوجد العنوان المذكور لتكرار الحلقة مرة أخرى

}      // وهذا هو قوس غلق الدالة الرئيسية والبرنامج
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:17 pm

التدريب الثالث :
الغرض :
• ما زلنا بصدد التعامل مع سجل التحكم فى الاتجاه TRISB وسجل المنفذ PORTB كمخارج بجميع أطرافه .
• هذا البرنامج يمثل أحد أشكال الأضواء المتحركة .
• بعد هذا البرنامج يمكنك تشكيل نماذج إضاءة متحركة مختلفة
الكود:
void main()
{

      TRISB=0; PORTB=0;
      loop:
   PORTB=0B00000001; Delay_ms(250);  //  إضاءة الليد المتصل بالطرف الأول والانتظار 250 ملى ثانية
   PORTB=0B00000011; Delay_ms(250);  // إضاءة الليدات المتصلة بالطرف الأول والثانى والانتظار
   PORTB=0B00000111; Delay_ms(250);  //  بالمثل
   PORTB=0B00001111; Delay_ms(250);  //
   PORTB=0B00011111; Delay_ms(250);  //
   PORTB=0B00111111; Delay_ms(250);  //
   PORTB=0B01111111; Delay_ms(250);  //
   PORTB=0B11111111; Delay_ms(250);  //إضاءة جميع الليدات

   PORTB=0B00000000; Delay_ms(250);  // إطفاء جميع الليدات

   PORTB=0B00011000; Delay_ms(250);  // إضاءة الليد المتصل بالطرف  4 و 5
   PORTB=0B00111100; Delay_ms(250);  // إضاءة ليدات الأطراف 3و4و5و6
   PORTB=0B01111110; Delay_ms(250);  //إضاءة ليدات الأطراف 2 و3و4و5و6و7
   PORTB=0B11111111; Delay_ms(250);  // إضاءة جميع الليدات من 1 إلى 8

   PORTB=0B00000000; Delay_ms(250);  // إطفاء جميع الليدات
   PORTB=0B11111111; Delay_ms(250);  // إضاءة جميع الليدات
   PORTB=0B00000000; Delay_ms(250);  //إطفاء جميع الليدات
   PORTB=0B11111111; Delay_ms(250);  //إضاءة جميع الليدات
   PORTB=0B00000000; Delay_ms(250);  // إطفاء جميع الليدات

   goto loop;                                                // تكرار حلقة البرنامج
}
 


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:19 pm

التدريب الرابع :
الغرض :
• إستخدام مؤثر المكمل أو المعكوس “ ~ “ .
• هذا المؤثر يعكس جميع بتات المتغير (الوسيط ) الذى يأتى بعده .
الكود:
void main()
{

      TRISB=0;
      PORTB=0;

      loop:

            PORTB=~PORTB;    // تساوى "تخصيص" ، عكس بتات المنفذ ووضع النتيجة فى المنفذ مرة أخرى
            Delay_ms(250);
            goto loop;
}
 


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:23 pm

التدريب الخامس :
الغرض :
• الغرض من التدريب استخدام أحد عبارات التحكم فى مسار البرنامج فى عمل حلقة غير منتهية .
الكود:
void main()
{

   TRISB=0;
   PORTB=0;

   while(1)       //  هذه الحلقة سوف تتكرر طالما ان نتيجة الشرط حقيقية أى غير صفرية
         //  ونحن اجبرناها على أن تكون حقيقية دائما أى أن الحلقة سوف تتكرر دائما
   {      // while قوس فتح حلقة 

   PORTB=~PORTB;
   Delay_ms(250);

   }   // while  قوس نهاية حلقة 
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:25 pm


التدريب السادس
الغرض :
• التعامل مع بت واحدة من سجل به ثمانى بتات ، البت هى البت الأولى (الأدنى قيمة) bit0 بالمنفذ PORTB .
• مترجم الميكروسى يتعرف على البتات المفردة بالصيغة PORTB.B0 أو PORTB.F0 ، وبالمثل لباقى البتات B0,B1,…..B7 ، و F0,F1,….F7 .
• فى هذا التدريب يتم عمل وميض لليد متصل بهذه البت .
الكود:
 void main()
{

   TRISB=0;      //تهيئة جميع أطراف المنفذ كمخارج 
   PORTB=0;   
   loop:

   PORTB.B0=1;    // أكتب أو ضع فى البت الأولى بالمنفذ القيمة 1 أى الحالة المرتفعة
            // يؤدى ذلك إلى إضاءة الليد
   Delay_ms(250);

   PORTB.B0=0;    // ضع فى البت الأولى للمنفذ القيمة 0 أى الحالة المنخفضة
            // يؤدى ذلك إلى إطفاء الليد
   Delay_ms(250);

   goto loop;

}


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:29 pm

التدريب السابع :
الغرض :
• حلقة for ، هى حلقة تكرارية لحدث معين لعدد معين من المرات وبشرط معين .
• فإن تحقق الشرط يتم تكرار حدوث الحدث حتى نهاية العدد المحدد .
• وإن لم يتحقق تم الخروج من الحلقة .
• هذه الحلقة تستلزم وجود متغير لحفظ قيمة عداد دورات التكرار ، ويجب الإعلان عنه قبل الدخول فى الحلقة
• الصيغة العامة for(Part1;Condition;Part3) Action_Statement;
- الجزء الأول هو القيمة الأبتدائية للعداد حيث يتم تنفيذه أولا ومرة واحدة و قبل الدخول إلى الحلقة.
- الجزء الثانى هو شرط الحلقة حيث يتم اختبار هذا الشرط فإن كان صواب تستمر الحلقة
وإن كان خطأ يتم القفز إلى ما بعد نهاية الحلقة.
- الجزء الثالث هو الفعل الذى يتم تكراره فى كل حلقة .


الكود:
void main()
{

   int x;      //الإعلان عن متغير عداد الحلقة قبل الدخول فى الحلقة ليتعرف عليه المترجم
   TRISB=0;         // تهيئة أطراف المنفذ  لتكون مخارج

   for(x=0;x<18;x++)       // x=0 القيمة الابتدائية بصفر
            // x<18 الشرط هو أن يتم التكرار لأقل من 18 أى من 0 إلى 17 أى 18 مرة
            // x++ الفعل هو مؤثر التزايد ويعنى زيادة العداد بواحد بعد كل حلقة

   {               //البداية 

   PORTB=0xFF;         //جميع أطراف المنفذ فى الحالة المرتفعة
   Delay_ms(1000);         // إنتظار 1000 مللى ثانية أى ثانية
   PORTB=0;            // تحويل أطراف المنفذ إلى الحالة المنخفضة
   Delay_ms(1000);         // الانتظار ثانية
         
   }               // النهاية

}                  //نهاية الدالة الرئيسية والبرنامج
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:33 pm

التدريب الثامن :
الغرض : شكل من أشكال الحلقات :
الكود:
 void main()
{
   char x;         // الإعلان عن متغير الحلقة قبل استخدامها
 
   TRISB=0; PORTB=0;    // تهيئة المنفذ كمخارج وتصفيره فى نفس السطر
   Delay_ms(1000); //الانتظار ثانية

   while(1)         //إنشاء حلقة غير منتهية لتكرارجسمها إلى مالانهاية

   {

      for(x=0;x<9;x++){ PORTB++;Delay_ms(1000);}

            // الحلقة بالثلاثة بارامترات وجسمها فى سطر واحد

      PORTB=0;Delay_ms(1000);  // تصفير المنفذ والانتظار ثانية
   }
}

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:35 pm

التدريب التاسع :
الغرض :
الحلقات الغير منتهية مع العبارة for(;Wink
الكود:
void main()
{
   TRISB=0;    // تهيئة المنفذ كمخارج
   PORTB=0;    // تصفير المنفذ
   
   for(;;)        // إنشاء حلقة غير منتهية لعدم وجود شرط للخروج منها

       {
              PORTB.B0=1;       // LED ON
              Delay_ms(250);     // delay for 0.25 seconds

              PORTB.B0=0;         // LED OFF
              Delay_ms(250);
       }
}
 


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 03, 2017 10:38 pm

التدريب العاشر
الغرض :
• التدريب على بعض المؤثرات وجمل التحكم فى البرنامج .
• البرنامج يعرض الأرقام الثنائية من 0 إلى 9 ويتكرر.
الكود:
void main()
{
         TRISB=0;      //تهيئة المنفذ كمخارج

       PORTB=0;   //  جميع المخارج فى الحالة المنخفضة أى الليدات مطفأة
   Delay_ms(1000);   // الانتظار لفترة ثانية
 
   while(1)       // بدء حلقة غير منتهية التكرار
   {      // while بداية

      PORTB++;   // فى كل حلقة يتم زيادة السجل بواحد
            // أول دورة يصبح 1 وثانى دورة يصبح 2 وحتى الدورة التاسعة يصبح 9
      Delay_ms(1000);   //الانتظار لثانية

      if(PORTB==9)    // إذا تحقق أن محتويات سجل المنفذ تكافىء العدد 9 فقط

      {      // if    نفذ جسم عبارة

         PORTB=0;    //تصفير سجل المنفذ بعد العدد 9 
         Delay_ms(1000);   // الانتظار لثانية

      }       // if نهاية جملة

   }         // while  نهاية جملة
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 05, 2017 11:04 am

تمرين :
الدائرة الكهربية :



فى البرنامج أدناه :
• اشرح البرنامج متتبعا خطوات تنفيذ البرنامج .
• استخرج من البرنامج مفاهيم البرمجة بلغة السى .
• قم بتعديل البرنامج مستخدما الدوال Function .

الكود:
sbit LED0 at PORTB.B0; // bit is fully defined
sbit LED1 at PORTB.B1;
sbit LED2 at PORTB.B2;
sbit LED3 at PORTB.B3;
sbit LED4 at PORTB.B4;
sbit LED5 at PORTB.B5;
sbit LED6 at PORTB.B6;
sbit LED7 at PORTB.B7;




//main function
void main(void)
{
   unsigned int c; //for loop Counter

 TRISB = 0;
 PORTB = 0;

 while(1)
 {

 for(c=0; c<10; c++)
 {
 //forward
 LED0 = 1;
 Delay_ms(1000);

 LED0 = 0;
 LED1 = 1;
 Delay_ms(1000);

 LED1 = 0;
 LED2 = 1;
 Delay_ms(1000);

 LED2 = 0;
 LED3 = 1;
 Delay_ms(1000);

 LED3 = 0;
 LED4 = 1;
 Delay_ms(1000);

 LED4 = 0;
 LED5 = 1;
 Delay_ms(1000);

 LED5 = 0;
 LED6 = 1;
 Delay_ms(1000);

 LED6 = 0;
 LED7 = 1;
 Delay_ms(1000);

 LED7 = 0;


 //reverse
 LED6 = 1;
 Delay_ms(1000);

 LED6 = 0;
 LED5 = 1;
 Delay_ms(1000);

 LED5 = 0;
 LED4 = 1;
 Delay_ms(1000);

 LED4 = 0;
 LED3 = 1;
 Delay_ms(1000);

 LED3 = 0;
 LED2 = 1;
 Delay_ms(1000);

 LED2 = 0;
 LED1 = 1;
 Delay_ms(1000);

 LED1 = 0;
 LED0 = 1;
 Delay_ms(1000);


 }

 //re-initalize PORTB
 PORTB = 0b00000000;

 for(c=0; c<10; c++)
 {

 PORTB = 0b10101010;
 Delay_ms(1000);

 PORTB = 0b01010101;
 Delay_ms(1000);

 }

 for(c=0; c<10; c++)
 {

 PORTB = 0b11110000;
 Delay_ms(1000);

 PORTB = 0b00001111;
 Delay_ms(1000);

 }

 for(c=0; c<10; c++)
 {

 PORTB = 0b11001100;
 Delay_ms(1000);

 PORTB = 0b00110011;
 Delay_ms(1000);

 }

 for(c=0; c<10; c++)
 {

 PORTB = 0b10000001;
 Delay_ms(1000);

 PORTB = 0b01000010;
 Delay_ms(1000);

 PORTB = 0b00100100;
 Delay_ms(1000);

 PORTB = 0b00011000;
 Delay_ms(1000);

 PORTB = 0b00100100;
 Delay_ms(1000);

 PORTB = 0b01000010;
 Delay_ms(1000);

 }

 }

}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 05, 2017 8:36 pm

مشروع أضواء متلاحقة مبرمجة 5 قناة بمخارج ترياكات Triac
الوصف :
مشروع تأثيرات إضاءة ، أضواء متلاحقة ، صغير لكنه مؤثر جدا ، لأن يصلح للعديد من التطبيقات الزخرفية (الديكور) مثل أضواء أعياد الميلاد ، والمتاجر ، والحفلات ، وعروض الأزياء والعديد من الاستخدامات الأخرى .
فى المشروع يتم استخدام الميكروكونترولر الصغير PIC12F675 لتشغيل خمس قنوات بمخارج ليدات LEDs وأيضا بمخارج ترياكات ، حيث يتم التحكم فى مصابيح كهربية قياسية بقدرة حتى 500 وات لكل قناة . هناك الغديد من البرامج التى يمكن أن تنشىء مجموعات مختلفة من الإضاءة مثل تتابع التوصيل والفصل ، والحركة إلى الأمام والخلف وغيرها .
الخواص الفنية :
• جهد التشغيل : 230VAC .
• القدرة المستهلكة لليدات : 50 ملى أمبير ، مع جميع الليدات فى حالة تشغيل ON .
• القدرة المستهلكة للمصابيح الكهربية : 2500 وات بحد أقصى .
مبدأ العمل :
استخدام الميكروكونترولر PIC12F675 ، والذى يحتوى على 8 أطراف ، يجعل الدائرة بسيطة للغاية .
• الأطراف 1(+) و 8(-) تستخدم من أجل مصدر القدرة .
• يتم برمجة الطرف 4 كمدخل Input ، ليستقبل الأوامر من مفتاح ضاغط . المقاومة R11 تحافظ على طرف الدخل عند جهد منخفض حتى يتم الضغط على المفتاح الضاغط . فى كل مرة يتم فيها الضغط على المفتاح يتقدم البرنامج إلى الوضع التالى ، فيغير من الإيقاع والطريقة التى يتم بها إشعال الترياك .
• الأطراف الخمسة الأخرى تستخد كمخارج ، متصلة بالمقاومات الخمسة (R6….R10) وذلك للحد من التيارات التى تمر بالدايودات المدمجة فى الرابط الضوئى ، لحماية الترانزستورات فى مخارج PIC من أى تلف .
• عند أنودات الترياكات ،النقط (3,4) و (5,6) و (7,Cool و (9,10) و (11,12) ، يمكننا توصيل مصابيح كهربية بقدرة حتى 500 وات .
• المقاومات (R1…R5) لتوصيل إشارات التحكم من مخارج الروابط الضوئية إلى الترياكات .
• تحتوى الدائرة على الروابط الضوئية OC1…OC5 من أجل الحماية من الارتفاعات فى الجهد .
• المقاومات R12…R16 لتشغيل الليدات L1…L5 من خلال العاكس IC3 بحيث يمكننا مراقبة المخارج .
• دائرة مصدر القدرة تتكون من الكحول T1 وقنطرة التوحيد D1…D4 ومكثفات التنغيم C1,C2,C3,C4 ومنظم الجهد IC4 .  
المكونات :






الدائرة الكهربية :



Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الثلاثاء يونيو 06, 2017 9:36 am

مشكلة الارتداد فى المفاتيح SWITCHES والمفاتيح الضاغطة PUSH-BUTTONS وطرق علاجها
المشكلة :
ربما تكون المفاتيح والمفاتيح الضاغطة هى أبسط الأجهزة والتى توفر أبسط طريقة للكشف عن مظهر الجهد على طرف مدخل  الميكروكونترولر . ومع ذلك فإنها ليست بسيطة كما تبدو... السبب في ذلك هوالارتداد bounce الذى يحدث فى تلامساتها .




إرتداد التلامس مشكلة مشتركة مع المفاتيح الميكانيكية. عندما تتصادم التلامسات بعضها ببعض فإن خواصها الميكانيكية ( كمية الحركة momentum  والمرونة elasticity  ) تعمل معا وتسبب ظاهرة الارتداد bounce  . وتكون النتيجة تولد نبضات سريعة من التيار الكهربائى بدلا من الانتقال النظيف المثالى (الخالى من تلك النبضات) من الصفر إلى التيار الكامل . وغالبا ما يحدث ذلك بسبب الاهتزازات vibrations  والبقع الخشنة الصغيرة  والأوساخ  بين التلامسات . هذا التأثير غير ملحوظ عادة عند استخدام هذه المكونات في الحياة اليومية لأن الارتداد يحدث بسرعة كبيرة تؤثر على معظم المعدات. ومع ذلك ، فإنه يسبب مشاكل في بعض الدوائر التناظرية والمنطقية والتى تستجيب بسرعة كافية فتفسر نبضات التوصيل والفصل on/off على أنها بيانات متدفقة  . على أي حال فالعملية برمتها لا تدوم طويلا ( قليل من الميكرو أو الملى ثوانى )ولكنها طويلة بما يكفي ليتم تسجيلها بواسطة الميكروكونترولر . عندما لا يستخدم سوى المفتاح الضاغط كمصدر لعداد  counter  إشارة تحدث أخطاء فى ما يقرب من 100 ٪ من الحالات!

الحل :
يمكن حل هذه المشكلة بسهولة من خلال ربط دائرة RC بسيطة لإخماد التغييرات السريعة فى الجهد. وحيث أن فترة الارتداد غير معروفة فإن قيم المكونات غير محددة بدقة . في معظم الحالات من المستحسن استخدام القيم كما هو مبين في الشكل أدناه :





إذا كانت هناك حاجة للاستقرار التام complete stability  ينبغي اتخاذ تدابير جذرية. الخرج من الدائرة التالية ( قلاب RS flip-flop  ) سوف يغير حالته المنطقية فقط بعد الكشف عن أول نبضة منطلقة من إرتداد التلامس .هذا الحل هو أكثر تكلفة  بسبب المفتاح (SPDT قطب واحد ودائرتين ) والدائرة المتكاملة ولكن بالتأكيد هو حل للمشكلة.



بالإضافة إلى هذا الحل الذى يعتمد على الأجهزة hardware هناك أيضا حل برمجى بسيط.
عندما يقوم البرنامج باختبار الحالة المنطقية لطرف المدخل وكشف التغير , ينبغي أن يتم التحقق مرة أخرى بعد تأخير زمنى معين . إذا أكد البرنامج التغيير ، فهذا يعني أن المفتاح أو المفتاح الضاغط قد غير من وضعه . مزايا مثل هذا الحل واضحة : فهو مجانى ، ويتم التخلص من آثار إرتداد التلامس علاوة على إمكانية تطبيقه على التلامسات ذات الجودة الأقل .

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 07, 2017 12:29 pm

طريقة توصيل وبرمجة المفتاح مع الميكروكونترولر :
المفتاح ، ببساطة ، "يغلق" closes أو "يفتح" opens دائرة . لكن الميكروكونترولر هو جهاز رقمى والذى يفهم فقط الصفر “0”(0V) أو الواحد “1”(5V) . لذلك نحن بحاجة لدائرة تبين حالة المفتاح بدلالة “0” أو “1” .
الشكل التالى يبين طريقتى توصيل المفتاح مع الميكروكونترولر .



• إذا كان توصيل المفتاح وهو "مفتوح" يطبق “0” على طرف الدخل ، وهو "مغلق" يطبق “1” على طرف الدخل ، يقال أن المفتاح "فعال فى الحالة المرتفعة" active high .
• وإذا كان توصيل المفتاح وهو "مفتوح" يطبق “1” على طرف الدخل ، وهو "مغلق" يطبق “0” على طرف الدخل ، يقال أن المفتاح "فعال وهو فى الحالة المنخفضة" active low .
ومن ثم ، إذا تم توصيل المفتاح بحيث يذهب إلى “0” عند الضغط عليه ، فهو فعال فى الحالة المنخفضة ، وإذا تم توصيله بحيث يذهب إلى “1” عند الضغط عليه ، فإنه يكون فعال فى الحالة المرتفعة .
الشكل التالى يبين توصيل مفتاح فعال فى الحالة المرتفعة (A) ، ومفتاح فعال فى الحالة المنخفضة (B) . المقاومة تحافظ على الدخل فى الحالة "الغير فعالة" حتى يتم غلق المفتاح ، عند هذه النقطة يتم سحب الدخل إلى "الحالة الفعالة" . يمكنك التفكير فى ذلك كمقسم جهد ، مقاومة المفتاح تكون مرتفعة جدا وهو مفتوح وتكون صفر وهو مغلق .
مقاومةالسحب لأعلى pullup ( موصلة بين طرف الدخل والجهد الموجب )أو مقاومة السحب لأسفل pulldown (موصلة بين طرف الدخل والأرضى) ، والتى قد تكون مدمجة فى بناء الميكروكونترولر أو قد تكون عنصر خارجى ، تكون فى المدى من 10 إلى 100 كيلو أوم .      


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 07, 2017 10:10 pm

برمجة المداخل الرقمية )المفتاح على سبيل المثال( :
الدائرة الكهربية :



• يتم توصيل المفتاح الضاغط إلى طرف البت الأولى بالمنفذ PORTD أى RD0 ، والذى يجب تهيئته كطرف دخل ، يتم توصيل المفتاح بحيث يكون فعال فى الحالة المنخفضة ، ولذلك يتم توصيل مقاومة سحب لأعلى (رفع) بين طرف الدخل RD0 والجهد الموجب (5V)VDD ، ويتم توصيل المفتاح بين هذا الطرف والأرضى . نتيجة لذلك تكون حالة طرف الدخل RD0 عند الحالة المنطقية المرتفعة High(5V)(1) "عندما يكون المفتاح غير مضغوط" (غير فعال) .
• عند الضغط على المفتاح (فعال) فإن طرف الدخل RD0 سوف يتصل بالأرضى وتتحول حالته إلى الحالة المنطقية المنخفضة Low(0V)(0) .
• الليد المتصل بطرف الخرج PORTB(RB0) ، خلال مقاومة تحديد التيار ، سوف يومض عند الضغط على المفتاح .
• يقوم الميكروكونترولر "تلقائيا" بالكشف (قراءة) على طرف الدخل وتسجيل حالته فى البت المناظرة وكل ما عليك هو اختبار حالة هذه البت بعبارات الشرط المعروفة ، كما فى البرنامج التالى .


تطبيق :
برنامج لتشغيل وتبطيل ليد (أو أى حمل) بمفتاح واحد .
• فى البداية يكون المفتاح فى الوضع المفتوح (غيرفعال) ، ويكون طرف الدخل RD0 فى الحالة المرتفعة ، وشرط العبارة if(PORTD.F0 == 1) يكون صواب true ، ومن ثم يتم تنفيذ العبارتين Delay_ms(10) (زمن تأخير لتلاشى الارتدادات ) ، و oldstate = 1 ( للإشارة إلى أن الدخل عند الحالة الابتدائية المرتفعة) .
• بعد ذلك يكون الميكروكونترولر فى انتظار الضغط على المفتاح ليكمل تنفيذ البرنامج .
• عندما يتم الضغط على المفتاح تتحول حالة طرف الدخل RD0 من الحالة المرتفعة (1) إلى الحالة المنخفضة (0) (الحالة الفعالة) ، ومن ثم يتحقق شرط العبارة if (oldstate && PORTD.F0 == 0) ، وهو شرط مركب من شرطين oldstate "و" && PORTD.F0 == 0 ، ويتم تنفيذ الثلاثة عبارات التابعة لها : Delay_ms(10) (زمن تأخير تلاشى الارتدادات ) ، وعبارة الفعل المطلوب وهى
PORTB.F0 = ~PORTB.F0 (عكس حالة الطرف RB0 ، فإن كان off(0) يصبح on(1) والعكس بالعكس ، و العبارة oldstate = 0 للعودة إلى الحالة الابتدائية انتظارا للضغطة التالية .
• نتيجة لذلك عند الضغطة الأولى يتم إضاءة الليد ، وعند الضغطة التالية يتم إطفاء الليد ، وتتكرر العملية . بعبارة أخرى ، فى كل مرة يتم فيها الضغط على المفتاح يتحول الليد بين التشغيل on والفصل off . بمجرد أن يتم الضغط على المفتاح فإن الميكروكونترولر سوف ينتظر تحرير الضغط للرجوع إلى الحالة الابتدائية وذلك قبل الكشف عن ضغطة أخرى .

الكود:
bit oldstate;
void main()
{
oldstate=0;
TRISD.F0 = 1;    //pin RD0 as input – it doesn’t matter if you are using F0 or B0
TRISB = 0x00;    // PORTB as output
PORTB = 0x00;    // PORTB pins are all “off”

while(1)                // Endless loop
{
if(PORTD.F0 == 1)          // Detect logical one , oldstate

{
Delay_ms(10);          // “debouncing” mechanical contacts
oldstate = 1;             // Update flag
}

if (oldstate && PORTD.F0 == 0)       // Detect one-to-zero transition , pressed

{
Delay_ms(10);          // “debouncing” mechanical contacts
PORTB.F0 = ~PORTB.F0;       //Action >>> Invert PORTB.F0
oldstate = 0;             // Update flag , Initial condition
}
}
}

 


النتائج :















Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 07, 2017 10:45 pm

تدريب :

الكود:
void main()
{
  TRISD.F0 = 1;             //Configure 1st bit of PORTD as input
  TRISB.F0 = 0;             //Configure 1st bit of PORTB as output
  PORTB.F0 = 0;             //LED OFF
  while(1)
  {
       if(PORTD.F0 == 0)        //If the switch is pressed
       {
            Delay_ms(10);          //Switch Debounce
            if(PORTD.F0 == 0)      //If the switch is still pressed
            {
                 PORTB.F0 = 1;    //LED ON
                 Delay_ms(500);    //0.5 Second Delay
                 PORTB.F0 = 0;    //LED OFF
Delay_ms(500);    //0.5 Second Delay
            }
       }
 }
}     
 

فى هذا البرنامج :
• فى البداية ، وكالعادة، يتم تهيئة منافذ الدخل والخرج .
• بمجرد تشغيل البرنامج ، يتم قراءة حالة طرف الدخل RD0 ، وتكون فى الحالة المرتفعة (المفتاح غير مضغوط) ، وعند الدخول إلى الحلقة الغير منتهية نجد أن شرط العبارة if(PORTD.F0==0) غير متحقق false ولا يتم تنفيذ جسمها ، ويكون الليد مطفأ .
• عند الضغط على المفتاح تتحول حالة طرف الدخل RD0 إلى الحالة المنخفضة (0) ، ويتحقق true شرط عبارة if ويتم تنفيذ جسمها ، حيث التأخير 10 ملى ثانية ، ومرة أخرى نجد عبارة الشرط الثانية if(PORTD.F0==0) ، فإذا كان المفتاح مازال مضغوطا يكون شرطها متحقق true ويبد تنفيذ جسمها الذى يحتوى على وميض الليد المتصل بالطرف RB0 .
• عند رفع الضغط من على المفتاح تعود حالة الطرف إلى الحالة المرتفعة ونعود إلى الحالة الابتدائية ( الشروط أصبحت false).

لعلك لاحظت ما يلى :
• أنه يتم اختبار حالة المفتاح مرتين (باستخدام عبارة if ) ، بتأخير 10 ملى ثانية . هذا الزمن لازم لتجنب ظهور تأثير الارتدادات التى تحدث نتيجة غلق وفتح المفتاح debouncing .
• تأثير المفتاح (الوميض) يكون "أثناء الضغط علية" ، ويزول بعد تحرير المفتاح .


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الخميس يونيو 08, 2017 1:03 am

تمرين :

الكود:
/*Toggle LED with a Tact Switch Input */
 // Define LED @ RB0 and Tact switch @ RD0
 sbit LED at RB0_bit;
 sbit Switch at RD0_bit;
void main()
{
    TRISB = 0; // PORTB All Outputs
PORTB=0;
    TRISD = 0b00000001; // PORTD All Outputs, Except RD0
PORTD=0;
do
{
        if(Switch==0)
{
Delay_ms(20);
             if (Switch ==0) 
{
                LED = ~LED;
             }
          while (Switch ==0); // Wait for release of the button
     }
 } while(1);  // Infinite Loop
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الخميس يونيو 08, 2017 11:46 am

تدريب :
برنامج لتشغيل وفصل أكثر من ليد بمفتاح واحد .
يتم توصيل 4 ليدات بأطراف المنفذ PORTB(RB0…RB3) ، ومفتاح بالطرف RD0 .
عند بداية التشغيل تكون جميع الليدات مطفأة .
عند الضغط على المفتاح لأول مرة : تضىء الليد المتصل بالطرف RB0 فقط .
عند الضغط على المفتاح لثانى مرة : تضىء الليد المتصل بالطرف RB1 فقط .
عند الضغط على المفتاح لثالث مرة : تضىء الليد المتصل بالطرف RB2 فقط .
عند الضغط على المفتاح لرابع مرة : تضىء الليد المتصل بالطرف RB3 فقط .
عند الضغط على المفتاح لخامس مرة : تنطفىء جميع الليدات ، وتبدأ الدورة من جديد .

البرنامج :

الكود:
bit oldstate;
char counter = 0 ;
void main()
{
oldstate=0;
TRISD.F0 = 1; //pin RD0 as input – it doesn’t matter if you are using F0 or B0
TRISB = 0x00; // PORTB as output
PORTB = 0x00; // PORTB pins are all “off”

while(1) // Endless loop
{
if(PORTD.F0 == 1) // Detect logical one

{
Delay_ms(10); // “debouncing” mechanical contacts
oldstate = 1; // Update flag
}

if (oldstate && PORTD.F0 == 0) // Detect one-to-zero transition, pressed

{
Delay_ms(10); // “debouncing” mechanical contacts
counter++ ; //   Action
oldstate = 0; // Update flag
if(counter==5) counter=0;
}

if(counter==1) portb=0b00000001 ;
else if(counter==2) portb=0b0000010 ;
else if(counter==3) portb=0b0000100 ;
else if(counter==4) portb=0b0001000 ;
else portb=0;

}
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 12:59 pm

تدريبات وتمارين ومشاريع على السفن سيجمنت والمفاتيح :
فى هذا الجزء سوف نتناول تصميم المشاريع باستخدام السفن سيجمنت مع المفاتيح .
فى البداية سوف نتناول تدريب بسيط لشاشة عرض مكونة من وحدة سفن سيجمنت واحدة حتى نتعود على توصيل واستخدام السفن سيجمنت . بعد ذلك ، يتم استخدام وحدتين وأربع وحدات سفن سيجمنت بنظام الانتخاب فى مشاريع لتطبيقات عملية وأكثر فائدة .
تدريب تمهيدى رقم 1 : عداد تصاعدى والعرض على وحدة سفن سيجمنت.
الغرض :
ربما يكون هذه التدريب أبسط تدريب على السفن سيجمنت .
فى هذا التدريب يتم توصيل شرائح وحدة سفن سيجمنت نوع الكاثود المشترك إلى المنفذ PORTB للميكروكونترولر PIC16F877A ، بحيث يتم توصيل الشريحة “a” بالطرف RB0 ، والشريحة “b” بالطرف RB1 وهكذا حتى الشريحة “g” بالطرف RB6 . السفن سيجمنت سوف تعرض العد التصاعدى للأرقام من “0” إلى “9” وتعود مرة أخرى إلى الصفر وتستمر ، مع تأخير (فاصل) زمنى واحد ثانية بين كل رقم وآخر .
الدائرة الكهربية :
فى الدائرة الكهربية المبينة أدناه ، يتم استخدام وحدة سفن سيجمنت نوع "كاثود مشترك" ، حيث يتم توصيل الكاثود بالأرضى ، ويتم توصيل ON الشرائح عن طريق تحديدها بالمنطق المرتفع HIGH(1) . يتم تشغيل الشرائح من خلال مقاومات لتحديد التيار .




البرنامج :

الكود:
/*****************************************************************************
1-DIGIT 7-SEGMENT COUNTER
=============================
In this project a common cathode 7-segmentdisplay is connected to PORT B of a
PIC16F877A type microcontroller (other types can also be used). The microcontroller
is operated from an 8MHz crystal.
The display counts from 0 to 9 and then back to 0 continuously with one second delay
between each count.
**************************************************************************/
void main()
{
unsigned char Disp, Cnt = 0;
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
TRISB = 0;                // PORT D pins are outputs
PORTB = 0 ;

for(;;)                   // DO FOREVER
{
Disp = SevenSegment[Cnt];       // Get bits of number to be displayed
PORTB = Disp;          // Display number
Cnt++;             // Incremet count
if(Cnt == 10)Cnt = 0;       // Back to zero
Delay_Ms(1000);          // Wait 1 second
}
}
 


فى بداية البرنامج ، يتم إعلان وتهيئة متغير العداد “Cnt” بالصفر (من نوع unsigned char ويكفى char) ، هذا المتغير هو الذى سوف يتم تزايده بواحد عشرى ولكن الأرقام العشرية عند توصيلها مباشرة إلى السفن سيجمنت فإنها لا تعنى شىء ، ولذلك يجب تحويلها إلى ما يعادلها من شفرة السفن سيجمنت ، على سبيل المثال ، لعرض الصفر “0” العشرى يجب إرسال معادل السفن سيجمنت وهو العدد 0x3F(0b000111111) إلى المنفذ PORTB ولعرض الواحد “1” العشرى يجب إرسال معادل السفن سيجمنت وهو العدد 0x06(0b00000110) وهكذا (هذه الأعداد تسمى mask ، أو نماذج بتات الشرائح ) ، كما يتم إعلان متغير التحويل للعرض “Disp” (نوع char). أيضا ، يتم تخزين "نماذج بتات الشرائح" للأرقام من “0” إلى “9” فى المصفوفة “SevenSegment” (نوع char) ، كما يتم تهيئة المنفذ PORTB كمخارج .

الكود:
unsigned char Disp, Cnt = 0;
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
TRISB = 0;                // PORT D pins are outputs
PORTB = 0 ;

بعد ذلك ، يتم تشكيل حلقة غير منتهية باستخدام عبارة for . داخل هذه الحلقة يتم :
• تحويل العداد Cnt من عشرى إلى شفرة السفن سيجمنت وذلك عن طريق "فهرسة" المصفوفة SevenSegment باستخدام قيمة متغير العداد Cnt . يتم تخزين "نموذج بتات الشرائح" فى المتغير Disp .

الكود:
Disp = SevenSegment[Cnt];       // Get bits of number to be displayed

• بعد ذلك يتم إرسال محتويات المتغير Disp (نموذج بتات الشرائح أو mask ) إلى المنفذ PORTB لعرض العدد الموجود فى المتغير Cnt .

الكود:
 PORTB = Disp;          // Display number

• بعد ذلك يتم تزايد المتغير Cnt بواحد ، وتصفيرة إذا كان يحتوى على 10 للعودة مرة أخرى إلى الصفر .

الكود:
Cnt++;             // Incremet count
if(Cnt == 10)Cnt = 0;       // Back to zero

• ثم يتم إدخال تأخير لمدة واحد ثانية فى الحلقة وبعدها تتكرر الحلقة .

الكود:
Delay_Ms(1000);          // Wait 1 second

اقتراح بالتعديل :
يمكن جعل البرنامج السابق أكثر قابلية للقراءة ، إذا تم دمج جزء العرض فى البرنامج فى دالة . فيما يلى البرنامج بعد التعديل :

الكود:
// this function forms the bit pattern corresponding to a number between 0 and 9. This
// bit pattern is returned to the calling program
//
unsigned char Display_Segment(unsigned char Number)
{
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Disp;
Disp = SevenSegment[Number];       // Get bits of the number to be displayed
return (Disp);             // Return bits to main program
}
//
// Start of main program
//
void main()
{
unsigned char Cnt = 0;
TRISB = 0;                // PORT B pins are outputs
PORTB = 0 ;


for(;;)                   // DO FOREVER
{
PORTB = Display_Segment(Cnt); // Display number
Cnt++;             // Increment count
if(Cnt== 10)Cnt = 0;       // Back to zero
Delay_Ms(1000);          // Wait 1 second
}
}
 

الدالة Display_Segment تستقبل عدد بين 0 و 9 وتعيد returns نموذج بتات الشرائح المقابل لهذا العدد. فى البرنامج الرئيسى يتم إرسال هذا النموذج إلى المنفذ PORTB لعرض العدد على وحدة السفن سيجمنت .

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 1:11 pm

تطبيق رقم 1 : التعامل مع المفتاح (الدخل) والسفن سيجمنت :




• وحدة السفن سيجمنت المستخدمة من نوع "الكاثود المشترك" ويتم توصيلها إلى المنفذ PORTB بحيث تتصل الشريحة a بالطرف RB0 والشريحة b بالطرف RB1 وهكذا حتى الشريحة g بالطرف RB6 .
• لعرض الرقم “0” يلزم وضع العدد السداسى عشر 0x3F فى المنفذ PORTB ، ولعرض الرقم “1” يلزم وضع العدد العشرى 0x06 فى المنفذ PORTB وهكذا حتى الرقم “9” .
البرنامج :

الكود:
/*Project name: 7-Segment */
#define SW1 PORTD.F0

char Display_Segment(char Number)
{
char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
char Disp;
Disp = SevenSegment[Number];       // Get bits of the number to be displayed
return (Disp);                // Return bits to main program
}


char Count = 0;

void main()
{
  TRISB  = 0;          //Configure PORTB as Outputs
  PORTB = 0;
  TRISD.F0 = 1;      //Configure RD0 as intput
 
  while(1){

      if (SW1==0)          //Check if switch SW1 is closed
      {
        delay_ms(100);  //wait for 100ms  (switch debouncing)
        if (SW1==0)      //Check if switch SW1 is still closed
        {
         Count ++;
PORTB = Display_Segment(Count);
   if (Count >9) Count =0;
        }
while (SW1 ==0); // Wait for release of the button

      }
      else
      {
        PORTB = Display_Segment(Count);
      }
    }
}
 


جرب إزالة العبارة while (SW1 ==0) ولاحظ الفرق .


Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 1:16 pm

تطبيق رقم 2 : عداد تصاعدى تنازلى مع عرض قيمة العد على وحدة سفن سيجمنت مع استخدام مفتاحين للتزايد وللتناقص .
يتم توصيل السفن سيجمنت إلى المنفذ PORTB ، وتوصيل المفاتيح إلى الأطراف RD0 , RD1 بالمنفذ PORTD .

الدائرة الكهربية :



البرنامج :
فى هذا البرنامج سوف يتم استخدام عبارة switch…case ، بدلا من المصفوفة ، داخل دالة العرض .


الكود:
/*
 * Project name:
    UP/DOWN Decimal Counter with Push Button and 7-Segment Interface
* Description:
    This code is an example of Seven Segment Display and Push Button interface.
    A decimal counter value will be displayed on the seven segment display.
    The value of the counter can be incremented or decremented through push
    buttons.
    MCU:            PIC16F877A
    The two push buttons are connected to RD0(Increment) and RD1(Decrement)
    and the seven segment display connected to PORTB (Segment a to PB.0,
    Segment b to PB.1 and so on)
*/
//-------------- Function to Return mask for common cathode 7-seg. display
char SevenSegment(char num) {
  switch (num) {
    case 0 : return 0x3F;
    case 1 : return 0x06;
    case 2 : return 0x5B;
    case 3 : return 0x4F;
    case 4 : return 0x66;
    case 5 : return 0x6D;
    case 6 : return 0x7D;
    case 7 : return 0x07;
    case 8 : return 0x7F;
    case 9 : return 0x6F;
  } //case end
}

char  digit;               // To Hold Decimal Value
char number;             // To Hold Equivalent Seven Segment Value

void main() {
  TRISB = 0x00;                 // Set PORTB direction to be output
  PORTB = 0x00;              // Turn OFF LEDs on PORTB
  TRISD0_bit = 1;            // RD0 Input for Increment
  TRISD1_bit = 1;            // RD1 Input for Decrement

  digit  =    0;              // Initial Value of Counter , Decimal Value
  number  = SevenSegment (digit)  ;//Get 7-segment pattern
  PORTB  = number;      //Display

  do {
    if (PORTD.F0 == 0 ) {        // Detect logical zero
      Delay_ms(200);
      digit ++;                      // Increase Counter
      number  = SevenSegment (digit)  ;
      PORTB  = number;

    }
    if (PORTD.F1 == 0) {        // Detect logical zero
      Delay_ms(200) ;
      digit = digit--;                      // Decrease Counter
      number  = SevenSegment (digit)  ;
      PORTB  = number;               
    }
  } while(1);                               // endless loop
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 1:22 pm

تطبيق رقم 3 : مشروع نظام استدعاء وبيان رقم الغرفة على وحدة عرض سفن سيجمنت 7-Segment
يتم تنفيذ المشروع باستخدام الميكروكونترولر PIC16F877A والبرمجة بلغة السى مع المترجم ميكروسى برو :
الدائرة الكهربية :



البرنامج :


الكود:
//Call System

#define SW1 PORTD.F0
#define SW2 PORTD.F1
#define SW3 PORTD.F2
#define SW4 PORTD.F3
#define SW5 PORTD.F4
#define SW6 PORTD.F5
//======================
void main()
{
TRISB = 0;             //PORTB as outouts
PORTB = 0;                                       
TRISD = 0xFF;         //PORTD as inputs
PORTB = 0x3F;          // Display "0"

 while(1)
 {
 
  //==========First SWITCH ========
   if(SW1==0)          // Test for LOW state
   {
   PORTB = 0x06;       // Display "1"
   PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
   delay_ms(10000);       // Wait 10 sec
   }
     
   else if(SW2==0)       // Test for LOW state
       {
   PORTB = 0x5B ;      // Display "2"
   PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
   delay_ms(10000);
   }
     
       else if(SW3==0)       // Test for LOW state
   {
       PORTB = 0x4F;       // Display "3"
   PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
   delay_ms(10000);
   }
     
       else if(SW4==0)       // Test for LOW state
   {
       PORTB = 0x66;       // Display "4"
   PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation       
   delay_ms(10000);
   }
     
       else if(SW5==0)          // Test for LOW state
   {
   PORTB = 0x6D;       // Display "5"
   PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
   delay_ms(10000);
   }
     
       else if(SW6==0)       // Test for LOW state
   {
     
   PORTB = 0x7D;       // Display "6"
   PORTB.F7 = 1 ; delay_ms(500); PORTB.F7 = 0 ;// Buzzer Operation
   delay_ms(10000);
   }
     
       else
       PORTB = 0x3F;      // Display "0"
  //==============================
 
  }
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 2:25 pm

تدريب تمهيدى رقم 2 : عرض عدد على شاشة سفن سيجمنت مكونة من وحدتين 2-Digit :
الغرض :
هذا التدريب يوضح كيفية استخدام أكثر من وحدة سفن سيجمنت بطريقة الانتخاب multiplexed . فى هذا التدريب سوف نعرض العدد “45” على شاشة بوحدتى عرض سفن سيجمنت ، على سبيل المثال .

الدائرة الكهربية :



يتم توصيل أطراف شرائح وحدتى العرض على التوازى إلى المنفذ PORTB للميكروكونترولر . يتم "تمكين" enable تشغيل كل وحدة (خانة) digit على حدة عن طريق توصيل ترانزستور كمفتاح إلى طرف الكاثود المشترك لها . تحديد قاعدة الترانزستور بالمنطق المرتفع HIGH(1) يؤدى إلى توصيل ON الترانزستور وتمكين تشغيل وحدة العرض المناظرة . تستخدم الأطراف RD0 و RD1 للمنفذ PORTD للتحكم فى خطوط تمكين الوحدات . مع العرض بالانتخاب من متعدد multiplexing ، يتم تمكين كل وحدة عرض لمدة عدة ميلى ثوانى ، وتعتقد عين الإنسان أن جميع الوحدات فى حالة تشغيل ON كل الوقت . على سبيل المثال ، وحدتى عرض سفن سيجمنت تعمل بالشكل التالى :
• إرسال بيانات رقم خانة الآحاد للعدد Number الخاصة بالوحدة (الخانة)الأولى digit1 إلى المنفذ PORTB .
• تمكين enable تشغيل الوحدة الأولى digit1 .
• الانتظار لعدة ميلى ثوانى .
• عدم تمكين disable الوحدة الأولى digit1 .
• إرسال بيانات رقم خانة العشرات للعدد Number الخاصة بالوحدة (الخانة)الثانية digit2 إلى المنفذ PORTB .
• تمكين تشغيل الوحدة الثانية digit2 .
• الانتظار لعدة ميلى ثوانى .
• عدم تمكين disable الوحدة الثانية digit2 .
• تكرار الخطوات السابقة بصفة مستمرة .
ملخص البرنامج :
• تهيئة المتغير Num بالقيمة المطلوب عرضها وهى “45” ، على سبيل المثال .
• تهيئة المنافذ PORTB و PORTD كمخارج .
• عدم تمكين كلا الوحدتين كحالة ابتدائية .
• حلقة غير منتهية ، وفيها يتم :
- استخلاص بيانات قيمة خانة الآحاد Digit1_Data (يساوى باقى خارج قسمة العدد Num على 10 ) ، وبيانات قيمة خانة العشرات Digit2_Data (يساوى خارج قسمة العدد Num على 10 ) .
- استدعاء دالة العرض Display_Segment لعرض قيمة خانة الآحاد “5” .
- تمكين وحدة خانة الآحاد .
- الانتظار لمدة 5 ميلى ثانية .
- عدم تمكين وحدة خانة الآحاد .
- استدعاء دالة العرض لعرض قيمة خانة العشرات “4” .
- تمكين وحدة خانة العشرات .
- الانتظار لمدة 5 ميلى ثانية
- عدم تمكين وحدة خانة العشرات .
البرنامج :

الكود:
/*****************************************************************************
2-DIGIT 7-SEGMENT DISPLAY
=======================
In this tutorial 2-digit common cathode 7-segment display is connected to PORT B of a
PIC16F877A type microcontroller (other types can also be used). The microcontroller is operated from an 8MHz crystal. The displays are multiplexed where the a-g segment lines are in parallel, but the common cathode pin (enable) of each display is controlled separately.
Number 45 is displayed on the 2-digit display as an example.
Digit1 (right hand side) is controlled from port RD0 through a transistor switch, and
Digit2 (left hand side) is from port RD1.
This program uses a function to get the bit pattern for a given number. This bit pattern is returned to the calling program.
*******************************************************************/
#define Digit1_Enable RD0_bit
#define Digit2_Enable RD1_bit
//
// this function forms the bit pattern corresponding to a number between
// 0 and 9. this bit pattern is returned to the calling program
//
unsigned char Display_Segment(unsigned char Number)
{
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Disp;
Disp = SevenSegment[Number];       // Get bits of the number to be displayed
return (Disp);             // Return bits to main program
}
//
// Start of main program
//
void main()
{
unsigned char Num = 45;
unsigned char Digit1_Data,Digit2_Data;
TRISB = 0;                      // PORT B pins are outputs
TRISD = 0;                      // PORT D output
Digit1_Enable = 0;                   // Disable Digit 1 to start with
Digit2_Enable = 0;                   // Disable Digit 2 to start with
for(;;) // DO FOREVER
{
Digit2_Data = Num / 10;             // Extract Digit 2 data ,(4)
Digit1_Data = Num % 10;             // Extract Digit 1 data , (5)

PORTB = Display_Segment(Digit1_Data);    // Send LSD number (5) to port
Digit1_Enable = 1;                // Enable Digit 1
Delay_Ms(5);                   // Wait 5ms
Digit1_Enable = 0;                // Disable Digit 1

PORTB = Display_Segment(Digit2_Data);    // Send MSD number (4) to port
Digit2_Enable = 1;                // Enable Digit 2
Delay_Ms(5);                // Wait 5ms
Digit2_Enable = 0;                // Disable Digit 2
}
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 2:28 pm

تدريب تمهيدى رقم 4 : استخدام أربع وحدات سفن سيجمنت بتقنية الانتخاب Multiplexed :
فى هذا التدريب سوف نتعلم كيفية استخدام أربع وحدات سفن سيجمنت متصلة على التوازى مع منفذ الميكروكونترولر عن طريق تقتية الانتخاب . سوف نستخدم أربع وحدات كاثود مشترك ، حيث يتم توصيل الشرائح على التوازى بأطراف المنفذ PORTB ، ويتم توصيل خطوط التحكم فى وحدات الآحاد والعشرات والمئات والآلاف عن طريق المنفذ PORTD ، وسوف يتم عرض العدد “1234” .
الدائرة الكهربية :



البرنامج :

الكود:
#define Digit1_Enable RD0_bit
#define Digit2_Enable RD1_bit
#define Digit3_Enable RD2_bit
#define Digit4_Enable RD3_bit

//
// this function forms the bit pattern corresponding to a number between
// 0 and 9. this bit pattern is returned to the calling program
//
unsigned char Display_Segment(unsigned char Number)
{
unsigned char SevenSegment[] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char Disp;
Disp = SevenSegment[Number];       // Get bits of the number to be displayed
return (Disp);             // Return bits to main program
}
//
// Start of main program
//
void main()
{
unsigned int Num = 1234;
unsigned char Digit1_Data,Digit2_Data, Digit3_Data, Digit4_Data ;
TRISB = 0;                      // PORT B pins are outputs
TRISD = 0;                      // PORT D output
Digit1_Enable = 0;                   // Disable Digit1 to Digit4 as start
Digit2_Enable = 0;
Digit3_Enable = 0;
Digit4_Enable = 0;                  
for(;;)                         // DO FOREVER
{
Digit4_Data = Num / 1000;             // Extract Digit4 data ,(1)
Digit3_Data = (Num/100) % 10;          // Extract Digit3 data ,(2)
Digit2_Data = (Num / 10) % 10;          // Extract Digit2 data ,(3)
Digit1_Data = Num % 10;             // Extract Digit4 data ,(4)

PORTB = Display_Segment(Digit1_Data);    // Send LSD number (4) to port
 Digit1_Enable = 1;
 Digit2_Enable = 0;
Digit3_Enable = 0;               // Enable Digit1
Digit4_Enable = 0;
Delay_Ms(5);                   // Wait 5ms
Digit1_Enable = 0;                // Disable Digit1

PORTB = Display_Segment(Digit2_Data);    // Send MSD number (3) to port
Digit2_Enable = 1;                // Enable Digit2
Digit1_Enable = 0;
Digit3_Enable = 0;
Digit4_Enable = 0;
Delay_Ms(5);                // Wait 5ms
Digit2_Enable = 0;                // Disable Digit2

PORTB = Display_Segment(Digit3_Data);    // Send MSD number (2) to port
Digit3_Enable = 1;                // Enable Digit3
Digit1_Enable = 0;
Digit2_Enable = 0;
Digit4_Enable = 0;
Delay_Ms(5);                // Wait 5ms
Digit3_Enable = 0;                // Disable Digit3

PORTB = Display_Segment(Digit4_Data);    // Send MSD number (1) to port
Digit4_Enable = 1;                // Enable Digit4
Digit1_Enable = 0;
Digit2_Enable = 0;
Digit3_Enable = 0;
Delay_Ms(5);                // Wait 5ms
Digit4_Enable = 0;                // Disable Digit4

}
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الإثنين يونيو 12, 2017 8:45 pm

تطبيق : عداد تصاعدى من 0 إلى 9999 والعرض على أربع وحدات سفن سيجمنت :
مرة أخرى مع تقنية الانتخاب multiplexing ، والتى تعتمد على الخداع البصرى لعين الإنسان . فعين الإنسان لا يمكنها كشف التغيرات البصرية عند معدل 25 إطار (صورة) كل ثانية 25 frames/sec (التردد). هذا يعنى أى تغيرات فى فرق زمنى أقل من 1/25 sec (الزمن الدورى) لن تستطيع العين ملاحظتها . يستخدم هذا المفهوم فى تقنية الانتخاب Multiplexing لوحدات السفن سيجمنت المتعددة . فى هذا التدريب سوف نستخدم 4 وحدات سفن سيجمنت ، وحدة واحدة فقط هى التى تكون فى حالة تسغيل ON فى وقت ما ، ولكن يتم تغيير حالة التشغيل والفصل ON/OFF بسرعة كبيرة بين الوحدات لخلق الانطباع بأن جميع الوحدات تكون فى حالة توصيل ON فى نفس الوقت .


الدائرة الكهربية :



يتم توصيل شرائح وحدات السفن سيجمنت إلى المنفذ PORTB ، وتوصيل الكاثودات المشتركة عن طريق ترانزستورات (والتى تعمل كمفاتيح)  إلى المنفذ PORTD .

البرنامج :
يتم إرسال رقم الآحاد Units إلى وحدات السفن سيجمنت من خلال المنفذ PORTB ، ويتم تشغيل ON الترانزستور الأول فى نفس الوقت ، وبعد وقت قصير يتم فصل OFF هذا الترانزستور . بعد ذلك يتم إرسال رقم العشرات  Tens إلى وحدات السفن سيجمنت من خلال المنفذ PORTB ، ويتم تشغيل ON الترانزستور المناظر فى نفس الوقت ، وبعد وقت قصير يتم فصله OFF . يتكرر نفس العمل لكل من رقم المئات hundreds ورقم الآلاف thousands .
تتكرر العملية كلها باستمرار عند سرعة عالية ولجميع الأرقام والترانزستورات المناظرة .    

الكود:
/**********************************
 Multiplexing of 7 segment display with PIC16F877A
This project demonstrate multiplexing of 4X7 segment display.
it counts from 0000 - 9999
***********************************/
unsigned char units,tens,hundreds,thousands ;
unsigned int counter = 0;
unsigned int digit = 0;


 unsigned char display(unsigned char digit1)
 {

   unsigned char my_digit;
   unsigned int array[10] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // array holding common cathode 7 segment look up table for 0-9
   my_digit = array[digit1];
   return (my_digit) ;
      
 }
  

 void short_delay() // delay function to control how digit is incremented
 {    

     if(counter<100)
 {
      counter++  ;
      if(counter==100)
  {
      digit++ ;
      counter = 0;  
  }
      if(digit==9999)
  {
      digit = 0;
      }
 }
 }

void main()
{

  TRISB = 0x00;    // set PORTB as output
  TRISD = 0x00;

   PortD.F0 = 0;  //turn off PORTD bit 0-3
   PortD.F1 = 0;
   PortD.F2 = 0;
   PortD.F3 = 0;

 while(1) {
    
   short_delay();                     // call delay function
  
   units = digit % 10 ;               //extract units from digit
   PORTB = display(units);             // send  units value to PORTD
   PortD.F0 = 1;                     // turn ON 1st 7 segment (LSD 7 Segment display)
   PortD.F1 = 0;
   PortD.F2 = 0;
   PortD.F3 = 0;
   delay_ms(1);
   PortD.F0 = 0;

   tens =  (digit / 10) % 10 ;         //extract tens from digit
   PORTB = display(tens);               // send tens value to PORTD
   PortD.F0 = 0;
   PortD.F1 = 1;                       // turn ON 2nd 7 segment
   PortD.F2 = 0;
   PortD.F3 = 0;
   delay_ms(1);
   PortD.F1 = 0;

   hundreds =  (digit / 100) % 10;    //extract hundreds from digit
  PORTB = display(hundreds);          // send hundreds value to PORTD
   PortD.F0 = 0;
   PortD.F1 = 0;
   PortD.F2 = 1;                       // turn ON 3rd 7 segment
   PortD.F3 = 0;
   delay_ms(1);
   PortD.F2 = 0;

   thousands =  digit / 1000 ;         //extract thousands from digit
   PORTB = display(thousands);           // send  thousands value to PORTD
   PortD.F0 = 0;
   PortD.F1 = 0;
   PortD.F2 = 0;
   PortD.F3 = 1;                       // turn ON 4th 7 segment
   delay_ms(1);
   PortD.F3 = 0;
   }
}
 

Admin
Admin

عدد المساهمات : 985
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

صفحة 2 من اصل 5 الصفحة السابقة  1, 2, 3, 4, 5  الصفحة التالية

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى