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

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 30-03-2012, 01:23 PM المشاركة 1   
افتراضي مشروع قياس درجة الحرارة بالحساس LM35 وعرضها على وحدات 7-segment وإنشاء نظام تحكم : Twitter FaceBook Google+



مشروع قياس درجة الحرارة بالحساس LM35 وعرضها على وحدات 7-segment وإنشاء نظام تحكم :
الحساس LM35 شائع الاستخدام وهو حساس دقيق لدرجة الحرارة بالدرجات المئوية , يمكن استخدامه لقياس درجة الحرارة بدقة نصف 0.5 درجة مئوية . يمكن ربط هذا الحساس بسهولة بالميكروكونترولر PIC وإنشاء مقاييس لدرجة الحرارة و متحكمات فى درجة الحرارة وأجهزة إنذار بالحريق و...
الحساس LM35 :

هذا الحساس له ثلاثة أطراف كما فى الشكل . جهد التغذية Vcc يمكن أن يكون من 4V إلى 20V . لاستخدام الحساس ببساطة قم بتوصيل الطرف Vcc بالجهد +5V وطرف الأرضى (المشترك) GND بالأرضى وطرف الخرج Out بأحد أطراف المداخل التناظرية للميكروكونترولر . هذا الخرج يتغير خطيا مع درجة الحرارة وهو يساوى 10 ملى فولت لكل درجة مئوية . إذا كان الخرج 310 mV , على سبيل المثال , فإن درجة الحرارة تكون 31 درجة مئوية .
المحول ADC بالميكروكونترولر PIC بسعة 10 بت . إذا كان جهد المرجع المستخدم هو 5V فإن دقة التحويل (أقل جهد يمكن قياسه) تكون :
5/1024 = 5mV approx
بمعنى آخر : أقل نتيجة تحويل ADC هى البت أو الوحدة "1" , عندئذ يكون أقل جهد يمكن قياسه هو 5mV وهو يناظر درجة حرارة تساوى 0.5 درجة مئوية وهى دقة القياس .
ملحوظة :
القيمة الدقيقة هى 4.88mv .
مثال :
إذا كانت نتيجة التحويل ADC هى 10 فهذا يعنى أن جهد الدخل :
10 x 5mV = 50mV
وهو يناظر 5 درجة مئوية ( طل درجة مئوية تناظر 10 ملى فولت) .
يمكننا قراءة قيمة أى قناة تحويل ADC باستخدام الدالة ADC_Read(ch)" " حيث ch هى رقم القناة . إذا قمت بتوصيل الحساس LM35 إلى القناة RA0/AN0 عندئذ تصبح الدالة ADC_Read(0)" " . هذه القراءة يجب حفظها فى متغير ليصبح شكل العبارة:
result = ADC_Read(0);
هذه العبارة تعنى تخزين القراءة الحالية لنتيجة التحويل ADC فى المتغير result . بيانات هذا المتغير يجب أن تكون من نوع 0 .. 65535" unsigned (int)" حيث أن مدى قيمة نتيجة التحويل هو 0-1023 .
كما ذكرنا : قيمة نتيجة التحويل ADC تكون نتيجة "لمضاعفات" القيمة 5mV ونظرا لأن كل واحد درجة مئوية تنتج 10mV فى خرج الحساس , نتيجة لذلك يمكننا القول " كل وحدتين من وحدات نتيجة التحويل ADC تساوى واحد درجة مئوية" . لذلك , للحصول على درجة الحرارة يتم قسمة قيمة المتغير result على 2 أى :
result = result /2;
ملحوظة :
معامل القسمة الدقيق هو 2.05 , أى :
result = result /2.05;
فى النهاية يمكنك عرض هذه القيمة على وحدات العرض المختلفة .
فى هذا المشروع سوف نستخدم وحدتين 7 segment لعرض درجة الحرارة
الدائرة الكهربية :


البرنامج وبه جميع التعليقات :
كود:
/*Project: Temperature display and controller using two 7 segment and LM35 Connection as in QL200 : segments connected to PORTD-Common Anodes :RA4>tens & RA5>ones LED : connected to RB0 Buzzer :connected to RC2 MCU : PIC16F877A MikroC PRO ENG.F.ABDELAZIZ http://www.eeecb.com/vb/index.php */ //---------------------------------------------------------------------------------------------------------- //define the table of constant 0-9 (mask) const char TABLE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; unsigned int result=0x00; //define ADC convert result register unsigned short i; // for loop counter void init(); //I/O PORT initialize function declare void display(int result); //display function declare //--------------------------------------------------------------------------------------------------------------- //main program void main() { init(); //call initialize function while(1) { result=0x00; //clear the convert result result = ADC_Read(0);// read and stor ADCresult as "0-1023" //result=result/2; // covert from "0-1023" to "temperature in degree result=result/2.05; // exact conversion from "0-1023" to "temperature in degree display(result); //call display function // Temperature controller part if(result>75) PORTB.B0=1; else PORTB.B0=0; // LED if(result>85) PORTC.B2=1; else PORTC.B2=0;//Buzzer } } //----------------------------------------------- //initialize function void init() { ADCON1=0X8E; //set RA0 pin > ADC input ,the others general I/O TRISA=0X01; //set RA0 INPUT,the others OUTPUT TRISD=0X00; //set D PORT all OUTPUT TRISB.B0=0; //For LED TRISC.B2=0; //For Buzzer PORTD=0XFF; //close all display } //----------------------------------------------- //display function void display(int result) { int TEN,ONE,temp; //define 3 temporary variable temp=result; //temporary keep AD convert result TEN = temp/10 ; //get display tens bit ONE = (temp % 10) ; //get display ones bit //----------------------------- for (i = 0; i<=50; i++) { PORTD=TABLE[TEN]; //get the display tens bit code from table PORTA=0x2F; //RA4 OUTPUT low,light tens bit display Delay_ms(1); //delay some time,ensure display brightness PORTD=TABLE[ONE]; //get the display ones bit code from table PORTA=0x1F; //RA5 OUTPUT low,light ones bit display Delay_ms(1); //delay some time,ensure display brightness } //------------------------------------------- }

اعلانات

medo30975
:: مهندس ::
تاريخ التسجيل: May 2009
المشاركات: 2
نشاط [ medo30975 ]
قوة السمعة:0
قديم 23-09-2013, 11:58 AM المشاركة 2   
افتراضي


هل يمكن مساعدتى فى هذا الكود
الادوات المستخدمة
pic 16f877a
ds18b20
common anode 4digit 7segment
mikroc pro for pic
المشكلة عدم ظهور اى نتيجة على العرض
------------------------------------------------------------
/*
'************************************************* ******************************
' Lesson nr.14:
' Digital thermometer with DS18B20 and 7- Segments.
' Done by:
' Aureliu Raducu Macovei, 2010.
' Description:
' In this experiment we will work with one-wire communication.
' The thermal sensor used is "DS18B20" and measured value is displayed
' on the 7-segment digits. PORTB will be used for character
' (RB0=a,RB1=b...RB6=g,RB7=dp)and for digits RA0=digit1...RA3=digit4.
' Data wire from DS18B20 is conected to RA4.
' Test configuration:
' MCU: PIC16F628A
' Test.Board: WB-106 Breadboard 2420 dots
' SW: MikroC PRO for PIC 2010 (version v4.15)
' Configuration Word
' Oscillator: INTOSC:I/O on RA.6, I/O on RA.7
' Watchdog Timer: OFF
' Power up Timer: Disabled
' Master Clear Enable: Enabled
' Browun Out Detect: Enabled
' Low Voltage Program: Disabled
' Data EE Read Protect: Disabled
' Code Protect: OFF
'************************************************* ******************************
*/
unsigned short i, DD0=0xBF, DD1=0xBF,DD2=0xBF, DD3 =0xC6, N_Flag;
unsigned temp_value=0; // Variable to store temperature register value
unsigned short mask(unsigned short num) // Mask for 7 segment common cathode;
{
switch (num)
{
case 0 : return 0xC0; // 0;
case 1 : return 0xF9; // 1;
case 2 : return 0xA4; // 2;
case 3 : return 0xB0; // 3;
case 4 : return 0x99; // 4;
case 5 : return 0x92; // 5;
case 6 : return 0x82; // 6;
case 7 : return 0xF8; // 7;
case 8 : return 0x80; // 8;
case 9 : return 0x90; // 9;
case 10 : return 0xBF; // Symbol '-'
case 11 : return 0xC6; // Symbol C
case 12 : return 0xFF; // Blank
} //case end
}

void display_temp(short DD0, short DD1, short DD2, short DD3)
{
for (i = 0; i<=4; i++)
{
PORTC = DD3;
RA0_bit = 1; // Select C Digit;
RA1_bit = 0;
RA2_bit = 0;
RA3_bit = 0;
delay_ms(700);
PORTC = DD0;
RA0_bit = 0;
RA1_bit = 1; // Select Ones Digit;
RA2_bit = 0;
RA3_bit = 0;
delay_ms(700);
PORTC = DD1;
RA0_bit = 0;
RA1_bit = 0;
RA2_bit = 1; // Select Tens Digit;
RA3_bit = 0;
delay_ms(700);
PORTC = DD2;
RA0_bit = 0;
RA1_bit = 0;
RA2_bit = 0 ;
RA3_bit = 1; // Select +/- Digit;
delay_ms(700);
}return;
}

void DS18B20() //Perform temperature reading
{
Display_temp(DD0, DD1, DD2, DD3);
Ow_Reset(&PORTA, 4); // Onewire reset signal
Ow_Write(&PORTA, 4, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 4, 0x44); // Issue command CONVERT_T
Display_temp(DD0, DD1, DD2, DD3);
Ow_Reset(&PORTA, 4);
Ow_Write(&PORTA, 4, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 4, 0xBE); // Issue command READ_SCRATCHPAD
Display_temp(DD0, DD1, DD2, DD3);
// Next Read Temperature
temp_value = Ow_Read(&PORTA, 4); // Read Byte 0 from Scratchpad
temp_value = (Ow_Read(&PORTA, 4) << 8) + temp_value; // Then read Byte 1 from
// Scratchpad and shift
// 8 bit left and add the Byte 0
if (temp_value & 0x8000) {
temp_value = ~temp_value + 1;
N_Flag = 1; // Temp is -ive
}
if (temp_value & 0x0001) temp_value += 1; // 0.5 round to 1
temp_value = temp_value >> 4 ; //<<< // 1 for DS1820 and
// 4 for DS18B20;
}

void main()
{
CMCON |= 7; // Disable Comparators
TRISC = 0; // Set PORTB direction to be output
PORTC = 0; // Turn OFF LEDs on PORTB
PORTA = 0;
TRISA0_bit = 0; // RA.0 to RA3 Output
TRISA1_bit = 0;
TRISA2_bit = 0;
TRISA3_bit = 0;

do { //--- main loop
N_Flag = 0; // Reset Temp Flag
DS18B20();
DD0 = temp_value%10; // Extract Ones Digit
DD0 = mask(DD0);
DD1 = (temp_value/10)%10; // Extract Tens Digit
DD1 = mask(DD1);
DD2 = temp_value/100; // Extract Hundred digit
if (N_Flag == 1) DD2=0x0A; // DD2 10 ??
else if (DD2 == 0) DD2 = 0x0D; // DD2 13 ??
DD2 = mask(DD2);
display_temp(DD0, DD1, DD2, DD3); // Infinite loop;
} while (1);
}

ولك جزيل الشكر

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

الصورة الرمزية المهندس أحمد1
المهندس أحمد1
:: مهندس متواجد ::
تاريخ التسجيل: Sep 2010
الدولة: مصر-أسيوط-ديروط
المشاركات: 159
نشاط [ المهندس أحمد1 ]
قوة السمعة:0
قديم 24-09-2013, 04:35 PM المشاركة 3   
افتراضي


هناك مشكلة فى البروتس وهو ان الترانزستورين يعملان دائما سواء كان مطبق عليهم HIGH or LOW لذلك يظهر رقم واحد على كلا من العارضتين.


عبدالله نعمان
:: مهندس متواجد ::
تاريخ التسجيل: May 2006
المشاركات: 176
نشاط [ عبدالله نعمان ]
قوة السمعة:0
قديم 12-03-2016, 05:33 PM المشاركة 4   
افتراضي


بارك الله فيك وزادك علما

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2024