((الدرس الرابع))
تطبيقات وتمارين على الدرس الثالث
===============================================
إخواني الكرام .. سيكون هذا الدرس مقسم لعدة أجزاء لذا أرجو عدم وضع أي مشاركات أو أسئلة حتى أخبركم بأنني انتهيت من شرح الدرس
===============================================
إخواني الكرام مشاهدي ومتابعي هذه الدورة السلام عليكم ورحمة الله وبركاته
وأرحب بكم جميعا في هذه الدورة مرة أخرى ...
كان الدرس الثالث من أهم الدروس على الإطلاق فهو يحتوي كم معين من الأساسيات البرمجية المهمة جدا ... لذلك سيكون هذا الدرس بإذن الله هو عبارة عن تطبيق على الدرس السابق وذلك عن طريق وضع برامج تطبيقية بالإضافة إلى الأسئلة والتمارين المحلولة ....... وأيضا تمارين تنتظر حلولكم .
وسيكون في هذا الدرس معلومات جديدة أيضا ... لكنها بسيطة وسهلة .
وسأقوم الآن بمراجعة سريعة على بعض الأشياء المهمة في الدرس السابق والتي يجب أن تعرفها جيدا لتكمل مسيرتك في احتراف برمجة البك إن شاء الله ..
أولا :: عندما نريد من البك تكرار تنفيذ مجموعة من الأوامر فإنه يجب علينا استخدام أمر يسمى for (أو جملة for ) .. فعلى سبيل المثال
كما تعلم لو أردنا أن نجعل البك يضيء الليد الموصل بالرجل b0 ثم يطفئه فإننا سنكتب الكود التالي .
كود:
void main()
{
TRISB=0;
PORTB=0XFF;
delay_ms(1000);
PORTB=0;
delay_ms(1000);
}
في الكود السابق .. سيضيء الليد الموصل بالرجل b0 ثم ينتظر البك لمدة ثانية ثم يطفئ الليد ثم ينتطر لمدة ثانية .
ولكن ماذا نفعل إذا أردنا أن نجعل البرنامج السابق يتكرر تنفيذه خمسة عشر مرة أي أن عدد المرات التي سيضيء فيها الليد ثم ينطفئ هي خمسة عشر مرة .. في هذه الحالة لابد من استخدام أمر يقوم بعملية التكرار هذه .. وهذا الأمر كما ذكرت هو for أو ما يسمى بجملة for .. ولكن
كيف نستخدم جملة for لتكرار تنفيذ مجموعة من الأوامر عدد معين من المرات (وليكن 60 مرة ) .. ببساطة سنكتب الكود التالي
كود:
for(m=0;m<60;m++)
{
هنا نكتب الأوامر التي نريد تكرار تنفيذها
60
مرة
}
كلام جميل ... ولكن ماذا لو أردت أن أغير هذا العدد .. أي أجعل البك يكرر تنفيذ مجموعة من الأوامر وليكن 19 مرة .. (ببساطة غير الرقم 60 واجعله 19 كما يلي )
كود:
for(m=0;m<19;m++)
{
هنا نكتب الأوامر التي نريد تكرار تنفيذها
19
مرة
}
ولكن قبل هذا لا بد أن أكتب في بداية البرنامج الأمر التالي
ولكن ماذا نعني بهذا الأمر char m ؟؟؟ هذا الأمر نسميه تعريف المتغير ...
متغير؟؟ نعم ,, المتغير هذا هو مكان نحجزه في الذاكرة (ذاكرة البك) فائدته أننا نستخدمه في الكثير من العمليات و أيضا نستخدمه في تخزين قيمة معينة ...
بمعنى أننا الآن حجزنا مكان في الذاكرة (واخترنا له اسم هو m ) هذا المكان يمكننا أن نضع فيه قيمة معينة ( 5 مثلا .. أو 18 أو 3 أو ... أي قيمة) كما يمكننا أن نغير هذه القيمة فمثلا لو كانت صفر يمكننا أن نجعلها بعد مدة بواحد أو بأي قيمة أخرى ... بما أننا نستطيع تغيير قيمته لذلك نطلق عليه اسم متغير ..
ولكن ما فائدة هذا المتغير في جملة for ؟؟
فائدته سنعرفها عندما نعرف كيف تعمل جملة for وهذا ما سأشرحه بعد قليل ..
والآن لنكتب الكود الذي سيجعل الليد يضيء وينطفئ 15 مرة .
كود:
void main()
{
char x;
TRISB=0;
for(x=0;x<15;x++)
{
PORTB=0XFF;
delay_ms(1000);
PORTB=0;
delay_ms(1000);
}
}
كيف تعمل جملة for ؟؟؟
لنعرف كيف تعمل جملة for سنطرح هذا المثال ونرى كيف تعمل جملة for
كود:
for(ze=0;ze<60;ze++)
{
delay_ms(1000);
}
قبل أن أشرح كيف ستعمل لابد أنك استنتجت من خلال الكود السابق أن الأمر
ستم تكرار تنفيذه 60 مرة أي أن البك سينتظر لمدة 60 ثانية . ولكن كيف سيحدث ذلك .. الآن أنت تعرف أننا سنستخدم في جملة for هذه متغير اسمه ze هذا المتغير كما قلنا أنه مكان يحجز في الذاكرة نضع فيه قيمة معينة ويمكننا تغيير هذه القيمة ... كلام جميل ... الآن كيف ستعمل جملة for ؟؟ ستلاحظ وجود قوسي مجموعة { } بعد جملة for ما بين هذين القوسين سيتم تكرارهم 60 مرة بالطريقة التالية
أولا سيضع البك في المتغير ze قيمة هي صفر ثم ينفذ الأوامر التي بين القوسين الخاصين بجملة for وبعد ذلك سيغير القيمة صفر ويجعلها بواحد أي أن
ze=1
ثم ينفذ الأوامر التي بين القوسين ثم يغير البك القيمة واحد ويجعلها 2 أي أن
ze=2
ثم ينفذ الأوامر التي بين القوسين ثم يغير البك القيمة اثنين ويجعلها 3 أي أن
ze=3
.................
...............
وهكذا .. إلى أن تصبح قيمة ze=59 فينفذ البك الأوامر التي بين القوسين وحينها لن يجعل البك قيمة ze=60 لان شرط التكرار يخبرنا أن ze<60 ...
==============================================
علمنا أننا نستطيع تعريف متغير معين وليكن اسمه nn بكتابة الكود التالي في بداية البرنامج
علمنا أن nn هذه هو اسم المتغير (
حيث يمكننا أن نختار أي اسم )
ولكن
ماذا تعني char هذه ؟؟ إنها تعني أن المتغير الذي حجزناه في الذاكرة يتكون من 8 بت ..
وهذا يعني أن هذا المتغير يمكن أن تكون قيمته صفر أو واحد أو 2 أو 3 .... أو 255 ولا يمكن أن تزيد قيمته عن 255 ...
لماذا ؟؟ لأنه يتكون من 8 بت والبت bit هذا إما أن يكون واحد أو صفر ( بالنظام الثنائي ) ومن المعلوم أن أكبر رقم يمكن الحصول عليه من 8 بت بالنظام الثنائي هو 11111111 وهو يساوي 255 بالنظام العشري ... (راجع الأنظمة الرقمية الثنائي والعشري والسادس عشري .. وابحث عنها إذا لم تكن تعرفها جيدا..؟؟)
مما سبق يتضح أننا لو أردنا أن نعرف متغير هذا المتغير قيمته من 0 - 255 فإننا نستخدم النوع char ..
وهذا يعني أننا لو استخدمنا جملة for وكان عدد مرات التكرار هو 255 أو أقل فإننا في بداية البرنامج سنعرف متغير هذا المتغير من النوع char ..
ولكن ماذا لو أردنا أن نكرر تنفيذ مجموعة من الأوامر ألف مرة مثلا ... في هذه الحالة لا نستطيع استخدام char وسنستخدم بدلا منه نوع آخر اسمه int . هذا النوع يتكون من 16 بت (وبهذا يمكن أن تكون قيمة هذا المتغير من 0 إلى 65535 )
كلام جميل ... هيا بنا الآن نكتب كود يقوم بتكرار تنفيذ مجموعة من الأوامر ألف مرة
كود:
void main()
{
int x;
for(x=0;x<1000;x++)
{
هنا نكتب الأوامر التي ستتكرر ألف مرة
}
}
وسنشرح المتغيرات بإستزادة أكثر في دروس قادمة إن شاء الله ..
ملحوظة :: لقد قمت بإعادة شرح جملة for استجابة لطلب أحد الأعضاء
===============================================
( تطبيقات )
التطبيق الأول - اكتب برنامج يقوم بإضاءة الليد الموصل بـ b5 ثم يطفئه ثلاثة وعشرون مرة .
كود:
void main()
{char R;
trisb=0;
for(R=0;R<23;R++)
{
portb.f5=0;
delay_ms(1000);
portb.f5=1;
delay_ms(1000);
}
}
ملحوظة :: كان يمكن أن نكتب البرنامج السابق بالشكل التالي ::
كود:
void main()
{char R;
trisb=0;
for(R=0;R<23;R++)
{
portb=0b00100000;
delay_ms(1000);
portb=0b00000000;
delay_ms(1000);
}
}
==============================================
التطبيق الثاني :: اكتب برنامج يضيء الليد الموصل بـ b7ثم يطفيه ( عشر مرات) ثم بعد ذلك يضي الليد الموصل بـ b3 ( خمس مرات ) .
في هذا البرنامج نحتاج أن نكرر الأوامر التالية عشر مرات
كود:
portb.f7=1;
delay_ms(1000);
portb.f7=0;
delay_ms(1000);
وبعد تنفيذ الأوامر السابقة نحتاج أن نكرر الأوامر التالية خمس مرات
كود:
portb.f3=1;
delay_ms(1000);
portb.f3=0;
delay_ms(1000);
ولهذا سنحتاج (سنستخدم) جملتي for وبالتالي سيكون الشكل النهائي للبرنامج كما يلي ..
كود:
void main()
{
char
trisb=0;
for(x=0;x<10;x++)
{
portb.f7=1;
delay_ms(1000);
portb.f7=0;
delay_ms(1000);
}
for(x=0;x<5;x++)
{
portb.f3=1;
delay_ms(1000);
portb.f3=0;
delay_ms(1000);
}
}
================================================
التطبيق الثالث : اكتب برنامج يضيء جميع الليدات الموصلة من b0 إلى b6 ثم يطفئهم (ويكرر هذه العملية 13 مرة ) وبعد ذلك يضيء الليد b7 ..
طبعا سنستخدم جملة for من أجل عملية التكرار وبعد جملة for سنكتب الأمر الذي يجعل البك يضيء الليد الموصل بـ b7 طبعا هذا الأمر خارج جملة for لأنه لن يتم تكراره وسنكتبه بعد جملة for لأنه من المفترض أن يضيء هذا الليد بعد تنفيذ عملية التكرار ..
كود:
void main()
{
char x;
TRISB=0;
for(x=0;x<13;x++)
{
portb=0b011111111;
delay_ms(1000);
portb=0;
delay_ms(1000);
}
portb.f7=1;
}
================================================
التطبيق الرابع :: صمم دائرة باستخدام المايكروكنترولر تحتوي على سويتشين وعلى ليد led وعند الضغط على السويتش الأول يضيء الليد ثم ينتظر البك لمدة ثانية ثم ينطفئ الليد ... وعند الضغط على السويتش الثاني يضيء الليد ثم ينتظر البك لمدة ثلاث ثواني ثم ينطفئ الليد .
الحل : سنوصل السويتشين (المفتاحين) بالرجل رقم a0 والرجل رقم a1 . وسنوصل الليد بالرجل رقم b0 . وهنا نحتاج لجملة if تقوم باختبار السوتش الأول وجملة if أخرى تقوم باختبار السويتش الثاني .
إذن سنكتب الأوامر بالشكل التالي ::
كود:
if(porta.f0==0)
{
هنا نكتب الأوامر التي سينفذها البك
في حالة الضغط على السويتش الأول
}
if(pora.f1==0)
{
هنا نكتب الأوامر التي سينفذها البك
في حالة الضغط على السويتش الثاني
}
إذن في حالة الضغط على السويتش الأول من المفترض أن ينفذ البك الأوامر التالية
كود:
portb.f0=1;
delay_ms(1000);
portb.f0=0;
delay_ms(1000);
وعند الضغط على السويتش الثاني من المفترض أن ينفذ البك الأوامر التالية
كود:
portb.f0=1;
delay_ms(3000);
portb.f0=0;
delay_ms(5000);
طبعا كما أخبرتك سابقا لابد أن تكون عملية الاختبار هذه باستمرار وليست مرة واحدة أي يجب أن أجعل البك يختبر السويتشات باستمرار .
وبهذا يكون الشكل النهائي للبرنامج كما يلي ::
كود:
void main()
{
trisb=0;
trisa=0xff;
loop:
if(porta.f0==0) {
portb.f0=1;
delay_ms(1000);
portb.f0=0;
delay_ms(1000);
}
if(porta.f1==1) {
portb.f0=1;
delay_ms(3000);
portb.f0=0;
delay_ms(5000);
}
goto loop;
}
===============================================
إخواني الكرام .. سيكون هذا الدرس مقسم لعدة أجزاء لذا أرجو عدم وضع أي مشاركات أو أسئلة حتى أخبركم بأنني انتهيت من شرح الدرس