منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

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

اذهب الى الأسفل

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

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

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

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

البرنامج :


الكود:

#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

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

https://fathallaabdelaziz.forumarabia.com

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

الرجوع الى أعلى الصفحة


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