51单片机RFID门禁系统设计与实现详解

一.硬件方案

        本RFID系统设计可分为硬件部分和软件部分。硬件部分以MFRC522射频识别模块为核心,结合主控模块STC89C52设计系统的外围硬件电路,实现对射频卡的控制与MCU之间的互通。软件部分采用C语言进行系统的下位机程序的开发,完成与IC卡之间的通信,实现数据交换功能。整体电路主要由51单片机最小系统,LCD12864液晶显示模块,RFID无线模块,5V转3.3V稳压电路,蜂鸣器模块,AT24C02存储电路,继电器控制电路,按键模块;原理图如图:

 PCB如图:

 

二.设计功能

  • 通过按键输入密码,根据密码的正确与否来进行相应的操作;
  • 可使用管理员密码可以自行设定和修改密码;修改的密码自动保存至存储芯片,支持掉电保存;
  • IC卡感应,匹配成功开锁;匹配三次不成功,蜂鸣器报警;输入正确的密码后,驱动开锁电路。
  • 三.软件设计

    (1)LCD初始化

    /*******************************************************************/
    void lcd_init()
    { 
    
       LCD_PSB = 1;         //并口方式    ,部分液晶不需要
        write_cmd(0x36);      //扩充指令操作
        delay(5);
        write_cmd(0x30);      //基本指令操
        delay(5);
        write_cmd(0x0C);      //显示开,关光标
        delay(5);
        write_cmd(0x01);      //清除LCD的显示内容
        delay(5);
    }

    (2)修改密码

    case 3:        
                   display(1,0,4);      //密码设置
                   display2(3,0,table,8);
                   key_count=0;
                   while(1)
                   {  
                      key_value=key_scan();      
                      if(key_value==12) 
                       { 
                         states--;
                         return;
                        }
                 
                      if(key_value>=0 && key_value <=9)//有按键输入
                      {                                                  
                        table[key_count++]=key_value+'0';
                        display2(3,0,table,8);            
                      }
                      
                      if(key_value==11)//退格
                      {                                    
                        table[--key_count]='-';
                        display2(3,0,table,8);                 
                      }
    
                       if(key_count==8 && key_value == 15) //按下确定键
                      
                      { 
                      
                        for(i=0;i<8;i++)
                         KEY_BUF[i]=table[i];    
                            EEPROM_WRITE(7,KEY_BUF,8);//写入EEPROM
                     
                       break;
                       }
                    }              
                    
                   break ;

    (3)匹配密码

      case 1:        
                   display(1,0,2);    //密码输入
                   display2(3,0,table,8);
                   key_count=0;
                   while(1)
                   {  
                      key_value=key_scan();      
                      if(key_value==12) 
                       { 
                         states--;
                         return;
                        }
    
                      if(key_value==13)
                      {
                       states++;
                       return;
                      }                 
                      if(key_value>=0 && key_value <=9)//有按键输入
                      {                                                  
                        table[key_count++]=key_value+'0';
                        display2(3,0,table,8);            
                      }
                      
                      if(key_value==11)//退格
                      {                                    
                        table[--key_count]='-';
                        display2(3,0,table,8);                 
                      }
    
                      if(key_count==8)
                      {
                         if( table[0]==KEY_BUF[0] &&
                             table[1]==KEY_BUF[1] &&
                              table[2]==KEY_BUF[2] &&
                             table[3]==KEY_BUF[3] &&
                             table[4]==KEY_BUF[4] &&
                             table[5]==KEY_BUF[5] &&
                             table[6]==KEY_BUF[6] &&
                             table[7]==KEY_BUF[7] )      //密吗正确 
                    
                         { 
                           bPass=1;
                           relay_ON();//灯开关
                           display(2,0,5);
                           relay_OFF();
                           break;                  
                        
                         }
                          else      //密码错误
                          {    
                            relay_OFF();
                            beep1()     ;
                            bWarn=1;
                            display(2,0,6);
                             break;
                         }                      
                      }
    
                   }
                   break ;

    (3)主程序源码

    void main(void)      //主函数
    {    
        INT8U key;
    
        Delay_ms(50); //让硬件稳定
        init_all();       //执行初始化函数
        relay_OFF();   //关继电器
        LED_BLINK_1(); //led test
        beep1();       //beep test     
        display(0,0,0);     //显示初始化
    
        while(1)
        {
           key=key_scan(); //按键操作
           if(key==12)  if(states>0) states--;
                        else states=0;    //上一功能
           
           if(key==13) if(++states>3) states=3;    //下一功能
           ctrl_process(); //进入RC522操作
        }
    }      

    资料链接:https://pan.baidu.com/s/1KkmG5-HjxLwf_3w9jcIkiQ?pwd=oyni 
    提取码:oyni

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机RFID门禁系统设计与实现详解

    发表评论