قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 01:22 AM المشاركة 49   
افتراضي



البرنامج الثالث :
قراءة مدخل تناظرى واستخلاص خاناته ( آلاف – مئات – عشرات – آحاد) وإرسالها لوحدة العرض LCD

الدائرة الكهربية :


البرنامج :

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 01:27 AM المشاركة 50   
افتراضي


البرنامج :








كود:
 
 
/*1-Comments
ADC &LCD PIC16F877A Oscillator * 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF
*/
//2- LCD module connections
sbit LCD_RS at RD0_bit; sbit LCD_EN at RD1_bit; sbit LCD_D4 at RD4_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;
sbit LCD_RS_Direction at TRISD0_bit;
sbit LCD_EN_Direction at TRISD1_bit; sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module connections
//3- Define Messages and variables
char message1[] = "ADC Value= "; char *temp = "0000";
unsigned int adc_Value;
//4- main
void main() {
TRISD = 0; // PORTD All Outputs TRISA = 0b00000001; // PORTA All Outputs, Except RA0
Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // CLEAR display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,1,message1); // Write message1 in 1st row
Lcd_Out(2,1,"Eng.F.ABDELAZIZ"); while(1) {
adc_value = ADC_Read(0);
temp[0] = adc_value/1000 + 48; // Add 48 to get the ASCII character value
temp[1] = (adc_value/100)%10 + 48; temp[2] = (adc_value/10)%10 + 48;
temp[3] = adc_value%10 + 48;
Lcd_Out(1,11,temp);
Delay_ms(1000); } }
التعليق على البرنامج :

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 01:30 AM المشاركة 51   
افتراضي


التعليق على البرنامج :
· يبدأ البرنامج كالعادة بالتعليقات يليها التعريف بتوصيلات وحدة LCD مع الميكروكونترولر فى شكل 6 أطراف و 6 بتات تحكم .
· بعد ذلك يتم إعلان والتعريف بالمتغيرات النصية والعددية وهنا يتم :
# إعلان متغير لمصفوفة سلسلة نصية باسم message1[] نوع char مع تخصيص سلسلة نصية محددة لها توضع بعد علامة التخصيص (التساوى) بين قوسين تنصيص "ADC Value= " .
# ثم إعلان متغير لسجل مؤقت لمصفوفة سلسلة نصية تعرف هنا بالإشارة إليها برمز الإشارة وهو النجمة "*" يليها اسمها *temp مع تخصيص سلسلة نصية لها مكونة من أربع حروف متغيرة (بتغير الدخل التناظرى) وذلك بوضع أربع أماكن فارغة بين قوسين التنصيص أو أربع أصفار حتى نتحقق من عدد الحروف المحجوزة ( هى هنا أربع حروف لأن قيمة التحويل تتغير من 0 إلى 1023 ) مع ملاحظة أن الحرف الأيسر رتبته الصفر [0] (وسوف يمثل هنا خانة الآلاف ) والذى يليه من اليسار رتبته واحد [1] (وسوف يمثل هنا خانة المئات) وهكذا .
# بعد ذلك يتم إعلان متغير لعدد حقيقى موجب unsigned int (أو فقط unsigned ) باسم adc_Value لحفظ نتيجة التحويل من تناظرى لرقمى لعلاجه بالعمليات الرياضية للحصول على المطلوب منه .
· ثم نبدأ الدالة الرئيسية :
# بإعدادات المنافذ :
المنفذ TRISA كمداخل (وهى حالته الافتراضية) والمنفذ TRISD حيث يتم توصيل وحدة العرض LCD . يمكن اختيار إعدادات اطراف المداخل التناظرية كما يلى ADCON1 = 0b00001110 وهذا يعنى اختيار المدخل RA0/AN0 فقط كمدخل تناظرى وباقى المداخل كمداخل / مخلرج رقمية مع ملاحظة أن الوضع الافتراضى لبتات للسجل ADCON1 كلها بأصفار وهو يعنى اختيار جميع المداخل AN0-AN7 كمداخل تناظرية .
# ثم إعدادات وحدة العرض LCD :
تشمل التهيئة للبدء Lcd_Init() ومسح الشاشة Lcd_Cmd(_LCD_CLEAR) و منع ظهور المؤشر أثناء الكتابة Lcd_Cmd(_LCD_CURSOR_OFF) .
· بعد ذلك يتم كتابة الرسائل الثابتة (قبل الدخول للحلقة الغير منتهية ) وتشمل :
# الرسالة الأولى (ثابتة) " " ADC Value= بدءا من الصف الأول والعامود الأول Lcd_Out(1,1,message1) .
# ثم رسالة أخرى ثابتة (اختيارية) بالصف الثانى بدءا من العامود الأول Eng.F.ABDELAZIZ .
· بعد ذلك ندخل لحلقة التكرار الغير منتهى while(1) :
# نبدأ بقراءة المدخل التناظرة من القناة AN0 باستخدام الدالة ADC_Read(0) ثم نسخ نتيجة التحويل من تناظرى لرقمى (عدد صحيح يقع بين 0 و 1023) إلى المتغير المعرف مسبقا adc_value .

نصل الآن إلى الجزء الهام من البرنامج وهو معالجة نتيجة التحويل بالعمليات الحسابية وإظهارها على الشاشة:
1- هنا نحن نتعامل مع أعداد صحيحة موجبة وأى كسر فى الناتج سوف يهمله المترجم .
2- حتى الآن ما لدينا هو أعداد أو أرقام (وليس نصوص) إذا تم إرسالها لوحدة العرض LCD فلن تتعرف عليه ولن يظهر ولذلك يجب تحويلها إلى كود أسكى , ويتم ذلك فقط بإضافة العدد 48 إليه , هلى سبيل المثال الرقم 1 إذا أرسل مباشرة كما هو إلى وحدة العرض فلن يظهر شىء , أما إذا أرسلنا 1+48 إلى وحدة العرض عندئذ سوف يظهر 1 على وحدة العرض .
3- نتيجة التحويل عدد صحيح مكون من أربعة أرقام (خانات) على الأكثر , الرقم الأول من اليسار يمثل خانة الآلاف وهو العنصر temp[0] , والرقم الثانى من اليسار يمثل خانة المئات وهو العنصر temp[1] , والرقم الثالث من اليسار يمثل خانة العشرات وهو العنصر temp[2] , والرقم الرابع من اليسار يمثل خانة الآحاد وهو العنصر temp[3] .
4- لاستخلاص خانة الآلاف temp[0]:
# فقط نقسم نتيجة التحويل على 1000 أى adc_value/1000 فتكون " نتيجة القسمة هى الرقم المقابل لخانة الآلاف "(كما ذكرت لن يلتفت المترجم للكسور) , على سبيل المثال إذا كانت نتيجة التحويل 1023 وقسمناها على 1000 فإن نتيجة القسمة تكون واحد فقط "1" .
# وحتى نتمكن من عرضها على وحدة العرض يجب إضافة العدد 48 إلى ناتج القسمة
adc_value/1000 + 48 لتحويله إلى كود أسكى كما ذكرنا .

5- لاستخلاص خانة المئات temp[1]:
# نقسم نتيجة التحويل على 100 أى adc_value/100فنحصل على عدد مكون فقط من الرقمين الأول والثانى من اليسار ثم نوجد " باقى قسمة العددين على 10 إى " %10وهو الرقم الثانى من اليسار أى رقم خانة المئات المطلوب , على سبيل المثال العدد 0923 عند قسمته على 100 ينتج 09 فقط ثم قسمة هذا العدد على 10 تكون "النتيجة بصفر" و" الباقى " 9 وهذا الباقى هو خانة المئات المطلوبة . المؤثر % يعنى " باقى خارج قسمة ما قبله على ما بعده" .
# نضيف العدد 48 لتحويل الرقم إلى كود أسكى .
6- لاستخلاص خانة العشرات temp[2]:
# نقسم نتيجة التحويل على 10 أى adc_value/10فنحصل على عدد مكون فقط من الثلاثة أرقام جهة اليسار ثم نوجد " باقى قسمة هذه النتيجة على 10 إى " %10وهو الرقم الثالث من اليسار أى رقم خانة العشرات , على سبيل المثال العدد 1023 عند قسمته على 10 ينتج 102 فقط ثم قسمة هذا العدد على 10 تكون "النتيجة 10 " و" الباقى " 2 وهذا الباقى هو خانة العشرات المطلوبة . # نضيف العدد 48 لتحويل الرقم إلى كود أسكى .
7- لاستخلاص خانة الآحاد temp[3]:
# نوجد مباشرة " باقى قسمة نتيجة التحويل على 10 إى " %10وهو الرقم الرابع من اليسار أى رقم خانة الآحاد , على سبيل المثال العدد 1023 عند قسمته على 10 تكون " النتيجة 102 " و" الباقى " 3 وهذا الباقى هو خانة الآحاد المطلوبة .
# نضيف العدد 48 لتحويل الرقم إلى كود أسكى .
8- بعد ذلك يتم كتابة (إرسال) محتويات المتغير temp كنص يبدأ من الصف الأول والعامود الحادى عشر Lcd_Out(1,11,temp) حتى يتم كتابتة بعد الرسالة الأولى الثابتة مباشرة .
9- التأخير ثانية Delay_ms(1000)للسماح بالاستقرار ومشاهدة وقراءة المعروض على الشاشة .

10- تكرار الخطوات السابقة لتحديث قيمة الدخل التناظرى ومن ثم المعروض على الشاشة .
النتائج :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 01:33 AM المشاركة 52   
افتراضي


النتائج :










الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 12:35 PM المشاركة 53   
افتراضي


تدريب :
عرض عائد (نتيجة) قراءة المحول ADC على وحدة عرض LCD :
فى هذا التدريب سوف نفعل نفس الشىء ولكننا سوف نعرض عائد (نتيجة) المحول ADC على وحدة العرض LCD مباشرة مع التعبير عن القيمة بالفولت Vوبالطبع يمكن التعبير عنه بأى كمية فيزيائية أخرى كالحرارة والضغط و.... إلخ .
الدائرة الكهربية :








البرنامج :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 12:39 PM المشاركة 54   
افتراضي


البرنامج :





ملاحظة :
فى هذا البرنامج سوف نقوم بتقريب قيمة الجزء bit من 4.88 mV إلى 5mV وهو تقريب معقول .


كود:
/*1-Comments ADC &LCD PIC16F877A Oscillator * 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF */ //2- LCD module connections sbit LCD_RS at RD0_bit; sbit LCD_EN at RD1_bit; sbit LCD_D4 at RD4_bit; sbit LCD_D5 at RD5_bit; sbit LCD_D6 at RD6_bit; sbit LCD_D7 at RD7_bit; sbit LCD_RS_Direction at TRISD0_bit; sbit LCD_EN_Direction at TRISD1_bit; sbit LCD_D4_Direction at TRISD4_bit; sbit LCD_D5_Direction at TRISD5_bit; sbit LCD_D6_Direction at TRISD6_bit; sbit LCD_D7_Direction at TRISD7_bit; // End LCD module connections //3- Define Messages and variables char Message1[] = "ADC TO Volt"; char *volt = "0.000V"; unsigned int ADC_Value, DisplayVolt; //4- main void main() { TRISD = 0; // PORTD All Outputs TRISA = 0b00000001; // PORTA All Outputs, Except RA0 Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // CLEAR display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,4,message1); // Write message1 in 1st row while(1) { adc_value = ADC_Read(0); DisplayVolt = adc_value * 5 ; // get the value in millivolts considering that 1bit = 5mV volt[0] = DisplayVolt/1000 + 48; // Add 48 to get the ASCII character value volt[2] = (DisplayVolt/100)%10 + 48; volt[3] = (DisplayVolt/10)%10 + 48; volt[4] = DisplayVolt%10 + 48; Lcd_Out(2,6,volt); delay_ms(500); // Hold for 500 ms } }
النتائج :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 12:42 PM المشاركة 55   
افتراضي


النتائج :












الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 25-02-2012, 03:03 PM المشاركة 56   
افتراضي


مشروع إنشاء جهاز قياس فولت رقمى DVM (فولت ميتر) يعتمد على الميكروكونترولر PIC
مقدمة :
يتناول هذا المشروع إنشاء مقياس جهد رقمى بسيط DVM باستخدام الميكروكونترولر PIC16F877 . مدى القياس
0-20V ويمكن بالطبع زيادة أو نقصان مدى جهد الدخل كما ترغب بعد فهم طريقة معايرة التدريج scaling .
يقوم الميكروكونترولر بقراءة جهد الدخل من خلال أحد القنوات الثمانية وتحويله إلى عدد رقمى باستخدام المحول ADC الداخلى . بإجراء بعض العمليات الرياضية على نتيجة التحويل فأن هذا العدد الرقمى يمكن تحويله كمقياس للجهد الفعلى .
يتم عرض الجهد على وحدة LCD .

الدائرة الكهربية والوصف :
لا يمكنك تغذية إشارة الجهد 20V مباشرة إلى قناة مدخل الميكروكونترولر . هذه القيمة مرتفعة جدا عن جهد العمل وقد تسبب تلف الميكروكونترولر . لذلك فنحن نحتاج أولا إلى تخفيض جهد الدخل إلى قيمة جهد عمل آمن للميكروكونترولر . يمكن تحقيق ذلك باستخدام مقسم (مجزىء) جهد بسيط مكون من مقاومات كما فى الشكل .




باستخدام المقاومتين R1 و R2 يمكن تخفيض جهد الدخل ليتحول من المدى 0-20V ويصبح فى المدى
0-5V . لقيم المقاومات R1 و R2 المختارة يمكنك رؤية أن جهد الخرج (Vout) من مقسم الجهد هو ربع 1/4 جهد الدخل . عندما يتعدى جهد الدخل 20V فسوف يزيد جهد الخرج عن 5V وهذا يسبب ضررا للميكروكونترولر . إذا تم توصيل زنر دايود بجهد 5.1V بين طرفى المقاومة R1 فإن الخرج Vout سوف لا يزيد أبد عن 5.1V . هذا يؤدى إلى حماية الميكروكونترولر من التلف المحتمل نتيجة زيادة جهد الدخل .
يتم توصيل الجهد Vout إلى طرف القناة التناظرية AN0 للميكروكونترولر PIC16F877 .
باقى الدائرة كما هو مبين بالشكل التالى :

وحدة العرض LCD موصلة فى نظام 4-bit . إذا كانت وحدة LCD تمتلك 14 طرف فقط فلا يكون لديك إضاءة خلفية كما يمكنك تجاهل الطرفين 15 و 16 إن كانا موجودين .يتم التحكم فى التباين باستخدام المقاومة المتغيرة 5K المتصلة بين الجهد +5V والأرضى .
المفتاح الضاغط لإعادة العمل reset خارجيا مفيد لوضع النظام فى حالة ابتدائية معروفة عندما يتوقف الميكروكونترولر عن تنفيذ تلبرنامج لأى سبب .
البرنامج



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:59 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)