 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:333
|
|
24-06-2017, 01:29 PM
المشاركة 5
|
|
مشروع قفل إلكترونى بسيط بكلمة سر محددة مسبقا :

لوحة المفاتيح الرقمية تستخدم فى كثير من المجالات ، من أنظمة الأمان وحتى التليفونات المحمولة . فى هذا المشروع سوف نستخدم لوحة مفاتيح 4x3 لإدخال كلمة المرور password ، إذا كانت كلمة المرور صواب يتم فتح القفل الإلكترونى .
الدائرة الكهربية :

فى هذا المشروع سوف نستخدم الميكروكونترولر PIC16F877A ، والذى يعمل على تردد 4MHz . فى البداية يطلب إدخال كلمة المرور والتى تم تحديدها فى البرنامج مسبقا ، وهى “2345” والتى تم حفظها فى مصفوفة السلسلة pass . إذا تطابقت كلمة المرور التى يقوم المستخدم بإدخالها مع كلمة المرور المحددة مسبقا سوف يتم تشغيل ريلاى لمدة 10 ثوانى ، أما إذا لم يكن هناك تطابق بينهما ، غير صواب ، يتم طلب إدخال كلمة المرور مرة أخرى . البرنامج بسيط ويمكن فهمه بسهولة . يجدر ملاحظة أنه قد تم استخدام عبارة switch-case هنا لتحويل القيم من لوحة المفاتيح (1,2,3….16) إلى مكافىء كود أسكى حتى نتمكن من عرضها على وحدة العرض LCD ، هناك طرق أخرى لتنفيذ هذا التحويل . أيضا لعلك لاحظت ترتيب أطراف التوصيل ، يجب توصيل الأعمدة بالأطراف (0,1,2,3) للمنفذ المستخدم ، وتوصيل الصفوف بالأطراف (4,5,6,7) لنفس المنفذ ، فى حالة لوحة المفاتيح 4X3 لا يوجد عامود رابع ويترك طرفه بدون توصيل .
البرنامج :
كود:
// LCD 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;
//=================================
char password[4],i=0,j=7,kp=0;
const char pass[5]="2345"; //The password was set at 2345.
char keypadPort at PORTD; // The keypad will be connected to the PORTD.
void main() {
trisb.f0=0;
portb.f0=0;
Keypad_Init(); // Keypad Set up.
Lcd_Init(); // LCD Set up .
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Close the cursor.
Lcd_out(1,1,"Enter Password:");
lcd_out(2,7,"____");
while(1)
{
kp=0;
while(kp==0) // Continuously scans keys when no key is pressed.
{
kp=Keypad_Key_Click(); //Press the keypad to get the value.
delay_ms(10); // 10ms delay .
}
switch (kp) { // ASCII conversion is done (eg ASCII code 49 which corresponds to 1 character).
case 1: kp = 49; break; // 1
case 2: kp = 50; break; // 2
case 3: kp = 51; break; // 3
//case 4: kp = 65; break; // A
case 5: kp = 52; break; // 4
case 6: kp = 53; break; // 5
case 7: kp = 54; break; // 6
//case 8: kp = 66; break; // B
case 9: kp = 55; break; // 7
case 10: kp = 56; break; // 8
case 11: kp = 57; break; // 9
//case 12: kp = 67; break; // C
case 13: kp = 42; break; // *
case 14: kp = 48; break; // 0
case 15: kp = 35; break; // #
//case 16: kp = 68; break; // D
}
lcd_chr(2,j,'*');
j++;
if(j==11)j=7;
password[i]=kp;
i++;
if(i==4)
{
i=0;
if(password[0]==pass[0] && password[1]==pass[1] && password[2]==pass[2] && password[3]==pass[3])
// If the password is correct, it will ON the relay for 10 seconds ...
{
portb.f0=1;
Lcd_Cmd(_LCD_CLEAR);
lcd_out(1,1,"Password is :");
lcd_out(2,1,"correct!");
delay_ms(10000);
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_out(1,1," Enter Password:");
lcd_out(2,7,"____");
portb.f0=0;
}
else // If the password is wrong, ask for the password again ...
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1," Wrong password!");
portb.f7=0;
delay_ms(2000);
Lcd_out(1,1," Enter Password:");
lcd_out(2,7,"____");
}
}
}
}
النتيجة :

|