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的智能门禁系统相关推荐

  1. 基于STM32的智能门禁卡片(开题报告)

    备注:本文参考了稚晖君的智能门禁卡项目,当时开本项目是作为我毕设的备选方案之一,不过后面被指导老师否决后,只保留了开题报告,我没有更多的研究资料了. 基于STM32的智能门禁卡片(开题报告) 一.研究 ...

  2. 基于STM32的最小系统电路设计(手把手零基础教学)

    文章目录 前言 一.复位电路 二.晶振电路 三.电源转换电路 四.SWD下载电路 五.LED测试电路 六.芯片外扩引脚 七.STM32微控制电路 总结 前言    在上篇介绍完<STM32的核心 ...

  3. 基于STM32视频监控系统

    目录 一.项目需求 二.原理图 三.上位机界面 四.实物 五.程序 六.说明文档 七.资料清单 资料下载地址:基于STM32视频监控系统 一.项目需求 上位机能够实时显示摄像头的画面,并且可以控制摄像 ...

  4. 基于STM32的环境检测系统(DHT11、BMP280、1602、MQ2)

    基于STM32的环境检测系统 闲来无事,用手头STM32做个项目. 成品功能: 功能说明 材料 STM32ZET6开发板 LCD1602显示屏 DHT11温湿度模块 BMP280大气压强模块 MQ2烟 ...

  5. 单片机毕业设计 基于stm32的病房呼叫系统

    文章目录 1 简介 2 绪论 2.1 课题背景 3 系统设计 3.1 系统架构 3.2 主程序设计 3.3 语音模块程序设计 3.4 显示模块程序设计 3.5 键盘模块程序设计 3.6 无线传输模块程 ...

  6. 基于STM32温室大棚监测系统Protues仿真设计温湿度采集光照

    仿真演示视频 基于stm32温室大棚控制系统仿真设计温湿度采集光照采集protues设计物联网定制_哔哩哔哩_bilibili 开发软件Keil5+Protues8.9,温湿度传感器DHT11. 部分 ...

  7. 详细!基于ESP32的智能门禁系统(华为云iot+微信小程序)

    git地址:智能门禁(云IOT+微信小程序) 开关门效果 设备侧 产品创建 创建产品 创建产品,协议类型选择MQTT,数据格式选择JSON,其他参数自定 设备注册 找到所属产品,认证类型选择密钥,单击 ...

  8. 基于STM32外部中断系统的秒表的设计

    1.项目简介 硬件平台:基于某STM32F103开发板. 软件平台:KEIL5 MDK V5.38,基于LCD屏幕库函数例程库为模板,添加了外部中断,定时器中断相关代码,稍加修改而成. 功能简介:有三 ...

  9. 毕业设计 基于单片机的智能门禁系统

    文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,学长今天向大家介绍一个学长做 ...

最新文章

  1. vue与html优势与缺点,vue优缺点详解
  2. 开发你的第一个 Android 应用
  3. 语音识别技术迎风发展,未来五年规模将近300亿
  4. webview页面和壳通信的库(精简版)
  5. 修改 Idea 终端 Terminal 为 GitBash 或 Cmder
  6. 使用thrift进行跨语言调用(php c# java)
  7. 两个简单的动态规划问题,0-1背包和最大不相邻数累加和,附递归c代码
  8. (四)创建ROS程序包(就是软件包)
  9. java collections.sort 忽略大小写排序_Java Spring Mongo排序忽略大小写问题
  10. 钉钉宜搭入选Forrester《中国低代码平台市场分析报告》
  11. MONGODB 数据库文件读取的优化
  12. vue 启动时卡死_十分钟浅入Vue 原理
  13. 优秀程序员必备七要件
  14. 临时停车码-扫码拨号发信息HTML源码
  15. 【Flink】Flink 与数据库的集成最佳实践 【视频笔记】
  16. php有的图片显示不出来,图片显示不出来,但是数据库里有显示
  17. SATA OOB CTS测试项解析
  18. B 站递给 GitHub 的 DMCA 文件被公布,蹩脚的英语引发争议
  19. 面试须知的前端渲染和后端渲染
  20. 机器视觉、halcon visionpro 的使用感受

热门文章

  1. 《金属切削原理》教学大纲
  2. idea怎么进行c语言编程_编程入门-C语言开发IDE选择
  3. ProE中文版安裝問題
  4. 自己动手搭建恶意软件样本行为分析环境
  5. SRC众测挖洞之支付逻辑漏洞的奇淫技巧
  6. 计算机网络安全之网络嗅探器
  7. 年薪100万都是什么样人才啊?
  8. 这些是源自几米的句子,让人满心感触……
  9. IDEA 轻松实现线上debug 调试
  10. 4人组合蓝牙对讲耳机