[CENTER]السلام عليكم
طلب مني انجاز مقياس حرارة بتوظيف المكركنترولر
فوجدت في احدى المواقع الاجنبية نمودج

والكود
// modules LCD connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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;
// Fin modules LCD connections
int t;
char a;
char lcd[] = "000 Degree";
void main()
{
ADCON1 = 0x04;
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
do
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_out(1,1, "Temperature:");
t = ADC_Read(0);
t = t * 0.4887; // 4.887 est la resolution du convertisseur ADC
a = t%10;
lcd[2] = a + '0';
t = t/10;
a = t%10;
lcd[1] = a + '0';
t = t/10;
a = t%10;
lcd[0] = a + '0';
Lcd_out(2,1,lcd);
Delay_ms(100);
}while(1);
}
والمطلوب هو شرح الية عمل المقياس + وشرح مفصل لاسطر الكود
وشكرا مسبقا
|
أخي Yassine AgH
أهلا بك في القرية
بالنسبة للبك المستخدم هو 16F877A يحتوي على موديول ADC تحويل من أنالوج الى ديجيتال أي يستطيع استقبال الإشارة الواردة من حساس الحرارة LM35 وتحويلها الى قيمة رقمية تظهر على الشاشة
// modules LCD connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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;
// Fin modules LCD connections
هذه الأسطر هي لتوظيف أرجل المعالج للتوصيل مع الشاشة LCD
**************************
int t; تعريف متغير صحيح لحجز قيمة الحرارة المقرؤة
char a; تعريف وحجز متغير حرفي حجم 1 بايت
char lcd[] = "000 Degree"; تعريف مصفوفة حجم 1 بايت لعرض درجة الحرارة بثلاثة مراتب مع إظهار الكلمة Degree بعد درجة الحرارة
***********************************
void main() هنا بداية البرنامج الرئيسي
{
ADCON1 = 0x04; توظيف رجل المعالج كمدخل لقراءة الاشارة الأنالوج الواردة من حساس الحرارة
Lcd_Init(); دالة استدعاء للشاشة لتحضيرها لعرض البيانات عليها
Lcd_Cmd(_LCD_CURSOR_OFF); إلغاء تفعيل وإظهار مؤشر الكتابة على الشاشة
do بداية حلقة لقراءة قيمة القرارة وتحويلها وإظهارها على الشاشة
{
Lcd_Cmd(_LCD_CLEAR); دالة مسح الشاشة
Lcd_out(1,1, "Temperature:"); دالة لعرض الكلمة Temperature في السطر الأول بدءا من العمود الأول
***************************
t = ADC_Read(0); وضع القيمة المقرؤة من الرجل RA0 في المتغيّر t
t = t * 0.4887; // 4.887 est la resolution du convertisseur ADC
بما أن الموديول حجمه 10 بت فتكون قيمته 1024 إي يأخذ القيم من 0 وحتى 1023
وملاحظة عن الحساس بحيث أن كل درجة تقابل 10 ميلي فولت
أي عند جهد 5 فولت تكون درجة الحرارة المقابلة هي 500
5 * 1000 = 5000 ميلي فولت 5000 / 10 = 500 درجة
إذا يستطيع قراءة أكبر قيمة وقدرها 500 درجة عند جهد 5 فولت
ومنه 500 / 1023 = 0.4887
لمعرفة درجة الحرارة التي أخذناها من الموديول نقوم بضربها بالقيمة 0.4887
اذا تأخذ t نتيجة التحويل للمحول ADC
**********************
a = t%10;
lcd[2] = a + '0';
t = t/10;
a = t%10;
lcd[1] = a + '0';
t = t/10;
a = t%10;
lcd[0] = a + '0';
هذه الأسطر هي عملية فصل الأرقام اي المئات والعشرات والأحاد لعرضها بالترتيب الصحيح على الشاشة
*************************
Lcd_out(2,1,lcd);
Delay_ms(100);
}while(1);
}
وأخيرا بعد إيجاد المراتب الأحاد والعشرات والمئات
ومن خلال دالة Lcd_out نعرض الحرارة في السطر الثاني وبدءا من العمود الأول
ثم تأخير زمني قدره 100 ميلي ثانية قبل أن يتم قراءة الحرارة وعرضها من جديد
وأخيرا جملة }while(1); وتعني مادام الشرط محقق استمر بالقراءة والعرض
********************
بالنسبة للدارة المعروضة هي بغرض المحاكاة نجد المعالج 16F877A القطعة الرئيسية ثم حساسا الحرارة LM35 والشاشة LCD ومقاومة متغيرة مربوطة مع الشاشة من أجل التباين وفي المحاكاة غير ضرورية ولكن في الواقع عند التطبيق سنحتاجها لتظهر المحارف على الشاشة.
أرجو أن أكون قد أفدتك ولو بالقلي وبحسب إمكانياتي
أتمنى لك كل التوفيق