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

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

أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 23-07-2009, 07:35 PM المشاركة 1   
افتراضي قفل الكترونى بباسوورد مكون من ستة أرقام Twitter FaceBook Google+



السلام عليكم ورحمة الله وبركاته
تم بفضل الله وحده عمل تطوير للكود الذى كان قد وضعه الأخ العزيز فادى لعمل قفل الكترونى بباسوورد مكون من ستة أرقام

الكود يحتوى على بعض الأفكار البرمجية المهمة مثل :
التعامل مع البرامج الفرعية subroutines
التعامل مع شاشة ال lcd
التعامل مع الكيباد من النوع 4x3
التعامل مع مكتبة الصوت sound library
التعامل مع ذاكرة الايبروم الموجودة فى البيك

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

لتحميل المشروع شاملا الكود وملف البروتس اضغط على الرابط التالى
http://filaty.com/f/907/11101/6-DIGIT_PASSWORD.rar.html

وهذا هو البرنامج لمن يجد أى صعوبة فى تحميله من الرابط
كود:
                              // global variables declaration

char i = 0 , m = 0 , check = 0 ;
const int number[]={'y','y',3,2,1,'x',6,5,4,'x',9,8,7,'x','x',0 ,'y'} ;
char temp[6] ;
char attempts = 0 ;

                                // subroutines
void tone1()
{
     sound_play ( 659, 250 ) ;
}
void tone2() {
     sound_play ( 698, 250 ) ;
}
void Tone3() {
     sound_play ( 784, 250 ) ;
}
void melody()
{
     tone1(); tone2(); tone3(); tone3();
     tone1(); tone2(); tone3(); tone3();
     tone1(); tone2(); tone3();
     tone1(); tone2(); tone3(); tone3();
     tone1(); tone2(); tone3();
     tone3(); tone3(); tone2(); tone2(); tone1();
}

void set_new_pass()
{
     char m = 0 ,i = 0 ;
     lcd_cmd(lcd_clear) ;
     lcd_out(1,1,"ENTER NEW PASS") ;
     lcd_cmd(lcd_second_row) ;

     get_new_pass :
     m = 0 ;
     if(portc.f4==0 && i!=0)                    // if CANCEL button is pressed
     {
                    delay_ms(250) ;
                    lcd_out(2,i," ") ;
                    lcd_cmd(lcd_move_cursor_left) ;
                    i-- ;
                    goto get_new_pass ;
     }
     m = keypad_released() ;
     while(m==0 || m==14 ||m==16) goto get_new_pass ;
     lcd_chr_cp('*') ;
     temp[i] = number[m] ;
     i++ ;
     if(i==6) goto confirm_new_pass ;
     goto get_new_pass ;

     confirm_new_pass:
     while(portc.f2==1 && portc.f4==1) {}
     if(portc.f4==0) goto get_new_pass ;

     for(i=0;i<6;i++)
     {
                     eeprom_write(i,temp[i]) ;
                     delay_ms(20) ;
     }

     lcd_cmd(lcd_clear) ;
     lcd_out(1,3,"NEW PASS HAS" ) ;
     lcd_out(2,4,"BEEN ADDED") ;
     delay_ms(2000) ;
     lcd_cmd(lcd_clear) ;
}


                           // main program

void main()
{


     trisb = 0 ; portb = 0 ;
     trisd = 0 ; portd = 0 ;
     trisc.f0 = trisc.f1 = 0 ; portc = 0 ;
     trisc.f2 = trisc.f3 = trisc.f4 = 1 ;


                      // lcd initialization
     lcd_init(&portb) ;
     lcd_cmd(lcd_cursor_off) ;

                        // keypad initialization
     keypad_init(&portd) ;

                         // sound play initialization
     sound_init(&portc,0) ;

     while(1)
     {
             if(eeprom_read(0) != 0xff) goto get_current_pass ;
             set_new_pass() ;

             get_current_pass :

             i = 0 ;
             check = 0 ;
             lcd_cmd(lcd_clear) ;
             lcd_out(1,4,"ENTER PASS") ;
             lcd_cmd(lcd_second_row) ;


             wait :
             m = 0 ;
             if(portc.f4==0 && i!=0)                // if CANCEL button is pressed
             {
                            delay_ms(250) ;
                            lcd_out(2,i," ") ;
                            lcd_cmd(lcd_move_cursor_left);
                            i-- ;
                            goto wait ;
             }
             
             if(portc.f3==0)              // if CHANGE button is pressed
             {
                            delay_ms(20) ;        // switch debouncing
                            set_new_pass() ;
                            goto get_current_pass ;
             }
             m = keypad_released() ;
             while(m==0 || m==14 ||m==16) goto wait ;
             if(attempts==3)
             {
                            lcd_out( 2,6,"ALARM" ) ;
                            melody() ;
                            goto get_current_pass ;
             }
             lcd_chr_cp('*') ;

             if(eeprom_read(i)!=number[m]) check = 1 ;
             i++ ;
             if(i==6) goto confirm ;
             goto wait ;

             confirm :
             while(portc.f2==1) {}

             compare :
             if(check!=0)
             {
                         lcd_cmd(lcd_clear) ;
                         lcd_out(1,3,"INVALID PASS") ;
                         while(keypad_released()==0) {}
                         attempts++ ;
                         goto get_current_pass ;
             }

             else
             {
                         lcd_cmd(lcd_clear) ;
                         lcd_out(1,5," OPEN " ) ;
                         portc.f1 = 1 ; delay_ms(3000) ;
                         portc.f1 = 0 ;
                         attempts = 0 ;
            }
}
}


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

نصيحة أخيرة

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



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


سبحانك اللهم وبحمدك أشهد ألا إله إلا أنت أستغفرك وأتوب إليك
والسلام عليكم ورحمة الله وبركاته


التعديل الأخير تم بواسطة : أشرف الخطيب بتاريخ 23-07-2009 الساعة 07:57 PM
اعلانات

الصورة الرمزية أبو زكووور
أبو زكووور
:: عضو فضي ::
تاريخ التسجيل: Mar 2009
الدولة: سوريا العروبة
المشاركات: 436
نشاط [ أبو زكووور ]
قوة السمعة:77
قديم 23-07-2009, 09:31 PM المشاركة 2   
attension السلام عليكم


ممتاز جداً جداً .... ماشاء الله عليك
عمل أكثر من رائع
شكراً جزيلا لك وإلى كل من ساهم في هذا الموضوع
وشكر خاص لصاحب الفكرة والموضوع الأخ
geniusse01 .
الملاحظة الوحيدة على هذا الموضوع هو نوع المتحكم من حيث الحجم وغلاء السعر
لو أمكن إستخدام المتحكم ATmega8L الذي يضاهيه في كل شيء
ولكن برمجته أصعب و تختلف عن المتحكم السابق
شكراً لكم ... بارك الله جهودكم .

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

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:101
قديم 24-07-2009, 12:45 PM المشاركة 3   
افتراضي


السلام عليكم

ايه الحلاوة دي يا عم اشرف...ربنا يجزيك الخير ويزيدك من فضله..جارى متابعة البرنامج من اجل المناقشه ....ربنا يوفقك...

اخي ابو زكور

ان شاءا لله نجد من يعرف بمتحكمات ATMEGA ويفيدنا فيها ..شد حالك وفهمنا اياها...ربنا يوفقك..

واخر دعوانا ان الحمدلله رب العالمين..وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..


أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 02-08-2009, 08:35 PM المشاركة 4   
افتراضي


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

أشكرك أخى العزيز أبو زكوور وأشكرك أخى العزيز فادى على الكلمات الطيبة بارك الله فيكم جميعا

الملاحظة الوحيدة على هذا الموضوع هو نوع المتحكم من حيث الحجم وغلاء السعر
لو أمكن إستخدام المتحكم ATmega8L الذي يضاهيه في كل شيء
ولكن برمجته أصعب و تختلف عن المتحكم السابق
اعذرنى أخى أبو زكوور لم أتعامل أبدا مع متحكمات ATMEGA .... ربنا يوفقك وتستطيع تنفيذ المشروع باستخدام متحكم من النوعATMEGA
__________________________________________________ ____________________

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

أستطيع الآن وضع احتمالات لعدم وجود تفاعل من الأعضاء :

1- إما أن المشروع غير مفيد أو ليس على المستوى المطلوب فلم ينل رضاكم
وهنا أكون قد أخطأت أنا ....

2- إما أنه لايوجد مهتمين بلغة الميكروسى كلغة برمجة
وهنا أكون قد أخطأت أنا أيضا...

وهناك احتمالات أخرى لاأريد أن أذكرها حتى لاأغضب أحدا وأنا لاأقصد .....

عموما .... كان قصدى من وضع البرنامج كاملا أن تكون الرؤية واضحة لأى تعديلات أو إضافات يمكن أن تنمى المشروع .....
فى النهاية هى مجرد فكرة تنفذ لا أكثر وليست اختراع ولا ابتكار ....

أرجو ألا أكون قد أغضبت أحدا ...... يعلم الله أنه ليس قصدى ذلك وأن قصدى هو أن نستطيع معا من تنمية أفكارنا وتطويرها ....... لأنه دائما ماأقول (هناك أكيد الأفضل) وربما أكون قد وقعت فى خطأ ما فى البرنامج
فلا تبخلوا علينا بل على أنفسكم أولا من تقديم الآراء والأفكار الجميلة
لأنه كلنا نتعلم من بعضنا . وإن لم يكن هناك فكرة تطرح فهناك أكيد استفسار وإن لم يكن فهناك أكيد كلمة شكر أو بدعاء بظهر الغيب لمقدم الموضوع الأخ فادى ولكل من يقدم فكرة جديدة أو طريقة جديدة للموضوع

أنا حزين لأن ذلك حالنا نحن العرب .... اللهم أصلح أحوالنا وجمع شملنا

أرجو ألا تغضبوا من هذا الكلام .... فهذا الكلام موجه لى أولا قبلكم ....


سبحانك اللهم وبحمدك أشهد ألا إله إلا أنت أستغفرك وأتوب إليك
والسلام عليكم ورحمة الله وبركاته


الصورة الرمزية أبو زكووور
أبو زكووور
:: عضو فضي ::
تاريخ التسجيل: Mar 2009
الدولة: سوريا العروبة
المشاركات: 436
نشاط [ أبو زكووور ]
قوة السمعة:77
قديم 03-08-2009, 12:13 AM المشاركة 5   
attension السلام عليكم


كيف حالك أخي أشرف
أكرر لك شكري و تقديري على هذا العمل المتميز و الأكثر من رائع
و للأخ geniusse01 أيضاً
إن مسألة المشاركات و ضعفها و أحيانا ندرتها هي شيء عام
و قد يكون لها أسباب عديدة
بالنسبة لي من الأسباب التي تمنعني أحيانا من المشاركة
ضيق الوقت ... ضغط العمل ... الواجبات العائلية ... ضعف شبكة الإنترنت
على كل حال الأجر والثواب عند الله سبحانه و تعالى


أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 08-08-2009, 11:51 AM المشاركة 6   
افتراضي


أشكرك أخى أبو زكووور على مشاعرك وكلماتك الطيبة ....


أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 08-08-2009, 05:03 PM المشاركة 7   
افتراضي


فى الرابط التالى البرنامج + بعض التعديلات عليه

http://www.4shared.com/file/12372171..._PASSWORD.html

أشكر الأخ فادى الذى نبهنى إلى الخطأ الذى وقعت فيه .... وهذا ماكنت أرجوه وأتمناه
__________________________________________________ ______________

شرح البرنامج

يمكن تقسيم البرنامج إلى عدة مراحل :

1- تعريف المتغيرات variables

تم استخدام متغيرات من النوع global variable أى أنها أصبحت معرفة فى دالة ال main بالإضافة إلى البرامج الفرعية المستخدمة subroutines

والمتغيرات هى :

المتغيرi

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

المتغير m
وقد تم استخدامه لتوضع فيه القيمة التى ترجعها الدالة() keypad_released وهى دالة من دوال الكيباد فى لغة الميكروسى ترجع قيم معينة حسب الزر المضغوط عليه



طبعا إذا لم يتم الضغط على أى زر ستكون القيمة الراجعة من الدالة تساوى صفر


المتغير error

وهو متغير استخدمناه ليعبر عن وجود خطأ عند إدخال الباسورد بحيث
  • إذا كان هناك خطأ عند إدخال الباسورد تكون القيمة الموجودة فى ذلك المتغير تساوى واحد
  • وإذا لم يكن هناك خطأ فى الباسورد المدخل عن طريق المستخدم تكون القيمة الموجودة فى ذلك المتغير تساوى صفر


المتغير attempts

وهو متغير استخدم لمعرفة ماإذا كان المستخدم قد أدخل الباسورد خطأ ثلاث مرات متتالية أم لا

كود:
Char attempts = 0 ;

المصفوفة number

كود:
const int number[]={'y','y',3,2,1,'x',6,5,4,'x',9,8,7,'x','x',0 ,'y'} ;
وقد تم وضع العناصر بترتيب معين بحيث
number[2] = 3 , number[3] = 2 ...... وهكذا

لأن القيمة الراجعة من الدالة keypad_released تساوى 2 عند الضغط على الزر 3
والقيمة الراجعة من الدالة keypad_released تساوى 3 عند الضغط على الزر 2
والقيمة الراجعة من الدالة keypad_released تساوى 11 عند الضغط على الزر 8
وهكذا .......


المصفوفة temp

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

كود:
char temp[6] ;

وعلى ذلك فإنه لتعريف المتغيرات السابقة تكتب الأوامر التالية :

كود:
char i = 0 , m = 0 , error = 0 ;
const int number[]={'y','y',3,2,1,'x',6,5,4,'x',9,8,7,'x','x',0 ,'y'} ;
char temp[6] ;
char attempts = 0 ;


التعديل الأخير تم بواسطة : أشرف الخطيب بتاريخ 08-08-2009 الساعة 06:18 PM

أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 195
نشاط [ أشرف الخطيب ]
قوة السمعة:0
قديم 08-08-2009, 06:07 PM المشاركة 8   
افتراضي


2- البرامج الفرعية subroutines

تم استخدام خمسة برامج فرعية : أربعة منها خاصة بإصدار صوت من الميكروكنترولر عن طريق السماعة speaker + برنامج خاص للتعديل على الباسورد

بالنسبة للنغمة الصادرة فلها تلك الأوامر



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



____________________________________

3- الدالة الرئيسية main

عبارة عن أوامر لضبط البورتات و الشاشة lcd والكيباد والسماعة speaker + حلقة while لا نهائية

أما أوامر ضبط البورتات والشاشة والكيباد والسماعة فعن طريق الأوامر التالية

كود:
 trisb = 0 ; portb = 0 ;
     trisd = 0 ; portd = 0 ;
     trisc.f0 = trisc.f1 = 0 ; portc = 0 ;
     trisc.f2 = trisc.f3 = trisc.f4 = 1 ;


                      // lcd initialization
     lcd_init(&portb) ;
     lcd_cmd(lcd_cursor_off) ;

                        // keypad initialization
     keypad_init(&portd) ;

                         // sound play initialization
     sound_init(&portc,0) ;
أما حلقة while اللانهائية










__________________________________________________ __________________

شرح مختصر للبرنامج ككل
  • فى البداية شغلت الدائرة لأول مرة سيطلب منك البيك أن تدخل باسورد جديدة له لك يحفظها فى الايبروم
  • ( فى البداية تكون القيم الموجودة فى الايبروم تساوى 255 )
  • وذلك بأن يطبع لك الشاشة جملة ENTER NEW PASS

  • ويبدأ أخذ الأرقام منك عن طريق الكيباد رقم رقم ... ويحفظه فى مصفوفة مؤقتة temp بنفس ترتيب إدخالك الأرقام
( طبعا أثناء إخال الأرقام إن أردت التراجع عن رقم أدخلته يمكنك الضغط على المفتاح CANCEL وإخاله مرة أخرى من الكيباد )

  • ثم ينتظر من البيك أن تضغط على المفتاح OK عندها سيقوم بحفظ الأرقام التى فى المصفوفة temp إلى الايبروم

وهكذا نكون قد حفظنا الباسورد فى الايبروم

طبعا نفس الخطوات السابقة تتكرر عندما يريد المستخدم تغيير الباسورد الموجود فى الايبروم

أى أن تلك الخطوات تحدث فى حالتين :

1- عند إدخال باسورد لأول مرة فى الايبروم وذلك عند تشغيل الدائرة لأول مرة
2- عندما نريد أن نعدل فى الباسورد الموجود فى الايبروم وذلك بالضغط على المفتاحCHANGE
  • ثم يقوم البيك بعرض جملة ENTER PASS على الشاشة حتى يقوم المستخدم بإدخال باسورد عن طريق الكيباد

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


فإن كان متساويا معه وضع البيك القيمة صفر فى المتغير error

وإن لم يكن متساويا معه يضع القيمة واحد فى المتغير error


أى أنه جعلنا المتغير error علما flag ليعبر عن وجود خطأ فى الباسورد
  • وبعد إدخال الباسورد كاملا فإن البيك ينتظر التأكيد من المستخدم بالضغط على المفتاح OK

عندها لكى يعرف البيك ماإذا كان تم إدخال الباسورد صحيح أم لا ... فإنه فقط يقرأ العلم أو المتغير error


فإن وجدت قيمته تساوى صفر ( أى أن الباسورد تم إدخاله بشكل صحيح ) فسوف يضىء الليد

وإن وجد قيمته تساوى واحد ( أى أن الباسورد تم إدخاله بشكل خاطىء ) فلن يضىء الليد

__________________________________________________ _________________________________


وبذلك أكون قد وصلت إلى نهاية الشرح ... أتمنى أن أكون قد وفقت


سبحانك اللهم وبحمدك أشهد ألا إله إلا أنت أستغفرك وأتوب إليك

والسلام عليكم ورحمة الله وبركاته


التعديل الأخير تم بواسطة : أشرف الخطيب بتاريخ 08-08-2009 الساعة 06:22 PM
إضافة رد

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

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

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


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

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