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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 22-11-2015, 06:30 PM المشاركة 1   
افتراضي مراجعة برمجة الميكروكونترولر PIC من خلال مشاريع الميكروكونترولر PIC16F877A مع الدايود Twitter FaceBook Google+



مراجعة برمجة الميكروكونترولر PIC من خلال مشاريع الميكروكونترولر PIC16F877A مع الدايودات المشعة للضوء والمترجم ميكروسى برو :
المشروع الأول : وميض ليد Flashing LED :
وصف المشروع :
لعل هذا المشروع هو أبسط مشروع يمكن إنشاؤه . فى هذا المشروع ، يتم توصيل ليد إلى البت bit 0  للمنفذ PORT B (RB0)  للميكروكونترولر PIC16F877A (يمكن استخدام أى ميكروكونترولر آخر) . تردد الكريستال المستخدم  8MHz . الليد تومض بفترة زمنية واحد ثانية .
مخطط الدائرة الكهربائية :



منطق وصف البرنامج :
• بداية البرنامج  .
• تهيئة المنفذ .
• بداية حلقة لا نهائية .
• توصيل الليد .
• الانتظار واحد ثانية .
• فصل الليد . الانتظار واحد ثانية .
• نهاية الحلقة النهائية والعودة إلى بدايتها.
• نهاية البرنامج .  



البرنامج :


كود:
/******************************************************************** Project1-a FLASHING LED In this project an LED is connected to bit 0 of PORT B (RB0) of a PIC16F877A type microcontroller (any other PIC microcontroller can also be used in this project). The microcontroller is operated from an 8MHz crystal. The LED is flashed continuously with 1 second intervals. *******************************************************************/ void main() { CMCON = 0x07;     // To turn off comparators ADCON1 = 0x06;   // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { PORTB.RB0 = 1; // Turn ON LED Delay_Ms(1000); // Wait 1 second PORTB.RB0 = 0; // Turn OFF LED Delay_Ms(1000); // Delay 1 second } }


فى بداية البرنامج ، يتم إعداد جميع المنافذ كمنافذ دخل/خرج رقمى عام وذلك بتعطيل المقارنات بالعبارة
 CMCON = 0x07 والمحول من تناظرى لرقمى بالعبارة  ADCON1 = 0x06 (تختلف الإعدادات باختلاف الميكروكونترولر المستخدم) .
بعد ذلك يتم إعداد جميع أطراف المنفذ PORT B كمخارج بمسح السجل TRISB بالعبارة TRISB = 0  .
بعد ذلك يتم إنشاء حلقة غير منتهية ، وفيها يتم عمل وميض لليد بفترة زمنية واحد ثانية باستخدام الدالة Delay_Ms مع الوسيط بقيمة (1000) أى واحد ثانية .
 
ملحوظة :
• يمكن الوصول إلى بتات المنفذ بشكل منفصل باستخدام الصيغ التالية :  PORTB.RB0 ، PORTB.F0 ، RB0_bit .
• لكتابة (تخصيص) قيمة لهذه البت تم استخدام الصيغة PORTB.RB0 = 1.  

اعلانات

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


تحسين البرنامج :
يمكن جعل البرنامج السابق أكثر سهولة فى القراءة والتتبع والفهم إذا تم استخدام عبارات توجيه المعالج ‘#define’ كما يلى :

كود:
/******************************************************************** Project1-b-FLASHING LED ------------------ In this project an LED is connected to bit 0 of PORT B (RB0) of a PIC16F77A type microcontroller (any other PIC microcontroller can also be used in this project). The microcontroller is operated from an 8MHz crystal. The LED is flashed continuously with 1 second intervals. In this version of the program "define" pre-processor statements are used to make the program more readable. ************************************************************/ #define LED PORTB.F0 // LED is bit 0 of PORT C #define ON 1 #define OFF 0 #define Delay_1_second Delay_Ms(1000) void main() { CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { LED = ON; // Turn ON LED Delay_1_second; // Wait 1 second LED = OFF; // Turn OFF LED Delay_1_second; // Delay 1 second } }

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 22-11-2015, 07:20 PM المشاركة 3   
افتراضي


تعديل البرنامج السابق لمحاكاة إضاءة المنار (الفنار) Lighthouse:
فى البرنامج السابق ، تم عمل وميض بسيط لليد بفترة زمنية واحد ثانية . يمكن تعديل هذا البرنامج ، على سبيل المثال لمحاكاة وامض أضواء المنار (الفنار) البحرى بغرض التعليم . أضوار المنار متعددة ولها خصائص مختلفة ، مثل الأضواء المتناوبة ، والثابتة ، والوامضة ، وسريعة الوميض وغيرها .
كمثال على ذلك سوف نقوم بتعديل البرنامج لمحاكاة إشارة أضواء المنارة المعروفة باسم VQ(3) 5s . تتكون هذه الإشارة من 3 ومضات قصيرة ، كل منها توصيل 500 ملى ثانية وفصل 100ملى ثانية ، وتتكرر كل 5 ثوانى كما فى الشكل التالى :



لاحظ أن فترة الإشارة هى 5 ثوانى . الثلاث ومضات تأخذ 1.7 ثانية ، وتترك 3.3 ثانية قبل أن يبدأ الوميض من جديد . يحتوى البرنامج على "حلقة متداخلة" ، حيث يتم تكرار الحلقة الداخلية 3 مرات ، وتكرار الحلقة الخارجية إلى الأبد .
منطق وصف البرنامج :
• بداية البرنامج .
• تهيئة المنافذ .
• بداية حلقة لا نهائية .
• حلقة تكرار 3 مرات .
• توصيل الليد .
• الانتظار 500 ملى ثانية .
• فصل الليد .
• الانتظار 100 ملى ثانية .
• نهاية حلقة تكرار 3 مرات .
• نهاية الحلقة الانهائية .
• نهاية البرنامج .




البرنامج :

كود:
/******************************************************************** Project1-c -FLASHING LIGHTHOUSE LED ------------------------------------------ In this project an LED is connected to bit 0 of PORT B (RB0) of a PIC16F877A type microcontroller (any other PIC microcontroller can also be used in this project). The microcontroller is operated from an 8MHz crystal. In this project the LED simulates the flashing of a lighthouse light having the characteristics: VQ(3) 5s where the light flashes 3 times with 500ms ON time and 100ms OFF time with a period of 5 seconds. *****************************************************************/ void main() { unsigned char i; CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { for(i= 0; i < 3; i++) // Do 3 times { PORTB.RB0 = 1; // Turn ON LED Delay_Ms(500); // Wait 500 milliseconds PORTB.RB0 = 0; // Turn OFF LED Delay_Ms(100); // Wait 100 milliseconds } Delay_Ms(3300); // Wait 3.3 seconds } }


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 22-11-2015, 08:46 PM المشاركة 4   
افتراضي


المشروع الثانى : عداد ثنائى تصاعدى باستخدام الليدات :
وصف المشروع :
هذا المشروع أيضا بسيط ، حيث يتم توصيل 8 ليدات بالمنفذ PORT B للميكروكونترولر . إضاءة الليدات تشكل عداد ثنائى تصاعدى بفاصل واحد ثانية بين كل عدة . الشكل التالى يبين النموذج (النمط) الذى سيتم عرضه بواسطة الليدات :





مخطط الدائرة الكهربائية :



منطق وصف البرنامج :
• بداية البرنامج .
• إعلان عن متغير العداد ، و تهيئة المنفذ .
• تصفير العداد .
• بداية حلقة غير منتهية .
• إرسال قيمة العداد إلى المنفذ .
• الانتظار واحد ثانية .
• تزايد العداد .
• نهاية الحلقة الغير منتهية .
• نهاية البرنامج .

البرنامج :

كود:
/******************************************************************** Project2-a-BINARY COUNTING UP LEDs ----------------------------------------- In this project 8 LEDs are connected to PORT B of a PIC16F877A type microcontroller (any other PIC microcontroller can also be used in this project). The microcontroller is operated from an 8MHz crystal. In this project the LEDs count up in binary from 0 to 255 and then back to 0 with one second delay between each count. ****************************************************************/ void main() { unsigned char Cnt = 0; // Declare and initialise Cnt CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { PORTB = Cnt; // SendCnt to PORT B Delay_Ms(1000); // Delay 1 second Cnt++; // Increment Cnt } }
• فى بداية البرنامج ، يتم إعلان متغير العداد Cnt وتعينه بصفر (0) . لاحظ أن جميع المتغيرات المستخدمة فى برامج لغة السى يجب أن يتم إعلانها فى بداية البرنامج .
• بعد ذلك يتم تهيئة أطراف المنفذ PORT B لتكون جميعها مداخل /مخارج رقمية .
• يتم إنشاء حلقة غير منتهية ، بداخل هذه الحلقة يتم إرسال محتويات العداد (المتغير Cnt ) إلى المنفذ PORT B .
• ثم الانتظار (التأخير) واحد ثانية .
• وتزايد محتويات العداد ، المتغير Cnt ، بواحد .
• ثم تكرار الحلقة الغير منتهية إلى الأبد .

ملاحظات على المتغير unsigned char Cnt:
1- لماذا نحتاج إلى المتغير ؟
نحتاج إلى كتابة (إرسال) قيمة إلى المنفذ PORT B ليتم عرضها على أطرافه كمخارج ، وأثناء عرضها نحتاج إلى تعديل هذه القيمة ، هذا التعديل يجب أن يتم فى مكان آخر بالذاكرة ، هذا المكان هو المتغير Cnt . ومن ثم نكتب صفر إلى هذا المتغير Cnt = 0 ثم ننسخه إلى المنفذ PORTB = Cnt ليعرضه كمخارج ، وأثناء العرض يتم التعديل فى المتغير ، تزايد بواحد ، Cnt++ ليكون Cnt = 1 ، وتتكر العملية بتكرار الحلقة الغير منتهية .
2- نوع وحجم المتغير unsigned char Cnt :
هذا المتغير نوع حرف char أى سعته (حجمه) واحد بايت أى 8 بت ، لذلك فإن محتوياته تكون من 0 إلى 255 ، وبالتالى سوف يتزايد فى كل تكرار للحلقة بواحد حتى يمتلء ( 0,1,2,3,……255) عند التكرار التالى سوف يتم تصفيره تلقائيا ويبدأ من الصفر مرة أخرى ليحقق الغرض من هذا البرنامج على وجه التحديد . كما يمكننا استخدام الصيغة التالية :

كود:
void main() { unsigned char Cnt = 0; // Declare and initialise Cnt CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { for(Cnt=0;Cnt<=255;Cnt++) { PORTB = Cnt; // SendCnt to PORT B Delay_Ms(1000); // Delay 1 second } } }


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


تدريب :
تعديل البرنامج ليعد تنازليا بعد أن يصل إلى 255 .


كود:
void main() { unsigned char Cnt = 0; // Declare and initialise Cnt CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { for(Cnt=0;Cnt<255;Cnt++) { PORTB = Cnt; // SendCnt to PORT B Delay_Ms(1000); // Delay 1 second } for(Cnt=255;Cnt>0;Cnt--) { PORTB = Cnt; // SendCnt to PORT B Delay_Ms(1000); // Delay 1 second } } }


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


المشروع الثالث :
إضاءة الليدات الدوارة Rotating LEDs :
فى هذا المشروع يتم توصيل 8 ليدات بأطراف المنفذ PORT B للميكروكونترولر كما فى المشروع الثانى . يتم توصيل الليدات فى الاتجاه من اليسار إلى اليمين ( من البت bit 0 تجاه البت bit 7 ) فى شكل دائرى ، مع تأخير واحد ثانية بين كل خرج حيث تكون ليد واحدة فقط فى حالة توصيل فى أى وقت . إذا تم ترتيب الليدات فى شكل دائرى ، فإن النموذج المعروض بالليدات سوف يكون كما فى الشكل التالى :



مخطط الدائرة الكهربائية :



وصف منطق البرنامج :
• بداية البرنامج .
• إعلان وتخصيص واحد (1) لمتغيرالعداد كقيمة ابتدائية وهو ما يعنى أضاءة الليد المتصل بالطرف RB0 (bit 0) ، وإعداد المنفذ .
• بداية حلقة غير منتهية .
• إرسال (كتابة) محتويات متغير العداد إلى إلى المنفذ .
• الانتظار (التأخير) واحد ثانية .
• إزاحة (زحزحة) محتويات متغير العداد إلى اليسار بت واحدة فى كل تكرار.
• إختبار : هل محتويات العداد بصفر ؟ ( تم الزحزحة حتى البت الأخيرة bit 7 ) .
• إذا كانت بصفر يتم إعادة تخصيص القيمة الابتدائية (1) لمتغير العداد .




البرنامج :

كود:
/******************************************************************** Project3-a ROTATING LEDs ------------------------ In this project 8 LEDs are connected to PORT B of a PIC16F877A type microcontroller (any other PIC microcontroller can also be used in this project). The microcontroller is operated from an 8MHz crystal. In this project the LEDs rotate left (RB0 through RB1 and so on) with one second delay between each output. *******************************************************************/ void main() { unsigned char Cnt = 1; // Initialise Cnt CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { PORTB = Cnt; // Send Cnt to PORT B Delay_Ms(1000); // Delay 1 second Cnt = Cnt << 1; // Shift left 1 digit if(Cnt == 0)Cnt = 1; // If the last LED re-start } }
• فى بداية المشروع ، يتم إعداد متغير العداد Cnt للوضع الابتدائى Cnt = 1 .
• كما يتم إعداد المنفذ PORT B كمداخل / مخارج رقمية (كما سبق) .
• بعد ذلك يتم إنشاء حلقة غير منتهية ، بداخلها نبدأ بإرسال محتويات متغير العداد Cnt إلى المنفذ PORT B .
• بعد واحد ثانية تأخير ، يتم زحزحة محتويات متغير العداد جه اليسار بت واحدة Cnt = Cnt << 1 .
• يتم اختبار تصفير محتويات متغير العداد بعد عملية الإزاحة ، وإعادة تهيئته للوضع الابتدائى .
• تكرار الحلقة إلى الأبد .
• النتيجة أن متغير العداد Cnt ، وبالتالى PORT B ، يأخذ القيم 1 2 4 8 16 32 64 128 1 2 . . .


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


تعديل البرنامج :
البرنامج السابق يعطى دوران لليدات جهة اليسار . الآن سوف نعدل البرنامج بحيث تدور الليدات فى كلا الجهتين اليسرى واليمنى .
فى البرنامج المعدل ، بعد أن تضىء "آخر ليد" أثناء الدوران فى أحد الاتجاهين ، سوف يتم تغيير اتجاه الدوران . لذلك ، على سبيل المثال ، أثناء الدوران "من اليمين إلى اليسار" ، إذا أضاءى الليد المتصلة بالطرف RB7 ، عندئذ سوف يتم تغيير اتجاه الدوران إلى "من اليسار إلى اليمين" ، وسوف تضىء الليد المتصلة بالطرف RB6 بعد ذلك ، وهكذا .

وصف منطق البرنامج :




البرنامج :

كود:
/******************************************************************** Project3-b ROTATING LEDs ------------------------ In this project 8 LEDs are connected to PORT B of a PIC16F877A type microcontroller (any other PIC microcontroller can also be used in this project). The microcontroller is operated from an 8MHz crystal. In this project the LEDs rotate right to left (RB0 through RB1 and so on) and left to right (RB7 through RB6 and so on) with one second delay between each output. *****************************************************************/ void main() { unsigned char Cnt = 1; // Initialise Cnt unsigned char Mode = 0; // Mode=0 right-to-left CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs for(;;) // FOREVER loop { PORTB = Cnt; // Send Cnt to PORT B Delay_Ms(1000); // Delay 1 second if(Mode == 0) { Cnt = Cnt << 1; // Left shift Cnt if(Cnt == 0) // Last LED lit { Cnt = 64; Mode = 1; // Change direction } } else { Cnt = Cnt >> 1; // Right shift Cnt if(Cnt == 0) // Last LED lit { Cnt = 2; Mode = 0; // Change direction } } } }
• تم إعلان وتخصيص متغير يسمى Cnt .
• وإعداد أطراف المنفذ PORT B كمداخل / مخارج رقمية .
• بالإضافة إلى ذلك تم استخدام متغير يسمى Mode ، والذى يحدد اتجاه الدوران . عندما يكون
Mode = 0 ، تدور الليدات من من اليمين إلى اليسار ، وعندما يكون Mode = 1 / تدور الليدات من اليسار إلى اليمين .
• عندما يضىء آخر ليد فى الصف ، يتم تغيير اتجاه الدورات عن طريق تعيين قيمة جديدة لمتغير العداد Cnt وتغيير قيمة Mode . ولذلك ، فإن متغير العداد Cnt يأخذ القيم :

1 2 4 8 16 32 64 128 64 32 16 8 4 2 1 2 . . .

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 23-11-2015, 08:59 AM المشاركة 8   
افتراضي مشروع إضاءة متحركة (جراى) يمين – يسار ، المسمى Knight Rider :


مشروع إضاءة متحركة (جراى) يمين – يسار ، المسمى Knight Rider :
الدائرة الكهربية :











البرنامج :

كود:
void left() { while (PORTB.F7 != 1) { PORTB = PORTB * 2; Delay_ms(500) ; } } void right() { while (PORTB.F0 != 1) { PORTB = PORTB / 2; Delay_ms(500) ; } } void main( ) { CMCON = 0x07; // To turn off comparators ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0; // Configure PORT B as outputs PORTB = 1 ; Delay_ms(500) ; while(1){ if(PORTB.F0 == 1) left() ; if(PORTB.F7 == 1) right() ; } }
فى هذا البرنامج يتم إعداد المنفذ PORT B كمخارج ، ثم تعيين البت bit 0 بالحالة المرتفعة بالعبارة PORTB = 1 ، ثم الانتظار (التأخير) لمدة نصف ثانية . بعد ذلك يتم إنشاء حلقة غير منتهية وفيها يتم استدعاء دالتى الحركة جهة اليسار والحركة جهة اليمين والتى تم إعلانها مسبقا ، وخلالها يتم اختبار حالة آخر وأول بت .
النموذج الثنائى للحركة جهة اليسار يتم تشكيله باستخدام عملية ضرب القيم فى 2 ، فى حين أن النموذج الثنائى للحركة جهة اليمين يتم تشكيله باستخدام عملية قسمة لقيم على 2 ، النتيجة الحصول على تأثير عملية إزاحة البتات بموقع واحد .

إضافة رد

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

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

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


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

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