单片机毕设 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 总结
包含内容有:
技术解答 - 毕设帮助请联系博主哦!