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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-03-2012, 02:57 AM المشاركة 41   
افتراضي



1- عبارة if – else :
يمكنك تنفيذ عبارة آخرى أو مجموعة (بلوك) من العبارات إذا كانت نتيجة تقييم الشرط بصفر false باستخدام عبارة if – else .

الصيغة :

كود:
if (expression) command 1 else Command 2
مثال :


كود:
if (x> 5)
z = 10;
else
z = 20;
العبارة if (x> 5) مهمتها "إختبار" : "هل نتيجة تقييم الشرط (x> 5) (وهو عبارة مقارنة ) تكون صواب true أم غير صواب false ؟ " .
إذا كان الجواب (النتيجة) صواب true عندئذ يتم تنفيذ السطر z = 10 .
وإذا كان الجواب (النتيجة) غير صواب false ,أى كانت "x" أقل من أو تساوى 5 ,عندئذ يتم تنفيذ سطر الخيار البديل z = 20 .

يمكن تضمين جميع عوامل operators لغة السى فى شرط الاختبار , تعبيرات لغة السى الصالحة هى التى تولد نتيجة منطقية للشرط . التعبيرات الأتية صالحة ونتيجتها سوف تعتمد على قيمة متغيراتها :

كود:
if (a> b) b = a; /* if the expression a> b is true, the variable "b" assumes the value of "a"*/ if (b <a) b = 10; /* if the expression a <b is true, the variable "b" assumes the value 10*/ if (a != b) b = 55; /* if the expression a != b (differ) is true, the variable "b" assumes the value 55 */ if ((a + b)> (b + d)) b ++; /* if the expression (a + b)> (b + d) is true, the variable "b" is incremented by one.*/
ملاحظات هامة :
  • عامل التخصيص فى لغة السى هو علامة التساوى (=).
  • بينما عامل "مقارنة التساوى" وهو (==)يختلف عن عامل التخصيص .
لاختبار شرط لمتغير معطى نستخدم عامل مقارنة التساوى (==) كما يلى :

كود:
if (a == b) c = 10;
وهذا يختلف عن :
كود:
if (a = b) c = 10;
فى عبارة if الأولى : اختبار الشرط (a == b) يقوم بعمل مقارنة بين متغيريين , إذا كان الشرط صواب يتم تنفيذ c=10 .
فى عبارة if الثانية : يوجد تعبير تخصيص بالتساوى (a = b) . عندما يقوم المترجم بترجمة هذا الأمر فأنه فى البداية يخصص للمتغير a القيمة الموجودة بالمتغير b وبعد ذلك يختبر الشرط فإن كانت النتيجة صواب (وهو بالقطع سوف يكون صواب بعد التخصيص ) يتم تنفيذ c = 10 .

لإضافة بلوكات من البرامج فى عبارة if من الضرورى إستخدام قوس الفتح (البداية) ({) وقوس الغلق(النهاية) (}) .
مثال :


كود:
if (PORTB == PORTC)
{           // Command block
a ++;
portb.f0 = 1;
d = c + e;
}

اعلانات

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


1- عبارات if المتداخلة if, else, if
يمكننا إنشاء عبارات ifمتداخلة Nested If statements من خلال بناء عبارات if, else, if .


يتم إنشاء العبارات ببساطة عن طريق وضع عبارة if متداخلة مع عبارة if أخرى .



الصيغة :

كود:
if (condition1) statement 1; else
    if (condition2) statement 2; else
        if (condition3) statement 3; else
            if (condition4) statement 4;



مثال :
كود:
void main () { int count = 10; int signal = 5; if (count> signal) signal ++; else if (count <signal) signal--; else if (count == signal) signal = 0; }



يمكننا أيضا تنفيذ بلوكات باستخدام الأقواس ({and}) .

مثال :
كود:
void main () { int count = 10; int signal = 5; if (count> signal) { // Use command blocks in if-else-if signal ++; count = 20; } else if (count <signal) { signal--; count = 15; } else if (count == signal) signal = 0; }



بناء جملة if هو الأفضل لاتخاذ قرارات منطقية , وسوف نستخدمه فى العديد من البرامج لاحقا . عبارات if المتداخلة تتطلب مزيدا من الاهتمام .



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

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


ثانيا : عبارة إتخاذ القرار باستخدام عبارة Switch-case
تستخدم عبارة switch-case فى أمرار التحكم إلى فرع محدد من البرنامج بناء على شرط معين .
عبارة Switch "بمعنى التحويل أو التبديل" هو الأوضح والأكثر أناقة لاتخاذ القرار ضمن البرمجة بلغة السى , وخلافا لعبارة if فإن "عبارة switch لا تقبل تعبيرات expression لاتخاذ قرار لكن تقبل فقط الثابت "constant.
الصيغة :



كود:
switch (variable)
{
case constant1:
    Statement 1A;
    Statement 1B;
    Statement 1N;
break;

case constant2:
    Statement 2A;
    Statement 2B;
    Statement 2N;
break;

default;
Statement _default;
}
كود:


فى البداية يتم تقييم المتغير المصاحب لكلمة switch حبث يعتبر نتيجة التقييم هى "شرط تنفيذ الحالة" بعد ذلك تتم المقارنة بين "قيمة المتغير variable الموجود بعبارة "switch مع "جميع قيم الثوابت constantالتى تلى كلمة case" .
إذا وجد تطابق بين المتغير وأحد الثوابت , يتم تنفيذ الأوامر الموجودة بعد نقطتى التنصيص والتى تلى كلمة case الموجود بها هذا الثابت .
إذا لم يتواجد أى ثابت بنفس قيمة المتغير , عندئذ سوف يتم تنفيذ الأوامر المحدد بالجملة الافتراضية default .

مثال :
كود:
void main () { int count = 10; int signal = 5; switch (count) { case 2: signal ++; break; case 1: signal = 2; break; case 10: count--; break; default: signal = 0; } }
فى هذا المثال يتم مقارنة "قيمة المتغير count" مع " الثوابت العددية 2 و 1 و 10 للحالات case" . فعندما تكون قيمة المتغير count بالقيمة 10 , على سبيل المثال , عندئذ فإن الأمر الذى يجب تنفيذه هو count--(تناقص المتغير count بواحد ) والتابع لحالة الثابت المتطابق مع المتغير وهو 10.
تجنبا لتقييم حالات أخرى وخروج التحكم عن نطاق عبارة switch-case فإن كل حالة case تنتهى بكلمة break . كلمة Break مهمتها إنهاء تتابع الأوامر لجمل case . أى بعد تنفيذ الحالة المطابقة يخرج من عبارة switch-case تماما .
عبارة default هى آخر أمر فى تعبير switch-case , ويتم تنفيذه إذا لم توجد أى حالة تطابق على الإطلاق.


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-03-2012, 04:02 AM المشاركة 44   
افتراضي


الدرس السابق فى ملف بصيغة pdf على الرابط :

http://www.eeecb.com/vb/attachment.php?attachmentid=108&d=1332032434


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-03-2012, 06:07 PM المشاركة 45   
افتراضي


عبارات حلقات التكرار Repetition
مقدمة :
الغرض من هذه العبارات هو التكرار لمرة واحدة أو لعدد من المرات لعبارة statement معطاه أو مجموعة من العبارات . يوجد فى لغة السى ثلاثة أنواع أساسية من عبارات التكرار هى :


· for
· While
· Do – While

تستخدم عبارة for أساسا فى التكرار "لعدد محدد من المرات" (أى تكرار محدد) باستخدام "متغير تحكم كعداد" .
تستخدم عبارة while أساسا لتكرار مجموعة من التعليمات طالما أن "شرط" صواب true (أى تكرار مشروط) .
تستخدم عبارة Do – While مثل While ويختلفان فقط فى "وقت تحليل أو اختبار الشرط" .
سوف نتناول كل عبارة تكرار على حدة .


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


1- عبارة for
تستخدم حلقة for عندما نحتاج للتحكم فى دورة حلقة تكرار, حيث يمكن "إعداد عبارتها للبدءinitialization" و "تزايد incrementأو تناقص" متغير التحكم . يتم أولا "تقييم" أو اختبار الشرط conditionفإذا كان صواب true يتم تنفيذ أوامر الحلقة . فى كل دورة تنفذ يتم تزايد أو تناقص قيمة المتغير .

صيغة عبارة for :


كود:

for (initialization; condition; increment) statement;
Or
for (initialization; condition; increment)
{
...
command A1
command A2
...
}
عبارة for الأساسية تبدأ بكلمة for يليها قوسين ( ) (قوس بداية وقوس نهاية) بداخلهما ثلاثة بارامترات يفصل بينهما الفاصلة المنقوطة ";" .
حيث :
initialization : هو تعبير يستخدم لإعداد (تهيئة) متغير التحكم فى الحلقة للبدء .
condition : هو الشرط الذى يحدد استمرار تكرار الحلقة من عدمه , طالما أن هذا الشرط صواب فسوف تستمر الحلقة فى التنفيذ .
increment : هو تزايد بواحد فى قيمة متغير الحلقة مع كل دورة تكرار للحلقة .

بعد قوس النهاية تكتب العبارة أو العبارات المراد تنفيذها فى حالة صحة الشرط condition .
مثال :



كود:
int count;

for (count = 0;count = 10; count ++) PORTB = count;
 


· فى الكود السابق , يتم إعداد متغير عداد الحلقة count للبدء بتحميله (تخصيص) بالقيمة صفر.
· ثم يتم تقييم الشرط count = 10فإن تحقق الشرط يتم تنفيذ أوامر الحلقة PORTB = count.
· بعد تنفيذ جميع أوامر الحلقة يتم تزايد المتغير بقيمة واحد count ++ .
· يتم تكرار الحلقة طالما أن الشرط متحقق .
· آخر حلقة عندما تصبح قيمة متغير عدادا الحلقة بمدخل عبارة ifبالقيمة 10 : count = 10 حيث يتم تنفيذ أوامر الحلقة وفى نهايتها يتزايد متغير عداد الحلقة بواحد أى بالقيمة 11 وهذه القيمة تجعل الشرط غير صواب ويتم الخروج من الحلقة إلى العبارة التالية لها .

مثال آخر :


كود:

int v, d;
 
for (v = 0; v = d; v ++)
{
Command A
Command B
}
 
 
هذ المثال يعمل بالطريقة التالية :
1- تخصيص القيمة صفرللمتغير v = 0 .
2- تقييم الشرط v = d .
3- تنفيذ الأوامر Command Aو Command Bطالما أن الشرط صواب true.
4- تزايد المتغير بواحد v ++.
5- بعد هذا التزايد تتكرر الحلقة ويتم مقارنة القيمة الجديدة مع قيمة المتغير d ويتكررالتتابع بدءا من الخطوة رقم 2 .
6- ينتهى التكرار عندما لا يتحقق الشرط v = d .

الفائدة الرئيسية لحلقة for هى مرونتها , فهى تقبل أى تعبير صالح بلغة السى حتى لو كان هذا التعبير ليس له علاقة مباشرة بالحلقة .
المثال البسيط لتطبيق حلقة for هو إنشاء تأخيرات بزمن صغير small time delays كما يلى :


كود:
 
 
int delay;
for (delay = 0; delay <1000; delay ++);
هذه الحلقة تسبب استمرار عملية التزايد فى المتغير delay بدءا من الصفر وحتى يساوى 1000 .

لاحظ أن كود البرنامج التالى صالح للاستخدام :

كود:
for (n = 0; (n <100) && portb.f0; n ++)
فى المثال السابق يتم تزايد المتغير n 100 مرة طالما أن الطرف RB0 يظل فى الحالة المرتفعة . عندما يتحول الطرف RB0 إلى الحالة المنخفضة تنتهى على الفور الحلقة لعدم تحقق الشرط
(n <100) && portb.f0 (&& العامل المنطقى "و" true&&true>>>true) .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-03-2012, 06:19 PM المشاركة 47   
افتراضي


مثال لبرنامج :
وميض ليدات متصلة بأطراف المنفذ PORTBبالميكروكونترولر PIC .
سوف يقوم البرنامج التالى بالعد حتى 100,000 . لاحتواء هذا العدد يجب أن نستخدم متغير من النوع long ولكننا نفضل المتغير من النوع int حتى نتمكن من فهم تركيب حلقتان متداخلتان. للعد حتى 100,000 من الضرورى أن يكون لدينا متغير يعد حتى 100 وآخر يعد حتى 1000 لأن (1000 * 100 = 100,000) .

كود:
/************************************************ 
برنامج تأخير زمنى باستخدام الحلقات المتداخلة 
إعداد:
Eng.F.Abdelaziz
http://www.eeecb.com/vb/index.php
************************************************/ 
 
void delay (void)                                                        // دالة التأخير 
     {
     int count1, count2;
     for (count1 = 0; count1 <100; count1 ++)          // حلقتان متداخلتان 
         for (count2 = 0;  count2 <1000; count2 ++);
      }

void main () 
{

TRISB = 0;
while (1) {
PORTB =0;
     delay ();                                                          // إستدعاء دالة التأخير 
            PORTB =~ PORTB;                                     // عكس حالة أطراف المنفذ 
delay ();
                 }
}


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

كود:
for ( ; ; ) statement
  • الطريقة الوحيدة لكسر هذه الحلقة والخروج منها يتم عن طريق استخدام عبارة break .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 18-03-2012, 06:22 PM المشاركة 48   
افتراضي


2- عبارة حلقة While
تستخدم عبارة حلقة whileفى التكرار المشروط .

الصيغة العامة :
while (expression) statementيتكرر تنفيذ العبارة statement حتى يصبح الشرط(expression) غير صواب false .يتم اختبار الشرط قبل تنفيذ العبارةstatement. ونتيجة لذلك إذا كان الشرط(expression) غير صواب فى أو مرة فلن يتم تنفيذ الحلقة على الإطلاق. الأقواس المحيطة بالشرط إلزامية .
عبارة حلقة while هى العبارة النموذجية لإنشاء حلقات تكرار لا نهاية فى البرنامج .
فى بداية عبارة while يتم إختبار "صحة الشرط" . إذا كانت النتيجة صواب true , يتم تنفيذ جميع العبارات الموجودة بداخل حلقة while . عند العودة إلى بداية الحلقة يتم اختبار "صحة الشرط" مرة أخرى , فإذا كانت النتيجة صواب true, يتم تنفيذ مجموعة العبارات مرة أخرى , وهكذا حتى تنتهى حلقة while .





مثال :

كود:

void main () {

while (1) //اختبار الشرط (هل مابين القوسين صواب؟ ) , فى هذه الحالة الجواب دائما "صواب" 
}
    statement 1;
    statement 2;
    statement n;
}
}
مثال آخر :
كود:
 void main () {
int a = 25;
while (a = 5)
{
a ++;
PORTB = a;
}
}



لاحظ أنه فى هذا المثال نتيجة شرط حلقة while الموجود عند مدخلها : هل a=5 ؟ ... لا .. لأن a=25 كما هو فى تعريف وتخصيص المتغير a = 25. أى أن النتيجة تكون خطأ false ولن يتم تنفيذ الحلقة حتى يكون الجواب صواب true أى حتى يكون a=5 .



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