51单片机的RFID门禁系统

2023-05-16

一.硬件方案

        本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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机的RFID门禁系统 的相关文章

  • 【Stack】简单使用

    入栈 xff1a add获取栈顶元素 xff1a peek出栈 xff1a pop span class token keyword import span java span class token punctuation span ut
  • 【HashMap】基本操作

    添加键值对put获取key对应的value get遍历 xff1a keySet span class token keyword import span java span class token punctuation span uti
  • 【单调栈】496. 下一个更大元素 I

    题目 给定两个 没有重复元素 的数组 nums1 和 nums2 xff0c 其中nums1 是 nums2 的子集 找到 nums1 中每个元素在 nums2 中的下一个比其大的值 nums1 中数字 x 的下一个更大元素是指 x 在 n
  • 【堆】建堆、插入、删除、堆排序

    参考 堆就是利用数组来实现二叉树 xff0c 可用于构建优先队列 堆排序 TopK问题等 可分为 xff1a 最大堆 xff1a 父节点的值比其子节点大最小堆 xff1a 父节点的值比其子节点小 堆的根节点存放了最小 xff08 或最大 x
  • 【RDD编程】cache持久化使用场景

    Spark中RDD采用惰性求值的机制 xff0c 每次遇到action操作都会触发一次从头开始执行的计算 xff0c 在某些场景下这会使得程序性能大幅度降低 例如下面例子 xff0c 在rdd13 count 时将触发一次从rdd1开始到r
  • 【Java】自带sort库使用

    Arrays sort arr span class token keyword public span span class token keyword class span span class token class name mai
  • 如何使UDEV规则有效

    转 victor 64 X301A1 ls etc udev rules d 70 persistent cd rules 70 persistent net rules README 然后 xff1a victor 64 X301A1 s
  • 【堆】剑指 Offer 40. 最小的k个数

    输入整数数组 arr xff0c 找出其中最小的 k 个数 例如 xff0c 输入4 5 1 6 2 7 3 8这8个数字 xff0c 则最小的4个数字是1 2 3 4 示例 1 xff1a 输入 xff1a arr 61 3 2 1 k
  • 【堆】703. 数据流中的第K大元素

    设计一个找到数据流中第K大元素的类 xff08 class xff09 注意是排序后的第K大元素 xff0c 不是第K个不同的元素 你的 KthLargest 类需要一个同时接收整数 k 和整数数组nums 的构造器 xff0c 它包含数据
  • 【Queue】简单使用

    java中LinkedList实现了Queue接口 xff0c 可以当作队列使用 添加元素 xff1a offer或add方法 xff0c add方法在失败的时候会抛出异常 不推荐 删除元素 xff1a remove和poll方法都是从队列
  • 【树】剑指 Offer 55 - I. 二叉树的深度

    题目 输入一棵二叉树的根节点 xff0c 求该树的深度 从根节点到叶节点依次经过的节点 xff08 含根 叶节点 xff09 形成树的一条路径 xff0c 最长路径的长度为树的深度 例如 xff1a 给定二叉树 span class tok
  • 【树】剑指 Offer 28. 对称的二叉树

    题目 请实现一个函数 xff0c 用来判断一棵二叉树是不是对称的 如果一棵二叉树和它的镜像一样 xff0c 那么它是对称的 例如 xff0c 二叉树 1 2 2 3 4 4 3 是对称的 span class token number 1
  • 【图】1042. 不邻接植花

    题目 有 N 个花园 xff0c 按从 1 到 N 标记 在每个花园中 xff0c 你打算种下四种花之一 paths i 61 x y 描述了花园 x 到花园 y 的双向路径 另外 xff0c 没有花园有 3 条以上的路径可以进入或者离开
  • 【LinkedList】基本操作、图的邻接表

    基本操作 创建 LinkedList span class token generics function span class token punctuation lt span Integer span class token punc
  • 【Python】配置文件configparser

    使用configparser模块读取模型参数 xff0c 设置config ini文件内容如下 xff0c train 和 savepath 分别为两个session span class token punctuation span tr
  • 【Python】生成随机字符串

    参考 span class token keyword import span random span class token keyword def span span class token function random str sp
  • 【动态规划】64. 最小路径和

    题目 给定一个包含非负整数的 m x n 网格 xff0c 请找出一条从左上角到右下角的路径 xff0c 使得路径上的数字总和为最小 说明 xff1a 每次只能向下或者向右移动一步 示例 输入 1 3 1 1 5 1 4 2 1 输出 7
  • 树莓派无法安装pyqt5与pandas

    问题描述 使用pip3 install安装一些包 xff0c 例如pyqt5 pandas无法成功 sudo pip3 install pandas sudo pip3 install pyqt5 无法安装 解决方案 xff1a 安装pan
  • 【Java】二维数组初始化

    带值初始化 span class token keyword int span a span class token punctuation span span class token punctuation span span class
  • 【图】1162. 地图分析(多源BFS)

    题目 你现在手里有一份大小为 N x N 的 地图 xff08 网格 xff09 grid xff0c 上面的每个 区域 xff08 单元格 xff09 都用 0 和 1 标记好了 其中 0 代表海洋 xff0c 1 代表陆地 xff0c

随机推荐

  • 【tensorflow】数据增强

    使用tf image对图片进行数据增强 读入图片 span class token keyword from span PIL span class token keyword import span Image span class to
  • 【HashMap】使用自定义类作为key

    需要重写hashCode 和equals 方法才能实现自定义键在HashMap中的查找 span class token keyword class span span class token class name Pos span spa
  • 【图】1267. 统计参与通信的服务器

    题目 这里有一幅服务器分布图 xff0c 服务器的位置标识在 m n 的整数矩阵网格 grid 中 xff0c 1 表示单元格上有服务器 xff0c 0 表示没有 如果两台服务器位于同一行或者同一列 xff0c 我们就认为它们之间可以进行通
  • 【并查集】Java实现

    并查集理解 并查集的数据结构实现一般是数组 xff0c 通过数组来指示各个元素之间的父子关系 xff0c 通常初始化为 1 xff0c 若最终该位置的值大于0 xff0c 则表示该位置是一个孩子 xff0c 其父亲为节点的值 并查集的两个重
  • 【并查集】721. 账户合并

    题目 给定一个列表 accounts xff0c 每个元素 accounts i 是一个字符串列表 xff0c 其中第一个元素 accounts i 0 是 名称 name xff0c 其余元素是 emails 表示该帐户的邮箱地址 现在
  • 【并查集】面试题 17.07. 婴儿名字

    题目 每年 xff0c 政府都会公布一万个最常见的婴儿名字和它们出现的频率 xff0c 也就是同名婴儿的数量 有些名字有多种拼法 xff0c 例如 xff0c John 和 Jon 本质上是相同的名字 xff0c 但被当成了两个名字公布出来
  • 【Java】字符串比较compareTo

    根据字典序比较两个字符串的大小 xff0c 使用compareTo方法 xff0c 如下 xff0c 如果字符串str1和str2相等则res 61 0 xff0c 若str1字典序小于str2则res lt 0 xff0c 否则res g
  • 【Java】String indexOf substring截取字符串

    使用indexOf char c 方法获取字符串中第一次出现字符c的下标 xff0c 例如 span class token keyword public span span class token keyword class span s
  • 树莓派3B+环境搭建

    转载 xff1a https blog csdn net zhangjun62 article details 80517176 我的树莓派3b 43 没有买HDMI 屏 xff0c 利用网线与电脑主机相连操纵树莓派 如果买回来接上电 xf
  • 【Scala】创建整型数组

    var res span class token operator 61 span new ArrayBuffer span class token punctuation span Int span class token punctua
  • 【RDD编程】map和mapPartitions

    map和mapPartitions map针对RDD中的每一个元素调用一次函数 xff0c 而mapPartitions针对RDD中每个Partition调用一次函数 xff0c 假设RDD有N个元素 xff0c 有M个分区 xff0c 那
  • 【Spark入门项目】词频统计

    项目要求 要求统计txt英文文件中每个单词出现的次数 txt文件内随机拷贝英文内容 xff0c 如下 The scientists re analysed a sample collected by NASA astronauts duri
  • 【jieba】中文分词

    span class token keyword import span jieba words span class token operator 61 span jieba span class token punctuation sp
  • 【Python】读取中文

    fn span class token operator 61 span span class token builtin open span span class token punctuation span path span clas
  • 【WordCloud】生成词云

    generate from frequencies xff1a 从频率字典中生成词云 该方法传入统计好的词频字典 xff0c 例如 39 Python 39 5 39 Hadoop 39 10 39 Spark 39 20 39 大数据 3
  • 【Spark入门项目】统计男女生身高的平均值、最大、最小值

    项目要求 分别统计男女生身高的平均值 最大 最小值 xff0c 数据格式为 xff08 ID xff0c sex xff0c height xff09 xff0c 如下 xff1a 1 M 174 2 F 165 3 M 180 4 M 1
  • 【Spark入门项目】关键词统计

    项目描述 统计txt文件中出现频率前10的关键词 xff0c 内如如下 实现流程 初始化spark配置通过textFile方法读取txt文件通过flatMap将RDD中的每一个元素调用split方法分词 xff0c split中使用jieb
  • 【二叉搜索树】面试题 17.12. BiNode

    题目 二叉树数据结构TreeNode可用来表示单向链表 xff08 其中left置空 xff0c right为下一个链表节点 xff09 实现一个方法 xff0c 把二叉搜索树转换为单向链表 xff0c 要求依然符合二叉搜索树的性质 xff
  • 【二叉搜索树】1305. 两棵二叉搜索树中的所有元素(非递归中序遍历)

    题目 给你 root1 和 root2 这两棵二叉搜索树 请你返回一个列表 xff0c 其中包含 两棵树 中的所有整数并按 升序 排序 示例 1 xff1a 输入 xff1a root1 span class token operator
  • 51单片机的RFID门禁系统

    一 硬件方案 本RFID系统设计可分为硬件部分和软件部分 硬件部分以MFRC522射频识别模块为核心 xff0c 结合主控模块STC89C52设计系统的外围硬件电路 xff0c 实现对射频卡的控制与MCU之间的互通 软件部分采用C语言进行系