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

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

abuhajer06
:: مهندس ::
تاريخ التسجيل: Jul 2007
المشاركات: 42
نشاط [ abuhajer06 ]
قوة السمعة:0
قديم 06-11-2009, 11:06 AM المشاركة 1   
attension حلول المسائل الورادة بالدرس الخامس - دورة الأستاذ/ أحمد س. ف - وفقه الله Twitter FaceBook Google+



هذا الدرس يحتوي على تسع تجارب مختلفة .. وأحب أن أخبركم أن هذا الدرس يحتوي على نوعية مختلفة من الشرح فقد ارتقينا من مستوى المبتدئين لمستوى أعلى .. ففي هذا الدرس تم نقاش الكود بطريقة مختلفة تنشط العقل أكثر وأكثر (خصوصا التجربة رقم 12).. فالهدف من هذا الدرس الفهم الأقوى لما ينفذه البك خطوة خطوة .. وكيف يمكننا التعديل في ترتيب الأوامر ..
أيضا في هذا الدرس تم استخدام عنصر إلكتروني جديد ::
ففي الدروس السابقة استخدمنا الليدات led والسويتشات push button أما في هذا الدرس فسنستخدم عناصر إضافية وهي السفن سيجمنت ومفكك الترميز 7447 وتم استخدام السفن سيجمنت بطريقة معينة .. وفي دروس قادمة سيكون هناك تفصيل أكثر وأكثر ,, بالإضافة إلى العديد من الطرق والأوامر البرمجية وسأشير بإذن الله إلى كيفية استخدام أكثر من سفن سيجمنت بالعديد من الطرق وسأشرحها بتفصيل أكثر إن شاء الله ..
السؤال الأول :: لدينا أربع ليدات موصلين بالبك عن طريق B0,B1,B2,B3 المطلوب عمل عداد يقوم بالعد من صفر إلى 15 ثم يقوم بتكرار ذلك العد مرة أخرى من صفر إلى 15 وهكذا باستمرار ...( طبعا العد سيكون بالثنائي لأنه عن طريق الليدات ) .
الحل
كود:
void main() { char x; trisb=0; lop: portb=0; delay_ms(500); for(x=0;x<15;x++) { portb++; delay_ms(500); } goto lop; }
حل آخر
كود:
void main() { trisb=0; portb=0; while(1) { for(portb=0;portb<=15;portb++) delay_ms(500); } }
السؤال الثاني :: لدينا أربع ليدات موصلين بالبك عن طريق B0,B1,B2,B3 المطلوب عمل عداد يقوم بالعد من 15 إلى صفر ثم يعود مرة أخرى إلى 15 ويعد تنازلياً إلى أن يصل للصفر وهكذا باستمرار ..

الحل1

كود:
void main() { char x; trisb=0; while(1) { portb=15; delay_ms(500); for(x=0;x<15;x++) { portb--; delay_ms(500); } } }
حل آخر
كود:
void main() { trisb=0; portb=0; while(1) { for(portb=15;portb>=0;portb--) delay_ms(500); } }
السؤال الثالث :: لدينا خمس ليدات موصلين بالبك عن طريق B0,B1,B2,B3,B4 المطلوب عمل عداد يقوم بالعد من 10 إلى 31 ثم يبدأ العد من جديد من 10 إلى 31 وهكذا باستمرار ..

الحل

كود:
void main() { trisb=0; portb=0; while(1) { for(portb=10;portb<=31;portb++) delay_ms(500); } }
السؤال الرابع :: لدينا أربع ليدات موصلين بالبك عن طريق B0,B1,B2,B3 المطلوب هنا عمل عداد يقوم بالعد من 0 إلى 15 وعند وصول العداد إلى الرقم 15 يقوم بالعد تنازليا 15 ثم 14 ثم 13 ثم .. وهكذا إلى أن يصل إلى الصفر . وعند وصوله للصفر يبدأ بالعد تصاعديا من جديد إلى أن يصل إلى 15 .. وبالطبع عند وصوله لـ 15 يبدأ بالعد التنازلي إلى أن يصل للصفر .. وهكذا باستمرار .

الحل

كود:
void main() { char x; trisb=0; lop: portb=0; delay_ms(500); for(x=0;x<15;x++) { portb++; delay_ms(500); } for(x=0;x<14;x++) { portb--; delay_ms(500); } goto lop; }


التعديل الأخير تم بواسطة : abuhajer06 بتاريخ 06-11-2009 الساعة 11:11 AM
اعلانات

abuhajer06
:: مهندس ::
تاريخ التسجيل: Jul 2007
المشاركات: 42
نشاط [ abuhajer06 ]
قوة السمعة:0
قديم 06-11-2009, 11:14 AM المشاركة 2   
افتراضي


السؤال الخامس :: قم بعمل عداد باستخدام سفن سيجمنت واحدة أول ما يبدأ البرنامج يظهر الرقم صفر على السفن سيجمنت. و عند الضغط على السويتش الموصل بـ A0 يقوم البك بزيادة الرقم الموجود على السفن سيجمنت وطبعا هذا العداد يمكنه العد من صفر إلى تسعة فقط . وعند الضغط على السويتش الموصل بـ A1 يقوم البك بتنقيص العدد الظاهر على السفن سيجمنت . ( إلى الآن هذا يشبه التجربة رقم 16 ) الجديد هنا هو أنه عند الضغط على السويتش الموصل بـ A2 يقوم البك بإظهار الرقم 5 على السفن سيجمنت وبالتالي لو ضغطنا على هذا السويتش ثم ضغطنا على السويتش الموصل بـ A0 سيظهر الرقم 6 . لأن السويتش A0 يزيد الرقم الحالي .
الحل
كود:
void main() { trisa=0xff; trisb=0x00; portb=0x00; while(1) { if(porta.f2==0x00) portb=0x05; if(porta.f0==0) { portb++; if(portb==10) portb=0; delay_ms(500); } if(porta.f1==0) { portb--; if(portb==255) portb=9; delay_ms(500); } } }
السؤال السادس(سؤال قوي نوعا ما):: باستخدام السفن سيجمنت و مفتاحين قم بعمل البرنامج الذي يؤدي الوظيفة التالية : يقوم البرنامج بالعد تلقائيا من 9 إلى صفر عند تشغيله مباشرة وعند الضغط على السويتش الموصل بـ a0 مرة واحدة فقط يقوم البرنامج بالعد تصاعديا من صفر إلى 9 وعند الضغط على السويتش الموصل بـ a1 مرة واحدة فقط يقوم البرنامج بالعد تنازليا من 9 إلى صفر وهكذا باستمرار ...
السؤال بعبارات أخرى البرنامج يقوم بالعد من 9 إلى صفر تلقائيا بمجرد تشغيله ثم يكرر هذا باستمرار إلى أن يتم الضغط على المفتاح الموصل بـ a0 مرة واحدة فقط حينها يعكس طريقة العد فيقوم بالعد من 0 إلى 9 باستمرار (ودون الحاجة للضغط على السويتش كل مرة ) ولكن إذا تم الضغط من على المفتاح الموصل بـa1 مرة واحدة فقط سيقوم بالعد من 9 إلى صفر باستمرار .

الحل

كود:
void main() { trisa=0xff; trisb=0x00; while(1) { a1: portb=0x09; delay_ms(500); portb-=1; if(porta.f0==0) goto a2; if(portb==255) portb=9; } a2: portb=0; delay_ms(500); while(1) { portb+=1; if(portb==10) portb=0; delay_ms(500); if(porta.f1==0) goto a1; } }
السؤال السابع (سؤال قوي نوعا ما ):: قم بعمل نفس البرنامج السابق ولكن بتعديل بسيط وهو أنه عند الضغط على المفتاح الموصل بـ a0 يقوم البك بزيادة نفس الرقم الظاهر على السفن سيجمنت فلو كان الرقم الظاهر هو 5 وقبل أن يصبح أربعة تم الضغط على المفتاح a0 مرة واحدة فقط سيقوم البك بإظهار الرقم 6 ثم ينتظر نصف ثانية ثم يظهر الرقم 7 تلقائيا دون ضغطة أخرى ثم ينتظر ثم يظهر الرقم ثمانية وهكذا .. ولو كان الرقم الظاهر 8 ثم تم الضغط على المفتاح الموصل بـ a1 ضغطة واحدة سيقوم البك عندها بجعل الرقم الظاهر 7 ثم ينتظر نصف ثانية وتلقائيا دون ضغطة أخرى يجعله 6 .. وهكذا ...

الحل

كود:
void main() { trisa=0xff; trisb=0x00; while(1) { a1: portb=9; delay_ms(500); portb-=1; if(porta.f0==0) goto a2; if(portb==255) } a2: while(1) { portb+=1; if(portb==10) portb=0; delay_ms(500); if(porta.f1==0) goto a1; } }

السؤال الثامن (سؤال قوي نوعاً ما ) : باستخدام السفن سيجمنت و مفتاحين قم بعمل البرنامج الذي يؤدي الوظيفة التالية : في بداية البرنامج يظهر الرقم صفر فقط ولا يحدث أي تغير إلا عند الضغط على السويتش الموصل بـA0 ضغطة واحدة عندها يقوم البك بزيادة الرقم ويجعله واحد وبعد نصف ثانية يقوم تلقائيا دون الضغط على السويتش مرة أخرى بزيادة هذا الرقم ويجعله اثنين ثم ينتظر نصف ثانية ويجعله ثلاثة وهكذا .. ولكن في أثناء ذلك إذا تم الضغط على السويتش الموصل بـ A1 ضغطة واحدة يقوم البك بوقف هذا العداد بمعنى لو أن العداد وصل مثلا إلى الرقم ثلاثة وقبل أن يصل للرقم أربعة تم الضغط على السويتش الموصل بـ A1 سيقوم البك بوقف هذا العداد وسيظل الرقم ثلاثة ظاهر على السفن سيجمنت وفي حالة تم الضغط مرة أخرى على المفتاح الموصل بـ A0 سيقوم البك بزيادة الرقم الموجود حاليا على السفن سيجمنت ( 3 مثلا ) فيجعله 4 ثم ينتظر نصف ثانية ودون أن نضغط مرة أخرى على المفتاح يجعله 5 .. وهكذا إلى أن يتم الضغط على المفتاح A1 فيتوقف هذا العداد . . وهكذا

الحل

كود:
void main() { trisa=0xff; trisb=0x00; portb=0x00; while(porta.f0==0) while(1) { delay_ms(500); if(porta.f1==0) goto a2; a1: portb+=1; if(portb==10) portb=0; } a2: while(1) { if(porta.f0==0) goto a1; } }


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

abuhajer06
:: مهندس ::
تاريخ التسجيل: Jul 2007
المشاركات: 42
نشاط [ abuhajer06 ]
قوة السمعة:0
قديم 06-11-2009, 11:21 AM المشاركة 3   
افتراضي


السؤال التاسع :: قم بعمل برنامج يقوم بإظهار الرقم 0 على السفن سيجمنت وعند الضغط على المفتاح الموصل بـ a0 يقوم بجمع واحد على الرقم السابق فبالتالي لو كان الرقم الظاهر صفر سيجعله واحد ولو كان الرقم الظاهر 5 سيجعله 6 وهكذا ( معنى هذا أن كل ضغطة على المفتاح (السويتش) يتم زيادة الرقم ). وعند الضغط على المفتاح الموصل بـ a1 سيقوم بجمع 2 على الرقم السابق فلو كان الرقم الظاهر على السفن سيجمنت 2 سيجعله 4 ولو كان أربعة سيجعله 6 . وهكذا .
الحل
كود:
void main() { trisa=0xff; trisb=0x00; portb=0x00; while(1) { if(porta.f0==0) { portb+=1; if(portb==10) portb=0; delay_ms(500); } if(porta.f1==0) { portb+=2; if(portb>=10) portb=0; delay_ms(500); } } }
السؤال العاشر :: قم بعمل نفس البرنامج السابق ولكن بطريقة عكسية فعند الضغط على المفتاح الموصل بـ a0 يقوم البك بطرح واحد من العدد السابق .. وعند الضغط على المفتاح الموصل بـ a1 يقوم البك بطرح اثنين من العدد السابق .


الحل


كود:
void main() { trisa=0xff; trisb=0x00; portb=0x00; while(1) { if(porta.f0==0) { portb-=1; if(portb==255) portb=9; delay_ms(500); } if(porta.f1==0) { portb-=2; if(portb==255) portb=9; if(portb==254) portb=8; delay_ms(500); } } }
السؤال الحادي عشر :: نريد أن نقوم بعمل برنامج تعليمي يقوم بتعليم الأرقام الثنائيةومقابلها بالنظام العشري وتم ما يلي : قمنا بتوصيل 4 ليدات موصلة بـ a1 , a0 , a2 ,a3 وقمنا بتوصيل سفن سيجمنت بـ portb . المطلوب هو عمل برنامج يقوم بالعد من صفر إلى تسعة بالنظامين في نفس الوقت بمعنى أن الرقم الذي سيظهر على الليدات بالنظام الثنائي هو نفس الرقم الذي سيظهر على السفن سيجمنت ولكن بالنظام العشري . فمثلا عن ظهور الرقم 5 على السفن سيجمنت في نفس الوقت سيظهر الرقم 0101 على الليدات ثم بعد ثانية يظهر الرقم 6 على السفن سيجمنت ويظهر في نفس الوقت الرقم 0110 على الليدات وهكذا باستمرار إلى أن يصل العداد للرقم تسعة ثم يبدأ العداد من صفر من جديد .


الحل


كود:
void main() { trisa=0x00; trisb=0x00; portb=porta=0x00; while(1) { delay_ms(500); porta+=1;
if(porta==10) porta=0; portb+=1;
if(portb==10) portb=0; } }
السؤال الثاني عشر :: لنقوم بعملية تطوير للبرنامج التعليمي السابق سنجعل الرقم الذي يبدأ به البرنامج هو صفر (صفر على الليدات وصفر على السفن سيجمنت) وعند الضغط على السويتش الموصل بـ لB6 سيتم تزويد هذا الرقم وجعله واحد أي أن كل ضغطة على هذا السويتش سيتم فيها زيادة الرقم . ويوجد أيضا مفتاح موصل بـ B7 كل ضغطة عليه يقوم بتنقيص هذا العدد .

الحل


كود:
void main()
{ trisa=0x00; trisb=0xc0; porta=portb=0; while(1) { if(portb.f6==0) { delay_ms(500); porta=portb+=1; if(porta==10) portb=porta=0; } if(portb.f7==0) { delay_ms(500); porta=portb-=1; if(portb==255) portb=porta=9; } } }


========================================
وفقنا الله جميعا لما يحب ويرضى ورزقنا وإياكم العلم النافع والعمل الصالح
والسلام عليكم ورحمة الله وبركاته
========================================
رحم الله امرءٍ أهدى إليَّ عيوبي




التعديل الأخير تم بواسطة : abuhajer06 بتاريخ 06-11-2009 الساعة 11:27 AM
إضافة رد

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

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

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


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

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