Navigation

مشروع اشارات المرورباستخدام pic 16f84a

إنشاء اشارت مرور لاربعة تقاطعات الاشارات الاساسية فقط من دون التفرعات والعدادات فقط ثلاثة اشارات لكل مسار الاخضر والاصفر والاحمر استخدام المتحكم لاعطاء خرج خمسة فولت بازمان محددة نحددها نحن في البرنامج وخرج المتحكم هذا سوف نستخدمه لتشغيل اللدات التي تمثل الاشارات المختلفة لكل مسار

مشروع اشارات المرورباستخدام pic 16f84a

فكرة المشروع 
إنشاء اشارت مرور لاربعة تقاطعات الاشارات الاساسية فقط من دون التفرعات والعدادات فقط ثلاثة اشارات لكل مسار الاخضر والاصفر والاحمر
استخدام المتحكم لاعطاء خرج خمسة فولت بازمان محددة نحددها نحن في البرنامج وخرج المتحكم هذا سوف نستخدمه لتشغيل اللدات التي تمثل الاشارات المختلفة لكل مسار 

مبدأ عمل المشروع


حسب البرنامج الذي سوف نقوم بكتابته سوف يقوم المتحكم الدقيق باخراج جهد علي اطرافه بالتناوب وبازمان محددة في البرنامج تمثل هذه الازمان وقت اغلاق وفتح كل اشارة والوقت الذي سوف تظل فيه كل اشارة مضيئة 
فسوف يضئ المسار الاول الاشارة الخضراء بينما بقية المسارات تكون باللون الاحمر وعند انتهاء الزمن المحدد للاشارة الخضراء للمسار الاول يتم اطفاء الاشارة الخضراء لهذا المسار واضاءة الاشارة الصفراء لوقت قصير نحدده نحن ثانية او ثانيتين او كما نريد وتظل بقية الاشارات حمراء ثم بعد ذلك يتم اطفاء الاشارة الصفراء للمسار الاول واضاء الاشارة الحمراء لهذا المسار وفي نفس الوقت يتم اضاءة الاشارة الصفراء للمسار الثاني استعداداً لاضاءة الاشارة الخضراء وبقية الاشارات تظل حمراء
ثم بعد ذلك يتم اضاءة الاشارة الخضراء للمسار الثاني وتظل بقية الاشارات حمراء للوقت المحدد في البرنامج ثم بعد انتهاء الوقت المحدد يتم اطفاء الاشارة الخضراء للمسار الثاني ثم اضاءة الاشارة الصفراء للمسار الثاني لوقت قصير ثم اطفاء الاشارة الصفراء للمسار الثاني ثم اضاءة الاشارة الحمراء للمسار الثاني وفي نفس الوقت اضاءة الاشارة الصفراء للمسار الثالث استعداداً للتحرك لوقت قصير ثم اطفاء الاشارة الصفراء للمسار الثالث واضاءة الاشارة الخضراء للمسار الثالث وبقية الاشارات تظل حمراء
وهكذا لكل المسارات حتي يتم الانتهاء من المسار الرابع والاخير واعادة نفس الاوامر الي مالانهاية او حتي اعادة تشغيل البرنامج او المتحكم الدقيق

العناصر المستخدمة في المشروع 

المتحكم الدقيق  PIC16F877A

لدات LED   بثلاثة الوان احمر  اصفر  اخضر

مقاومات لحماية اللدات  220 اوم


مخطط الدائرة






كما نلاحظ من الدائرة فانه تم استخدام المتحكم الدقيق pic16f877A  بالاضافة الي لدات تمثل الاشارات المختلفة وتم استخدام مقاومات بين المتحكم الدقيق واللدات لحماية اللدات من الاحتراق لان المتحكم يعطي 5 فولت بينما اللدات تحتاج الي ثلاثة فولت فقط في البروتوس يمكن الاستغناء عن هذه المقاومات اما في التنفيذ العملي فلا يمكن الاستغناء عنها الا اذا كانت اللدات تعمل بجهد قدره 5 فولت او اكثر
قمنا باختيار مقاومات قدرها 220 فولت وطريقة حساب المقاومات تم التطرق لها سابقاً في موضوعين 
في هذا المشروع  http://goo.gl/MU3RZx  ابحث عن الفقرة التي تتحدث عن 

طريقة حساب المقاومات لحماية العناصر الالكترونية المختلفة

وفي هذا الموضوع ايضاً    http://goo.gl/td4zmx  

تم توصيل اللدات مع المتحكم حسب الترتيب التالي 

المسار الاول 
الاحمر في الطرف رقم 1 من بورت B
الاصفر في الطرف رقم 2 من بورت B
الاخضر في الطرف رقم 3 من بورت B

المسار الثاني 
 الاحمر في الطرف رقم 6 من بورت B
الاصفر في الطرف رقم 7 من بورت B
الاخضر في الطرف رقم 8 من بورت B

المسار الثالث
الاحمر في الطرف رقم 6 من بورت B
الاصفر في الطرف رقم 7 من بورت B
الاخضر في الطرف رقم 8 من بورت B

المسار الرابع 
الاحمر في الطرف رقم 1 من بورت B
الاصفر في الطرف رقم 2 من بورت B
الاخضر في الطرف رقم 3 من بورت B


الان فلننتقل الي جزء المتعة وهو جزء البرمجة 

قلنا دائماً قبل كتابة اي برنامج يستحسن كتابة خطة البرنامج وخطتنا لهذا البرنامج بسيطة الي حد ما نريد من المتحكم ان يخرج 5 فولت في ارجل معينة موصول معها لدات محدده لمدة محددة ثم يقوم باخراج 5 فولت في ارجل اخري ثم 5 فولت في ارجل اخري وهكذا والبرنامج سوف يكون كالاتي

المسار الاول اخضر بقية المسارات احمر
انتظر لمدة 7 ثواني
المسار الاول اصفر بقية المسارات احمر 
انتظر لمدة 1 ثانية 
المسار الاول احمر و المسار الثاني اصفر وبقية المسارات احمر 
انتظر لمدة 1 ثانية
المسار الثاني اخضر بقية المسارات احمر
انتظر لمدة 7 ثواني
المسار الثاني اصفر بقية المسارات احمر 
انتظر لمدة 1 ثانية 
المسار الثاني احمر و المسار الثالث اصفر وبقية المسارات احمر
انتظر لمدة 1 ثانية
المسار الثالث اخضر بقية المسارات احمر
انتظر لمدة 7 ثواني 
المسار الثالث اصفر بقية المسارات احمر
انتظر لمدة 1 ثانية 
المسار الثالث احمر و المسار الرابع اصفر و بقية المسارات احمر
انتظر لمدة 1 ثانية
المسار الرابع اخضر بقية المسارات احمر 
انتظر لمدة 7 ثواني 
المسار الرابع اصفر بقية المسارات احمر
انتظر لمدة 1 ثانية
المسار الرابع احمر المسار الاول اصفر وبقية المسارات احمر
انتظر لمدة 1 ثانية 

ارجع لاعادة الاوامر السابقة  وهكذا الي مالانهاية او اعادة تشغيل المتحكم الدقيق

عندما نقول تشغيل اللد الاحمر او اطفاءه او غيره من اللدات نقصد به اخراج خمسة فولت علي الطرف الموصول بها هذا اللد للتشغيل او اخراج صفر فولت للاطفاء

الان الي البرنامج سوف اقوم بكتابة البرنامج ثم اقوم بشرحه خطوة خطوة


void main()
 {
trisb = 0b00000000;
trisd = 0b00000000;

portb = 0b00000000;
portd = 0b00000000;
for(;;)
{
portb = 0b00100100;
portd = 0b00100001;

delay_ms(7000);

portb = 0b00100010;
portd = 0b00100001;

delay_ms(1000);

portb = 0b01000001;
portd = 0b00100001;

delay_ms(1000);

portb = 0b10000001;
portd = 0b00100001;

delay_ms(7000);

portb = 0b01000001;
portd = 0b00100001;

delay_ms(1000);

portb = 0b00100000;
portd = 0b01000001;

delay_ms(1000);

portb = 0b00100001;
portd = 0b10000001;

delay_ms(7000) ;

portb = 0b00100001;
portd = 0b01000001;

delay_ms(1000);

portb = 0b00100001;
portd = 0b00100010;

delay_ms(1000);

portb = 0b00100001;
portd = 0b00100100;

delay_ms(7000);

portb = 0b00100001;
portd = 0b00100010;

delay_ms(1000);

portb = 0b00100010;
portd = 0b00100001;
delay_ms(1000);
}
}

الان الي الشرح خطوة خطوة


void main()
 {

استدعاء الدالة الرئيسية مين main ومن دونها لن يعمل البرنامج 
والقوس هو بداية البرنامج ويبدأ تنفيذ البرنامج من بعد هذا القوس

trisb = 0b00000000;
trisd = 0b00000000;
هنا قلنا للبرنامج اجعل بورت B و بورت D كخرج 
اي قمنا بتهيئة  بورت بي وبورت دي لاخراج الجهد عليهما لتشغيل اللدات


portb = 0b00000000;
portd = 0b00000000;

هنا قمنا بجعل اطراف بورت B و بورت D صفر فولت
اي ان كل اللدات مطفاءة عند بداية تشغيل البرنامج وهو اجراء احترازي حتي اذا كان هنالك اي خلل قبل بدأ البرنامج يتم تجاوزه بجعل كل اللدات مطفاءة في بدايةالبرنامج

for(;;)
{

هنا اخبرنا البرنامج بالدخول في حلقة تكرارية مغلقة 
اي ان يقوم بتكرار الاوامر التالية لقوس الحلقة الي مالانهاية او حتي يتم اعادة تشغيل المتحكم الدقيق 
كل الاوامر التي تاتي بعد هذا القوس سوف يتم تكرارها الي عدد غير محدود 
وهذه هي طريقة الاعلان عن حلقة مغلقة باستخدام الفور لوب for

portb = 0b00100100;
portd = 0b00100001;

هنا قمنا باخبار المتحكم ان يقوم باخراج 5 فولت علي الاطراف المحددة بالرقم 1 واخراج صفر فولت علي الاطراف المحددة بالرقم 0 من بورت B  و بورت D
فاي لد موصول مع طرف اخرجنا فيه 5 فولت سوف يضئ  واي لد موصول مع طرف اخرجنا فيه 0 فولت سوف يكون مطفاء
وفي الاوامر السابقة قمنا باخراج 5 فولت علي الاطراف
رقم ثلاثة من بورت B  وموصول معه اللد الاخضر للمسار الاول اي سوف يكون مضاء والطرف رقم 6 من بورت B وموصول معه اللد الاحمر للمسار الثاني اي سوف يكون مضاء والطرف رقم 6 من بورت D وموصول معه اللد الاحمر للمسار الثالث اي سوف يكون مضاء و الطرف رقم 1 من بورت D وموصول معه اللد الاحمر للمسار الرابع اي سوف يكون مضاء

delay_ms(7000);

هنا قلنا للبرنامج بعد ان نفذت الاوامر السابقة انتظر لمدة 7 ثواني لا تفعل فيها شئ اخر
يمكن تغيير هذا الرقم الي الزمن الذي نريد ان تظل فيه الاشارة الخضراء للمسار الاول مضاءة فكل ثانية تعادل 1000 مايكرو ثانية

portb = 0b00100010;
portd = 0b00100001;

هنا ايضا اخبرنا المتحكم بان يقوم باخراج 5 فولت علي الاطراف المحددة بالرقم 1 وان يقوم باخراج 0 فولت علي الاطراف المحددة بالرقم 0 
واللدات الموصولة مع الاطراف المحددة بالرقم 1 سوف تضئ واللدات الموصولة مع الاطراف المحددة بالرقم 0 سوف تكون مطفاءة 
راجع ترقيم الاطراف واللدات الموصوصلة معها التي ذكرتها اعلاه

delay_ms(1000);

هنا اخبرنا البرنامج انه بعد ان يقوم بتنفيذ الاوامر السابقة بان ينتظر لمدة 1 ثانية

portb = 0b01000001;
portd = 0b00100001;
  

هنا ايضا اخبرنا البرنامج بان يقوم باخراج 5 فولت علي الارقام المحددة بالرقم 1 و 0 فولت علي الارقام المحددة بالرقم 0


وهكذا يستمر تنفيذ البرنامج الي اخر امر ثم اعادة هذه الاوامر من جديد
ففي كل مرة نقوم باخراج 5 فولت علي اطراف محددة و 0 فولت علي اطراف اخري ثم ننتظر لمدة محددة ثم تنفيذ الامر التالي 

الان يمكننا ان نكتب البرنامج السابق بطريقة اكثر احترافية باستخدام الدوال بدل اوامر التاخير 
فبدل ان نكتب  (delay_ms(1000   او  (delay_ms(7000 في كل مرة نستطيع ان نكتب دالتين تحتوي كل واحدة منهما علي امر تاخير نقوم باستدعائها عندما نريد كتابة تاخير زمني 
وسوف يصبح شكل البرنامج السابق كالتالي



void delay1()
{
delay_ms(7000);
}
void delay2()
{
delay_ms(1000);
}

void main()
 {
trisb = 0b00000000;
trisd = 0b00000000;

portb = 0b00000000;
portd = 0b00000000;
for(;;)
{
portb = 0b00100100;
portd = 0b00100001;

delay1();

portb = 0b00100010;
portd = 0b00100001;

delay2();

portb = 0b01000001;
portd = 0b00100001;

delay2();

portb = 0b10000001;
portd = 0b00100001;

delay1();

portb = 0b01000001;
portd = 0b00100001;

delay2();

portb = 0b00100000;
portd = 0b01000001;

delay2();

portb = 0b00100001;
portd = 0b10000001;

delay1() ;

portb = 0b00100001;
portd = 0b01000001;

delay2();

portb = 0b00100001;
portd = 0b00100010;

delay2();

portb = 0b00100001;
portd = 0b00100100;

delay1();

portb = 0b00100001;
portd = 0b00100010;

delay2();

portb = 0b00100010;
portd = 0b00100001;
delay2();
}
}


فكما نلاحظ قمنا بانشاء دالتين delay1  و delay2  احداهما تحتوي علي امر تاخر 7 ثواني والاخري تحتوي علي امر تاخير 1 ثانية 
فعندما نريد تاخير بمقدار 7 ثواني فقط نقوم باستدعاء الدالة التي تحتوي علي امر التاخير هذا عن طريق كتابة اسمها فقط بالطريقة الموضحة في البرنامج
وعندما نريد تاخير زمني بمقدار 1 ثانية ايضا نقوم باستدعاء الدالة التي تحتوي علي امرالتاخير هذا عن طريق ذكر اسمها فقط بالطريقة الموضحة في البرنامج اعلاه

تم بحمد الله
واتمنا ان اكون قد وفقت في ايصال فهم المشروع وطريقة عمله

سوف تجدون ملفات المحاكاة والكود لهذا البرنامج علي الرابط التالي

مشاركة

أضف تعليق:

0 comments: