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

   

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 07-05-2014, 09:42 PM المشاركة 9   
افتراضي



كود:
const char msg_day[]   ="input day:      ";
const char msg_week[]  ="input week:     ";
const char msg_month[] ="input month:    ";
const char msg_year[]  ="input year:     ";
const char msg_hour[]  ="input hour:     ";
const char msg_minute[]="input minute:   ";
const char msg_second[]="input second:   ";
const char system_24_12[]="system:         ";
خزن الرسائل في روم لان وضعنا في بدايه const طبعا هذه الرسائل من غير ممكن عرضها على شاشه اذن لابد من تحويله الى رام

وهذا الكود يخزن رساله في رام ومن ثم يعرضها
كود:
void show_msg(const char *message)
{
 for(x=0;x<16;x++)messgae_display[x]=message[x];
 lcd_out(1,1,messgae_display);
}
طبعا تكرار من 0 الى 16 لان ابعاد شاشه هي 16
وبهذه طريقه نستطيع عرض رساله
تلاحظون بلون أحمر وجود const يعني قيم ثابته ومخزونه في روم وكذلك *message وعلامه * تعني متغير message من نوع pointer اي يأخذ مصفوفه
او بأختصار نجعل مؤشر ذاكره في رام على اول عنصر لمتغير message
============================================

هذا كود نعرف مايكرو بأن هناك دوال موجوده ضمن البرنامج
كود:
void alarm_setting();
void check_prayer_Time();
لو لم نستخدم هذه طريقه فان مايكرو اذا كان ينفذ امر ما ثم أستدعى داله وكانت هذه داله تحت كود فأن مايكرو سيظهر رساله يقول لك بعد تعرفه على هذه داله

لذا اذا كان مايكرو ينفذ امر وأستدعى داله فأنه يجب ان تكون فوق داله

ولكن اذا عرفنا دوال فوق وقلنا للمايكرو عندك دوال ضمن البرنامج فان كومبايلر سوف يتعرف على هذه دوال حتى وان كتبتها في اسفل البرنامج
==============================================
كود:
void display_const_text()
{
  lcd_cmd(1);
  LCD_Chr(1,7,'-');
  LCD_Chr(1,10,'-');
  LCD_Out(2,1,"NOW:");
  LCD_Chr(2,7,':');
  LCD_Chr(2,10,':');
  LCD_Out(1,11,"20");

}
هنا سوف يتم عرض هذه الاحرف او كلمات في مواقع التي تم تحديدها في شاشه
==========================================

اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 07-05-2014, 09:47 PM المشاركة 10   
افتراضي


ندخل الى قائمه رئيسيه

كود:
cmcon=7;
الالغاء comparator

وهنا جعل جميع الاطراف ديجيتل
كود:
adcon1=0x0F;//pins as digital
كود:
osccon=0x70;
هذا ريجيستر لضبط التردد
وهنا تم ضبط تردد على 8 ميكا ويعمل على كرستاله خارجيه
=======================================

كود:
Lcd_Init();    تعريف شاشه                    // Initialize Lcd 
  Lcd_Cmd(_LCD_CURSOR_OFF);          //  اطفاء مؤشر  Cursor off
   display_const_text();عرض نص مثل now
==========================================
تعريف مداخل ومخارج
كود:
 buzzer_Dir=0;
   led_alarm_dir=0;
   sw_alarm_Direction=1;
   sw_alarm_stop=1;
   sw_dec_Direction=1;
   sw_inc_Direction=1;
   sw_set_Direction=1;
   clear_all_alarm_Direction=1;
   buzzer=0;
   led_alarm=0;
============================================
هنا يتم قراءه البيانات مخزونه في ايبروم وخزنها في مصفوفه prayer_alarm
كود:
 for(x=0;x<15;x++)prayer_alarm[x]=EEPROM_Read(x);
=============================================


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 07-05-2014 الساعة 09:51 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 07-05-2014, 10:12 PM المشاركة 11   
افتراضي


الان ندخل في لوب مستمر
هنا سوف يتم أختبار جميع سويجات هل تم ضغط عليها ام لا

كود:
if (  sw_set==0 ) // set switch
هذا سويج يستخدم لضبط الساعه

وهذا سويج لنقصان الرقم
كود:
else if (sw_dec == 0)

اما هذا سويج لزياده
كود:
 else if (sw_inc==0)
طبعا هذه مشروحه مع مكتبه ds1307

=========================================

كود:
else if (sw_alarm ==0) // alarm switch
                                {
                                  delay_ms(20);
                                  while(sw_alarm==0);
                                  delay_ms(20);
                                  lcd_cmd(1);
                                  cont2=1;
                                  lcd_out(1,1,"Fajr   ");
                                  hours_alarm=EEPROM_Read(5);
                                  minutes_alarm=EEPROM_Read(6);
                                  alarm_setting();
                                  display_const_text();
                                }
هنا يتم أختبار سويج انذار هل تم ضغط عليه اذا كان جواب نعم

هذا من اجل حل مشكله debounce كما انه لاينفذ طالما انت ضاغط على سويج
كود:
delay_ms(20);
                                  while(sw_alarm==0);
                                  delay_ms(20);
=======================================
كود:
lcd_cmd(1);
                                  cont2=1;
                                  lcd_out(1,1,"Fajr   ");
                                  hours_alarm=EEPROM_Read(5);
                                  minutes_alarm=EEPROM_Read(6);
وبعدها يمسح شاشه
ويجعل متغير cont2=1 وهذا متغير يحدد اي من وقت الصلاه الفجر او ظهر او ..
لذا cont2=1 معناها سوف يتم ضبط وقت الفجر
وبعدها سوف يظهر رساله Fajr للدلاله انه نريد ضبط وقت فجر
ثم نستدعي داله ضبط منبه
كود:
alarm_setting();
بعد ما ينتهي من ضبط المنبه لابد من أعاده عرض النص على شاشه
راجعو كود داله
كود:
display_const_text();
=============================================
كود:
 else if (sw_alarm_stop==0) // stop alarm switch
                                {
                                 delay_ms(250);
                                  buzzer=0;
                                  flag_alarm=0;
                                  stop_alarm=255;// stop alarm
                                }
هنا يختبر هل سويج sw_alarm_stop تم ضغط عليه
وهو يستخدم لايقاف منبه حيث يوقف منبه وصفر متغير خاص بأنذار
===========================================
كود:
 else if (clear_all_alarm==0) // clear_all_alarm switch
                                {
                                 delay_ms(250);
                                  for(x=0;x<5;x++)EEPROM_Write(x,255);
                                  delay_ms(250);
                                  for(x=0;x<5;x++)
                                                  {
                                                   prayer_alarm[x]=EEPROM_Read(x);
                                                   alarm[x]=0;
                                                  }
                                  flag_alarm=0;
                                  led_alarm=0;
                                }
هذا سويج يستخدم لايقاف جميع أنذار سواء كان للفجر او ظهر او ....
طبعا يكفي كتابه اي رقم عدا 100 في مواقع خمسه من ايبروم لماذا لانها خصصت لخزن flags لكي نعرف هل تم تشغيل منبه للفجر وظهر و...
طبعا انا خزنت رقم 100 للدلاله على انه تم تفعيل منبه وعكس ذلك منبه متوقف
===============================================
كود:
else if(kk ==255)
           {
            Show_Time(0,0,0,0,0,0,0,255);
            LCD_Out(1,1, txt_day);
            Lcd_Chr(1, 5, (day / 10)   + 48);    // Print tens digit of day variable
            Lcd_Chr(1, 6, (day % 10)   + 48);    // Print oness digit of day variable
            Lcd_Chr(1, 8, (month / 10) + 48);
            Lcd_Chr(1,9, (month % 10) + 48);
            Lcd_Chr(1,13, (year / 10)  + 48);
            Lcd_Chr(1,14, (year % 10)  + 48);

            Lcd_Chr(2, 5, (hours / 10)   + 48);
            Lcd_Chr(2, 6, (hours % 10)   + 48);
            Lcd_Chr(2, 8, (minutes / 10) + 48);
            Lcd_Chr(2,9, (minutes % 10) + 48);
            Lcd_Chr(2,11, (seconds / 10) + 48);
            Lcd_Chr(2,12, (seconds % 10) + 48);
            if(k_12_24==0)lcd_out(2,14,"AM");
            else if(k_12_24==1)lcd_out(2,14,"PM");
            else if(k_12_24==24)lcd_out(2,14," ");
          }
كود:
Show_Time(0,0,0,0,0,0,0,255);
هذا الكود لقراءه الوقت والتاريخ من متكامله ds1307
وبقيه الكود هو لاظهار البيانات على الشاشه
==========================================


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 07-05-2014, 10:28 PM المشاركة 12   
افتراضي


كود:
void alarm_setting()
هذه داله لضبط منبه
كود:
char cont=1 , address ;
تعريف متغيرات وجعلنا متغير cont=1 حتى يظهر لنا ساعات لكي يتم ضبطها
في ذاله ايضا يوجد سويجيات
كود:
 if (sw_alarm==0)
لاختيار اي صلاه تريد ضبط منبه عندها
مع أظهار رساله لكي يعلم مستخدم اي وقت للصلاه يريد ضبطها
كود:
if (sw_alarm==0) // alarm switch
                 {
                  delay_ms(250);
                  cont2++;  //Fajr
                  if(cont2==6)cont2=1;
                  if(cont2==1)lcd_out(1,1,"Fajr   ");
                  else if(cont2==2)lcd_out(1,1,"Dhuhr  ");
                  else if(cont2==3)lcd_out(1,1,"Asr    ");
                  else if(cont2==4)lcd_out(1,1,"Maghrib");
                  else if(cont2==5)lcd_out(1,1,"Isha   ");
                   hours_alarm=EEPROM_Read(2*(cont2-1)+5);
                   minutes_alarm=EEPROM_Read(2*(cont2-1)+6);
                 }
============================================
كود:
else if (sw_set==0) // set switch
                                {
                                  delay_ms(20);
                                  while(sw_set==0);
                                  delay_ms(20);
                                  cont++;
                                }
هذا سويج لخزن القيمه التي تم ضبطها
=============================================
كود:
  else  if (sw_inc==0) // inc switch
                         {
                           delay_ms(250);
                           if(cont==1){
                                         hours_alarm++;
                                         if(hours_alarm==24)hours_alarm=23;
                                       }
                          else if(cont==2){
                                            minutes_alarm++;
                                             if(minutes_alarm==60)minutes_alarm=59;
                                          }
                         }
هذا السويج لغرض زياده القيمه

اما هذا السويج لنقصان القيمه

كود:
 else if (sw_dec ==0) // dec switch
                          {
                            delay_ms(250);
                            if(cont==1){
                                        if(hours_alarm!=0)hours_alarm--;
                                       }
                           else if(cont==2){
                                             if(minutes_alarm !=0)minutes_alarm--;
                                            }

                         }
===========================================
كود:
if(cont==1){
                      lcd_out(2,1,"hours: ");
                      
                      lcd_chr_cp(hours_alarm/10 +48);
                      lcd_chr_cp(hours_alarm%10 +48);
                     }
هنا في حاله متغير cont==1 سوف يظهر لنا قيمه الساعه منبه على شاشه لغرض التعديل عليه وهذا متغير يزداد قيمته عند كل ضغطه على سويجsw_set

اما اذا كان متغير cont=2 فهنا سوف يتم أظهار دقائق ليتم ضبطها

اما اذا كان متغير =3
فهنا سوف يتم خزن قيم جديده في ايبروم لكي لايتم فقد البيانات عندما تنطفئ الكهرباء
كود:
 else if(cont==3){
                      flag_alarm=255;
                      cont=1;
                      delay_ms(50);
                      address=2*(cont2-1);
                      EEPROM_Write(address+5,hours_alarm);
                      EEPROM_write(address+6,minutes_alarm);
                      EEPROM_write(cont2-1 , 100);// store flag alaram 0 for fajer
                                              // 1 for  Dhuhr   and 2 for ASr  and 3 for Maghrib and 4 for Isha
                      prayer_alarm[address+5]=hours_alarm;
                      prayer_alarm[address+6]=minutes_alarm;
                      prayer_alarm[cont2-1]=100;
                      lcd_out(2,1,"Saving     ");
                      delay_ms(500);
                     }
تلاحظون وضعنا معادله يحسب لنا موقع لخزن البيانات فعندما تكون cont2=1 فان address=0
وبتالي سوف يخزن في موقع 5 يخزن ساعه و6 يخزن دقائق للمنبه الفجر
وكذلك نخزن في موقع cont2-1 رقم 100 للدلاله على انه تم تفعيل منبه

وعندما تكون cont2=2 سوف يخزن
address=7 اذن يخزن ساعات في موقع 7
ودقائق في موقع 6 واعلام flags بانه تم تفعيل منبه لصلاه الظهر في موقع 1
كود:
EEPROM_write(cont2-1 , 100)
وهكذا

==============================================
كود:
prayer_alarm[address+5]=hours_alarm;
                      prayer_alarm[address+6]=minutes_alarm;
                      prayer_alarm[cont2-1]=100;
اما هذا الكود هو لخزن المعلومات جديده او محدثه في مصفوفه لكي يتعامل البرنامح مع القيم جديده
اي تحديث بيانات المصفوفه prayer_alarm
=============================================
كود:
 else if (sw_alarm_stop==0) // stop alarm switch
                                {
                                  delay_ms(20);
                                  while(sw_alarm_stop==0);
                                  lcd_cmd(1);
                                  return;
                                }
هذا السويج يمسح بيانات على شاشه ثم يعود الى الداله الرئيسيه وبتالي تنتهي عمليه ضبط اوقات المنبه


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 08-05-2014 الساعة 05:36 AM السبب: اضافه معلومات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 08-05-2014, 06:01 AM المشاركة 13   
افتراضي


شرح داله
كود:
void check_prayer_Time()
هذه داله مهمتها
1- تتأكد النظام على اي وقت يعمل هل ب 24 ام 12 وبالطبع نواجه مشكله مع ساعات فقط فمن معروف ان 24 يبدأ من 0 الى 23 ولكن في نظام 12 يبدا من 1 الى 12
وهنا لن يعمل منبه اذا غيرنا نظام الى 12 وعليه هذه داله تعمل تصحيح لقيمه ضبط ساعه في حاله تغير نظام من 12 الى 24 او بالعكس

شوفو هذا الكود هو كود تصحيح القيمه ساعه للمنبه
كود:
if( system_12_24==12)
                         {
                            if(hours_alarm>12) {hours_alarm2=12;
                                                flag_alarm_sys_12_24=1; // alarm in PM
                                               }
                            else if (hours_alarm<=12)
                                                     {
                                                      flag_alarm_sys_12_24=0; // alarm in AM
                                                      hours_alarm2=0;
                                                     }
                         }
  else if( system_12_24==24)
                            {
                              flag_alarm_sys_12_24=24;
                              hours_alarm2=0;

                             }
=============================================

2- تعمل على مقارنه بيانات مصفوفه prayer_alarm مع الوقت الحقيقي ومنها اذا حدث ان اي وقت تساوى مع القيم منبه في مصفوفه prayer_alarm يعطي اشاره انذار

كود:
for(x=0;x<5;x++)
                 {
                  if(prayer_alarm[x]==100)
                        {
                         led_alarm=1;
                         if( (prayer_alarm[2*x+5]==hours-hours_alarm2) &&(prayer_alarm[2*x+6]==minutes) &&  stop_alarm==0 )
                                             {
                                              alarm[x]=100;
                                               flag_alarm=255;
                                               alarm[5]=2*x+6;
                                               return;
                                             }
                          if( prayer_alarm[alarm[5]]==minutes);
                          else
                                 {
                                   flag_alarm=0;
                                    stop_alarm=0;
                                  }
                        }

                 }
كود بلون احمر لو ترجعون الى داله
كود:
void alarm_setting()
وعندما cont=3 لترون انه اي وقت تم تفعيله (( أقصد فجر او ظهر او..)) فانه يتم وضع 100 في موقع مخصص له في ايبروم لكي نعرف انه فعلنا منبه لصلاه فجر او ظهر او كليهما او بقيه الصلوات

كود:
for(x=0;x<5;x++)
                 {
                  if(prayer_alarm[x]==100)
هنا يختبر هل يوجد اعلام للمنبه =100 طبعا x تتكرر من 0 الى 4 يعني 5 مرات لان عدد اوقات الصلاه هي 5 لكل واحد له flag
كود:
led_alarm=1;
                         if( (prayer_alarm[2*x+5]==hours-hours_alarm2) &&(prayer_alarm[2*x+6]==minutes) &&  stop_alarm==0 )
                                             {
                                              alarm[x]=100;
                                               flag_alarm=255;
                                               alarm[5]=2*x+6;
                                               return;
                                             }
فأذا تحقق الشرط سوف يعمل ليد للدلاله على وجود منبه يعمل
ومتى ما تتحقق الشرط ساعه منبه = ساعه وقت حقيقي ودقائق منبه = وقت دقائق حقيقي عندها يصبح flag_alarm=255
طبعا علينا خزن قيمه العنوان الي حدث عنده منبه لماذا بكل بساطه لكي يعمل نظام اطفاء اوتوماتيكي بعد أنتهاء دقيقه
كود:
 alarm[5]=2*x+6;
حيث هذا الكود يحفظلي عنوان موقع ذاكره في ايبروم بالنسبه لدقائق ولكي ينطفئ بعد 1 دقيقه

كود:
 alarm[5]=2*x+6;
هنا خزنا العنوان دقائق الي حدث عنده تنبيه
كود:
if( prayer_alarm[alarm[5]]==minutes);
                          else
                                 {
                                   flag_alarm=0;
                                    stop_alarm=0;
                                  }
هنا اخبرنا اذا كان prayer_alarm[alarm[5]]==minutes لاتفعل شيئا وترك منبه يعمل ولكن اذا لم يتساوو بالقيمه اوقف منبه
=================================================


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 08-05-2014, 06:07 AM المشاركة 14   
افتراضي


اخيرا عندما يصبح flag_alarm==255
وكود بلون احمر هو هل نظام منبه الي بعدما تم تصحيحه من داله
كود:
check_prayer_Time();
هل هو نفس نظام وقت حقيقي
اذا كان شرط متحقق فأنه
سوف يجعل buzzer=1 عدا ذلك اوقف منبه وصفر flag_alarm
كود:
if(flag_alarm==255 )
                     {
                      if( flag_alarm_sys_12_24==k_12_24 )
                                                      {
                                                         buzzer=1;
                                                      }

                      else
                           {
                            buzzer=0;
                            flag_alarm=0;
                            led_alarm=0;
                           }
                     }


عبقرينو1
:: مهندس متميز ::
تاريخ التسجيل: Oct 2010
الدولة: جمهورية مصر العربية - الاسكندرية
المشاركات: 557
نشاط [ عبقرينو1 ]
قوة السمعة:
قديم 22-01-2018, 11:47 PM المشاركة 15   
افتراضي


السلام عليكم
هل لو امكن رفع المشروع مره اخرى لانتهاء صلاحيه الرابط



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