مشروع عداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447-
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: برمجة الميكروكونترولر PIC بلغة السى مع المترجم CCS - C
صفحة 1 من اصل 1
مشروع عداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447-
مشروع عداد تصاعدى 0-99 يستخدم CCS-C-Counter-PIC-EEPROM-Interrupt-7 Segment-7447-
الغرض :
أنشاء عداد تصاعدى فى المدى “0-99” ، مع تذكر آخر رقم فى حالة انقطاع التيار الكهربائى ، والذى غالبا ما يتواجد فى كثير من المنشآت التى تقدم خدمات للجمهور مثل البنوك وأماكن انتظار الدور .
الدائرة الكهربية :
عندما نستخدم أكثر من وحدة عرض 7 Segment ، ونرغب فى تقليل عدد أطراف الميكروكونترولر المستخدمة للتحكم فيها ، هناك طرق عديدة ، أحد هذه الطرق ، والتى سوف نستخدمها هنا ، هى استخدام ديكودر (فك شفرة) من BCD إلى
7 Segment من نوع 7447 الذى يعمل مع السفن سيجمنت من نوع الأنود المشترك .
البرنامج :
نتائج المحاكاة ببرنامج Proteus :
الغرض :
أنشاء عداد تصاعدى فى المدى “0-99” ، مع تذكر آخر رقم فى حالة انقطاع التيار الكهربائى ، والذى غالبا ما يتواجد فى كثير من المنشآت التى تقدم خدمات للجمهور مثل البنوك وأماكن انتظار الدور .
الدائرة الكهربية :
عندما نستخدم أكثر من وحدة عرض 7 Segment ، ونرغب فى تقليل عدد أطراف الميكروكونترولر المستخدمة للتحكم فيها ، هناك طرق عديدة ، أحد هذه الطرق ، والتى سوف نستخدمها هنا ، هى استخدام ديكودر (فك شفرة) من BCD إلى
7 Segment من نوع 7447 الذى يعمل مع السفن سيجمنت من نوع الأنود المشترك .
البرنامج :
- الكود:
/*-----------------------------------------------------------*\
| Use EEPROM |
\*-----------------------------------------------------------*/
#include <16F877.h>
#use delay(clock=4000000)
#int_EXT
void EXT_isr( void )
{
if ((read_eeprom(0)==0x99)||(read_eeprom(0)==0xFF))
{
write_eeprom(0,0);
output_d(read_eeprom(0));
}
else if ((read_eeprom(0) & 0x0F)<0x09)
{
write_eeprom(0,(read_eeprom(0))+1);
output_d(read_eeprom(0));
}
else if ((read_eeprom(0) & 0x0F)>=0x09)
{
write_eeprom(0,(read_eeprom(0))+7);
output_d(read_eeprom(0));
}
}
void main()
{
set_tris_b(0xFF);
set_tris_d(0x00);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT);
output_d(0xFF);
//write_eeprom(0,0xFF);//reset EEPROM
while(true)
{
//rest of program
}
}
نتائج المحاكاة ببرنامج Proteus :
شرح المشروع :
شرح المشروع :
1- هذا المشروع فى الأساس هو عداد تصاعدى من صفر إلى 99 ، والذى يتزايد بواحد فى كل مرة يتم فيها الضغط على الزر الضاغط المسمى "العداد" counter .
2- لمنع قيمة العداد من الإعادة reset والبداية من الصفر من جديد فى كل مرة ينقطع فيها التيار الكهربائى ، يتم تخزين القيمة الحالية للعداد فى ذاكرة EEPROM الداخلية للميكروكونترولر بدلا من التخزين فى ذاكرة RAM . نظرا لأننا نريد حفظ مجرد قيمة بين 0 و 99 فيكفى استخدام البايت الأول من ذاكرة EEPROM فقط .
3- لكشف حالة الضغط على المفتاح ، تستخدم المقاطعة الخارجية على الطرف RB0/INT . فعند الضغط على زر العد المتصل بالطرف RB0 ، تحدث المقاطعة ويتم تنفيذ دالة خدمة المقاطعة والتى تحتوى على 3 عبارات شرط
if / else if / else if :
أ- عبارة الشرط الأولى “if” :
فى البداية تكون قيمة محتويات بتات ذاكرة EEPROM هى “FF” ( قيمة المصنع) ، لذلك ينبغى علينا أن نجعل قيمتها بصفر لبداية العد ، وكذلك (أو || ) عند وصول العداد إلى أقصى قيمة له وهى 99 يتم تصفير قيمة العداد ، عند التشغيل بعد ذلك فإن الشرط الثانى فقط هو الذى يتم تحقيقة . ملخص هذه العبارة هو تنفيذ عملية إعادة reset لتصفير محتويات الموقع الأول من الذاكرة عند تحقق أى من الشرطين .
ب- عبارة الشرط الثانية “else if” :
كل نبل “nibble” (أربع بتات) من المنفذ portD يتم توصيله إلى ديكودر ، كما هو فى الشكل أعلاه ، الأطراف RD0-RD3 (النبل السفلى) متصلة بالديكودر الأول والمتصل بوحدة عرض خانة الآحاد ، والأطراف RD4-RD7 (النبل العلوى) متصلة بالديكودر الثانى والمتصل بوحدة عرض العشرات .
حسنا ، إذا كان لدينا 4 بت تشكل النبل فإنه يكون لدينا 16 توليفة ممكنة ، ونحن نقوم بتزايد القيمة فى ذاكرة EEPROM بواحد ، وأن جميع القيم لن تتعدى القيمة 9 (أى تكون أقل من 9 ، كل خانة تعرض الأرقام من 0 إلى 9 ) . ونظرا لأن دالة الكتابة إلى الذاكرة EEPROM تسمح لنا باستخدام دالة القراءة كبارامتر ، لذلك فليس هناك حاجة لإعلان متغير محلى لنقل البيانات . الخلاصة تزايد محتويات الموقع الأول بذاطرة EEPROM بواحد كلما حدثت المقاطعة الخارجية .
ت- عبارة الشرط الثالثة : بمجرد أن تتجاوز ( أكبر من أو تساوى ) القيمة المخزنة فى النبل الأدنى لبيانات الموقع الأول لذاكرة EEPROM القيمة “9” وهى أكبر قيمة نريدها ، يتم إجراء قراءة جديدة وتخصيص قيمتها إلى المنفذ PORTD :
1- هذا المشروع فى الأساس هو عداد تصاعدى من صفر إلى 99 ، والذى يتزايد بواحد فى كل مرة يتم فيها الضغط على الزر الضاغط المسمى "العداد" counter .
2- لمنع قيمة العداد من الإعادة reset والبداية من الصفر من جديد فى كل مرة ينقطع فيها التيار الكهربائى ، يتم تخزين القيمة الحالية للعداد فى ذاكرة EEPROM الداخلية للميكروكونترولر بدلا من التخزين فى ذاكرة RAM . نظرا لأننا نريد حفظ مجرد قيمة بين 0 و 99 فيكفى استخدام البايت الأول من ذاكرة EEPROM فقط .
3- لكشف حالة الضغط على المفتاح ، تستخدم المقاطعة الخارجية على الطرف RB0/INT . فعند الضغط على زر العد المتصل بالطرف RB0 ، تحدث المقاطعة ويتم تنفيذ دالة خدمة المقاطعة والتى تحتوى على 3 عبارات شرط
if / else if / else if :
أ- عبارة الشرط الأولى “if” :
- الكود:
if ((read_eeprom(0)==0x99)||(read_eeprom(0)==0xFF))
{
write_eeprom(0,0);
output_d(read_eeprom(0));
}
فى البداية تكون قيمة محتويات بتات ذاكرة EEPROM هى “FF” ( قيمة المصنع) ، لذلك ينبغى علينا أن نجعل قيمتها بصفر لبداية العد ، وكذلك (أو || ) عند وصول العداد إلى أقصى قيمة له وهى 99 يتم تصفير قيمة العداد ، عند التشغيل بعد ذلك فإن الشرط الثانى فقط هو الذى يتم تحقيقة . ملخص هذه العبارة هو تنفيذ عملية إعادة reset لتصفير محتويات الموقع الأول من الذاكرة عند تحقق أى من الشرطين .
ب- عبارة الشرط الثانية “else if” :
- الكود:
else if ((read_eeprom(0) & 0x0F)<0x09) // & for select lower nibble only (mask)
{
write_eeprom(0,(read_eeprom(0))+1); // Increment by 1
output_d(read_eeprom(0));
}
كل نبل “nibble” (أربع بتات) من المنفذ portD يتم توصيله إلى ديكودر ، كما هو فى الشكل أعلاه ، الأطراف RD0-RD3 (النبل السفلى) متصلة بالديكودر الأول والمتصل بوحدة عرض خانة الآحاد ، والأطراف RD4-RD7 (النبل العلوى) متصلة بالديكودر الثانى والمتصل بوحدة عرض العشرات .
حسنا ، إذا كان لدينا 4 بت تشكل النبل فإنه يكون لدينا 16 توليفة ممكنة ، ونحن نقوم بتزايد القيمة فى ذاكرة EEPROM بواحد ، وأن جميع القيم لن تتعدى القيمة 9 (أى تكون أقل من 9 ، كل خانة تعرض الأرقام من 0 إلى 9 ) . ونظرا لأن دالة الكتابة إلى الذاكرة EEPROM تسمح لنا باستخدام دالة القراءة كبارامتر ، لذلك فليس هناك حاجة لإعلان متغير محلى لنقل البيانات . الخلاصة تزايد محتويات الموقع الأول بذاطرة EEPROM بواحد كلما حدثت المقاطعة الخارجية .
ت- عبارة الشرط الثالثة : بمجرد أن تتجاوز ( أكبر من أو تساوى ) القيمة المخزنة فى النبل الأدنى لبيانات الموقع الأول لذاكرة EEPROM القيمة “9” وهى أكبر قيمة نريدها ، يتم إجراء قراءة جديدة وتخصيص قيمتها إلى المنفذ PORTD :
- الكود:
else if ((read_eeprom(0) & 0x0F)>=0x09) // mask for lower nibble
{
write_eeprom(0,(read_eeprom(0))+7);
output_d(read_eeprom(0));
}
مواضيع مماثلة
» مثال على المقاطعة الخارجية External interrupt : عداد تصاعدى
» 5- حساس للضوء باستخدام ترانزستور و6- -حساس ضوء بالستخدام ترانزستور دارلنجتون
» التدريب الرابع : إنشاء عداد تصاعدى تنازلى من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع الدائرة المتكاملة 7448 وبدون استخدام ترانزستورات ومع المترجم CCS C .
» التدريب رقم 3 : إنشاء عداد ثنائى تصاعدى 3 بت :
» مشروع قفل إلكترونى بسيط باستخدام ذاكرة EEPROM بالميكروكونترولر ولوحة مفاتيح وشاشة LCD :
» 5- حساس للضوء باستخدام ترانزستور و6- -حساس ضوء بالستخدام ترانزستور دارلنجتون
» التدريب الرابع : إنشاء عداد تصاعدى تنازلى من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع الدائرة المتكاملة 7448 وبدون استخدام ترانزستورات ومع المترجم CCS C .
» التدريب رقم 3 : إنشاء عداد ثنائى تصاعدى 3 بت :
» مشروع قفل إلكترونى بسيط باستخدام ذاكرة EEPROM بالميكروكونترولر ولوحة مفاتيح وشاشة LCD :
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: برمجة الميكروكونترولر PIC بلغة السى مع المترجم CCS - C
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى