البرنامج :
شرح البرنامج خطوة بخطوة :
1- رأس (مقدمة) البرنامج
/*Header******************************************* ***********/
2- الدالة الرئيسية :
void main() {
3- الإعلان عن متغير من نوع الحروف char اسمه TEST واسناد القيمة 5 إليه ومن ثم يعتبر ثابت القيمة أى يمكن استخدام متغير نوع int أو ثابت const .
والإعلان عن مجموعة الثوابت الإحصائية {….,….}enum خاصة بالمخارج outputs من هذه المجموعة ثابت باسم RELAY ويخصص له القيمة 3 . بالطبع طالما أنه ثابت واحد يمكن استخدام const فنقول " const RELAY = 3 "ولكننا نعمم حتى نستطيع استخدام مجموعة مخارج فيما بعد.
char TEST = 5; // Constant TEST = 5
enum outputs {RELAY = 3}; // Constant RELAY = 3
4- تهيئة جميع الأطراف كمداخل أو مخارج رقمية فقط
ANSEL = 0; // All I/O pins are configured as digital
ANSELH = 0;
5- تصفير المنفذ PORTA كوضع ابتدائى آمن
PORTA = 0; // Reset port A
6- تهيئة جميع أطراف المنفذ PORTA كمداخل
TRISA = 0xFF; // All portA pins are configured as inputs
7- تصفير المنفذ PORTD كوضع ابتدائى آمن
PORTD = 0; // Reset port D
8- تهيئة الطرف RD3 بالمنفذ PORTD كمخرج وباقى الأطراف كمداخل
TRISD = 0b11110111; // Pin RD3 is configured as an output, while the rest are
// configured as inputs
9- تهيئة سجل المؤقت TMR0 ليعمل كعداد ويستقبل النبضات من على الطرف RA4 واستخدامه مع معامل قسمة تردد بالقيمة Prescaler = 1:1
OPTION_REG.F5 = 1; // Counter TMR0 receives pulses through the RA4 pin
OPTION_REG.F3 = 1; // Prescaler rate is 1:1
10- تصفير سجل المؤقت TMR0 ليبدأ العد من الصفر
TMR0 = 0; // Reset timer/counter TMR0
11- دخول حلقة do{…..} while بتنفيذ جسمها أولا حيث نجد تعبير شرط يستخدم if وشرط تنفيذ ما بعدها (جسمها) هو التكافؤ بين محتويات سجل المؤقت ومتغير معرف مسبقا أى :
TMR0 == TEST أى السؤال هل العدد الموجود فى المؤقت متوافق مع الثابت TEST ؟
do {
if (TMR0 == TEST)// Does the number in timer match constant TEST?
12- أن كانت الإجابة بنعم يتم تنفيذ العبارة التالية والتى تفعيل (1) الريلاى المتصل الطرف RD3
(PORTD.RELAY = 1);// Numbers match. Set the RD3 bit (output RELAY)
13- إذا كانت الإجابة لا يتم الخروج من حلقة do ليجد البرنامج نفسه فى حلقة while الغير منتهية فيكرر العملية .
}
while (1); // Remain in endless loop
}
ملحوظات :- فى هذا البرنامج تم استخدام ثابت واحد هو "RELAY" من ضمن مجموعة الثوابت
"enum outputs" وتم إسناد القيمة 3 اليه عند إعلانه أى RELAY = 3 .
- عند توصيل عدة أطراف من المنفذ port D بريلايات فإن التعبير السابق يمكن كتابته بالطريقة التالية :
- جميع الثوابت التى تلى الثوابت المسند إليها قيم وهى (RELAY = 3 , MOTOR = 6) يتم تلقائيا إسناد قيم لها بتزايد واحد بالنسبة للسابق لها . فى هذا البرنامج يتم إسناء القيمة 4 للثابت HEATER أى يكون HEATER = 4 ويتم إسناد القيمة 7 للثابت يكون الثابت PUMP أى يكون PUMP = 7 .
تعديل البرنامج ليعمل مع الميكروكونترولر PIC16F84