جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 وحدات سفن سيجمنت مع المترجم CCS C :

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 وحدات سفن سيجمنت مع المترجم CCS C :

مُساهمة من طرف Admin في الأربعاء يونيو 03, 2015 11:06 pm

جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 وحدات سفن سيجمنت مع المترجم CCS C  :



البرنامج :


الكود:

#include <12F675.h>
#device adc=10
#FUSES NOWDT, INTRC_IO, NOMCLR, NOBROWNOUT
#use delay(clock=4000000)
#use FIXED_IO( A_outputs=PIN_A5,PIN_A4,PIN_A2 )
#define EXP_OUT_ENABLE  PIN_A2
#define EXP_OUT_CLOCK   PIN_A5
#define EXP_OUT_DO      PIN_A4
#define NUMBER_OF_74595 4
#include <74595.c>

// Data values for Common cathode display
int digit[14]={63,6,91,79,102,109,125,7,127,111,99,88,64,80};
//            [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 ,o ,c ,- ,r ]

void main() {
   setup_comparator(NC_NC_NC_NC);
   setup_adc_ports(sAN0);// As defined in header file
   setup_adc(ADC_CLOCK_DIV_2);
   setup_vref(FALSE);
   int mask[4];//mask
   int data[4];//send array //
   int16 ADC;
   delay_ms(250);

   while(TRUE)
   {
     set_adc_channel(0);
     delay_ms(10);
     ADC = (read_adc())*(3);
    
   if(ADC<3010)
   {
   mask[0]=(ADC/1000)%10; // ones
   mask[1]=(ADC/100)%10;  // tens
   mask[2]=(ADC/10)%10;   // hundreds
   mask[3]= ADC %10;     // thousands
   }
   else
   {
   mask[0]=12;
   mask[1]=12;  
   mask[2]=12;  
   mask[3]=12;  
   }
  
   data[0] = digit[mask[0]];
   data[1] = digit[mask[1]];
   data[2] = digit[mask[2]];
   data[3] = digit[mask[3]];
  
   write_expanded_outputs(data);
   delay_ms(100);
   }

}


شرح البرنامج :

الكود:

شرح البرنامج :
أولا رأس (مقدمة) البرنامج :
• تضمين ملف الرأس الخاص بالميكروكونترولر المستخدم وهو PIC12F765 ذات الثمانية أطراف :
#include <12F675.h>
• تحديد دقة التحويل من تناظرى إلى رقمى بعشرة بتات :  
#device adc=10
• تحديد مصهرات (بتات) التكوين configuration وخاصة استخدام الساعة الداخلية :
#FUSES NOWDT, INTRC_IO, NOMCLR, NOBROWNOUT
• تحديد تردد المذبذب المستخدم والذى يدخل فى حسابات دالة التأخير delay :
#use delay(clock=4000000)
• إخبار المترجم بكيفية التعامل مع المداخل / المخارج ، هنا تم تحديد الأطراف A2,A4,A5 كمخارج :
#use FIXED_IO( A_outputs=PIN_A5,PIN_A4,PIN_A2 )
• تعريف الأطراف المستخدم مع مسجلات الإزاحة بأسماء تسهل فهم تنفيذ البرنامج :
#define EXP_OUT_ENABLE  PIN_A2
#define EXP_OUT_CLOCK   PIN_A5
#define EXP_OUT_DO      PIN_A4
• تحديد عدد مسجلات الإزاحة 74595 المستخدم فى توصيل البيانات إلى وحدات السفن سيجمنت :
#define NUMBER_OF_74595 4
• تضمين الملف الذى يحتوى على الدالة التى تستخدم مسجلات الإزاحة 74595 فى توسعة المخارج :
#include <74595.c>
• إعلان مصفوفة تحتوى على 14 عنصر كل عنصر عبارة عن بيانات عرض حرف محدد على وحدة عرض سفن سيجمنت ذات كاثود مشترك :
// Data values for Common cathode display
int digit[14]={63,6,91,79,102,109,125,7,127,111,99,88,64,80};
//                     [0 ,1,2 ,3 , 4 , 5 , 6 ,7, 8 , 9 ,o ,c ,- ,r ]
ثانيا : الدالة الرئيسية :

void main() {
• تحديد إعدادات أجهزة الميكروكونترولر وخاصة المحول من تناظرى لرقمى  :  
   setup_comparator(NC_NC_NC_NC);
   setup_adc_ports(sAN0); // As defined in header file
   setup_adc(ADC_CLOCK_DIV_2);
   setup_vref(FALSE);
• إعلان المتغيرات المستخدمة فى البرنامج
   int mask[4];//mask
   int data[4];//send array //
   int16 ADC;
• تأخير لاستقرار الإعدادات
   delay_ms(250);
ثالثا : الحلقة الغير منتهية :

   while(TRUE)
   {
• تحديد قناة التحويل المستخدمة مع تأخير قصير لضمان استقرار المحول  :
     set_adc_channel(0);
     delay_ms(10);
• قراءة نتيجة ( عدد من 0 إلى 1024 ) ، التحويل وضرب هذه النتيجة فى 3 لتصبح 3072  لكى تتناسب مع الجهد المقاس وهو 30 فولت ولتسهيل عملية المقارنة ، وحفظ النتيجة فى المتغير المحجوز لهذا الغرض وهو باسم ADC  :  
     ADC = (read_adc())*(3);
• اختبار النتيجة بعملية مقارنة ، فإذا كانت النتيجة أقل من أقصى مدى يتم تنفيذ عبارات عرض النتيجة على السفن سيجمنت .
   if(ADC<3010)
   {
• استنباط قيمة خانات الآحاد ، والعشرات ، والمئات , والآلاف وتخزينها فى المصفوفة mask[] فى شكل عناصر مرتبة indexed :  
   mask[0]=(ADC/1000)%10; // ones
   mask[1]=(ADC/100)%10;  // tens
   mask[2]=(ADC/10)%10;   // hundreds
   mask[3]= ADC %10;     // thousands
   }
• أما إذا كانت النتيجة خارج أقصى مدى فيتم إعطاء إشارة للدلالة على تعدى المدى  
   else
   {
   mask[0]=12;
   mask[1]=12;  
   mask[2]=12;  
   mask[3]=12;  
   }
• تحويل كل قيمة لخانة إلى ما يناظرها باستخدام المصفوفة digit[] ، ثم نسخ النتيجة إلى مصفوفة البيانات data[] فى شكل مرتب :
   data[0] = digit[mask[0]];
   data[1] = digit[mask[1]];
   data[2] = digit[mask[2]];
   data[3] = digit[mask[3]];
 وأخيرا : استخدام الدالة المخصصة للإخراج عن طريق الزحزحة للبايتات الأربعة من خلال مسجلات الإزاحة 74595 إلى وحدات العرض السفن سيجمنت ، والتأخير للحصول على دخل مستقر :  
   write_expanded_outputs(data);
   delay_ms(100);
   }

}


ملف المشروع :

mediafire.com download/14dizn6f523dutk/CCS-PIC12F675-ADC-4X74595-4X7SEGMENT-VOLTMETER.zip

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى