عرض مشاركة واحدة
  #13  
قديم 09-22-2011, 04:56 PM
 
التعليق على البرنامج :

/* Project: Digital Voltmeter based on PIC16F877
Oscillator @ 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF
*/
1- تعريف أطراف توصيل الميكروكونترولر بوحدة العرض LCD
// LCD module connections
· 6 أطراف بالمنفذ PORTC
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
· و 6 خانات تحكم بسجل التحكم TRISC
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections
2- تعريف (إعلان) الرسائل والمتغيرات المستخدمة قبل الدخول للدالة الرئيسية
· الرسالة الأولى ثابتة وتنص على DVM Project .
char Message1[] = “DVM Project”;
  • تعريف متغير لحفظ نتيجة التحويل باسم ADC_Value ومتغير لحفظ جهد العرض باسم DisplayVolt
unsigned int ADC_Value, DisplayVolt;
· والاشارة إلى متغير باسم volt يحتوى على نص عرض الجهد بالصيغة 00.0
char *volt = "00.0";
3- الدالة الرئيسية : ونبدءها بإعدادات الميكروكونترولر :
void main() {
# تهيئة الطرف RA0/AN0 كمدخل تناظرى وباقى الأطراف كمداخل / مخارج رقمية

ADCON1 = 0b00001110 ; // RA0/AN0 is analog input
# تخصيص موديول المحول داخليا للقناة AN0 .
ADCON0 = 0 ; // Analog channel select @ AN0

# تهيئة جميع أطراف المنفذ PORTB والمنفذ PORTA كمخارج فيما عدا طرف الدخل التناظرى AN0
TRISB = 0b00000000; // PORTB All Outputs
TRISA = 0b00000001; // PORTA All Outputs, Except RA0
· بعد ذلك تهيئة وحدة العرض LCD لبدء العمل

Lcd_Init(); // Initialize LCD
· ومسح الشاسة
Lcd_Cmd(_LCD_CLEAR); // CLEAR display
· ومنع ظهور (عرض) المؤشر على الشاشة
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
· ثم كتابة الرسالة الثابتة وهى الرسالة الأولى : DVM Project بدءا من الصف الأول والعامود الأول
Lcd_Out(1,1,Message1);
· ثم كتابة حرف V فى الصف الثانى والعامود العاشر لتظهر بعد قيمة الجهد .

Lcd_Chr(2,10,'V');
· الدخول فى الحلقة الغير منتهية do{…} while(1) حيث يتم تنفيذ :
do {
# قراءة المدخل التناظرى من القناة رقم 0 ونسخ نتيجة التحويل إلى سجل المتغير ADC_Value .
ADC_Value = ADC_Read(0);
# ضرب محتويات سجل المتغير ADC_Value فى 2 ونسخ النتيجة لسجل المتغير DisplayVolt ( على سبيل المثال 0462 )

DisplayVolt = ADC_Value * 2;
· الحصول على العدد الصحيح لخانة الآلاف : بالقسمة على 1000 وإضافة العدد 48 لتحويل العدد السابق لكود أسكى ونسخ العدد فى الخانة رقم 0 للمتغير volt ( 0462 / 1000 = 0 كعدد صحيح ).
volt[0] = DisplayVolt/1000 + 48;
· الحصول على العدد الصحيح للمئات : بقسمة محتويات سجل المتغير DisplayVolt على 100 ثم إيجاد باقى قسمة النتيجة على 10 . ثم يضاف العدد 48 للتحويل إلى كود أسكى وتخزين النتيجة بالخانة رقم 1 بسجل المتغير volt ( 0462/100 =4 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 4 المطلوب ) .
volt[1] = (DisplayVolt/100)%10 + 48;
· نكرر بالنسبة للعدد الصحيح للعشرات ( 0462 /10 = 46 كعدد صحيح وباقى قسمة النتيجة على 10 هى العدد 6 المطلوب "القسمة تساوى أربعة صحيح والباقى 6 وهو المطلوب )
volt[3] = (DisplayVolt/10)%10 + 48;
· ثم كتابة محتويات السجل volt بدءا من الصف الثانى والعامود الخامس
Lcd_Out(2,5,volt);
· التأخير لفترة 500 ملى ثانية للسماح بمشاهدة العرض .
delay_ms(500); // Hold for 500 ms
· تكرار العملية بصفة مستمرة لتحديث قراءة المدخل التناظرى والعرض .
} while(1);
} // End main()











__________________
angel4angel4angel4angel4angel4
رد مع اقتباس