51门禁系统设计

一、系统效果
编写程序使液晶屏上显示“清华大学”字样,调试RFID-RC522读取卡的卡号,将读取到的卡号显示在液晶屏上,并且用此卡号和EEPROM中存储的卡号进行比较,匹配液晶屏则显示“匹配成功”字样,继电器开启;反之则显示“匹配失败”字样,继电器关闭。设置三个独立按键实现以下功能:
按键1:当按下此按键时再次刷卡单片机可以将此卡号存在EEPROM中;
按键2:当按下此按键时再次刷卡单片机可以将此卡号从EEPROM中删除;
按键3:当按下此按键时再次刷卡单片机可以将EEPROM中的所有存在卡号都删除。


二、射频识别模块RFID-RC522
RFID是视频识别的英文缩写。通俗的说,RFID读卡器是一种能阅读电子标签数据的自动识别设备。RFID射频识别是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,可工作于各种恶劣环境。RFID技术可识别高速运动物体并可同时识别多个标签,操作快捷方便。
RC522是具有高集成度的读写卡芯片,也是一款非常常用的非接触式通信芯片。它利用了先进的调制和解调概念,完全集成了在13.56MHz下的所有类型的被动非接触式通信方式和协议。支持了ISO14443A的多层应用。当其工作时,射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。

 

 

 

#include <reg52.h>
#include <intrins.h>
#include   <STDIO.H>
#include <string.h>
#include"i2c.h"
#include "lcd.h"
#include "initi.h"
#include "mfrc522.h"
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit D1=P2^3;
unsigned int flg=0;//存入判断标志
unsigned int flg1=0;//读取判断标志
unsigned int flg2=0;
extern unsigned char idata g_ucTempbuf[20]; 
extern unsigned char idata array[9]; 
extern unsigned char idata brray[9]; 
void SaveCard();//存卡函数
void DeleteCard1();//删当前卡函数
void Keypros();

void main( )
{                      
     unsigned char status,i;
     P2 = 0xff;
   P0 = 0xff;
   LCD_init();
   LCD_clear(100);
      LCD_init();  //初始化LCD模块  
   ChineseChar(14,10,2,colors[2],colors[7],1);    
   ChineseChar(38,10,2,colors[2],colors[7],2);    
   ChineseChar(62,10,2,colors[2],colors[7],3);    
   ChineseChar(86,10,2,colors[2],colors[7],4);    
    InitializeSystem( );
    PcdReset();
    PcdAntennaOff(); 
    PcdAntennaOn();  
     while ( 1 )
     {   
            //Int1Init();
         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
         if (status != MI_OK)
         {    
                continue;
         }
                 
               display_type();//显示
             
                    /*    printf("卡的类型:");
            for(i=0;i<2;i++)
                    {
                        temp=g_ucTempbuf[i];
                        printf("%X",temp);
                    }
                    */
         status = PcdAnticoll(g_ucTempbuf); 
         if (status != MI_OK)
         {    
                     continue;  
                 } 
                 display_cardnum();//显示寻到的卡的序列号
                            FM_QI= 0; //蜂鸣器
                  delay_ms(100);
                            FM_QI= 1;
                            delay_ms(100);
                            FM_QI= 0;
                            delay_ms(200);
                            FM_QI= 1;                              
                            PcdHalt();                        
                            SaveCard();
                            DeleteCard();    //全部删掉
                            LCD_clear(5);
                            for(i=0;i<6;i++)
                            {
                                if(k3==0)
                            {
                                delay_ms(1); //消抖处理
                                if(k3==0)
                                {
                                DeleteCard1();   //删掉当前一张
                                if(flg2==1)
                                {
                                    flg1=0;
                                    break;
                                }
                                }
                            }
                                else
                                {
                                    Keypros();
                                }
                            }    
            }            
}
void SaveCard()//存卡函数
{
    unsigned int i;
    if(k1==0)
        {
            delay_ms(1); //消抖处理
            if(k1==0)
            {
                    switch(flg)
                {
                    case 0:
                    for(i=0;i<8;i++)
                    {
                        At24c02Write(i,brray[i]);   //在地址内写入数据
                        delay_ms(5);
                    }break;
                    case 1:
                    for(i=0;i<8;i++)
                    {
                        At24c02Write(i+8,brray[i]);   //在地址内写入数据
                        delay_ms(5);
                    }break;
                    case 2:
                    for(i=0;i<8;i++)
                    {
                        At24c02Write(i+16,brray[i]);   //在地址内写入数据
                        delay_ms(5);
                    }break;
                    case 3:
                    for(i=0;i<8;i++)
                    {
                        At24c02Write(i+24,brray[i]);   //在地址内写入数据
                        delay_ms(5);
                    }break;
                    case 4:
                    for(i=0;i<8;i++)
                    {
                        At24c02Write(i+32,brray[i]);   //在地址内写入数据
                        delay_ms(5);
                    }break;
                    default:
                        break;
            }
                flg=flg+1;
                if(flg==5)
                {
                    flg=0;
                }
    }
    }
}

void DeleteCard1()//删当前卡函数
{
        unsigned int i;
        switch(flg1)
            {
                case 0:
                for(i=0;i<8;i++)
                {
                    array[i]=At24c02Read(i);      //读取EEPROM地址内的数据保存在num中
                    delay_ms(5);
                }break;
                case 1:
                for(i=0;i<8;i++)
                {
                    array[i]=At24c02Read(i+8);      //读取EEPROM地址内的数据保存在num中
                    delay_ms(5);
                }break;
                case 2:
                for(i=0;i<8;i++)
                {
                    array[i]=At24c02Read(i+16);      //读取EEPROM地址内的数据保存在num中
                    delay_ms(5);
                }break;
                case 3:
                for(i=0;i<8;i++)
                {
                    array[i]=At24c02Read(i+24);      //读取EEPROM地址内的数据保存在num中
                    delay_ms(5);
                }break;
                case 4:
                for(i=0;i<8;i++)
                {
                    array[i]=At24c02Read(i+32);      //读取EEPROM地址内的数据保存在num中
                    delay_ms(5);
                }break;
                default:
                    break;
            }
    array[8]='\0';
    if(array[0]==brray[0]&&array[1]==brray[1]&&array[2]==brray[2]&&array[3]==brray[3]&&array[4]==brray[4]&&array[5]==brray[5]&&array[6]==brray[6]&&array[7]==brray[7])
    {        
            D1=1;
            flg2=1;
            ChineseChar(14,10,2,colors[2],colors[7],11);    
            ChineseChar(38,10,2,colors[2],colors[7],12);    
            ChineseChar(62,10,2,colors[2],colors[7],7);        
            ChineseChar(86,10,2,colors[2],colors[7],8);
            switch(flg1)
            {
                case 0:
                for(i=0;i<8;i++)
                {
                    At24c02Write(i,0);   //在地址内写入数据
                    delay_ms(5);
                }break;
                case 1:
                for(i=0;i<8;i++)
                {
                    At24c02Write(i+8,0);   //在地址内写入数据
                    delay_ms(5);
                }break;
                case 2:
                for(i=0;i<8;i++)
                {
                    At24c02Write(i+16,0);   //在地址内写入数据
                    delay_ms(5);
                }break;
                case 3:
                for(i=0;i<8;i++)
                {
                    At24c02Write(i+24,0);   //在地址内写入数据
                    delay_ms(5);
                }break;
                case 4:
                for(i=0;i<8;i++)
                {
                    At24c02Write(i+32,0);   //在地址内写入数据
                    delay_ms(5);
                }break;
                default:
                    break;
        }
    }
    else
    {
        flg1=flg1+1;
    }
}

void DeleteCard()//删全部卡函数
{
    unsigned int i;
    if(k2==0)
    {
        delay_ms(1); //消抖处理
        if(k2==0)
        {
            for(i=0;i<40;i++)
            {
                At24c02Write(i,0);   //在地址内写入数据
                delay_ms(5);
            }
            ChineseChar(14,10,2,colors[2],colors[7],11);    
            ChineseChar(38,10,2,colors[2],colors[7],12);    
            ChineseChar(62,10,2,colors[2],colors[7],7);        
            ChineseChar(86,10,2,colors[2],colors[7],8);        
            flg=0;
    }
    }
}
void Keypros()
{
      unsigned int i;
        switch(flg1)
                {
                    case 0:
                    for(i=0;i<8;i++)
                    {
                        array[i]=At24c02Read(i);      //读取EEPROM地址内的数据保存在num中
                delay_ms(5);
                    }break;
                    case 1:
                    for(i=0;i<8;i++)
                    {
                        array[i]=At24c02Read(i+8);      //读取EEPROM地址内的数据保存在num中
                        delay_ms(5);
                    }break;
                    case 2:
                    for(i=0;i<8;i++)
                    {
                        array[i]=At24c02Read(i+16);      //读取EEPROM地址内的数据保存在num中
                        delay_ms(5);
                    }break;
                    case 3:
                    for(i=0;i<8;i++)
                    {
                        array[i]=At24c02Read(i+24);      //读取EEPROM地址内的数据保存在num中
                        delay_ms(5);
                    }break;
                    case 4:
                    for(i=0;i<8;i++)
                    {
                        array[i]=At24c02Read(i+32);      //读取EEPROM地址内的数据保存在num中
                        delay_ms(5);
                    }break;
                    default:
                        break;
                }
                
        array[8]='\0';
        if(array[0]==brray[0]&&array[1]==brray[1]&&array[2]==brray[2]&&array[3]==brray[3]&&array[4]==brray[4]&&array[5]==brray[5]&&array[6]==brray[6]&&array[7]==brray[7])
        {
                D1=0;
                ChineseChar(14,10,2,colors[2],colors[7],5);    
                ChineseChar(38,10,2,colors[2],colors[7],6);    
                ChineseChar(62,10,2,colors[2],colors[7],7);    
                ChineseChar(86,10,2,colors[2],colors[7],8);    
              LCD_ShowString(12,80,colors[0],colors[5],array);  
                flg1=0;
        }
        else
        {
            flg1=flg1+1;
        }
                if(flg1==5)
                {
                        D1=1;
                        ChineseChar(14,10,2,colors[2],colors[7],5);    
                        ChineseChar(38,10,2,colors[2],colors[7],6);    
                        ChineseChar(62,10,2,colors[2],colors[7],9);    
                        ChineseChar(86,10,2,colors[2],colors[7],10);
                      flg1=0;
                }
}
void InitializeSystem()//系统初始化
{
     TMOD=0x21;           //设T0为方式1,GATE=1;
    SCON=0x50;
    TH1=0xFA;          //波特率为4800bps
    TL1=0xFA;
    TH0=0;
    TL0=0; 
    TR0=1;  
    ET0=1;             //允许T0中断
    TR1=1;               //开启定时器
    TI=1;
    EA=1;                   //开启总中断        
    ES = 1;
    RI = 1;
}

  • 7
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值