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

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

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 17-05-2018, 03:44 AM المشاركة 1   
افتراضي اريد مساعده في كود للتعامل مع حساس الرطوبه DHT11 Twitter FaceBook Google+



السلام عليكم ورحمه الله
كل عام وانتم بخير ..

لو سمحتو اريد مساعده في كود للتعامل مع حساس الرطوبه DHT11

حيث سيتم ادراجه مع مشروع انا اقوم بالعمل عليه الأن وهو فقاسه للبيض الدجاج ....

ولقد تابعت مشروع لأخونا "" مشتاق الله .. وللأسف لم يكتمل الموضوع ..
ايضااا عملت محولات كثيره في البحث في جوجل .. ولكن لم اتوصل لشئ مفيد ..

برجاء المساعده حتي لو بمثال صغير في كيفيه قرأه البايتات من حساس الرطوبه DHT11 ..

للعلم اللغه المستخدمه "" C "" مع المترجم "" ميكرو سي برو فور بيك

وايضااا البيك المستخدم "" 16F877A

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

اعلانات

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 18-05-2018, 04:55 AM المشاركة 2   
افتراضي السلام عليكم ورحمه الله


لقد حصلت علي هذا الكود من المكتبه الخاصه بالميكرو سي برو ..

وهي تعمل جيدااا علي ميكروكنترولر "" 16F628A""

هذا هو الكود ..
كود:
   /*
 Project: Temperature and humidity measurements using DHT11
 MCU: PIC16F628A
 Clock: 4.0MHz external resonator
 MCLR is enabled
 Date: Jan 10, 2012
 Written by: Rajendra Bhatt (www.embedded-lab.com)
*/

// LCD module 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;

sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;

void StartSignal(){
  DataDir = 0;     // Data port is output
  Data    = 0;
  Delay_ms(25);
  Data    = 1;
  Delay_us(30);
  DataDir = 1;     // Data port is input

}

unsigned short CheckResponse(){
  TOUT = 0;
  TMR2 = 0;
  T2CON.TMR2ON = 1;      // start timer
  while(!Data && !TOUT);
  if (TOUT) return 0;
  else {
   TMR2 = 0;
   while(Data && !TOUT);
   if (TOUT) return 0;
   else {
    T2CON.TMR2ON = 0;
    return 1;
   }
  }
}

unsigned short ReadByte(){
  unsigned short num = 0, t;
  DataDir = 1;
  for (i=0; i<8; i++){
   while(!Data);
   TMR2 = 0;
   T2CON.TMR2ON = 1;
   while(Data);
   T2CON.TMR2ON = 0;
   if(TMR2 > 80) num |= 1<<(7-i);  // If time > 40us, Data is 1
  }
  return num;
}

void interrupt(){
  if(PIR1.TMR2IF){
   TOUT = 1;
   T2CON.TMR2ON = 0; // stop timer
   PIR1.TMR2IF  = 0; // Clear TMR0 interrupt flag
  }
}

void main() {
  unsigned short check;
  TRISB = 0b00000000;
  PORTB = 0;
  TRISA = 0b00100001;
  CMCON = 7;
  INTCON.GIE = 1;    //Enable global interrupt
  INTCON.PEIE = 1;   //Enable peripheral interrupt
  // Configure Timer2 module
  PIE1.TMR2IE = 1;  // Enable Timer2 interrupt
  T2CON = 0;        // Prescaler 1:1, and Timer2 is off initially
  PIR1.TMR2IF =0;   // Clear TMR INT Flag bit
  TMR2 = 0;
  Lcd_Init();
  Lcd_Cmd(_Lcd_Clear);
  Lcd_Cmd(_LCD_CURSOR_OFF);

  do {
    Delay_ms(1000);
    StartSignal();
    check = CheckResponse();
    if (!check) {
     Lcd_Cmd(_Lcd_Clear);
     Lcd_Out(1, 1, "No response");
     Lcd_Out(2, 1, "from the sensor");
    }
    else{

     RH_Byte1 = ReadByte();
     RH_Byte2 = ReadByte();
     T_Byte1 = ReadByte();
     T_Byte2 = ReadByte();
     CheckSum = ReadByte();
     // Check for error in Data reception
     if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
     {
      message1[7]  = T_Byte1/10 + 48;
      message1[8]  = T_Byte1%10 + 48;
      message1[10] = T_Byte2/10 + 48;
      message2[7]  = RH_Byte1/10 + 48;
      message2[8]  = RH_Byte1%10 + 48;
      message2[10] = RH_Byte2/10 + 48;
      message1[11] = 223;     // Degree symbol
      Lcd_Cmd(_Lcd_Clear);
      Lcd_Out(1, 1, message1);
      Lcd_Out(2, 1, message2);
      }

      else{
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1, "Checksum Error!");
       Lcd_Out(2, 1, "Trying Again ...");
      }
    }

  }while(1);
}

وهذه هي الدائره الخاصه بها ...
[IMG][/IMG]


ما اريده هنا تغير الميكرو الي PIC16F877A

لأن لا يتوفر عندي الميكرو PIC16F628A


سؤال هل اعدادات التايمر الداخلي لعائله PIC16FXXXX تتوافق مع بعضها أم يوجد اختلاف

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

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 18-05-2018, 07:09 AM المشاركة 3   
افتراضي السلام عليكم ورحمه الله


حصلت علي هذا المشروع وهو مثال لكيفيه القرأه من حساس الرطوبه DHT11

ولكن عن تنفيذ الدائره والكود علي المحكاه لا يقرأ الحساس ...








كود:
   // LCD module connections
 sbit LCD_RS at RD2_bit;
 sbit LCD_EN at RD3_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 TRISD2_bit;
 sbit LCD_EN_Direction at TRISD3_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
 unsigned char Check, T_byte1, T_byte2,
 RH_byte1, RH_byte2, Ch ;
 unsigned Temp, RH, Sum ;
void StartSignal(){
 TRISD.B0 = 0; //Configure RD0 as output
 PORTD.B0 = 0; //RD0 sends 0 to the sensor
 delay_ms(18);
 PORTD.B0 = 1; //RD0 sends 1 to the sensor
 delay_us(30);
 TRISD.B0 = 1; //Configure RD0 as input
 }
 //////////////////////////////
 void CheckResponse(){
 Check = 0;
 delay_us(40);
 if (PORTD.B0 == 0){
 delay_us(80);
 if (PORTD.B0 == 1) Check = 1; delay_us(40);}
 }
 //////////////////////////////
 char ReadData(){
 char i, j;
 for(j = 0; j < 8; j++){
 while(!PORTD.B0); //Wait until PORTD.F0 goes HIGH
 delay_us(30);
 if(PORTD.B0 == 0)
 i&= ~(1<<(7 - j)); //Clear bit (7-b)
 else {i|= (1 << (7 - j)); //Set bit (7-b)
 while(PORTD.B0);} //Wait until PORTD.F0 goes LOW
 }
 return i;
 }
 //////////////////////////////
void main() {
 TRISD.F1 = 0;
 Lcd_Init();
 Lcd_Cmd(_LCD_CURSOR_OFF); // cursor off
 Lcd_Cmd(_LCD_CLEAR); // clear LCD
 while(1){
 StartSignal();
 CheckResponse();
 if(Check == 1){
 RH_byte1 = ReadData();
 RH_byte2 = ReadData();
 T_byte1 = ReadData();
 T_byte2 = ReadData();
 Sum = ReadData();
 if(Sum == ((RH_byte1+RH_byte2+T_byte1+T_byte2) & 0XFF)){
 Temp = T_byte1;
 RH = RH_byte1;
 Lcd_Out(1, 6, "Temp: C");
 Lcd_Out(2, 2, "Humidity: %");
 LCD_Chr(1, 12, 48 + ((Temp / 10) % 10));
 LCD_Chr(1, 13, 48 + (Temp % 10));
 LCD_Chr(2, 12, 48 + ((RH / 10) % 10));
 LCD_Chr(2, 13, 48 + (RH % 10));
 }
 else{
 Lcd_Cmd(_LCD_CURSOR_OFF); // cursor off
 Lcd_Cmd(_LCD_CLEAR); // clear LCD
 Lcd_Out(1, 1, "Check sum error");}
 }
 else {
 Lcd_Out(1, 3, "No response");
 Lcd_Out(2, 1, "from the sensor");
 }
 delay_ms(1000);
 }
}


اعتقد ان الخلل في ضبط الوقت المناسب لقرأه البايتات من الحساس ..


برجاء المساعده للضروره .....


مرجع ورابط المشروع الأصلي ...

http://microcontrollerslab.com/dht11...terfacing-pic/




ارجوو الأهتمام وشكرااا للجميع


محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 18-05-2018, 02:42 PM المشاركة 4   
افتراضي


لقد حصلت علي هذا الكود من المكتبه الخاصه بالميكرو سي برو ..

وهي تعمل جيدااا علي ميكروكنترولر "" 16F628A""

هذا هو الكود ..
كود:
   /*
 Project: Temperature and humidity measurements using DHT11
 MCU: PIC16F628A
 Clock: 4.0MHz external resonator
 MCLR is enabled
 Date: Jan 10, 2012
 Written by: Rajendra Bhatt (www.embedded-lab.com)
*/

// LCD module 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;

sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;

void StartSignal(){
  DataDir = 0;     // Data port is output
  Data    = 0;
  Delay_ms(25);
  Data    = 1;
  Delay_us(30);
  DataDir = 1;     // Data port is input

}

unsigned short CheckResponse(){
  TOUT = 0;
  TMR2 = 0;
  T2CON.TMR2ON = 1;      // start timer
  while(!Data && !TOUT);
  if (TOUT) return 0;
  else {
   TMR2 = 0;
   while(Data && !TOUT);
   if (TOUT) return 0;
   else {
    T2CON.TMR2ON = 0;
    return 1;
   }
  }
}

unsigned short ReadByte(){
  unsigned short num = 0, t;
  DataDir = 1;
  for (i=0; i<8; i++){
   while(!Data);
   TMR2 = 0;
   T2CON.TMR2ON = 1;
   while(Data);
   T2CON.TMR2ON = 0;
   if(TMR2 > 80) num |= 1<<(7-i);  // If time > 40us, Data is 1
  }
  return num;
}

void interrupt(){
  if(PIR1.TMR2IF){
   TOUT = 1;
   T2CON.TMR2ON = 0; // stop timer
   PIR1.TMR2IF  = 0; // Clear TMR0 interrupt flag
  }
}

void main() {
  unsigned short check;
  TRISB = 0b00000000;
  PORTB = 0;
  TRISA = 0b00100001;
  CMCON = 7;
  INTCON.GIE = 1;    //Enable global interrupt
  INTCON.PEIE = 1;   //Enable peripheral interrupt
  // Configure Timer2 module
  PIE1.TMR2IE = 1;  // Enable Timer2 interrupt
  T2CON = 0;        // Prescaler 1:1, and Timer2 is off initially
  PIR1.TMR2IF =0;   // Clear TMR INT Flag bit
  TMR2 = 0;
  Lcd_Init();
  Lcd_Cmd(_Lcd_Clear);
  Lcd_Cmd(_LCD_CURSOR_OFF);

  do {
    Delay_ms(1000);
    StartSignal();
    check = CheckResponse();
    if (!check) {
     Lcd_Cmd(_Lcd_Clear);
     Lcd_Out(1, 1, "No response");
     Lcd_Out(2, 1, "from the sensor");
    }
    else{

     RH_Byte1 = ReadByte();
     RH_Byte2 = ReadByte();
     T_Byte1 = ReadByte();
     T_Byte2 = ReadByte();
     CheckSum = ReadByte();
     // Check for error in Data reception
     if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
     {
      message1[7]  = T_Byte1/10 + 48;
      message1[8]  = T_Byte1%10 + 48;
      message1[10] = T_Byte2/10 + 48;
      message2[7]  = RH_Byte1/10 + 48;
      message2[8]  = RH_Byte1%10 + 48;
      message2[10] = RH_Byte2/10 + 48;
      message1[11] = 223;     // Degree symbol
      Lcd_Cmd(_Lcd_Clear);
      Lcd_Out(1, 1, message1);
      Lcd_Out(2, 1, message2);
      }

      else{
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1, "Checksum Error!");
       Lcd_Out(2, 1, "Trying Again ...");
      }
    }

  }while(1);
}
وهذه هي الدائره الخاصه بها ...
[IMG][/IMG]


ما اريده هنا تغير الميكرو الي PIC16F877A

لأن لا يتوفر عندي الميكرو PIC16F628A


سؤال هل اعدادات التايمر الداخلي لعائله PIC16FXXXX تتوافق مع بعضها أم يوجد اختلاف
السلام عليكم
أخي عبدالله
1- هذا المثال موجود في الموقع المسجل على صورة الدائرة .
هو مثال مشهور لاحظت أن كثير من المواقع تستند عليه .
رابط المثال + شرح طريقة عمل الحساس:
http://embedded-lab.com/blog/measure...crocontroller/

2- لتحويل الكود إلى Pic16F877A يكفي استبدال التعليمة ; CMCON = 7
بالتعليمة ; ADCON1 = 7 والتي تجعل مداخل المنفذ A دخول ديجيتال .
ذلك أن الطرف RA0 هو طرف الاتصال بين البيك والحساس في هذا الكود.
ويستحسن كذلك تعديل التعليمة ; TRISA = 0b00100001 إلى التعليمة :
; TRISA.B0 = 1

كود:
/*
 Project: Temperature and humidity measurements using DHT11
 MCU: PIC16F877A
 Clock: 4.0MHz external resonator

*/

// LCD module 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;

sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;

void StartSignal(){
  DataDir = 0;     // Data port is output
  Data    = 0;
  Delay_ms(25);
  Data    = 1;
  Delay_us(30);
  DataDir = 1;     // Data port is input

}

unsigned short CheckResponse(){
  TOUT = 0;
  TMR2 = 0;
  T2CON.TMR2ON = 1;      // start timer
  while(!Data && !TOUT);
  if (TOUT) return 0;
  else {
   TMR2 = 0;
   while(Data && !TOUT);
   if (TOUT) return 0;
   else {
    T2CON.TMR2ON = 0;
    return 1;
   }
  }
}

unsigned short ReadByte(){
  unsigned short num = 0, t;
  DataDir = 1;
  for (i=0; i<8; i++){
   while(!Data);
   TMR2 = 0;
   T2CON.TMR2ON = 1;
   while(Data);
   T2CON.TMR2ON = 0;
   if(TMR2 > 40) num |= 1<<(7-i);  // If time > 40us, Data is 1
  }
  return num;
}

void interrupt(){
  if(PIR1.TMR2IF){
   TOUT = 1;
   T2CON.TMR2ON = 0; // stop timer
   PIR1.TMR2IF  = 0; // Clear TMR0 interrupt flag
  }
}

void main() {
  unsigned short check;
  TRISB = 0b00000000;
  PORTB = 0;
  TRISA.B0 = 1;
  ADCON1 = 7;
  INTCON.GIE = 1;    //Enable global interrupt
  INTCON.PEIE = 1;   //Enable peripheral interrupt
  // Configure Timer2 module
  PIE1.TMR2IE = 1;  // Enable Timer2 interrupt
  T2CON = 0;        // Prescaler 1:1, and Timer2 is off initially
  PIR1.TMR2IF =0;   // Clear TMR INT Flag bit
  TMR2 = 0;
  Lcd_Init();
  Lcd_Cmd(_Lcd_Clear);
  Lcd_Cmd(_LCD_CURSOR_OFF);

  do {
    Delay_ms(1000);
    StartSignal();
    check = CheckResponse();
    if (!check) {
     Lcd_Cmd(_Lcd_Clear);
     Lcd_Out(1, 1, "No response");
     Lcd_Out(2, 1, "from the sensor");
    }
    else{
    
     RH_Byte1 = ReadByte();
     RH_Byte2 = ReadByte();
     T_Byte1 = ReadByte();
     T_Byte2 = ReadByte();
     CheckSum = ReadByte();
     // Check for error in Data reception
     if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
     {
      message1[7]  = T_Byte1/10 + 48;
      message1[8]  = T_Byte1%10 + 48;
      message1[10] = T_Byte2/10 + 48;
      message2[7]  = RH_Byte1/10 + 48;
      message2[8]  = RH_Byte1%10 + 48;
      message2[10] = RH_Byte2/10 + 48;
      message1[11] = 223;     // Degree symbol
      Lcd_Cmd(_Lcd_Clear);
      Lcd_Out(1, 1, message1);
      Lcd_Out(2, 1, message2);
      }
      
      else{
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1, "Checksum Error!");
       Lcd_Out(2, 1, "Trying Again ...");
      }
    }

  }while(1);
}
3- Pic16F628A و Pic16F877A ينتميان لعائلة واحدة هي عائلةMid-Range
واعدادات التايمرات الداخلية لها مثل التايمر2 المستخدم في هذا الكود تتم بنفس الطريقة .


التعديل الأخير تم بواسطة : محمد إلياس بتاريخ 18-05-2018 الساعة 04:05 PM

الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 19-05-2018, 01:57 AM المشاركة 5   
افتراضي السلام عليكم ورحمه الله


السلام عليكم
أخي عبدالله
1- هذا المثال موجود في الموقع المسجل على صورة الدائرة .
هو مثال مشهور لاحظت أن كثير من المواقع تستند عليه .
رابط المثال + شرح طريقة عمل الحساس:
http://embedded-lab.com/blog/measure...crocontroller/

2- لتحويل الكود إلى Pic16F877A يكفي استبدال التعليمة ; CMCON = 7
بالتعليمة ; ADCON1 = 7 والتي تجعل مداخل المنفذ A دخول ديجيتال .
ذلك أن الطرف RA0 هو طرف الاتصال بين البيك والحساس في هذا الكود.
ويستحسن كذلك تعديل التعليمة ; TRISA = 0b00100001 إلى التعليمة :
; TRISA.B0 = 1


}[/code]3- Pic16F628A و Pic16F877A ينتميان لعائلة واحدة هي عائلةMid-Range
واعدادات التايمرات الداخلية لها مثل التايمر2 المستخدم في هذا الكود تتم بنفس الطريقة .


السلام عليكم ورحمه الله

شكرااا جزيلا اخي علي اهتمامك ..

لقد اجريت محاوله وتجربه الكود وكانت النتيجه انه يوجد خطأ في قرأه الحساس ...






ارجو منك حل هذا الخطأ .. المشكله هي في ضبط وقت التايمر لكي يتوافق مع قرأه البايتات من الحساس .... ونحتاج هنا لتزامن الوقت جيدااا بين الحساس والميكرو كنترولر لكي تكون عمليه القرأه صحيحه ..

برجاااء حل هذه المشكله ...

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


محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 19-05-2018, 11:03 AM المشاركة 6   
افتراضي


السلام عليكم
أخي عبدالله ترجمت الكود بكريستالة 4 ميغا وبهذه الإعدادات :

وحاكيته على بروتوس 8.5 فلم ألحظ أي خطأ والقراءة كانت صحيحة:

وهذا ملف الكود والمحاكاة:
https://up.top4top.net/downloadf-869y7ycw1-rar.html

من جهة ثانية هذا موضوع مشابه بالقرية
يتضمن مثالا بالميكروسي بعدة بيكات من بينها Pic16F877A أرجو أن يفيدك:
http://www.qariya.info/vb/showthread.php?t=174639
رابط مباشر:
http://elecnote.blogspot.com/2015/10...imulation.html


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 20-05-2018, 03:40 AM المشاركة 7   
افتراضي السلام عليكم ورحمه الله


السلام عليكم
أخي عبدالله ترجمت الكود بكريستالة 4 ميغا وبهذه الإعدادات :

وحاكيته على بروتوس 8.5 فلم ألحظ أي خطأ والقراءة كانت صحيحة:

وهذا ملف الكود والمحاكاة:
https://up.top4top.net/downloadf-869y7ycw1-rar.html

من جهة ثانية هذا موضوع مشابه بالقرية
يتضمن مثالا بالميكروسي بعدة بيكات من بينها Pic16F877A أرجو أن يفيدك:
http://www.qariya.info/vb/showthread.php?t=174639
رابط مباشر:
http://elecnote.blogspot.com/2015/10...imulation.html

جزاك الله خيراا
وشكرااا جزيلا ..

لقد توصلت الي ما احتاجه من هذه المشاركه ..

للعلم أخي رابط الكود والمحكاه لا يعمل ..

اشكرك اخي علي اهتمامك ..
سوف اقوم بالعمل علي هذا الكود لدمجه في مشروع كامل للتحكم في درجه الحراره والرطوبه .... ..



محمد إلياس
:: مهندس جيد ::
تاريخ التسجيل: Jan 2017
المشاركات: 230
نشاط [ محمد إلياس ]
قوة السمعة:0
قديم 20-05-2018, 10:44 AM المشاركة 8   
افتراضي


جزاك الله خيراا
وشكرااا جزيلا ..
لقد توصلت الي ما احتاجه من هذه المشاركه ..
للعلم أخي رابط الكود والمحكاه لا يعمل ..
اشكرك اخي علي اهتمامك ..
سوف اقوم بالعمل علي هذا الكود لدمجه في مشروع كامل للتحكم في درجه الحراره والرطوبه .... ..
وجازاك بمثله أخي الكريم

أخي جربت الرابط وهو يعمل وعند فتحه يعطي هذه الصورة:


شكرا لأنك أخبرتني بهذا الأمر وسأبحث عن موقع أخر للتحميل لا بشترط التسجيل.


عموما هذا تذكير بالكود لمن يريد من الإخوة المحاكاة على بروتوس:
كود:
 /*
 Project: Temperature and humidity measurements using DHT11
 MCU: PIC16F877A
 Clock: 4.0MHz

*/

// LCD module 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;

sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;

void StartSignal(){
  DataDir = 0;     // Data port is output
  Data    = 0;
  Delay_ms(25);
  Data    = 1;
  Delay_us(30);
  DataDir = 1;     // Data port is input

}

unsigned short CheckResponse(){
  TOUT = 0;
  TMR2 = 0;
  T2CON.TMR2ON = 1;      // start timer
  while(!Data && !TOUT);
  if (TOUT) return 0;
  else {
   TMR2 = 0;
   while(Data && !TOUT);
   if (TOUT) return 0;
   else {
    T2CON.TMR2ON = 0;
    return 1;
   }
  }
}

unsigned short ReadByte(){
  unsigned short num = 0, t;
  DataDir = 1;
  for (i=0; i<8; i++){
   while(!Data);
   TMR2 = 0;
   T2CON.TMR2ON = 1;
   while(Data);
   T2CON.TMR2ON = 0;
   if(TMR2 > 40) num |= 1<<(7-i);  // If time > 40us, Data is 1
  }
  return num;
}

void interrupt(){
  if(PIR1.TMR2IF){
   TOUT = 1;
   T2CON.TMR2ON = 0; // stop timer
   PIR1.TMR2IF  = 0; // Clear TMR interrupt flag
  }
}

void main() {
  unsigned short check;
  TRISB = 0;
  PORTB = 0;
  TRISA.B0 = 1;
  ADCON1 = 7;
  INTCON.GIE = 1;    //Enable global interrupt
  INTCON.PEIE = 1;   //Enable peripheral interrupt
  // Configure Timer2 module
  PIE1.TMR2IE = 1;  // Enable Timer2 interrupt
  T2CON = 0;        // Prescaler 1:1, and Timer2 is off initially
  PIR1.TMR2IF =0;   // Clear TMR INT Flag bit
  TMR2 = 0;
  Lcd_Init();
  Lcd_Cmd(_Lcd_Clear);
  Lcd_Cmd(_LCD_CURSOR_OFF);

  do {
    Delay_ms(1000);
    StartSignal();
    check = CheckResponse();
    if (!check) {
     Lcd_Cmd(_Lcd_Clear);
     Lcd_Out(1, 1, "No response");
     Lcd_Out(2, 1, "from the sensor");
    }
    else{
    
     RH_Byte1 = ReadByte();
     RH_Byte2 = ReadByte();
     T_Byte1 = ReadByte();
     T_Byte2 = ReadByte();
     CheckSum = ReadByte();
     // Check for error in Data reception
     if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
     {
      message1[7]  = T_Byte1/10 + 48;
      message1[8]  = T_Byte1%10 + 48;
      message1[10] = T_Byte2/10 + 48;
      message2[7]  = RH_Byte1/10 + 48;
      message2[8]  = RH_Byte1%10 + 48;
      message2[10] = RH_Byte2/10 + 48;
      message1[11] = 223;     // Degree symbol
      Lcd_Cmd(_Lcd_Clear);
      Lcd_Out(1, 1, message1);
      Lcd_Out(2, 1, message2);
      }
      
      else{
       Lcd_Cmd(_Lcd_Clear);
       Lcd_Out(1, 1, "Checksum Error!");
       Lcd_Out(2, 1, "Trying Again ...");
      }
    }

  }while(1);
}
وهذا ملف Hex :
كود:
:02000000AC2929
:10000800FF00030E83018316B3000A08B4008A01B7
:1000180083128C1C13280130A00012118C10831637
:0E00280034088A00330E8300FF0E7F0E09009D
:10003600103083120313FD00FD0B1F28000008007B
:0400460000000800AE
:10004A00083083120313FC002330FD00FD0B2B281C
:06005A00FC0B2B2808003E
:1000600083160313BA1B3728831286133928831289
:10007000861783163A1B3F288312061341288312E2
:1000800006178316BA1A4728831286124928831244
:10009000861683163A1A4F288312061251288312A5
:1000A00006166C18552806155628061186152320A5
:1000B00086118316BA195F2883128613612883126A
:1000C000861783163A196728831206136928831244
:1000D00006178316BA186F288312861271288312A6
:1000E000861683163A187728831206127928831207
:1000F00006166C187D2806157E2806118615232005
:0E01000086116C1C8528252086281B200800EF
:0E010E00831203136B088A006A08820008003F
:10011C00831203136C1083163908BA0030206C1448
:02012C000800C9
:10012E0083120313A001910112150518A2282008AD
:10013E00031DA2289C2820080319A728F001B62821
:10014E009101051CAE282008031DAE28A828200802
:10015E000319B328F001B62812110130F00008007F
:10016E00C928803083160313B500DC28C030B500D3
:10017E00DC289430B500DC28D430B500DC28803083
:10018E00B500DC28831603133508013A0319B82885
:10019E003508023A0319BD283508033A0319C02859
:1001AE003508043A0319C328C6283603F00035086B
:1001BE00F0077008B5007008BA0030206C10831676
:1001CE00B80138083707840000080319F7283808E3
:1001DE00370784000008B9008E208316B80AE82875
:0601EE0083126C140800EE
:1001F40083160313B50105148312ED0108306D0253
:100204000318252905180729042991011215051C2D
:100214000C29092912111108283C031822296D08F8
:10022400073CF0007008F1000130F0007108031978
:100234001F29F00D7010FF3E192970088316B504AC
:0E0244008312ED0A002983163508F000080029
:1002520087208A110A128000840AEA0A0319EB0A2B
:08026200F003031D2929080027
:10026A0083120313F8010830FC00700DF80D7408AE
:10027A00F80203184229F8070310F00DFC0B3A297B
:02028A0008006A
:10028C00831603130510831205102130FC00763001
:10029C00FD00FD0B4F29FC0B4F2900000514093004
:1002AC00FD00FD0B57290000000083160514080003
:1002BC008316031386110611061286120613861373
:1002CC008312861106118613061386120612252038
:1002DC002520252086160616861523208611252016
:1002EC00861523208611252086152320861125208E
:1002FC0006128615232086112520861523208611AB
:10030C00861286178615232086112520861306163D
:10031C00861523208611061286152320861125208A
:10032C008615232086110616861523208611252076
:10033C0006128615232086118617061786160616B2
:0C034C0086152320861125206C14080063
:10035800E02283160313860183128601831605148F
:1003680007309F008B170B178C14831292018C1087
:1003780091015E2101308316BA0030200C308316BB
:10038800BA0030200630FB001330FC00AD30FD0011
:10039800FD0BCC29FC0BCC29FB0BCC290000000061
:1003A800462197207008031DEE2901308316BA00F4
:1003B800302001308316B5000130B6002130B70077
:1003C800B72002308316B5000130B600A030B70060
:1003D800B7207F2AFA2070088312EF00FA207008ED
:1003E8008312EE00FA207008B200FA207008B100FB
:1003F800FA207008B00083126E086F07F100F2014E
:100408000318F20A83163208F1070318F20A3108B2
:10041800F1070318F20AFF307105F3007208F400BF
:100428000030F40500307406031D1C2A730870069A
:10043800031D6B2A0A30F4003208F00035213030F1
:100448007007D2000A30F40083163208F000352114
:100458007808F00030307007D3000A30F4008316B3
:100468003108F000352130307007D5000A30F4002B
:100478006F08F000352130307007C4000A30F400EE
:100488006F08F00035217808F00030307007C5009B
:100498000A30F4006E08F000352130307007C700CC
:1004A800DF30D60001308316BA00302001308316C1
:1004B800B5000130B6004B30B700B72002308316C4
:1004C800B5000130B6003D30B700B7207F2A0130B3
:1004D8008316BA00302001308316B5000130B6000B
:1004E8002D30B700B72002308316B5000130B600B2
:0A04F8005930B700B720C629802A4A
:1005C000203084004A3083120313F0008630EA00A2
:1005D0000230EB002921A030840010308312F0009B
:0C05E000D030EA000230EB0029210800B6
:02050C000034B9
:10050E004E346F34203472346534733470346F3437
:08051E006E34733465340034BF
:1005260043346834653463346B34733475346D34F2
:1005360020344534723472346F34723421340034CA
:10054600523448342034203420343D34203430347E
:0C05560030342E3430342034253400348E
:10056200543465346D34703420343D3420343034A6
:0C05720030342E34303420344334003454
:10057E0054347234793469346E34673420344134EF
:10058E006734613469346E3420342E342E342E3474
:02059E00003427
:1005A000663472346F346D34203474346834653496
:1005B0002034733465346E3473346F3472340034E1
:02400E000A2F77
:00000001FF
أما الدائرة و اعدادات الميكروسي فهي المرفقة في الرد السابق



علما بأن المثال هو مجرد كود قراءة الحرارة والرطوبة
لكن يمكن استخدام النتائج في أغراض اخرى للقياس او الضبط بناء على هذه المعطيات :
- المتغير الذي يخزن درجة الحرارة هو المتغير :T_Byte1
- المتغير الذي يخزن درجة الرطوبة هو المتغير :RH_Byte1
و جزء الكود الذي يمكن التعديل عليه هو دالة تحقق القياس وهو :
كود:
// Check for error in Data reception
     if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
     {
      // ....
       }
هذه مجرد طريقة

ربما توجد طرق أخرى أفضل.
وفقك الله أخي الكريم وبارك فيك..

احصائية الشكر والاعجاب - 0 شكراً, 0 عدم اعجاب, 1 اعجاب
اعجاب borda ( أعجبته المشاركة )
إضافة رد

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

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

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


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

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