基于STM32的智能门禁系统
stm32F407主控芯片
RFID模块
矩阵按键模块
AS608指纹模块
SG90舵机模块
OLED显示屏模块
一、系统设计框架图
二、模块设计
RFID
寻卡
//功能描述寻卡读取卡类型号
//输入参数reqMode--寻卡方式
// TagType--返回卡片类型
// 0x4400 = Mifare_UltraLight
// 0x0400 = Mifare_One(S50)
// 0x0200 = Mifare_One(S70)
// 0x0800 = Mifare_Pro(X)
// 0x4403 = Mifare_DESFire
//返 回 值成功返回MI_OK
u8 MFRC522_Request(u8 reqMode, u8 *TagType)
{ u8 status; u16 backBits; //接收到的数据位数// Write_MFRC522(BitFramingReg, 0x07); //TxLastBists = BitFramingReg[2..0] TagType[0] = reqMode; status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits); // if ((status != MI_OK) || (backBits != 0x10)) { status = MI_ERR;}// return status;
}
读取卡序列号
//功能描述防冲突检测读取选中卡片的卡序列号
//输入参数serNum--返回4字节卡序列号,第5字节为校验字节
//返 回 值成功返回MI_OK
u8 MFRC522_Anticoll(u8 *serNum)
{ u8 status; u8 i; u8 serNumCheck=0; u16 unLen;// ClearBitMask(Status2Reg, 0x08); //TempSensclear ClearBitMask(CollReg,0x80); //ValuesAfterColl Write_MFRC522(BitFramingReg, 0x00); //TxLastBists = BitFramingReg[2..0]serNum[0] = PICC_ANTICOLL1; serNum[1] = 0x20; status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);// if (status == MI_OK){ //校验卡序列号 for(i=0;i<4;i++) serNumCheck^=serNum[i];//if(serNumCheck!=serNum[i]) status=MI_ERR;}SetBitMask(CollReg,0x80); //ValuesAfterColl=1// return status;
}
匹配卡号
u8 check_ID(u8 *a, u8 *b)
{int i;for(i=0;i<4;i++){if( a[i] == b[i])continue;else return 1; }return 0;
}
保存卡
//保存卡号
void save_id(u8 *card_numberbuf)
{char Wbuf[32];int i;printf("count:%d\n",count);w25q128_sector_erase(0x001000+0x001000*count);//擦除第count+1个扇区delay_ms(500);w25q128_read_data(0x001000+0x001000*count,Wbuf,20);//读取for(i=0;i<10;i++)printf("[%#x] ",Wbuf[i]);printf("\r\n");//sprintf(Wbuf,"%x%x%x%x\0",);w25q128_write_data(0x001000+0x001000*count,(char *)card_numberbuf,4);w25q128_read_data(0x001000+0x001000*count,Wbuf,20);for(i=0;i<10;i++)printf("[%#x] ",Wbuf[i]);printf("\r\n");memset(Wbuf,0,sizeof(Wbuf));count++;
}
删除卡
//删除卡号
void del_id(u8 *card_numberbuf)
{int i,j;u8 flag;char NextID[32];for(i=0;i<count;i++){w25q128_read_data(0x001000+0x001000*i,NextID,4);printf("card_id[%d]",i);printf("now_card_id:"); flag = check_ID((u8 *)NextID,card_numberbuf);printf("比较第%d张卡\n",i+1);if(flag == 0) //遍历成功找到{printf("卡号存在!");printf("为第%d张卡\n",i+1);break;}}for(j = i;j<count;j++){w25q128_sector_erase(0x001000+0x001000*j);w25q128_read_data(0x001000+0x001000*(j+1),NextID,4);w25q128_write_data(0x001000+0x001000*j,NextID,4);memset(NextID,0,sizeof(NextID));}count--;}
矩阵按键
按行按列读取,获取按键值
char get_keyboard()
{int x,y;//设置PA0~PA3为输出,PB0~PB3为输入GPIO_SET_MODE(GPIO_Mode_OUT,1);//读取电平x = get_num(GPIO_Mode_OUT);//设置PB0~PB3为输出模式,清零GPIO_SET_MODE(GPIO_Mode_OUT,0);//设置PB0~PB3为输出模式,PA0~PA3为输入模式GPIO_SET_MODE(GPIO_Mode_IN,1);//读取电平y = get_num(GPIO_Mode_IN);//清零GPIO_SET_MODE(GPIO_Mode_IN,0);//printf("x=%d\n",x);//printf("x=%d\n",x);return arr[x][y];
}
指纹
检测是否有手指按下图像
//录入图像 PS_GetImage
//功能:探测手指,探测到后录入指纹图像存于ImageBuffer。
//模块返回确认字
u8 PS_GetImage(void)
{u16 temp;u8 ensure;u8 *data;SendHead();SendAddr();SendFlag(0x01);//命令包标识SendLength(0x03);Sendcmd(0x01);temp = 0x01+0x03+0x01;SendCheck(temp);data=JudgeStr(2000);if(data)ensure=data[9];elseensure=0xff;return ensure;
}
刷指纹
void press_FR(void)
{SearchResult seach;u8 ensure;ensure=PS_GetImage();delay_ms(3000);if(ensure==0x00)//获取图像成功 { printf("获取图像成功!");PFout(10) = 0;ensure=PS_GenChar(CharBuffer1);if(ensure==0x00) //生成特征成功{printf("生成特征成功!"); PFout(10) = 1;ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);if(ensure==0x00)//搜索成功{printf("搜索成功!");printf("刷指纹成功,此人ID:%d 匹配得分:%d\r\n",seach.pageID,seach.mathscore);opendoor();}else {printf("指纹不存在,匹配失败!"); ShowErrMessage(ensure);}}else{printf("指纹识别失败\r\n");ShowErrMessage(ensure);}//PFout(10) = 1;delay_ms(2000);}AS608_flag = 0;
}
录入指纹
void Add_FR(void)
{u8 i,ensure ,processnum=0;u16 ID;while(AS608_flag == 1){switch (processnum){case 0:i++;printf("请按下指纹...\r\n");OLED_Clear();OLED_ShowCHinese(0,2,48);//请OLED_ShowCHinese(18,2,49);//按OLED_ShowCHinese(36,2,50);//下OLED_ShowCHinese(54,2,40);//指OLED_ShowCHinese(72,2,41);//纹delay_xms(2000);ensure=PS_GetImage();if(ensure==0x00) {PFout(9) = 0;ensure=PS_GenChar(CharBuffer1);//生成特征PFout(9) = 1;if(ensure==0x00){printf("指纹正常\r\n");i=0;processnum=1;//跳到第二步 }else ShowErrMessage(ensure); }else ShowErrMessage(ensure); break;case 1:i++;printf("请再按一次指纹...\r\n");OLED_Clear();OLED_ShowCHinese(0,2,48);//请OLED_ShowCHinese(18,2,51);//再OLED_ShowCHinese(36,2,49);//按OLED_ShowCHinese(54,2,50);//下OLED_ShowCHinese(72,2,40);//指OLED_ShowCHinese(90,2,41);//纹ensure=PS_GetImage();if(ensure==0x00) {PFout(9) = 0;ensure=PS_GenChar(CharBuffer2);//生成特征PFout(9) = 1;if(ensure==0x00){printf("指纹正常\r\n");i=0;processnum=2;//跳到第三步}else ShowErrMessage(ensure); }else ShowErrMessage(ensure); break;case 2:printf("对比两次指纹...\r\n");ensure=PS_Match();if(ensure==0x00) {printf("对比成功,两次指纹一样\r\n");processnum=3;//跳到第四步}else {printf("对比失败,请重新录入指纹\r\n");ShowErrMessage(ensure);i=0;processnum=0;//跳回第一步 }delay_ms(1200);break;case 3:printf("生成指纹模板...\r\n");ensure=PS_RegModel();if(ensure==0x00) {printf("生成指纹模板成功\r\n");processnum=4;//跳到第五步}else {processnum=0;ShowErrMessage(ensure);}delay_ms(1200);break;case 4:ID = ID_input();//输入存储用的ID号ensure=PS_StoreChar(CharBuffer2,ID);//储存模板if(ensure==0x00) { printf("录入指纹成功\r\n");//录入失败OLED_ShowCHinese(0,2,40);//指OLED_ShowCHinese(18,2,41);//纹OLED_ShowCHinese(36,2,53);//录OLED_ShowCHinese(54,2,54);//入OLED_ShowCHinese(72,2,26);//成OLED_ShowCHinese(90,2,27);//功AS608_flag = 0;PS_ValidTempleteNum(&ValidN);//读库指纹个数printf("剩余指纹容量为%d\r\n",AS608Para.PS_max-ValidN);return ;}else {processnum=0;ShowErrMessage(ensure);} break; }delay_xms(2000);if(i==5)//超过5次没有按手指则退出{printf("--------超过5次没有按手指则退出--------\r\n");//录入失败OLED_ShowCHinese(0,2,40);//指OLED_ShowCHinese(18,2,41);//纹OLED_ShowCHinese(36,2,53);//录OLED_ShowCHinese(54,2,54);//入OLED_ShowCHinese(72,2,28);//失OLED_ShowCHinese(90,2,29);//败AS608_flag = 0;break; }}}
删除指纹
void Del_FR(void)
{u8 ensure;u16 num;printf("删除指纹,请输入指纹ID\r\n");OLED_Clear();OLED_ShowCHinese(0,2,55);//输OLED_ShowCHinese(18,2,56);//入OLED_ShowCHinese(36,2,40);//指OLED_ShowCHinese(54,2,41);//纹OLED_ShowCHinese(72,2,57);//编OLED_ShowCHinese(90,2,58);//号delay_ms(50);num = ID_input();//输入删除用的ID号if(num==0xFFFF)goto MENU ; //返回主页面else if(num==0xFF00)ensure=PS_Empty();//清空指纹库else ensure=PS_DeletChar(num,1);//删除单个指纹if(ensure==0){printf("删除指纹成功\r\n");OLED_Clear();OLED_ShowCHinese(0,2,40);//指OLED_ShowCHinese(18,2,41);//纹OLED_ShowCHinese(36,2,32);//删OLED_ShowCHinese(54,2,33);//除OLED_ShowCHinese(72,2,26);//成OLED_ShowCHinese(90,2,27);//功 }elseShowErrMessage(ensure); delay_ms(750);PS_ValidTempleteNum(&ValidN);//读库指纹个数printf("剩余指纹个数:%d\r\n",AS608Para.PS_max-ValidN);AS608_flag = 0;MENU: printf("返回主程序\r\n");
}
基于STM32的智能门禁系统相关推荐
- 基于STM32的智能门禁卡片(开题报告)
备注:本文参考了稚晖君的智能门禁卡项目,当时开本项目是作为我毕设的备选方案之一,不过后面被指导老师否决后,只保留了开题报告,我没有更多的研究资料了. 基于STM32的智能门禁卡片(开题报告) 一.研究 ...
- 基于STM32的最小系统电路设计(手把手零基础教学)
文章目录 前言 一.复位电路 二.晶振电路 三.电源转换电路 四.SWD下载电路 五.LED测试电路 六.芯片外扩引脚 七.STM32微控制电路 总结 前言 在上篇介绍完<STM32的核心 ...
- 基于STM32视频监控系统
目录 一.项目需求 二.原理图 三.上位机界面 四.实物 五.程序 六.说明文档 七.资料清单 资料下载地址:基于STM32视频监控系统 一.项目需求 上位机能够实时显示摄像头的画面,并且可以控制摄像 ...
- 基于STM32的环境检测系统(DHT11、BMP280、1602、MQ2)
基于STM32的环境检测系统 闲来无事,用手头STM32做个项目. 成品功能: 功能说明 材料 STM32ZET6开发板 LCD1602显示屏 DHT11温湿度模块 BMP280大气压强模块 MQ2烟 ...
- 单片机毕业设计 基于stm32的病房呼叫系统
文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...
- 基于STM32温室大棚监测系统Protues仿真设计温湿度采集光照
仿真演示视频 基于stm32温室大棚控制系统仿真设计温湿度采集光照采集protues设计物联网定制_哔哩哔哩_bilibili 开发软件Keil5+Protues8.9,温湿度传感器DHT11. 部分 ...
- 详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)
git地址:智能门禁(云IOT+微信小程序) 开关门效果 设备侧 产品创建 创建产品 创建产品,协议类型选择MQTT,数据格式选择JSON,其他参数自定 设备注册 找到所属产品,认证类型选择密钥,单击 ...
- 基于STM32外部中断系统的秒表的设计
1.项目简介 硬件平台:基于某STM32F103开发板. 软件平台:KEIL5 MDK V5.38,基于LCD屏幕库函数例程库为模板,添加了外部中断,定时器中断相关代码,稍加修改而成. 功能简介:有三 ...
- 毕业设计 基于单片机的智能门禁系统
文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,学长今天向大家介绍一个学长做 ...
最新文章
- vue与html优势与缺点,vue优缺点详解
- 开发你的第一个 Android 应用
- 语音识别技术迎风发展,未来五年规模将近300亿
- webview页面和壳通信的库(精简版)
- 修改 Idea 终端 Terminal 为 GitBash 或 Cmder
- 使用thrift进行跨语言调用(php c# java)
- 两个简单的动态规划问题,0-1背包和最大不相邻数累加和,附递归c代码
- (四)创建ROS程序包(就是软件包)
- java collections.sort 忽略大小写排序_Java Spring Mongo排序忽略大小写问题
- 钉钉宜搭入选Forrester《中国低代码平台市场分析报告》
- MONGODB 数据库文件读取的优化
- vue 启动时卡死_十分钟浅入Vue 原理
- 优秀程序员必备七要件
- 临时停车码-扫码拨号发信息HTML源码
- 【Flink】Flink 与数据库的集成最佳实践 【视频笔记】
- php有的图片显示不出来,图片显示不出来,但是数据库里有显示
- SATA OOB CTS测试项解析
- B 站递给 GitHub 的 DMCA 文件被公布,蹩脚的英语引发争议
- 面试须知的前端渲染和后端渲染
- 机器视觉、halcon visionpro 的使用感受