 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
03-06-2015, 11:13 PM
المشاركة 1
|
|
جهاز قياس الجهد باستخدام الميكروكونترولر PIC12F675 ومسجل الإزاحة 74595 والعرض على 4 و
Twitter
FaceBook
Google+
جهاز قياس الجهد باستخدام الميكروكونترولر 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);
}
}
|