این پروژه توسط میکروکنترلر ATMEGA32 و کامپایلر کدویژن طراحی شده. ابتدا با انتخاب * یا # یکی از منو ها انتخاب می شود . برای وارد کردن پسوورد دکمه # فشرده شود و برای تغییر پسوورد دکمه * زده شود.

اگر # انتخاب شود سیستم منتظر دریافت کد می شود اگرعددی اشتباه وارد کردید با زدن دکمه * پاک می شود در صورتی که تمام ارقام کد را وارد کرده برای تائید کد, دکمه # زده شود اگر درست بود خروجی متصل به رله به مدت 500 میلی ثانیه فعال می شود و درب را باز می کند.

 

 

اگر کد اشتباه بود برای 2 مرتبه دیگر می توان کد وارد کرد و بعد از آن سیستم دیگر کد دریافت نمی کند. و تنها با فشردن دکمه متصل به پورت B0 به حالت پیش فرض با کد: 1234 بر می گردد.

اما در صورتی که تغییر پسوورد انتخاب شود پسوورد قبلی را وارد می کنید در صورتی که درست بود پسوورد جدید را نیز وارد کرده و با زدن دکمه # آن را تائید میکنید تا ثبت شود.از این پس با این پسوورد وارد می شوید و پسوورد قبلی مورد قبول نمی باشد.

 

لینک دانلود فایل های این پروژه در انتهای این مطلب آمده است.

 

توضیحات کد

با دستور اسمبلی زیر lcd کاراکتری به پین میکروکنترلر (پورت A)کانفیگ خواهد شد.

#asm
   .equ __lcd_port=0x1B ;PORTA
#endasm

 

رمز ورود نباید بعد از قطع برق از بین برود، بنابراین متغیر pass ( که رمز ورود را در خود ذخیره می کند) را در ایپیرام ذخیره می کنیم برای این کار از کلمه کلیدی eeprom  قبل از تعریف متغیر استفاده می کنیم (در کدویژن) مانند زیر:

متغیر j  تعداد دفعاتی که رمز اشتباه وارد می شود.(بعد از سه بار اشتباه قفل شود و دیگر عددی دریافت نکند)

نکته: میکروکنترلر mega32 دارای حافظه ایپیرام داخلی است.

eeprom  int pass ,j;

آرایه  key[10] برای ذخیره اعداد (0-9)، * و # می باشد زمانی که دکمه ها فشرده می شود.

unsigned char key[10];

توابع شامل:

unsigned char keypad();

void change_pass();

int enter_pass();

 

از تابع keypad برای دریافت کاراکتر از کلید ماتریسی استفاده می شود اگر کلیدی فشرده شود کاراکتر متناظر آن را برمی گرداند (0-9  * و #). بنابراین هر زمانی که در برنامه نیاز بود تا کاراکتری از کلید دریافت کنیم این تابع را فراخوانی می کنیم.

از تابع change_pass برای تغییر رمز قبلی استفاده می شود.

و تابع enter_pass برای دریافت رمز ورود استفاده می شود.

 

الگوریتم برنامه:

در حلقه اصلی برنامه تابع keypad را صدا می زنیم تا مدام در حال اسکن صفحه کلید ماتریسی باشد.

while (1) 
    {    
       lcd_puts(" # ENTER PASS"); 
       lcd_gotoxy(0,1);
       lcd_puts(" * CHANGE PASS"); 
       lcd_putchar(j);
       Temp=keypad(); 
       delay_ms(200);

 

  1. اگر # فشرده شود رمز دریافت شود.
  2. و اگر * فشرده شود رمز قبلی تغییر داده شود.

 

حالا اگر # بود و تعداد اشتباه از حد مجاز عبور نکرده بود؟

آنوقت با تابع enter_pass  رمز را دریافت کنید و با pass رمز اصلی ورود مقایسه کند اگر برابر بودند در باز شود (پین خروجی متصل به رله به مدت 500 میلی ثانیه یک شود) و در lcd کاراکتری OPEN نمایش داده می شود.

if(Temp=='#' && j>0)
       {   
       if(enter_pass()== pass)
        {
        lcd_clear();
         lcd_puts("OPEN");
          OUTPUT_PORT =128;
           delay_ms(500); 
            lcd_clear(); 
            OUTPUT_PORT =0; 
            j=3; 
          } 
       else

 

ولی اگر اشتباه بود متغییر j به روز شود زیرا رمز اشتباه وارد شده. ودر lcd کاراکتری نمایش داده می شود.

نکته: اینجا مقدار اولیه j برابر با سه است بنابراین هربار اشتباه وارد شد یکی از مقدار آن کم می کنیم اگر به صفر رسید یعنی از حد مجاز عبور کرده است.

else
        {
        lcd_clear(); 
         lcd_puts("CLOSE"); 
          delay_ms(500); 
           lcd_clear();
           j--;  
         }

 

اگر * بود و تعداد اشتباه از حد مجاز عبور نکرده بود؟

آنوقت با تابع change_pass عملیات تغییر رمز را انجام می دهیم. ابتدا رمز قبلی را باید وارد کرده (در lcd کاراکتری ENTER OLD PASS نمایش داده می شود) در صورتی که درست بود از شما می خواهد که رمز جدید را وارد کنید (در lcd کاراکتری ENTER NEW PASS نمایش داده می شود)  در صورت موفقیت آمیز بودن OK در lcd  نمایش داده می شود و رمز جدید در متغییر pass ذخیره می شود.

else if(Temp=='*' && j>0) 
       change_pass();

 

و تابع change_pass

void change_pass()
{
 lcd_clear(); 
 lcd_puts("ENTER OLD PASS"); 
 delay_ms(500); 
 
 while(j!=0)
  { 
   if(enter_pass()==pass) 
    {
     lcd_clear(); 
      lcd_puts("ENTER NEW PASS"); 
       delay_ms(500); 
     pass = enter_pass();
     lcd_clear(); 
      lcd_puts("OK");
       delay_ms(500);
        return;     
       }
   else j--;   
    }
}

 

و در نهایت در حلقه اصلی تعداد رمز ورود اشتباه بررسی میشود. اگر j به صفر رسیده بود (از 3 به صفر رسیده بود از حد مجاز عبور کرده بود) در lcd کاراکتری SORRY نمایش داده میشود و وارد یک حلقه می شود که تنها با فشردن دکمه ریست از آن خارج می شود. و مقدار متغیرهای pass و j به حالت اول بر می گردد و در lcd کاراکتری RESET نمایش داده می شود.

if(j<=0)
       {
       lcd_clear(); 
       lcd_puts("SORRY");
       while(1)
        {
        if(RESET_PIN==0)
         { 
          lcd_clear();
          lcd_puts("RESET");   
          pass=1234;
          j=3;
          delay_ms(1000);
          lcd_clear();
          break;
           }    
          }  
         } 
      }    

 

تابع keypad:

این تابع کلید ماتریسی 3در4 را اسکن میکند به این صورت که هر کلیدی که فشرده شود دو پین میکرو کنترلر تغییر می کنند آن را در متغییر  scanCode ذخیره می کند و با دستور switch کاراکتر متناظر آن را بر می گرداند.

 نکته: در صورتی که دکمه ای فشرده نشود کاراکتر پیش فرض _ را بر می گرداند.

 

char keypad()
{
 unsigned char scanCode=0xf0 ,butNum;

   while(scanCode==0xf0)
   {
    KEYPAD_DDR = 0x0f;                
    KEYPAD_PORT = 0xf0;                
    delay_us(5);                    
    scanCode= KEYPAD_PIN;    
      }
    KEYPAD_DDR = 0xf0;                
    KEYPAD_PORT = 0x0f;                 
    delay_us(5);                    
    scanCode |= KEYPAD_PIN; 
    
       
          switch (scanCode) 
          {
           case 0xee: butNum='1'; break;
           case 0xed: butNum='2'; break;
           case 0xeb: butNum='3'; break;
           case 0xe7: butNum=0; break;
           case 0xde: butNum='4'; break;
           case 0xdd: butNum='5'; break;
           case 0xdb: butNum='6'; break;
           case 0xd7: butNum=0; break;
           case 0xbe: butNum='7'; break;
           case 0xbd: butNum='8'; break;
           case 0xbb: butNum='9'; break;
           case 0xb7: butNum=0; break;                
           case 0x7e: butNum='*'; break; 
           case 0x7d: butNum='0'; break; 
           case 0x7b: butNum='#'; break; 
           case 0x77: butNum=0; break;
           default: butNum='_';        
            }; 

         
     return butNum;
}

  دانلود

فایل : پروژه طراحی درب بازکن رمزی توسط میکرو کنترلر AVR
حجم : 86,99KB
  نظرات

جهت ثبت نظر وارد سایت شوید

راهنمای استفاده از کد در کامنت
````
insert your code
``
محمد خانی
دوشنبه 16 خرداد 1401 ,10:20 ب.ظ

سلام رمز فایل رو میزنم باز نمی کنه

مهدی ادهم
دوشنبه 16 خرداد 1401 ,10:28 ب.ظ

سلام رمز فایل های فشرده www.techforall.ir می باشد

جهت ثبت پاسخ وارد سایت شوید
رویا قنبری
شنبه 18 دی 1400 ,01:06 ب.ظ

سلام ببخشید پسورد رو میشه بگید

مهدی ادهم
شنبه 18 دی 1400 ,02:27 ب.ظ

سلام، دقت کنید که پسورد با فشردن دکمه متصل به پورت B0 به حالت پیش فرض با کد: 1234 بر می گردد.

جهت ثبت پاسخ وارد سایت شوید
shana ghalam
سه شنبه 14 دی 1400 ,12:17 ب.ظ

سلام پروژه متوسط با cubemxو keil و شبیه سازی با پروتئوس انجم می دهید؟

مهدی ادهم
سه شنبه 14 دی 1400 ,12:32 ب.ظ

سلام دوست عزیز، بله حتما.

در آینده نزدیک سعی خواهم کرد تا یک پروژه مشابه با میکرو STM32 پست کنم و فایل های مورد نیاز را برای دانلود و هم در گیت هاب قرار خواهم داد

جهت ثبت پاسخ وارد سایت شوید
amir ap
سه شنبه 2 شهریور 1400 ,01:05 ب.ظ

فوق العاده بود برنامتون واقعا خسته نباشید .

مهدی ادهم
چهارشنبه 3 شهریور 1400 ,08:21 ق.ظ

ممنونم دوست عزیز

موفق باشید

جهت ثبت پاسخ وارد سایت شوید
حمید شاکری
شنبه 28 فروردین 1400 ,09:24 ق.ظ

سلام خدا قوت

من قفل رمز رو اجرا کردم ولی در پروتئوس هیچگونه اکشنی نمیگیره یه توضیح مختصری اگر بدهید برای اجرای برنامه ممنون میشوم

من از ویزارد استفاده کردم و ورودی و خروجی هارو طبق شکل تعریف کردم LCD رو هم فعال کردم و داخل فایل ایجاد شده برنامه شما رو اضافه کردم کامپایل و BUILD ALL کردم هیچگونه ERROE ی نداد ولی دیسپلی فقط اینتر پسورد و چنج پسورد رو نشون میده اشکال کار کجاست ممنونم

تکفورال (ادمین)
شنبه 28 فروردین 1400 ,10:12 ق.ظ

قبل از اینکه تغییرات با پروژه خود را تست کنید

ابتدا فایل هگز اصلی پروژه را از مسیر

Open door With Pass_(www.techforall.ir)\Open door With Pass\Source Code\Exe

در میکرو مگا32 پروتئوس اتچ کنید و بعد امتحان کنید و بررسی کنید که فرکانس کلاک میکرو در پروتئوس

8 مگاهرتز باشد و در انتها سعی کنید تغییرات برنامه خود را بدون ویزارد و در قسمت ابتدای کد فایل main وارد کنید.

حمید شاکری
شنبه 28 فروردین 1400 ,11:07 ق.ظ

با سلام

خیلی ممنون که پاسخگو بودید

فایلی که برای برنامه قرار داده بودید برنامه فایل پروتئوس داخل پوشه simulate نبود من خودم درست کردم روشی را که فرموده بودید اجرا کردم فرکانس کار در پروتئوس در قسمت edit component چیزی که دیده میشه default هست من 8000000 هم گذاشتم ولی باز فرقی نکرد مگر اینکه من مسیر رو اشتباه فهمیده باشم خیلی ممنون از شما چنانچه بتونین این مشکلم را حل کنید ممنون میشم بیشتر دنبال برنامه ای میگردم که بتوانم با eeprom کار کنم

یعنی یک برنامه ساده ای که چها led را به صورت باینری روشن و خاموش کند و با قطع برق از جایی که بوده ادامه دهد.

بسیار سپاسگزارم

مهدی ادهم
شنبه 28 فروردین 1400 ,07:42 ب.ظ

سلام، ممنونم من چک کردم البته فایل های پوشه simulate خالی نیست نمیدونم چرا شما ندارین در هر صورت اگر هیچگونه اکشنی در شبیه ساز ندارین احتمالا از keypad نسخه پروتئوس باشه. جای آن از 12 باتن به صورت کلید ماتریسی 4x3 استفاده کنید ببینید جواب می گیرید. در مورد eeprom هم، کدویژن کمی کار را ساده کرده و در زمان معرفی متغییر از کلمه کلیدی eeprom قبل از نوع متغییر استفاده شده است که در اینصورت دیگر نیاز به نوشتن و خواندن در آدرسی از حافظه ایپیرام نیست.

حمید شاکری
دوشنبه 30 فروردین 1400 ,08:37 ق.ظ

با سلام

اشکال کار اجرا نشدن قفل رمزی در نرم افزار پروتئوس من بود که از ورژن 7 استفاده میکردم ولی بعد از نصب ورژن8.1 راه افتاد ولی با تغییر رمز و ورود رمز جدید, فرمان open صادر نمیشود و بعد از حدودا یک دقیقه کل برنامه پروتئوس بسته میشود.

چنانچه برایتان امکان داشته باشد یک برنامه کد ویژن که چهار led را به ترتیب باینری روشن کند و از حافظه eeprom استفاده کند را برایم بنویسید منظورم روش استفاده از eeprom هست برنامه ساده ای باشد که بتوانم به صورت الگو از آن جهت کار با eeprom استفاده کنم.

از اینکه مزاحم شما شدم عذر میخواهم از همکاری و پاسخ شما نیز کمال تشکر را دارم.

برنامه ای که من نوشتم به اینصورت میباشد که هنگام استپ کردن و اجرای برنامه مجدد از اول شروع میکند.

#include <mega8a.h>

#include <delay.h>

eeprom unsigned int i;

void main(void)

{

if(eeprom i==0xFFFF)eeprom i=0x0000;

DDRB=0xFF;

eeprom unsigned int i;

while (1)

{

PORTB.0=i;

delay_ms(50);

PORTB.1=i;

delay_ms(50);

PORTB.2=i;

delay_ms(50);

PORTB.3=i;

delay_ms(50);

PORTB.0=0;

delay_ms(50);

PORTB.1=0;

delay_ms(50);

PORTB.2=0;

delay_ms(50);

PORTB.3=0;

delay_ms(50);

}}

مهدی ادهم
سه شنبه 31 فروردین 1400 ,08:13 ب.ظ

سلام کاربر عزیز حمید شاکری

خوشحالم که مشکلتون حل شد با این وجود به نظر باز مشکلی در اجرای عملکرد برنامه در پروتئوس دارید.

در هر صورت کد این پروژه نمونه خوبی برای طراحی محصول مشابه با امکانات بیشتر می باشد و سعی شده کدنویسی این پروژه ساده و روان باشد و قابل فهم که عملکرد آن هم تست شده باشد.

در مورد کدی که نوشتید چند نکته است که باید رعیت شود

eeprom یکبار استفاده می شود و آن هم در زمان تعریف متغیر به عنوان مثال:

eeprom unsigned char LEDS_STATUS;

و بعد در برنامه فقط از نام متغیر استفاده شود

که یا به آن مقدار می دهید به عنوان مثال

LEDS_STATUS = 0b00001000;

همینطور

LEDS_STATUS = 0x08;

یا از مقدار آن استفاده می کنید

به عنوان مثال وضعیت خروجی یک پورت که از پین 1 تا 4 به LED متصل هستند

PORTB = LEDS_STATUS;

در نهایت امیدوارم نمونه کد زیر کمکتون کنه

techforall.ir/content/uploads/ed.zip

حمید شاکری
پنجشنبه 2 اردیبهشت 1400 ,11:28 ب.ظ

با درود فراوان

خدمت دوست گرامی جناب مهندس مهدی ادهم

با تشکر فراوان از راهنمایی شما , چندین بار مشابه برنامه ای که زحمت کشیدید نوشته بودم ولی جواب نمی گرفتم نمیدونم چرا

به هر جهت برنامه ای که زحمت کشیدید بسیار کمک حالم شد از لطف شما سپاسگزارم و امیدوارم در تمامی مراحل زندگیتان شاد و موفق و سلامت باشید.

ارادتمند شما حمید شاکری

مهدی ادهم
شنبه 4 اردیبهشت 1400 ,02:56 ب.ظ

ممنونم دوست عزیز

این که عالیه، خوشحالم که نتیجه گرفتید

موفق باشید

جهت ثبت پاسخ وارد سایت شوید
محمد موسوی
چهارشنبه 18 فروردین 1400 ,08:14 ق.ظ

روی مگا ۳۲ البته یه تغییراتی دادم روی پورت d که اون رله رو روی پورت ۷ bوصل کردم جواب داد خیلی خوب هم کار میکنه ممنون از کدی که نوشتید خیلی خوب نوشته شده بود

مهدی ادهم
چهارشنبه 18 فروردین 1400 ,11:03 ق.ظ

خب این که عالیه، ممنونم موفق باشید

جهت ثبت پاسخ وارد سایت شوید
محمد موسوی
سه شنبه 17 فروردین 1400 ,05:09 ب.ظ

برای مگا ۸ من پروژه عوض کردم هیچ کاری انجام نمیده به نظر شما مشکل از کجا

مهدی ادهم
سه شنبه 17 فروردین 1400 ,05:47 ب.ظ

به pinout مگا8 نسبت به مگا32 (PORTA استفاده شده در lcd کاراکتری و...) دقت شود که به پیکربندی جدید در سورس کد برنامه نیاز خواهد بود

محمد موسوی
چهارشنبه 18 فروردین 1400 ,08:17 ق.ظ

اینارو انجام دادم همرو تغییر دادم حالا روی مگا۳۲ درست شد

جهت ثبت پاسخ وارد سایت شوید
Meli seen
سه شنبه 4 شهریور 1399 ,09:56 ب.ظ

پروژه عالی بود.ممنوووون

تکفورال (ادمین)
چهارشنبه 5 شهریور 1399 ,04:41 ب.ظ

خواهش میکنم ،این به ما انگیزه می دهد تا با انرژی بیشتری ادامه دهیم

جهت ثبت پاسخ وارد سایت شوید