基于STM32的指纹锁

您所在的位置:网站首页 三星指纹密码锁如何删除指纹 基于STM32的指纹锁

基于STM32的指纹锁

2024-03-07 04:40| 来源: 网络整理| 查看: 265

STM32

文章目录 STM32前言一、AS608模块接线说明 二、使用步骤总结

指纹锁

前言

封校生活无聊至极,手上还有个AS608指纹模块没玩过,闲着无聊做了个指纹锁。

一、AS608模块

ATK-AS608 指纹识别模块是 ALIENTEK 推出的一款高性能的光学指纹识别模块。 ATK-AS608 模块采用了国内著名指纹识别芯片公司杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片。芯片内置 DSP 运算单元,集成了指纹识别算法,能高效快速采集图像并识别指纹特征。模块配备了串口、USB 通讯接口,用户无需研究复杂的图像处理及指纹识别算法,只需通过简单的串口、USB 按照通讯协议便可控制模块。本模块可应用于各种考勤机、保险箱柜、指纹门禁系统、指纹锁等场合。 在这里插入图片描述 切记不可以接5v

接线说明

在这里插入图片描述 在这里插入图片描述

二、使用步骤

代码

#include #include #include "delay.h" #include "usart3.h" #include "as608.h" #include "oled_iic.h" #include "key.h" u32 AS608Addr = 0XFFFFFFFF; //ĬÈÏ char str2[6] = {0}; //´®¿Ú·¢ËÍÒ»¸ö×Ö½Ú static void MYUSART_SendData(u8 data) { while((USART3->SR & 0X40) == 0); USART3->DR = data; } //·¢ËÍ°üÍ· static void SendHead(void) { MYUSART_SendData(0xEF); MYUSART_SendData(0x01); } //·¢Ë͵ØÖ· static void SendAddr(void) { MYUSART_SendData(AS608Addr >> 24); MYUSART_SendData(AS608Addr >> 16); MYUSART_SendData(AS608Addr >> 8); MYUSART_SendData(AS608Addr); } //·¢ËÍ°ü±êʶ, static void SendFlag(u8 flag) { MYUSART_SendData(flag); } //·¢ËÍ°ü³¤¶È static void SendLength(int length) { MYUSART_SendData(length >> 8); MYUSART_SendData(length); } //·¢ËÍÖ¸ÁîÂë static void Sendcmd(u8 cmd) { MYUSART_SendData(cmd); } //·¢ËÍУÑéºÍ static void SendCheck(u16 check) { MYUSART_SendData(check >> 8); MYUSART_SendData(check); } //ÅжÏÖжϽÓÊÕµÄÊý×éÓÐûÓÐÓ¦´ð°ü //waittimeΪµÈ´ýÖжϽÓÊÕÊý¾ÝµÄʱ¼ä£¨µ¥Î»1ms£© //·µ»ØÖµ£ºÊý¾Ý°üÊ×µØÖ· static u8 *JudgeStr(u16 waittime) { char *data; u8 str[8]; str[0] = 0xef; str[1] = 0x01; str[2] = AS608Addr >> 24; str[3] = AS608Addr >> 16; str[4] = AS608Addr >> 8; str[5] = AS608Addr; str[6] = 0x07; str[7] = '\0'; USART3_RX_STA = 0; while(--waittime) { delay_ms(1); if(USART3_RX_STA & 0X8000) //½ÓÊÕµ½Ò»´ÎÊý¾Ý { USART3_RX_STA = 0; data = strstr((const char*)USART3_RX_BUF, (const char*)str); if(data) return (u8*)data; } } return 0; } //¼ÈëͼÏñ 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]; else ensure = 0xff; return ensure; } //Éú³ÉÌØÕ÷ PS_GenChar //¹¦ÄÜ:½«ImageBufferÖеÄԭʼͼÏñÉú³ÉÖ¸ÎÆÌØÕ÷Îļþ´æÓÚCharBuffer1»òCharBuffer2 //²ÎÊý:BufferID --> charBuffer1:0x01 charBuffer1:0x02 //Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_GenChar(u8 BufferID) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x04); Sendcmd(0x02); MYUSART_SendData(BufferID); temp = 0x01 + 0x04 + 0x02 + BufferID; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure; } //¾«È·±È¶ÔÁ½Ã¶Ö¸ÎÆÌØÕ÷ PS_Match //¹¦ÄÜ:¾«È·±È¶ÔCharBuffer1 ÓëCharBuffer2 ÖеÄÌØÕ÷Îļþ //Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_Match(void) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x03); Sendcmd(0x03); temp = 0x01 + 0x03 + 0x03; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure; } //ËÑË÷Ö¸ÎÆ PS_Search //¹¦ÄÜ:ÒÔCharBuffer1»òCharBuffer2ÖеÄÌØÕ÷ÎļþËÑË÷Õû¸ö»ò²¿·ÖÖ¸ÎÆ¿â.ÈôËÑË÷µ½£¬Ôò·µ»ØÒ³Âë¡£ //²ÎÊý: BufferID @ref CharBuffer1 CharBuffer2 //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö£¬Ò³Â루ÏàÅäÖ¸ÎÆÄ£°å£© u8 PS_Search(u8 BufferID, u16 StartPage, u16 PageNum, SearchResult *p) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x08); Sendcmd(0x04); MYUSART_SendData(BufferID); MYUSART_SendData(StartPage >> 8); MYUSART_SendData(StartPage); MYUSART_SendData(PageNum >> 8); MYUSART_SendData(PageNum); temp = 0x01 + 0x08 + 0x04 + BufferID + (StartPage >> 8) + (u8)StartPage + (PageNum >> 8) + (u8)PageNum; SendCheck(temp); data = JudgeStr(2000); if(data) { ensure = data[9]; p->pageID = (data[10] u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x06); Sendcmd(0x06); MYUSART_SendData(BufferID); MYUSART_SendData(PageID >> 8); MYUSART_SendData(PageID); temp = 0x01 + 0x06 + 0x06 + BufferID + (PageID >> 8) + (u8)PageID; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure; } //ɾ³ýÄ£°å PS_DeletChar //¹¦ÄÜ: ɾ³ýflashÊý¾Ý¿âÖÐÖ¸¶¨IDºÅ¿ªÊ¼µÄN¸öÖ¸ÎÆÄ£°å //²ÎÊý: PageID(Ö¸ÎÆ¿âÄ£°åºÅ)£¬Nɾ³ýµÄÄ£°å¸öÊý¡£ //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_DeletChar(u16 PageID, u16 N) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x07); Sendcmd(0x0C); MYUSART_SendData(PageID >> 8); MYUSART_SendData(PageID); MYUSART_SendData(N >> 8); MYUSART_SendData(N); temp = 0x01 + 0x07 + 0x0C + (PageID >> 8) + (u8)PageID + (N >> 8) + (u8)N; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure; } //Çå¿ÕÖ¸ÎÆ¿â PS_Empty //¹¦ÄÜ: ɾ³ýflashÊý¾Ý¿âÖÐËùÓÐÖ¸ÎÆÄ£°å //²ÎÊý: ÎÞ //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_Empty(void) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x03); Sendcmd(0x0D); temp = 0x01 + 0x03 + 0x0D; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure; } //дϵͳ¼Ä´æÆ÷ PS_WriteReg //¹¦ÄÜ: дģ¿é¼Ä´æÆ÷ //²ÎÊý: ¼Ä´æÆ÷ÐòºÅRegNum:4\5\6 //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_WriteReg(u8 RegNum, u8 DATA) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x05); Sendcmd(0x0E); MYUSART_SendData(RegNum); MYUSART_SendData(DATA); temp = RegNum + DATA + 0x01 + 0x05 + 0x0E; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; if(ensure == 0) printf("\r\nÉèÖòÎÊý³É¹¦£¡"); else printf("\r\n%s", EnsureMessage(ensure)); return ensure; } //¶Áϵͳ»ù±¾²ÎÊý PS_ReadSysPara //¹¦ÄÜ: ¶ÁÈ¡Ä£¿éµÄ»ù±¾²ÎÊý£¨²¨ÌØÂÊ£¬°ü´óСµÈ) //²ÎÊý: ÎÞ //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö + »ù±¾²ÎÊý£¨16bytes£© u8 PS_ReadSysPara(SysPara *p) { u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x03); Sendcmd(0x0F); temp = 0x01 + 0x03 + 0x0F; SendCheck(temp); data = JudgeStr(1000); if(data) { ensure = data[9]; p->PS_max = (data[14] PS_addr = (data[18] u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x07); Sendcmd(0x15); MYUSART_SendData(PS_addr >> 24); MYUSART_SendData(PS_addr >> 16); MYUSART_SendData(PS_addr >> 8); MYUSART_SendData(PS_addr); temp = 0x01 + 0x07 + 0x15 + (u8)(PS_addr >> 24) + (u8)(PS_addr >> 16) + (u8)(PS_addr >> 8) + (u8)PS_addr; SendCheck(temp); AS608Addr = PS_addr; //·¢ËÍÍêÖ¸Á¸ü»»µØÖ· data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; AS608Addr = PS_addr; if(ensure == 0x00) printf("\r\nÉèÖõØÖ·³É¹¦£¡"); else printf("\r\n%s", EnsureMessage(ensure)); return ensure; } //¹¦ÄÜ£º Ä£¿éÄÚ²¿ÎªÓû§¿ª±ÙÁË256bytesµÄFLASH¿Õ¼äÓÃÓÚ´æÓû§¼Çʱ¾, // ¸Ã¼Çʱ¾Âß¼­Éϱ»·Ö³É 16 ¸öÒ³¡£ //²ÎÊý: NotePageNum(0~15),Byte32(ҪдÈëÄÚÈÝ£¬32¸ö×Ö½Ú) //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_WriteNotepad(u8 NotePageNum, u8 *Byte32) { u16 temp; u8 ensure, i; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(36); Sendcmd(0x18); MYUSART_SendData(NotePageNum); for(i = 0; i u16 temp; u8 ensure, i; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x04); Sendcmd(0x19); MYUSART_SendData(NotePageNum); temp = 0x01 + 0x04 + 0x19 + NotePageNum; SendCheck(temp); data = JudgeStr(2000); if(data) { ensure = data[9]; for(i = 0; i u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//ÃüÁî°ü±êʶ SendLength(0x08); Sendcmd(0x1b); MYUSART_SendData(BufferID); MYUSART_SendData(StartPage >> 8); MYUSART_SendData(StartPage); MYUSART_SendData(PageNum >> 8); MYUSART_SendData(PageNum); temp = 0x01 + 0x08 + 0x1b + BufferID + (StartPage >> 8) + (u8)StartPage + (PageNum >> 8) + (u8)PageNum; SendCheck(temp); data = JudgeStr(2000); if(data) { ensure = data[9]; p->pageID = (data[10] ensure = data[9]; *ValidN = (data[10] SendHead(); SendAddr(); MYUSART_SendData(0X01); MYUSART_SendData(0X00); MYUSART_SendData(0X00); delay_ms(200); if(USART3_RX_STA & 0X8000) //½ÓÊÕµ½Êý¾Ý { if(//ÅжÏÊDz»ÊÇÄ£¿é·µ»ØµÄÓ¦´ð°ü USART3_RX_BUF[0] == 0XEF && USART3_RX_BUF[1] == 0X01 && USART3_RX_BUF[6] == 0X07 ) { *PS_Addr = (USART3_RX_BUF[2] case 0x00: p = " OK "; break; case 0x01: p = " Êý¾Ý°ü½ÓÊÕ´íÎó "; break; case 0x02: p = "´«¸ÐÆ÷ÉÏûÓÐÊÖÖ¸"; break; case 0x03: p = "¼ÈëÖ¸ÎÆͼÏñʧ°Ü"; break; case 0x04: p = " Ö¸ÎÆÌ«¸É»òÌ«µ­ "; break; case 0x05: p = " Ö¸ÎÆ̫ʪ»òÌ«ºý "; break; case 0x06: p = " Ö¸ÎÆͼÏñÌ«ÂÒ "; break; case 0x07: p = " Ö¸ÎÆÌØÕ÷µãÌ«ÉÙ "; break; case 0x08: p = " Ö¸ÎƲ»Æ¥Åä "; break; case 0x09: p = " ûÓÐËÑË÷µ½Ö¸ÎÆ "; break; case 0x0a: p = " ÌØÕ÷ºÏ²¢Ê§°Ü "; break; case 0x0b: p = "µØÖ·ÐòºÅ³¬³ö·¶Î§"; case 0x10: p = " ɾ³ýÄ£°åʧ°Ü "; break; case 0x11: p = " Çå¿ÕÖ¸ÎÆ¿âʧ°Ü "; break; case 0x15: p = "»º³åÇøÄÚÎÞÓÐЧͼ"; break; case 0x18: p = " ¶ÁдFLASH³ö´í "; break; case 0x19: p = " 䶨Òå´íÎó "; break; case 0x1a: p = " ÎÞЧ¼Ä´æÆ÷ºÅ "; break; case 0x1b: p = " ¼Ä´æÆ÷ÄÚÈÝ´íÎó "; break; case 0x1c: p = " ¼Çʱ¾Ò³Âë´íÎó "; break; case 0x1f: p = " Ö¸ÎÆ¿âÂú "; break; case 0x20: p = " µØÖ·´íÎó "; break; default : p = " ·µ»ØÈ·ÈÏÂëÓÐÎó "; break; } return p; } //ÏÔʾȷÈÏÂë´íÎóÐÅÏ¢ void ShowErrMessage(u8 ensure) { //OLED_ShowCH(5,0,(u8*)EnsureMessage(ensure)); } //¼ָÎÆ void Add_FR(void) { u8 i, ensure, processnum = 0; u8 ID_NUM = 0; while(1) { switch (processnum) { case 0: i++; OLED_ShowCH(0, 2, " Çë°´ÊÖÖ¸ "); ensure = PS_GetImage(); if(ensure == 0x00) { ensure = PS_GenChar(CharBuffer1); //Éú³ÉÌØÕ÷ if(ensure == 0x00) { OLED_ShowCH(0, 2, " Ö¸ÎÆÕý³£ "); OLED_ShowCH(0, 4, " "); i = 0; processnum = 1; //Ìøµ½µÚ¶þ²½ } else ShowErrMessage(ensure); } else ShowErrMessage(ensure); break; case 1: i++; OLED_ShowCH(0, 2, " ÇëÔÙ°´Ò»´Î "); OLED_ShowCH(0, 4, " "); ensure = PS_GetImage(); if(ensure == 0x00) { ensure = PS_GenChar(CharBuffer2); //Éú³ÉÌØÕ÷ if(ensure == 0x00) { OLED_ShowCH(0, 2, " Ö¸ÎÆÕý³£ "); OLED_ShowCH(0, 4, " "); i = 0; processnum = 2; //Ìøµ½µÚÈý²½ } else ShowErrMessage(ensure); } else ShowErrMessage(ensure); break; case 2: OLED_ShowCH(0, 2, " ¶Ô±ÈÁ½´ÎÖ¸ÎÆ "); OLED_ShowCH(0, 4, " "); ensure = PS_Match(); if(ensure == 0x00) { OLED_ShowCH(0, 2, " ¶Ô±È³É¹¦ "); OLED_ShowCH(0, 4, " "); processnum = 3; //Ìøµ½µÚËIJ½ } else { OLED_ShowCH(0, 2, " ¶Ô±Èʧ°Ü "); OLED_ShowCH(0, 4, " "); ShowErrMessage(ensure); i = 0; processnum = 0; //Ìø»ØµÚÒ»²½ } delay_ms(500); break; case 3: OLED_ShowCH(0, 2, " Éú³ÉÖ¸ÎÆÄ£°å "); OLED_ShowCH(0, 4, " "); delay_ms(500); ensure = PS_RegModel(); if(ensure == 0x00) { OLED_ShowCH(0, 2, "Éú³ÉÖ¸ÎÆÄ£°å³É¹¦"); OLED_ShowCH(0, 4, " "); processnum = 4; //Ìøµ½µÚÎå²½ } else { processnum = 0; ShowErrMessage(ensure); } delay_ms(1000); break; case 4: OLED_ShowCH(0, 0, " °´K4¼Ó,°´K2¼õ "); OLED_ShowCH(0, 2, " °´K3±£´æ "); OLED_ShowCH(0, 4, " 0=< ID


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3