- إعدادات الميكروكونترولر : جميع أطراف المنفذ PORTB كمخارج . وجميع أطراف المنفذ PORTA كمخارج فيما عدا مدخل النبضات RA4 ومدخل الإعادة MCLR = RA5 .
TRISB = 0b00000000; // Set PORTB direction to be output
TRISA = 0b00110000; // Set PORTA direction to be output
PORTB = 0x00; // Turn OFF LEDs on PORTB
- فصل المقارنات لجعل جميع الأطراف كمداخل / مخارج رقمية
CMCON = 7 ; // Disable comparators
- تصفير المتغير الذى يحتوى على قيمة RPM .
RPM = 0; // Initial Value of Counter
- إعداد السجل OPTION_REG لجعل موديول المؤقت Timer0 يعمل فى نظام العداد للنبضات الخارجية وبدون معامل قسمة .
OPTION_REG = 0b00111000; // TOCS=1 for Counter mode, PSA=1 for 1:1
- فى البداية تكون إشارة المرسل مفصولة .
IR_Tx = 0; // Turn OFF IR
- الدخول إلى الحلقة الغير منتهية do{……}while(1) وفيها :
do {
# استخلاص قيمة خانة الآحاد DD0 بإيجاد باقى خارج قسمة محتويات المتغير RPM على 10 ثم تحويله إلى الكود المقنع لوحدة الليدات السبعة باستدعاء الدالة mask وتخصيص المتغير DD0 كبارامتر لها .
DD0 = RPM%10;
DD0 = mask(DD0);
# استخلاص قيمة خانة العشرات DD1 بقسمة RPM على 10 أولا ثم إيجاد باقى خارج قسمة محتويات المتغير RPM على 10 ثم تحويله إلى الكود المقنع لوحدة الليدات السبعة باستدعاء الدالة mask وتخصيص المتغير DD1 كبارامتر لها .
DD1 = (RPM/10)%10;
DD1 = mask(DD1);
# تكرار ماسبق لخانة المئات وخانة الآلاف
DD2 = (RPM/100)%10;
DD2 = mask(DD2);
DD3 = (RPM/1000);
DD3 = mask(DD3);
- الآن جاء برمجة انتخاب وحدات العرض وحدة تلو الأخرى وفى البداية نستخدم حلقة تعبير for لتكرارهذه العملية 100 مرة حيث يتم البدء بجعل متغير الحلقة i =0 ثم تقييم الشرط i<=100 فإن تحقق يتم زيادة المتغير i بواحد i++ وتنفيذ جسم الحلقة وفيه :
for (i = 0; i<=100; i++) {
# بداية يتم تحميل محتويات متغير خانة الآحاد إلى المنفذ PORTB ثم يتم توصيل وحدة الآحاد بجعل طرف التحكم فى المهبط المشترك لها فى الحالة المرتفعة وفصل باقى الوحدات بجعل أطراف التحكم فى المهبط المشترك لها فى الحالة المنخفضة ثم تأخير بسيط 5ملى ثانية .
PORTB = DD0;
DD0_Set = 1;
DD1_Set = 0;
DD2_Set = 0;
DD3_Set = 0;
delay_ms(5);
# تكرار ما سبق لخانة العشرات والمئات والآلاف
PORTB = DD1;
DD0_Set = 0;
DD1_Set = 1;
DD2_Set = 0;
DD3_Set = 0;
delay_ms(5);
PORTB = DD2;
DD0_Set = 0;
DD1_Set = 0;
DD2_Set = 1;
DD3_Set = 0;
delay_ms(5);
PORTB = DD3;
DD0_Set = 0;
DD1_Set = 0;
DD2_Set = 0;
DD3_Set = 1;
delay_ms(5);
}
- بعد تكرار الحلقة 100 مرة يتحقق الشرط ويخرج البرنامج من الحلقة ويقوم بفصل وحدة الآلاف للعودة لوضع ابتدائى .
DD3_Set = 0;
- أخد أول عينة : وتتم بالطريقة التالية
// First Sample
# تصفير سجل المؤقت TMR0
TMR0=0;
# بداية إرسال الأشعة والانتظار فى حالة الإرسال لمدة ثانية ثم فصل الإرسال ونسخ محتويات سجل المؤقت TMR0 بعد ضربه فى 60 لتحويله لعدد لفات فى الدقيقة إلى المتغير Sample1
IR_Tx = 1;
Delay_ms(1000); // Delay 1 Sec
IR_Tx = 0;
Sample1 = TMR0*60;
- تكرار أخذ العينة رقم 2 والعينة رقم 3
// Second Sample
TMR0=0;
IR_Tx = 1;
Delay_ms(1000); // Delay 1 Sec
IR_Tx = 0;
Sample2 = TMR0*60;
// Third Sample
TMR0=0;
IR_Tx = 1;
Delay_ms(1000); // Delay 1 Sec
IR_Tx = 0;
Sample3 = TMR0*60; - الحصول على القيمة المتوسطة للعينات الثلاثة بجمعها وقسمتها على 3 ونسح الناتج فى سجل المتغير RPM .
RPM = Sample1 + Sample2 + Sample3;
RPM = RPM/3;
- تكرار العملية بصفة مستمرة حيث يتكرر : إستخلاص الخانات و عرضها على وحدات العرض
} while(1); // endless loop
}