جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 وحدات سفن سيجمنت مع المترجم CCS C :
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: برمجة الميكروكونترولر PIC بلغة السى مع المترجم CCS - C
صفحة 1 من اصل 1
جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 وحدات سفن سيجمنت مع المترجم CCS C :
جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 وحدات سفن سيجمنت مع المترجم CCS C :
البرنامج :
شرح البرنامج :
ملف المشروع :
http://www.mediafire.com/download/14dizn6f523dutk/CCS-PIC12F675-ADC-4X74595-4X7SEGMENT-VOLTMETER.zip
البرنامج :
- الكود:
#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);
}
}
ملف المشروع :
http://www.mediafire.com/download/14dizn6f523dutk/CCS-PIC12F675-ADC-4X74595-4X7SEGMENT-VOLTMETER.zip
مواضيع مماثلة
» تدريبات ومشاريع الأردوينو Arduino Tutorials and Projects
» تدريبات على وحدات العرض السفن سجمنت 7-Segmentمع المترجم CCS C التدريب الأول :
» التدريب الثانى : إنشاء عداد بمفتاح ضاعط أو بحساس لعد الأشياء من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع المترجم CCS C .
» مشروع متحكم رقمى فى درجة الحرارة السالبة والموجبة بالحساس DS18B20 والميكروكونترولر 16F628 والسفن سيجمنت مع المترجم CCS C :
» التدريب الثالث : إنشاء عداد بمفتاح ضاعط أو بحساس لعد الأشياء من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع استخدام ترانزستورات ومع المترجم CCS C .
» تدريبات على وحدات العرض السفن سجمنت 7-Segmentمع المترجم CCS C التدريب الأول :
» التدريب الثانى : إنشاء عداد بمفتاح ضاعط أو بحساس لعد الأشياء من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع المترجم CCS C .
» مشروع متحكم رقمى فى درجة الحرارة السالبة والموجبة بالحساس DS18B20 والميكروكونترولر 16F628 والسفن سيجمنت مع المترجم CCS C :
» التدريب الثالث : إنشاء عداد بمفتاح ضاعط أو بحساس لعد الأشياء من “0” إلى “99” باستخدم وحدتى عرض سفن سيجمنت مع استخدام ترانزستورات ومع المترجم CCS C .
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: برمجة الميكروكونترولر PIC بلغة السى مع المترجم CCS - C
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى