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

  • 5
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值