单片机毕设 STM32智能门禁锁(实物 代码 论文)

单片机毕设 STM32智能门禁锁

1 前言

📘 随着高校对毕业设计要求的不断提高,选择一个既具创新性又能切实解决实际问题的毕业设计题目,成为了众多毕业生面临的一大挑战。传统的选题往往因为缺乏亮点,难以达到老师和评审团的预期标准。为了帮助大家顺利通过毕业设计并展现出个人的独特风格,这里将推荐一些兼具技术性与实用性的项目选题,确保大家在完成毕业设计的过程中,既能掌握新技术,又能在答辩时脱颖而出。本次推荐的是:

🌌 基于STM32智能门禁锁

在这里插入图片描述

2 主要设计内容

基于STM32F103系列单片机,利用指纹传感器和RFID的,主要功能包括:

  • 指纹识别
  • RFID感应
  • 按键控制
  • OLED/LCD显示屏实时数据显示

原理图如下:

在这里插入图片描述

3 部分关键代码

char PcdComMF522(u8 ucCommand, u8 *pInData, u8 ucInLenByte, u8 *pOutData, u32 *pOutLenBit)
{
  char cStatus = MI_ERR;
  u8 ucIrqEn = 0x00;
  u8 ucWaitFor = 0x00;
  u8 ucLastBits;
  u8 ucN;
  u32 ul;

  switch (ucCommand)
  {
  case PCD_AUTHENT:   // Mifare认证
    ucIrqEn = 0x12;   // 允许错误中断请求ErrIEn  允许空闲中断IdleIEn
    ucWaitFor = 0x10; // 认证寻卡等待时候 查询空闲中断标志位
    break;

  case PCD_TRANSCEIVE: // 接收发送 发送接收
    ucIrqEn = 0x77;    // 允许TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEn
    ucWaitFor = 0x30;  // 寻卡等待时候 查询接收中断标志位与 空闲中断标志位
    break;

  default:
    break;
  }

  WriteRawRC(ComIEnReg, ucIrqEn | 0x80); // IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反
  ClearBitMask(ComIrqReg, 0x80);         // Set1该位清零时,CommIRqReg的屏蔽位清零
  WriteRawRC(CommandReg, PCD_IDLE);      // 写空闲命令
  SetBitMask(FIFOLevelReg, 0x80);        // 置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除

  for (ul = 0; ul < ucInLenByte; ul++)
    WriteRawRC(FIFODataReg, pInData[ul]); // 写数据进FIFOdata

  WriteRawRC(CommandReg, ucCommand); // 写命令

  if (ucCommand == PCD_TRANSCEIVE)
    SetBitMask(BitFramingReg, 0x80); // StartSend置位启动数据发送 该位与收发命令使用时才有效

  ul = 1000; // 根据时钟频率调整,操作M1卡最大等待时间25ms

  do // 认证 与寻卡等待时间
  {
    ucN = ReadRawRC(ComIrqReg); // 查询事件中断
    ul--;
  } while ((ul != 0) && (!(ucN & 0x01)) && (!(ucN & ucWaitFor))); // 退出条件i=0,定时器中断,与写空闲命令

  ClearBitMask(BitFramingReg, 0x80); // 清理允许StartSend位

  if (ul != 0)
  {
    if (!(ReadRawRC(ErrorReg) & 0x1B)) // 读错误标志寄存器BufferOfI CollErr ParityErr ProtocolErr
    {
      cStatus = MI_OK;

      if (ucN & ucIrqEn & 0x01) // 是否发生定时器中断
        cStatus = MI_NOTAGERR;

      if (ucCommand == PCD_TRANSCEIVE)
      {
        ucN = ReadRawRC(FIFOLevelReg); // 读FIFO中保存的字节数

        ucLastBits = ReadRawRC(ControlReg) & 0x07; // 最后接收到得字节的有效位数

        if (ucLastBits)
          *pOutLenBit = (ucN - 1) * 8 + ucLastBits; // N个字节数减去1(最后一个字节)+最后一位的位数 读取到的数据总位数
        else
          *pOutLenBit = ucN * 8; // 最后接收到的字节整个字节有效

        if (ucN == 0)
          ucN = 1;

        if (ucN > MAXRLEN)
          ucN = MAXRLEN;

        for (ul = 0; ul < ucN; ul++)
          pOutData[ul] = ReadRawRC(FIFODataReg);
      }
    }

    else
      cStatus = MI_ERR;
  }

  SetBitMask(ControlReg, 0x80); // stop timer now
  WriteRawRC(CommandReg, PCD_IDLE);

  return cStatus;
}

4 总结

包含内容有:
在这里插入图片描述

技术解答 - 毕设帮助请联系博主哦!

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值