找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3842|回复: 3
打印 上一主题 下一主题
收起左侧

AS608+stm32指纹锁源程序(德飞莱核心板)

[复制链接]
跳转到指定楼层
楼主
ID:439585 发表于 2019-12-5 13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
指纹模块:AS608
单片机:德飞莱stm32f103zet6(M3S)
需要中文字库。
自己学习弄的,as608模块给的是正点原子32的例程,没有德飞莱32的,因此在正点原子战舰版例程上进行了修改,可以在德飞莱板子上运行。
因为水平有限,改的很粗糙,只是基本保留了功能,望见谅。
有错误请留言。
有疑问请留言。
侵删

新建:
newxxx                  接收   0x6e 0x65 0x77
fir         st                发送   0x66 0x69 0x72
sec       ond             发送   0x73 0x65 0x63
suc       cess            发送    0x73 0x75 0x63
fai      l                   发送    0x66 0x61 0x69
nof       inger          发送    0x6e 0x6f 0x66
dif      发送       两次指纹不一
sam   发送       两次指纹一致
识别:
rec        ognize-xxx   发送   0x72 0x65 0x63
yes
no

删除:
delxxx                 接收   0x64 0x65 0x6c
delall                  接收   0x64 0x65 0x6c 0x61 0x6C 0x6C  
com      plete            发送   0x63 0x6f 0x6d

连接失败      error       发送  0x65 0x72 0x72

单片机源程序如下:
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "lcd.h"
  5. #include "key.h"
  6. #include "beep.h"
  7. #include "touch.h"         
  8. #include "malloc.h"
  9. #include "usmart.h"  
  10. #include "sdio_sdcard.h"   
  11. #include "w25qxx.h"   
  12. #include "ff.h"  
  13. #include "exfuns.h"   
  14. #include "fontupd.h"
  15. #include "text.h"        
  16. #include "usart2.h"
  17. #include "AS608.h"
  18. #include "timer.h"
  19. #include "adc.h"
  20. #include "switch.h"


  21. #define usart2_baund  57600//串口2波特率,根据指纹模块波特率更改

  22. SysPara AS608Para;//指纹模块AS608参数
  23. u16 ValidN;//模块内有效指纹个数
  24. u8** kbd_tbl;

  25. u8 unlock=0;
  26. u8 lock=0;
  27. float ADC_ConvertedValueLocal;
  28. extern __IO uint16_t ADC_ConvertedValue;  

  29. const  u8* kbd_menu[15]={"删指纹"," : ","录指纹","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按键表
  30. const  u8* kbd_delFR[15]={"返回"," : ","清空指纹","1","2","3","4","5","6","7","8","9","DEL","0","Enter",};//按键表

  31. void Add_FR(u8 fingerid);        //录指纹
  32. void Del_FR(void);        //删除指纹
  33. void press_FR(void);//刷指纹
  34. void ShowErrMessage(u8 ensure);//显示确认码错误信息
  35. void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl);//加载虚拟键盘
  36. u8  AS608_get_keynum(u16 x,u16 y);//获取键盘数
  37. u16 GET_NUM(void);//获取数值

  38. int main(void)
  39. {   
  40.         u8 ensure;
  41. //        u8 key_num;
  42.         char *str;        
  43.         ADC1_Init();
  44.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  45.         delay_init();          //初始化延时函数
  46.         uart_init(115200);        //初始化串口1波特率为115200,用于支持USMART
  47.         usart2_init(usart2_baund);//初始化串口2,用于与指纹模块通讯
  48. //        usart4_init(9600);//初始化串口3上位机
  49.         PS_StaGPIO_Init();        //初始化FR读状态引脚
  50.         BEEP_Init();                          //初始化蜂鸣器
  51.         KEY_Init();                                        //按键初始化
  52.          LCD_Init();                                        //LCD初始化         
  53.         W25QXX_Init();                        //初始化W25Q128
  54.         tp_dev.init();                        //初始化触摸屏
  55.         usmart_dev.init(72);                //初始化USMART
  56.         my_mem_init(SRAMIN);                //初始化内部内存池
  57.         exfuns_init();                        //为fatfs相关变量申请内存  
  58.          f_mount(fs[1],"1:",1);  //挂载FLASH.
  59.         POINT_COLOR=RED;
  60.         while(font_init())                         //检查字库
  61.         {            
  62.                 LCD_ShowString(60,50,240,16,16,"Font Error!");
  63.                 delay_ms(200);                                 
  64.                 LCD_Fill(60,50,240,66,WHITE);//清除显示
  65.                 delay_ms(200);        
  66.         }
  67.         if(!(tp_dev.touchtype&0x80))//如果是电阻屏
  68.         {
  69. //                Show_Str_Mid(0,30,"是否进行触摸屏校准",16,240);
  70. //                POINT_COLOR=BLUE;
  71. //                Show_Str_Mid(0,60,"是:KEY2   否:KEY0",16,240);        
  72. //                while(1)
  73. //                {
  74. //                        key_num=KEY_Scan(0);
  75. //                        if(key_num==KEY0_PRES)
  76. //                                break;
  77. //                        if(key_num==KEY2_PRES)
  78. //                        {
  79. //                                LCD_Clear(WHITE);
  80. //                                TP_Adjust();           //屏幕校准
  81. //                                TP_Save_Adjdata();//保存校准参数
  82. //                                break;                                
  83. //                        }
  84. //                }
  85.         }
  86.         /*加载指纹识别实验界面*/
  87.         LCD_Clear(WHITE);
  88.         POINT_COLOR=RED;
  89.         Show_Str_Mid(0,0,"AS608指纹识别模块测试程序",16,240);                                                
  90.         //Show_Str_Mid(0,20,"正点原子 @ALIENTEK",16,240);                                             
  91.          POINT_COLOR=BLUE;
  92.         Show_Str_Mid(0,40,"与AS608模块握手....",16,240);        
  93.         while(PS_HandShake(&AS608Addr))//与AS608模块握手
  94.         {
  95.                 delay_ms(400);
  96.                 LCD_Fill(0,40,240,80,WHITE);
  97.                 Show_Str_Mid(0,40,"检测到模块!!!",16,240);
  98.                 delay_ms(800);
  99.                 LCD_Fill(0,40,240,80,WHITE);
  100.                 Show_Str_Mid(0,40,"尝试连接模块...",16,240);                  
  101.         }
  102.         LCD_Fill(30,40,240,100,WHITE);
  103.         Show_Str_Mid(0,40,"通讯成功!!!",16,240);
  104.         printf("连接成功");
  105.         str=mymalloc(SRAMIN,30);
  106.         sprintf(str,"波特率:%d   地址:%x",usart2_baund,AS608Addr);
  107.         Show_Str(0,60,240,16,(u8*)str,16,0);
  108.         ensure=PS_ValidTempleteNum(&ValidN);//读库指纹个数
  109.         if(ensure!=0x00)
  110.                 ShowErrMessage(ensure);//显示确认码错误信息        
  111.         ensure=PS_ReadSysPara(&AS608Para);  //读参数
  112.         if(ensure==0x00)
  113.         {
  114.                 mymemset(str,0,50);
  115.                 sprintf(str,"库容量:%d     对比等级: %d",AS608Para.PS_max-ValidN,AS608Para.PS_level);
  116.                 Show_Str(0,80,240,16,(u8*)str,16,0);
  117.         }
  118.         else
  119.                 ShowErrMessage(ensure);        
  120.         myfree(SRAMIN,str);
  121.         AS608_load_keyboard(0,170,(u8**)kbd_menu);//加载虚拟键盘
  122.         while(1)
  123.         {
  124. //                key_num=AS608_get_keynum(0,170);        
  125. //                if(key_num)
  126. //                {
  127. //                        if(key_num==1)Del_FR();                //删指纹
  128. //                        if(key_num==3)Add_FR();                //录指纹                                                                        
  129. //                }
  130. //                GPIO_SetBits(GPIOB,GPIO_Pin_9);
  131. //                GPIO_ResetBits(GPIOB,GPIO_Pin_9);
  132.                
  133.                
  134.                 ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;
  135.                 LCD_ShowxNum(0,120,ADC_ConvertedValueLocal*100,20,16,0);        
  136.                 information();
  137.                 if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
  138.                 {
  139.                         press_FR();//刷指纹                        
  140.                 }                        
  141. delay_ms(500);

  142.                
  143.                
  144.                

  145.                
  146.         }         
  147. }


  148. //加载按键界面(尺寸x,y为240*150)
  149. //x,y:界面起始坐标(240*320分辨率的时候,x必须为0)
  150. void AS608_load_keyboard(u16 x,u16 y,u8 **kbtbl)
  151. {
  152.         u16 i;
  153.         POINT_COLOR=RED;
  154.         kbd_tbl=kbtbl;
  155.         LCD_Fill(x,y,x+240,y+150,WHITE);
  156.         LCD_DrawRectangle(x,y,x+240,y+150);                                                   
  157.         LCD_DrawRectangle(x+80,y,x+160,y+150);         
  158.         LCD_DrawRectangle(x,y+30,x+240,y+60);
  159.         LCD_DrawRectangle(x,y+90,x+240,y+120);
  160.         POINT_COLOR=BLUE;
  161.         for(i=0;i<15;i++)
  162.         {
  163.                 if(i==1)//按键表第2个‘:’不需要中间显示
  164.                         Show_Str(x+(i%3)*80+2,y+7+30*(i/3),80,30,(u8*)kbd_tbl[i],16,0);        
  165.                 else
  166.                         Show_Str_Mid(x+(i%3)*80,y+7+30*(i/3),(u8*)kbd_tbl[i],16,80);
  167.         }
  168. }
  169. //按键状态设置
  170. //x,y:键盘坐标
  171. //key:键值(0~14)
  172. //sta:状态,0,松开;1,按下;
  173. void AS608_key_staset(u16 x,u16 y,u8 keyx,u8 sta)
  174. {                  
  175.         u16 i=keyx/3,j=keyx%3;
  176.         if(keyx>16)return;
  177.         if(sta &&keyx!=1)//按键表第2个‘:’不需要清除
  178.                 LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,GREEN);
  179.         else if(keyx!=1)
  180.                 LCD_Fill(x+j*80+1,y+i*30+1,x+j*80+78,y+i*30+28,WHITE);
  181.         if(keyx!=1)//不是‘:’
  182.                 Show_Str_Mid(x+j*80,y+7+30*i,(u8*)kbd_tbl[keyx],16,80);        
  183. }
  184. //得到触摸屏的输入
  185. //x,y:键盘坐标
  186. //返回值:(1~15,对应按键表)
  187. u8 AS608_get_keynum(u16 x,u16 y)
  188. {
  189.         u16 i,j;
  190.         static u8 key_x=0;//0,没有任何按键按下
  191.         u8 key=0;
  192.         tp_dev.scan(0);                  
  193.         if(tp_dev.sta&TP_PRES_DOWN)//触摸屏被按下
  194.         {        
  195.                 for(i=0;i<5;i++)
  196.                 {
  197.                         for(j=0;j<3;j++)
  198.                         {
  199.                                  if(tp_dev.x[0]<(x+j*80+80)&&tp_dev.x[0]>(x+j*80)&&tp_dev.y[0]<(y+i*30+30)&&tp_dev.y[0]>(y+i*30))
  200.                                 {        
  201.                                         key=i*3+j+1;         
  202.                                         break;                           
  203.                                 }
  204.                         }
  205.                         if(key)
  206.                         {           
  207.                                 if(key_x==key)key=0;
  208.                                 else
  209.                                 {
  210.                                         AS608_key_staset(x,y,key_x-1,0);
  211.                                         key_x=key;
  212.                                         AS608_key_staset(x,y,key_x-1,1);
  213.                                 }
  214.                                 break;
  215.                         }
  216.           }  
  217.         }else if(key_x)
  218.         {
  219.                 AS608_key_staset(x,y,key_x-1,0);
  220.                 key_x=0;
  221.         }
  222.         return key;
  223. }
  224. //获取键盘数值
  225. u16 GET_NUM(void)
  226. {
  227.         u8  key_num=0;
  228.         u16 num=0;
  229.         while(1)
  230.         {
  231.                 key_num=AS608_get_keynum(0,170);        
  232.                 if(key_num)
  233.                 {
  234.                         if(key_num==1)return 0xFFFF;//‘返回’键
  235.                         if(key_num==3)return 0xFF00;//               
  236.                         if(key_num>3&&key_num<13&&num<99)//‘1-9’键(限制输入3位数)
  237.                                 num =num*10+key_num-3;               
  238.                         if(key_num==13)num =num/10;//‘Del’键                        
  239.                         if(key_num==14&&num<99)num =num*10;//‘0’键
  240.                         if(key_num==15)return num;  //‘Enter’键
  241.                 }
  242.                 LCD_ShowNum(80+15,170+7,num,6,16);
  243.         }        
  244. }
  245. //显示确认码错误信息
  246. void ShowErrMessage(u8 ensure)
  247. {
  248.         LCD_Fill(0,120,lcddev.width,160,WHITE);
  249.         Show_Str_Mid(0,120,(u8*)EnsureMessage(ensure),16,240);
  250.         
  251. }
  252. //录指纹
  253. void Add_FR(u8 fingerid)
  254. {
  255.         u8 i,ensure ,processnum=0;
  256.         u16 ID;
  257.         while(1)
  258.         {
  259.                 switch (processnum)
  260.                 {
  261.                         case 0:
  262.                                 i++;
  263.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  264.                                 Show_Str_Mid(0,100,"请按指纹",16,240);
  265.                         if(i==1)
  266.                         {printf("fir");}
  267.                                 ensure=PS_GetImage();
  268.                                 if(ensure==0x00)
  269.                                 {
  270.                                         BEEP=1;
  271.                                         ensure=PS_GenChar(CharBuffer1);//生成特征
  272.                                         BEEP=0;
  273.                                         if(ensure==0x00)
  274.                                         {
  275.                                                 LCD_Fill(0,120,lcddev.width,160,WHITE);
  276.                                                 Show_Str_Mid(0,120,"指纹正常",16,240);
  277.                                                 i=0;
  278.                                                 processnum=1;//跳到第二步                                                
  279.                                         }else ShowErrMessage(ensure);                                
  280.                                 }else ShowErrMessage(ensure);                                                
  281.                                 break;
  282.                         
  283.                         case 1:
  284.                                 i++;
  285.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  286.                                 Show_Str_Mid(0,100,"请按再按一次指纹",16,240);
  287.                           if(i==1)
  288.                           {printf("sec");}  
  289.                                 ensure=PS_GetImage();
  290.                                 if(ensure==0x00)
  291.                                 {
  292.                                         BEEP=1;
  293.                                         ensure=PS_GenChar(CharBuffer2);//生成特征
  294.                                         BEEP=0;
  295.                                         if(ensure==0x00)
  296.                                         {
  297.                                                 LCD_Fill(0,120,lcddev.width,160,WHITE);
  298.                                                 Show_Str_Mid(0,120,"指纹正常",16,240);
  299.                                                 i=0;
  300.                                                 processnum=2;//跳到第三步
  301.                                         }else ShowErrMessage(ensure);        
  302.                                 }else ShowErrMessage(ensure);               
  303.                                 break;

  304.                         case 2:
  305.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  306.                                 Show_Str_Mid(0,100,"正在对比两次指纹",16,240);
  307.                                 ensure=PS_Match();
  308.                                 if(ensure==0x00)
  309.                                 {
  310.                                         LCD_Fill(0,120,lcddev.width,160,WHITE);
  311.                                         Show_Str_Mid(0,120,"对比成功,两次指纹一样",16,240);
  312.                                         printf("sam");
  313.                                         processnum=3;//跳到第四步
  314.                                 }
  315.                                 else
  316.                                 {
  317.                                         LCD_Fill(0,100,lcddev.width,160,WHITE);
  318.                                         Show_Str_Mid(0,100,"对比失败,请重新录入指纹",16,240);
  319.                                         printf("dif");
  320.                                         ShowErrMessage(ensure);
  321.                                         i=0;
  322.                                         processnum=0;//跳回第一步               
  323.                                 }
  324.                                 delay_ms(1200);
  325.                                 break;

  326.                         case 3:
  327.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  328.                                 Show_Str_Mid(0,100,"生成指纹模板",16,240);
  329.                                 ensure=PS_RegModel();
  330.                                 if(ensure==0x00)
  331.                                 {
  332.                                         LCD_Fill(0,120,lcddev.width,160,WHITE);
  333.                                         Show_Str_Mid(0,120,"生成指纹模板成功",16,240);                                       
  334.                                         processnum=4;//跳到第五步
  335.                                 }else {processnum=0;ShowErrMessage(ensure);}
  336.                                 delay_ms(1200);
  337.                                 break;
  338.                                 
  339.                         case 4:        
  340. //                                LCD_Fill(0,100,lcddev.width,160,WHITE);
  341. //                                Show_Str_Mid(0,100,"请输入储存ID,按Enter保存",16,240);
  342. //                                Show_Str_Mid(0,120,"0=< ID <=299",16,240);
  343.                                 do
  344. //                                        ID=GET_NUM();
  345.                                     ID=fingerid;
  346.                                 while(!(ID<AS608Para.PS_max));//输入ID必须小于指纹容量的最大值
  347.                                 ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
  348.                                 if(ensure==0x00)
  349.                                 {                        
  350.                                         LCD_Fill(0,100,lcddev.width,160,WHITE);                                       
  351.                                         Show_Str_Mid(0,120,"录入指纹成功",16,240);
  352.                                         printf("suc");
  353.                                         PS_ValidTempleteNum(&ValidN);//读库指纹个数
  354.                                         LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
  355.                                         delay_ms(1500);
  356.                                         LCD_Fill(0,100,240,160,WHITE);
  357.                                         return ;
  358.                                 }else {processnum=0;ShowErrMessage(ensure);}                                       
  359.                                 break;                                
  360.                 }
  361.                 delay_ms(500);
  362.                 if(i==8)//超过5次没有按手指则退出
  363.                 {
  364.                         LCD_Fill(0,100,lcddev.width,160,WHITE);
  365. //                        printf("nof");
  366.                         break;        
  367.                 }                                
  368.         }
  369. }

  370. //刷指纹
  371. void press_FR(void)
  372. {
  373.         SearchResult seach;
  374.         u8 ensure;
  375.         char *str;
  376.         ensure=PS_GetImage();
  377.         if(ensure==0x00)//获取图像成功
  378.         {        
  379.                 BEEP=1;//打开蜂鸣器        
  380.                 ensure=PS_GenChar(CharBuffer1);
  381.                 if(ensure==0x00) //生成特征成功
  382.                 {               
  383.                         BEEP=0;//关闭蜂鸣器        
  384.                         ensure=PS_HighSpeedSearch(CharBuffer1,0,AS608Para.PS_max,&seach);
  385.                         if(ensure==0x00)//搜索成功
  386.                         {                                
  387.                                 LCD_Fill(0,100,lcddev.width,160,WHITE);
  388.                                 Show_Str_Mid(0,100,"刷指纹成功",16,240);                                
  389.                                 str=mymalloc(SRAMIN,50);
  390.                                 sprintf(str,"确有此人,ID:%d  匹配得分:%d",seach.pageID,seach.mathscore);
  391.                                 printf("rec");
  392.                                 printf("%d",(seach.pageID/100)%10);
  393.                                 printf("%d",(seach.pageID/10)%10);
  394.                                 printf("%d",seach.pageID%10);
  395.                                 Show_Str_Mid(0,140,(u8*)str,16,240);
  396.                                 myfree(SRAMIN,str);
  397.                         }
  398.                         else
  399.                                 ShowErrMessage(ensure);                                       
  400.           }
  401.                 else
  402.                         ShowErrMessage(ensure);
  403.          BEEP=0;//关闭蜂鸣器
  404.          delay_ms(600);
  405.          LCD_Fill(0,100,lcddev.width,160,WHITE);
  406.         }
  407.                
  408. }

  409. //删除指纹
  410. void Del_FR(void)
  411. {
  412.         u8  ensure;
  413.         u16 num;
  414.         LCD_Fill(0,100,lcddev.width,160,WHITE);
  415.         Show_Str_Mid(0,100,"删除指纹",16,240);
  416.         Show_Str_Mid(0,120,"请输入指纹ID按Enter发送",16,240);
  417.         Show_Str_Mid(0,140,"0=< ID <=299",16,240);
  418.         delay_ms(50);
  419.         AS608_load_keyboard(0,170,(u8**)kbd_delFR);
  420.         num=GET_NUM();//获取返回的数值
  421.         if(num==0xFFFF)
  422.                 goto MENU ; //返回主页面
  423.         else if(num==0xFF00)
  424.                 ensure=PS_Empty();//清空指纹库
  425.         else
  426.                 ensure=PS_DeletChar(num,1);//删除单个指纹
  427.         if(ensure==0)
  428.         {
  429.                 LCD_Fill(0,120,lcddev.width,160,WHITE);
  430.                 Show_Str_Mid(0,140,"删除指纹成功",16,240);
  431.     printf("com");               
  432.         }
  433.   else
  434.                 ShowErrMessage(ensure);        
  435.         delay_ms(1200);
  436.         PS_ValidTempleteNum(&ValidN);//读库指纹个数
  437.         LCD_ShowNum(56,80,AS608Para.PS_max-ValidN,3,16);
  438. MENU:        
  439.         LCD_Fill(0,100,lcddev.width,160,WHITE);
  440.         delay_ms(50);
  441.         AS608_load_keyboard(0,170,(u8**)kbd_menu);
  442. }
复制代码

所有资料51hei提供下载:
as608 defly stm32.7z (1.37 MB, 下载次数: 65)
as608 单片机设计.7z (1.37 MB, 下载次数: 57)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:563554 发表于 2019-12-28 10:18 | 只看该作者
谢谢大佬的分享,帮顶
回复

使用道具 举报

板凳
ID:688881 发表于 2020-2-13 15:33 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:722756 发表于 2020-4-8 10:24 | 只看该作者
谢谢大佬!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表