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

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

الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,073
نشاط [ عطية حسن محمود ]
قوة السمعة:123
قديم 13-06-2009, 07:10 PM المشاركة 1   
افتراضي قفل الكترونى لخزينة 3 درج وبانذار Twitter FaceBook Google+



الكود عبارة عن 3 ابواب كل باب له رقم سرى والباب الاول والثالث له رقم لفتحهم معا
Door1 = 05
Door2 = 28
Door3 = 82
Door1 & 2 = 33
وعند الخطا 3 مرات وبدء الرابعة يعطى انذار اخترت لكم موسيقى مولودى بالموبايلات
الكود كان بالنت وله اخطاء تم تعديلها على pic16f877
كود:
unsigned char var1, var2, kp;
char attempts=0;
char state = 1;//start from state 1
char txt[4];
char          text[] = "Combination Lock" ;//message text
char          text1[]= " *Door1 On*";
char          text2[]= " *Door2 On*";
char          text3[]= "*Door1&2 On*";
char table[17] = {0,3,2,1,0,6,5,4,0,9,8,7,0,11,0,10,0};
    void Tone1() {
  Sound_Play(659, 250);   // Frequency = 659Hz, duration = 250ms
}
void Tone2() {
  Sound_Play(698, 250);   // Frequency = 698Hz, duration = 250ms
}
void Tone3() {
  Sound_Play(784, 250);   // Frequency = 784Hz, duration = 250ms
}
 void Melody() {           // Plays the melody "Yellow house"
  Tone1(); Tone2(); Tone3(); Tone3();
  Tone1(); Tone2(); Tone3(); Tone3();
  Tone1(); Tone2(); Tone3();
  Tone1(); Tone2(); Tone3(); Tone3();
  Tone1(); Tone2(); Tone3();
  Tone3(); Tone3(); Tone2(); Tone2(); Tone1();
}
void main() {
  TRISC=0;
    PORTC=0;                 ;//PORTA to digital mode
  LCD_INIT(&PORTB) ;//Pin assignment
   SOUND_INIT(&PORTC,1)                                ;//RS,E,RW,D7,D6,D5,D4
  LCD_Cmd(LCD_CLEAR)               ;//Clear display
  LCD_Cmd(LCD_CURSOR_OFF)
          ;//Turn cursor off
    Keypad_Init(&PORTD)         ;
   LCD_OUT(1,1, text)                ;//Print welcome message
    while(1) {   //while ever loop
               switch(state){ //check the current state
case 1:
               LCD_Cmd(LCD_CLEAR)    ;
               LCD_out(1,1,text);
               LCD_out(2,1,"EnterPass:");
               while(!keypad_Read()){}   //wait for key1 press
               Delay_ms(10)             ;//debounce time
               kp = Keypad_Released()   ;//wait for release
               var1=kp; //store var1 into kp
               var1=table[kp];
               Lcd_Out_Cp("*");
               state = 2;
               break;
case 2:
               if(kp==15) state=1; //go back state 1 when kp = # (enter key)
               else if(kp==13) state=1;//go back state 1 when kp = * (clear key)
               else
               state = 3;//go to state 3 get key2
               break;
case 3:
               while(!keypad_Read()){}   //wait for key2 press
               Delay_ms(10)             ;//debounce time
               kp = Keypad_Released()   ;//wait for release
               var2=kp;//store var2 into kp
               var2=table[kp];
               Lcd_Out_Cp("*");
               state=4;
               break;
case 4:
               if(kp==15) state=1;//enter key goes back state 1
               else if(kp==13) state=1;//clear key goes back state 1
               else
               state = 5;//continue goes to state 4
               break;
 case 5:
               while(!keypad_Read()){}   //wait for enter key press
               Delay_ms(10)             ;//debounce time
               kp = Keypad_Released()   ;//wait for release
               state = 6;
               break;
case 6:
               if(kp==13)
               state =1; //clear goes back to s1
               else if(kp==15)
               state = 7;//enter key goes to state 7
               else state = 5;
               break;
case 7:
               if (var1==0 && var2==5)//comparing for door1
                state = 12;  //goes state 11 open door1
               else state =8;
               break;
case 8:
               if (var1==2 && var2 == 8)//comparing for door2
               state = 13;//goes to state 9 for door 2
               else state=9;
               break;
case 9:
               if(var1==8 && var2 == 2) //comparing foor door3
               state = 14; //goes to state 15 for door 3
               else state =10;//goes next state
               break;
case 10:
               if (var1==3 && var2 == 3)
               state = 15;//goes to state 14 for door1 & 2
               else
               state =11;
               break;
case 11:
               LCD_OUT(2,1,"**Invalid Code**") ;
               attempts++; //increment attempts
               kp+=attempts;//kp = kp + attempts
               if(attempts < 3)  //attempts less than 3 times
               state=1;     //go state 1
               else
               state=16;
               while(!keypad_Read()){}   //wait for enter key press
               Delay_ms(10)             ;//debounce time
               kp = Keypad_Released()   ;//wait for release
               LCD_Cmd(LCD_CLEAR);
               break;
case 12://open door1 for 5secs
               LCD_Cmd(LCD_CLEAR);
               Lcd_out(2,1,text1) ;
               Lcd_out(1,1,text);
               //turn door1 led on
               PORTC.F5=1;
               Delay_ms(5000); //delay 5secs
               //turn door1 led off
               PORTC.F5 = 0;
               LCD_Cmd(LCD_CLEAR)         ;
               attempts=0;
               state=1;
               break;
case 13: //open door2 for 5secs
               LCD_Cmd(LCD_CLEAR);//clear display
               LCD_OUT(2,1,text2);
               Lcd_out(1,1,text) ;
               //turn door2 led on
               PORTC.F7=1;
               Delay_ms(5000);
               PORTC.F7 = 0 ;//turn door2 led off
               LCD_Cmd(LCD_CLEAR);
               attempts=0;
               state =1;
               break;
case 14:      //open door3
              LCD_Cmd(LCD_CLEAR);
              LCD_OUT(2,1," *Door3 On*");
              Lcd_out(1,1,text) ;
              PORTC.f6=1;
              Delay_ms(5000);
              PORTC.F6 =0;
              LCD_Cmd(LCD_CLEAR);
              attempts=0;
              state =1;
              break;
case 15: //open door1 and door2
              LCD_Cmd(LCD_CLEAR);
              LCD_OUT(2,1,text3);
              Lcd_out(1,1,text) ;
              PORTC.F5=1;
              PORTC.F7=1;
              Delay_ms(5000);
              PORTC.F5=0;
              PORTC.F7=0;
              LCD_Cmd(LCD_CLEAR);
              attempts=0;
              state =1;
              break;
default:// must be a bad attempts
              LCD_OUT(2,1,"  **Alarm On**");
              LCD_OUT(1,1,text);
              PORTC.F1=1;
    Melody();
              Delay_ms(50);
LCD_Cmd(LCD_CLEAR);
  attempts=0;    PORTC.F1=0;
              state = 1; //goes to state 1}

              break;

                         }
                         }
                         }
صورة ملف المحاكاة
وجاهز للرد على تساؤلاتكم


اعلانات

شعاع الحرية
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
الدولة: فلسطين المحتلة
المشاركات: 64
نشاط [ شعاع الحرية ]
قوة السمعة:0
قديم 13-06-2009, 07:59 PM المشاركة 2   
افتراضي


مشكوووووووووووووووووور أخي عطية على مجهودك ..

ان شاء الله أول ما اخلص من الامتحانات راح ،، اجربه نظري + عملى ..


بارك الله في حسناتك ..

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

شعاع الحرية
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
الدولة: فلسطين المحتلة
المشاركات: 64
نشاط [ شعاع الحرية ]
قوة السمعة:0
قديم 13-06-2009, 08:02 PM المشاركة 3   
افتراضي


لكن أخي لى سؤال:::

أليس الرجل (R/W) الموجودة في LCD ، يجب ان تكون موصلة على البيك ،، وليس على GND كما في الرسمة ...

أم انا غلطان ؟؟


الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 10,061
نشاط [ حيدر علاج حسن ]
قوة السمعة:394
قديم 13-06-2009, 08:42 PM المشاركة 4   
افتراضي


شكرا لك استاذ عطيه على المجهود الرائع حقا .
ما هو دور كلمة break من فضلك
اشكرك مرة اخرى

حيدر علاج حسن

الصورة الرمزية عطية حسن محمود
عطية حسن محمود
:: عضو ذهبي و مشرف سابق لورشة صيانة التلفزيون ::
تاريخ التسجيل: Aug 2005
المشاركات: 1,073
نشاط [ عطية حسن محمود ]
قوة السمعة:123
قديم 14-06-2009, 01:13 PM المشاركة 5   
افتراضي


r\w يمكن ان توصل بالاى سى وتستخدم الدالة مثلا
LCD_Config(&PORTb,7,6,5,3,2,1,0)
ويتم توصيل r\w بالرجل b5
بالترتيب RS,E,RW,D7,D6,D5,D4
break تعنى نهاية الحالة المذكورة للانتقال للامر الذى يليه


geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,139
نشاط [ geniusse01 ]
قوة السمعة:105
قديم 14-06-2009, 09:35 PM المشاركة 6   
افتراضي


السلام عليكم

جزاك الله كل خير اخونا ومشرفنا الغالي وجعلها في ميزان حسناتك..اسمح لي باضافة الدارة بالبروتوس مع الكود في الرابط التالي:

http://filaty.com/f/906/14215/lock.rar.html

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


metalljack
:: عضو ذهبي ::
تاريخ التسجيل: Mar 2008
الدولة: syria
المشاركات: 900
نشاط [ metalljack ]
قوة السمعة:102
قديم 14-06-2009, 09:43 PM المشاركة 7   
افتراضي


الله يعطيكم العافية
شكرا على التكافل


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


جزاك الله خيرا أستاذ عطية

فعلا دائرة جميلة وبرنامج أجمل من شخص عزيز علينا

أتمنى منك المزيد و المزيد فلا تحرمنا من ذلك .........

فى الكود أفكار كثيرة مثل تشغيل إنذار بعد ثلاث محاولات خطأ بالإضافة إلى التعامل مع الكيباد و شاشة lcd
وهناك أيضا جمل برمجية مفيدة مثل switch و...و... و...و الكثير
لذلك فهو برنامج مفيد جدا جدا


لى ملحوظة أستاذ عطية

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

إضافة رد

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

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

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


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

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