این یک پروژه تهیه قفل رمز دیجیتالی الکترونیکی است. هدف در این پروژه مفید بودن مدار ساخته شده و کارکرد صحیح آن میباشد. ضمن اینکه در طی طراحی این مدار آشنایی عملی و بسیار خوب با میکرو AVR وبعضی قطعات پرکاربرد الکترونیکی دیگر نظیر صفحه کلید و LCD و پروتکل های آن ها و چگونگی اتصال ان ها با میکرو صورت گرفت .

      همچنین برنامه نویسی عملی برای میکرو به این صورت, چگونگی عملکرد برنامه نوشته شده و صحت آن در مدار بسته شده خود حاوی تجارب بسیار مفیدی بود.و این راه را برای طراحی مدارات  پیشرفته تر وپیچیده تر با میکرو آسان مینماید.

    این نکته قابل ذکر است که این اولین مدار میکرو کنترلی ساخته شده به صورت عملی برای من بود و تجربه چنین کاری بسیار با طراحی آن در نرم افزارهای شبیه ساز متفاوت است.(خطاهای برنامه و چگونگی اتصالات بین اجزای مختلف مدار و پروتکل های هر جز با شبیه سازی توسط نرم افزار متفاوت میباشد .)

اجزای اساسی این مدار:

1)میکرو
ATMEGA32
2)
LCD کاراکتری 16*2
3) صفحه کلید 3*4 ماتریسی
4)
LED
5) برد بورد.
6)سیم های رابط.
7) مقاومت های1و0.680 کیلواهم



نرم افزار:

     نرم افزار استفاده شده در این پروژه (bascom avr ) میباشد که زبان برنامه نویسی آن بیسیک است. این تعداد زیاد خط برنامه نویسی برای رفع تقریبا کامل باگ ها و خطاهای احتمالی و غیر احتمالی در مدار عملی و حین کار مدار و ارایه یک مدار بی نقص میباشد.در برنامه این نرم افزار از مجموعه ای از دستورات نرم افزای مثل دستورات شرطی و...و روشها و تکنیک های برنامه نویسی همچون روش نظاره به جدول(برای عملکرد صفحه کلید)و تعداد زیادی subroutine (زیر برنامه) و ایجاد تاخیر های مناسب برای عملکرد مدار را نام برد.

     نرم افزا دیگری که در طراحی این مدار برای تست طرز عملکرد مدار به کار گرفته شد (proteus) میباشد . ولی همان طور که گفته شد شبیه سازی با این نرم افزار تا پیاده سازی عملی و به نتیجه رسیدن در مدار عملی بسیار سخت تر از شبیه سازی با نرم افزار است.
 

•   از دیگر قابلیت های این مدار توانایی افزودن دیگر مدارات جانبی همانند سیستم کارت خوان و... میباشد.
•     این مدار قابلیت کاربرد در اماکن امنیتی و مهم و نیز در هر مکان و هر وسیله دیگری که فاکتور امنیت در آن مهم باشد را دارا میباشد . ضمن اینکه سبب آسانی و راحتی کاربران در هر محل کاربرد میباشد.

     رمز اولیه دستگاه هنگام روشن شدن آن 1234  میباشد و رمز اصلی آن   (master password)  عدد 1357  است.ضمن اینکه با فشردن کلید * میتوان رمز(password) را تغییر داد و با فشردن کلید # میتوان رمز اصلی (master password ) را تعویض نمود.  تعداد ارقام مورد استفاده در دستگاه 4 رقم است که با تغییر در برنامه آن میتوان تعداد ارقام رمز (password) را 254 رقم افزایش داد

امنیت:
     احتمال درست وارد کردن رمز توسط افراد غیر مرتبط ؛ با این تعداد ارقام(4 رقم) در فرصت اول 10000/1 میباشدو تا سه مرحله فرصتی که دستگاه برای وارد کردن رمز درست به افراد میدهد این عدد به 10000/3 میرسد که این عدد معادل 0003/. است که این نشان دهنده امنیت مناسب این دستگاه در برابر نفوذ اتفاقی میباشد.


توان مصرفی:

توان مصرفی در حالت عادی : 475
mW در ولتاژ 5 ولت.
بیشترین توان مصرفی :  771 mW در ولتاژ5 ولت.

برنامه نوشته شده:

/*****************************************************

This program was produced by the

CodeWizardAVR V1.24.8d Professional

Automatic Program Generator

© Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

 

Project :

Version :

Date    : 2007/08/25

Author  : F4CG                           

Company : F4CG                           

Comments:

 

 

Chip type           : ATmega16

Program type        : Application

Clock frequency     : 8.000000 MHz

Memory model        : Small

External SRAM size  : 0

Data Stack size     : 256

*****************************************************/

 

#include >

#include >

 

// Alphanumeric LCD Module functions

#asm

   .equ __lcd_port=0x1B ;PORTA

#endasm

#include >

 

// Declare your global variables here

unsigned char in[4];

int chflage=0;

eeprom unsigned int x[4]={'6','6','7','2'};

unsigned int counter=0;

unsigned int pass[4]={'6','6','7','2'} ;  

 

void eiman(void);

void change();

void init();

void check();

 

 

void kp(void){

 

 

 

 

 if(PINB.6==1)

 {

        

 

     PORTB.0=0;

     PORTB.1=0;

     PORTB.2=0;

     PORTB.6=1;

    

              if(PINB.0==1){            

                 

              

                  in[counter]='1';         

                  lcd_putchar('*');

                 // eiman();              

              }

              else if(PINB.1==1){

               

              

                  

                   in[counter]='2';

                   lcd_putchar('*');                  

                   // eiman();        

                }

              else if(PINB.2==1){

                    

                   

                  

                    in[counter]='3';

                    lcd_putchar('*');                   

                    //eiman();  

               }

               else

               {            

               

                in[counter]='1'; 

                 lcd_putchar('*');                       

                //eiman();              

              }      

             

  }

 //-------------------------

 

  

else if(PINB.5==1)

 {

     

   

     PORTB.0=0;

     PORTB.1=0;

     PORTB.2=0;

     PORTB.5=1;

              if(PINB.0==1){

                

                   in[counter]='4';

                   lcd_putchar('*');                  

                  //eiman();              

              }

             else if(PINB.1==1){ 

                 

               

                 

                   in[counter]='5';

                   lcd_putchar('*');                  

                    //eiman();        

                }

              else if(PINB.2==1){

             

                 

                    in[counter]='6';

                    lcd_putchar('*');                   

                    //eiman();  

               }

               else

               {            

               

                in[counter]='4';

                lcd_putchar('*');                         

                //eiman(); 

                }    

              

  }

 

 

                             

 

 

 

//---------------------------- 

else  if(PINB.4==1)

 {

 

      

 

     PORTB.0=0;

     PORTB.1=0;

     PORTB.2=0;

     PORTB.4=1;

             

               if(PINB.0==1){      

                  

 

                   in[counter]='7';

                   lcd_putchar('*');                  

                  //eiman();              

              }

             else if(PINB.1==1){

               

              

                   in[counter]='8';

                   lcd_putchar('*');                  

                    //eiman();        

                }

             else  if(PINB.2==1){

              

             

                    in[counter]='9';

                    lcd_putchar('*');                   

                    //eiman();  

               }

               else

               {            

               

                in[counter]='7';

                lcd_putchar('*');                        

                //eiman();       

                  }

  }

//------------------------------

  

else if(PINB.3==1)

 {

     

   

     PORTB.0=0;

     PORTB.1=0;

     PORTB.2=0;

     PORTB.3=1;

              if(PINB.0==1){

            

                   //in[counter]='*';

                  change();

                  //eiman();              

              }

             else if(PINB.1==1){

             

                  

                  

                   in[counter]='0';

                   lcd_putchar('*');                   

                    //eiman();        

                }

              else if(PINB.2==1){

              

             

         

                    //in[counter]='#';

                    if(chflage==2){

                        chflage=0;

                        lcd_clear();

                        lcd_gotoxy(0,0);

                        lcd_putsf("Set Pass Failed");

                        delay_ms(2000);

                        lcd_clear();

                        lcd_gotoxy(0,0);

                        lcd_putsf("Enter Pass:");

                        lcd_gotoxy(0,1);

                        counter=0;

                        eiman();                        

                    }

                    check();

                    lcd_putchar('*');                   

                    //eiman();  

               }

               else

               {            

               

                //in[counter]='*';         

                change();

                //eiman();      

              }

  }

}

 

//***********************************************

void main(void)

{

// Declare your local variables here

 

// Input/Output Ports initialization

// Port A initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTA=0x00;

DDRA=0x00;

 

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTB=0x00;

DDRB=0x00;

 

// Port C initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0x00;

 

// Port D initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x00;

 

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

 

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: Timer 1 Stopped

// Mode: Normal top=FFFFh

// OC1A output: Discon.

// OC1B output: Discon.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0x00;

TCCR1B=0x00;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

 

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

 

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0x00;

MCUCSR=0x00;

 

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

 

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

 

// LCD module initialization

lcd_init(16);

 

DDRC.1=1;

DDRD.7=1;

DDRB.0=1;

DDRB.1=1;

DDRB.2=1;

DDRB.3=1;

DDRB.4=1;

DDRB.5=1;

DDRB.6=1;

 

lcd_clear();

init();

lcd_gotoxy(0,0);

lcd_putsf("Enter Pass:");

lcd_gotoxy(0,1);

counter=0;

eiman();

 

}

 

 

//****************************************

 

  void eiman(void){

  while(1){ 

      PORTC.1=1; \\LED Press ON

    

      PORTB.3=0;

      PORTB.4=0;

      PORTB.5=0;              

      PORTB.6=0;              

      PORTB.0=1;

      PORTB.1=1;

      PORTB.2=1;  

   

    

if(PINB.3==1||PINB.4==1||PINB.5==1||PINB.6==1)

      {

        PORTC.1=0;      \\LED Press OFF     

        kp();

       delay_ms(500);

       counter++;

      

   }

  }

 }

//*******************************************

void check(){

        int g;

        lcd_clear();

        if(in[0]==pass[0]&&in[1]==pass[1]&&in[2]==pass[2]&&in[3]==pass[3]){

                if(chflage==1){

                        lcd_clear();

                        lcd_gotoxy(0,0);

                        lcd_putsf("Enter New Pass:");

                        lcd_gotoxy(0,1);

                        delay_ms(2000);

                        counter=0;

                        chflage=2;

                        eiman();

                }

                else{

                        lcd_gotoxy(0,0);

                        lcd_putsf("Pass Is Correct");

                        PORTD.7=1;

                        delay_ms(2000);

                        lcd_clear();

                        lcd_gotoxy(0,0);

                        lcd_putsf("Opening The Door");

                        PORTD.7=0;

                        delay_ms(2000);

                        lcd_clear();

                        lcd_gotoxy(2,0);

                        lcd_putsf("Loading...");

                        for(g=1;g<15;g++){

                                lcd_gotoxy(g,1);

                                lcd_putchar('*');

                                delay_ms(100);

                        }

                        lcd_clear();

                }

        }

        else{

                lcd_gotoxy(0,0);

                lcd_putsf("Pass Is Worng");

                PORTD.7=0;

                delay_ms(2000);               

        }

       

        main();

 

}   

//**********************************

void change(){

        int g;

 

        if(chflage==2){

                lcd_clear();

                for(g=0;g<4;g++){

                        x[g]=in[g];

                        delay_ms(50);

                }

                lcd_gotoxy(0,0);

                lcd_putsf("Pass Confirmed");                       

                delay_ms(2000);

                lcd_clear();

                lcd_gotoxy(2,0);

                lcd_putsf("Loading...");

                for(g=1;g<15;g++){

                        lcd_gotoxy(g,1);

                        lcd_putchar('*');

                        delay_ms(100);

                }       

                chflage=0;

                lcd_clear();

                main();

        }

        if(counter!=0){

                lcd_clear();

                lcd_gotoxy(0,0);

                lcd_putsf("Error");

                delay_ms(2000);

                lcd_clear();

                main();

        }       

        chflage=1;

        lcd_clear();

        lcd_gotoxy(0,0);

        lcd_putsf("Enter Old Pass:");

        lcd_gotoxy(0,1);

        counter=0;

        eiman();

}

//***********************************

void init(){

        int g;

        for(g=0;g<4;g++){

             pass[g]=x[g];

             delay_ms(50);

        }

 

}
     

 

 

 

 

 

+ نوشته شده توسط Milad در و ساعت 1:6 |


Powered By
BLOGFA.COM