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

   

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



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



يتم توصيل جهد المرجع للطرف RA3 . ويوصل خرج الحساس LM35 إلى المدخل التناظرى RA0/AN0 .
تعرض درجة الحرارة على وحدة عرض LCD نوع 16X2 وتعمل فى نظام 4-bit . تستخدم المقاومة المتغيرة 5K للتحكم فى تباين الشاشة . يستخدم المذبذب الداخلى بتردد 4.0 MHz .
البرنامج :

اعلانات

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


البرنامج :


كود:
/* Digital Thermometer using PIC16F877 and LM35 Oscillator * 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF */ // LCD module connections sbit LCD_RS at RB0_bit; sbit LCD_EN at RB1_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB0_bit; sbit LCD_EN_Direction at TRISB1_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; // End LCD module connections // Define Messages char message0[] = "LCD Initialized"; char message1[] = "Room Temperature"; // String array to store temperature value to display char *tempC = "000.0"; char *tempF = "000.0"; // Variables to store temperature values unsigned int tempinF, tempinC; unsigned long temp_value; void Display_Temperature() { // convert Temp to characters if (tempinC/10000) // 48 is the decimal character code value for displaying 0 on LCD tempC[0] = tempinC/10000 + 48; else tempC[0] = ' '; tempC[1] = (tempinC/1000)%10 + 48; // Extract tens digit tempC[2] = (tempinC/100)%10 + 48; // Extract ones digit // convert temp_fraction to characters tempC[4] = (tempinC/10)%10 + 48; // Extract tens digit // print temperature on LCD Lcd_Out(2, 1, tempC); if (tempinF/10000) tempF[0] = tempinF/10000 + 48; else tempF[0] = ' '; tempF[1] = (tempinF/1000)%10 + 48; // Extract tens digit tempF[2] = (tempinF/100)%10 + 48; tempF[4] = (tempinF/10)%10 + 48; // print temperature on LCD Lcd_Out(2, 10, tempF); } void main() { ADCON0 = 0 ; // Connect AN0 to ADC module ADCON1 = 0b00000101; // Connect AN0, select Vref=AN3 = 1.19V TRISB = 0b00000000; // PORTC All Outputs TRISA = 0b00001001; // PORTA All Outputs, Except RA0and RA3 Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // CLEAR display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,1,message0); Delay_ms(1000); Lcd_Out(1,1,message1); // Write message1 in 1st row // Print degree character Lcd_Chr(2,6,223); Lcd_Chr(2,15,223); // Different LCD displays have different char code for degree symbol // if you see greek alpha letter try typing 178 instead of 223 Lcd_Chr(2,7,'C'); Lcd_Chr(2,16,'F'); do { temp_value = ADC_Read(0); temp_value = temp_value*1168; tempinC = temp_value/1000; tempinC = tempinC*10; tempinF = 9*tempinC/5 + 3200; Display_Temperature(); Delay_ms(1000); // Temperature sampling at 1 sec interval } while(1); }

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

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


التعليق على البرنامج :

/*PIC16F877
Digital Thermometer using PIC16F688 and LM35
4MHz, MCLR Enabled, PWRT Enabled, WDT OFF
*/

1- التعريف بتوصيلات وحدة العرض LCD بالميكروكونترولر وتشمل :
// LCD module connections

· 6 أطراف توصيل بالمنفذ PORTC
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

· و6 خانات تحكم تناظرها فى سجل التحكم TRISC
·
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connections

2- تعريف الرسائل والمتغيرات قبل بداية الدالة الرئيسية وتشمل :
// Define Messages

· الرسالة message0 مصفوفة حروف فى صف واحد وهى النص LCD Initialized
· والرسالة message1 مصفوفة حروف فى صف واحد وهى النص Room Temperature

char message0[] = "LCD Initialized";
char message1[] = "Room Temperature";
· الأشارة إلى سجل المتغير الذى سوف يتم فيه حفظ قيمة درجة الحرارة بالدرجات المئوية على شكل نص للعرض على الشاشة على شكل نص ذو 4 حروف بالصيغة "000.0"
· الأشارة إلى سجل المتغير الذى سوف يتم فيه حفظ قيمة درجة الحرارة بالدرجات الفهرنهيت على شكل نص للعرض على الشاشة

// String array to store temperature value to display
char *tempC = "000.0";
char *tempF = "000.0";

· متغيرات حفظ قيم درجات الحرارة فى المراحل المختلفة للمعالجة
// Variables to store temperature values
unsigned int tempinF, tempinC;
unsigned long temp_value;

3- فى البداية إنشاء دالة "عرض درجة الحرارة " بغرض تسهيل عملية فهم ومتابعة البرنامج فى الدالة الرئيسية وفيها :

void Display_Temperature() {

· تحويل درجة الحرارة إلى حروف
// convert Temp to characters
# اختبار وجود رقم صحيح فى الرقم (الخانة) الأول من اليسار أو الخامس من اليمين بالقسمة على 10000 وفى حالة وجود مثل هذا الرقم أى تحقق شرط if يتم الحصول عليه وتحويله إلى كود أسكى بإضافة العدد 48 إليه ونسخ النتيجة إلى العنصر رقم 0 بالمصفوفة النصية للعرض tempC[0 .
if (tempinC/10000)
// 48 is the decimal character code value for displaying 0 on LCD
tempC[0] = tempinC/10000 + 48;

# وأن لم يوجد مثل هذا الرقم فيوضع مكانه مكان فارغ فى العنصر رقم 0 فى المصفوفة النصية tempC[0]
else tempC[0] = ' ';

· الحصول على خانة العشرات : (القسمة على 1000 وايجاد باقى قسمة الناتح على 10 ) ثم تحويل النتيجة إلى كود أسكى بإضافة العدد 48 ونسخ النتيجة إلى العنصر رقم 1 بالمصفوفة النصية للعرض tempC[1] .

tempC[1] = (tempinC/1000)%10 + 48; // Extract tens digit

· نكرر للحصول على خانة الآحاد ( العنصر tempC[2] )
tempC[2] = (tempinC/100)%10 + 48; // Extract ones digit

· لاحظ أن العنصر tempC[3] متروك لنقطة العلامة العشرية كما فى التعريف
( char *tempC = "000.0"; )

· نكرر للحصول على الكسر العشرى
// convert temp_fraction to characters
tempC[4] = (tempinC/10)%10 + 48; // Extract tens digit

· إرسال (عرض ) درجة الحرارة المئوية بدءا من الصف الثانى والعامود الأول
// print temperature on LCD
Lcd_Out(2, 1, tempC);

· تكرار الخطوات السابقة لدرجات الحرارة بالفهرنهيت
if (tempinF/10000)
tempF[0] = tempinF/10000 + 48;
else tempF[0] = ' ';
tempF[1] = (tempinF/1000)%10 + 48; // Extract tens digit
tempF[2] = (tempinF/100)%10 + 48;
tempF[4] = (tempinF/10)%10 + 48;
// print temperature on LCD
Lcd_Out(2, 10, tempF);
}


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


4- بداية الدالة الرئيسية :

void main() {

· نبدأ بتهيئة الميكروكونترولر :
# توصيل الطرف RA0/AN0 كمدخل تناظرى ليعمل مع موديول المحول ADC .

ADCON0 = 0 ; // Connect AN0 to ADC module
# تخصيص المدخل AN2 ليعمل مع موديول المحول A/D واختيار توصيل جهد المرجع الخارجى

ADCON1 = 0b00000101; // Select AN0, select Vref=AN3 = 1.19V

# تهيئة جميع أطراف المنفذ PORTC كمخارج .
TRISB = 0b00000000; // PORTB All Outputs

# وتهيئة جميع أطراف المنفذ PORTA كمخارج فيما عدا الأطراف RA3 و RA2فتهىء كمداخل
TRISA = 0b00001001; // PORTA All Outputs, Except RA0 and RA3

· تهيئة وحدة العرض LCD للبدء
Lcd_Init(); // Initialize LCD

· مسح الشاشة
Lcd_Cmd(_LCD_CLEAR); // CLEAR display

· منع عرض المؤشر على الشاشة
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

· إرسال (عرض) الرسالة message0 بدءا من الصف الأول والعامود الأول والتى تنص على LCD Initialized " تم تهيئة وحدة العرض LCD " والتأخير 1 ثانية لاستقرار التهيئة
Lcd_Out(1,1,message0);
Delay_ms(1000);

· عرض الرسالة message1 بدءا من السطر الأول والعامود الأول وتنص على
Room Temperature "درجة حرارة الغرفة أو المحيط"
Lcd_Out(1,1,message1); // Write message1 in 1st row
// Print degree character
· كتابة رمز درجة الحرارة بدءا من السطر الثانى والعامود السادس (المئوية)وفى السطر الثانى والعامود الخامس عشر (الفهرنيت)
Lcd_Chr(2,6,223);
Lcd_Chr(2,15,223);
// Different LCD displays have different char code for degree symbol
// if you see greek alpha letter try typing 178 instead of 223

· كتابة الحرف C فى السطر الثانى والعامود السابع أى بعد رمزها وحرف F فى السطر الثانى والعامود السداس عشر أى بعد رمزها .
Lcd_Chr(2,7,'C');
Lcd_Chr(2,16,'F');

· الدخول إلى حلقة غير منتهية do{…..}while(1) حيث يتم تنفيذ :
do {

# قراءة القيمة التناظرية من المدخل RA0/AN0 وتحويله إلى عدد رقمى ونسخ هذه النتيجة لسجل المتغير temp_value .
temp_value = ADC_Read(0);

· ثم الضرب فى المعامل 1168 (كما تم ذكره بأعلى) ونسج النتيجة إلى المتغير temp_value
·
temp_value = temp_value*1168;
· القسمة على 1000 ونسخ النتيجة لسجل المتغير tempinC
tempinC = temp_value/1000;

· الضرب فى 10 ونسخ النتيجة لسجل المتغير tempinC
tempinC = tempinC*10;

· التحويل من مئوى إلى فهرنيت
tempinF = 9*tempinC/5 + 3200;

· أخيرا استدعاء دالة عرض درحة الحرارة التى سبق إنشاءها فى البداية والتأخير لزمن قدره 1 ثانية للسماح للمحول A/D من أخذ عينة جديدة ومعالجتها وتحديث النتائج وعرضها .
Display_Temperature();
Delay_ms(1000); // Temperature sampling at 1 sec interval
} while(1);
}

النتائج :


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









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


الملفات الكاملة للمشروع على الرابط :

http://www.4shared.com/file/kZevqVIR/EX7-LM35-ADC-LCD.html


goldfinger2
:: عضوية غير مفعلة ::
تاريخ التسجيل: Oct 2006
الدولة: egypt
المشاركات: 186
نشاط [ goldfinger2 ]
قوة السمعة:
قديم 19-04-2011, 09:11 AM المشاركة 47   
افتراضي


جزاك الله خيرا مجهود عظيم
اخى الكريم هل ممكن ان ارسل الداتا التى تحتوى على معلومات درجة الحرارة الى ميكرو اخرعن طريق السيريال ويقوم هذا الميكرو الثانى بعرض نتيجة السينسورات على الشاشة


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 19-04-2011, 01:05 PM المشاركة 48   
افتراضي


جزاك الله خيرا مجهود عظيم
اخى الكريم هل ممكن ان ارسل الداتا التى تحتوى على معلومات درجة الحرارة الى ميكرو اخرعن طريق السيريال ويقوم هذا الميكرو الثانى بعرض نتيجة السينسورات على الشاشة
اخى الكريم

شكرا جزيلا لك

ليس لدى الآن إجابة محددة وربما بعد تناول موضوع الاتصالات التسلسلية بين الميكروكونترولر والكومبيوتر وبين الميكروكونترولر وميكروكونترولر آخر يكون هناك رأى آخر .

والموضوع مفتوح لمشاركة الاخوة المتخصصيين فى هذا الموضوع .

مع تمنياتى بدوام التوفيق



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