基于STM32的指纹锁

您所在的位置:网站首页 smartlocks智能指纹密码锁 基于STM32的指纹锁

基于STM32的指纹锁

2024-07-11 20:58| 来源: 网络整理| 查看: 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] > 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] PS_N * 9600); } else printf("\r\n%s", EnsureMessage(ensure)); return ensure; } //ÉèÖÃÄ£¿éµØÖ· PS_SetAddr //¹¦ÄÜ: ÉèÖÃÄ£¿éµØÖ· //²ÎÊý: PS_addr //˵Ã÷: Ä£¿é·µ»ØÈ·ÈÏ×Ö u8 PS_SetAddr(u32 PS_addr) { 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 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]


【本文地址】


今日新闻


推荐新闻


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