你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F103+AS608的智能打卡系统

[复制链接]
STMCU小助手 发布时间:2022-10-26 21:34
工程源码链接

一、功能描述
基于STM32F013+AS608实行的智能打卡系统
1》进行打卡功能
2》指纹添加(多指纹添加 最大容量300)
3》删除指纹(这里进行指纹删除时按顺序删除从最新添加的开始,还没有写删除指定指纹)
4》查看指纹列表(通过该功能可以查看现有的指纹)
扩展功能:可以通过指纹实现一系列的其他控制(待完成)

二、硬件
N3NQ(Y{KEGILLR8{XXSYGHE.png

硬件实物
1.TFT彩屏

eed8cb0244404c56b5525744f0ba71f8.jpg

2.F103最小系统

2296ae9314054302b0f85ff049d5dd53.png

3.AS608指纹模块

5aebf752f0ec4a65ac1882d77114de70.png

4a444ce17ab145049e5de88887797d68.png

4.ST-LINK烧入器

e772c88f751e45ae93063d5b97c28c30.png

5.TTL串口打印

a6a3d2658115489dbe0a7d278438a7cd.png

三、部分程序
usart_view.c

  1. #include "usart1_view.h"
  2. #include "USART_Config.h"
  3. #include "lcd.h"
  4. #include "lcd_init.h"
  5. #include "delay.h"
  6. #include "AS608_use.h"
  7. #include "as608.h"


  8. void Operation_Interface(void);
  9. extern void Add_FR(u16 FR_ID);                                                /*录哪个ID的指纹*/
  10. extern void Del_FR(u16 FR_ID);                                                /*删除哪个ID的指纹*/
  11. //SysPara AS608Para;                                                                 /*指纹模块AS608参数*/
  12. unsigned char List_Index = 1,Temp_Index;  /*选择项索引 和缓存索引 界面返回时需要用*/
  13. unsigned  char Add_Flag;              /*指纹添加成功失败标志 1成功 0 失败*/
  14. unsigned  char Del_Flag;              /*指纹删除失败标志   1成功  0 失败*/
  15. unsigned char Figer_Info[4][12];      
  16. unsigned int Temp = 0,Temp1= 0;          /*缓存有效指纹*/
  17. extern  unsigned int Count;     /*有效指纹数记录*/
  18. unsigned int ID_Array[300],id_index = 0; /*存储ID号*/
  19. unsigned int ID_Flag;        /*用来记录当前ID*/
  20. unsigned char Score;         /*记录匹配得分*/
  21. unsigned char Sign_Flag;     /*签到成功标志  1成功  0 失败*/
  22. unsigned int ID_Num = 0;      /*每次添加时ID_Num表示一个指纹*/


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

  25. void usart1_execute(void)  /*串口一接收到数据后执行子函数*/
  26. {
  27.                 extern u8 eu8_Flag;
  28.           extern u8 eu8_what;
  29.                 unsigned  char i =0,j = 0;

  30.                 if(eu8_Flag)
  31.                 {
  32.                         eu8_Flag=0;
  33.                         switch(eu8_what)
  34.                         {
  35.                                 case '1':
  36.                                         {
  37.                                                                 List_Index++;
  38.                                                         Temp_Index = List_Index;   //进行选择性的缓存
  39.                                                                 if(List_Index == 1)
  40.                                                                 {
  41.                                                                         LCD_ShowString(320,80,(unsigned char *)"<=",RED,HS,32,0);
  42.                                                                         LCD_ShowString(320,120,(unsigned char *)"  ",RED,HS,32,0);
  43.                                                                         LCD_ShowString(320,160,(unsigned char *)"  ",RED,HS,32,0);
  44.                                                                         LCD_ShowString(320,200,(unsigned char *)"  ",RED,HS,32,0);
  45.                                                                 }
  46.                                                                 else if(List_Index == 2)
  47.                                                                 {
  48.                                                                          LCD_ShowString(320,120,(unsigned char *)"<=",RED,HS,32,0);
  49.                                                                          LCD_ShowString(320,80,(unsigned char *)"  ",RED,HS,32,0);
  50.                                                                          LCD_ShowString(320,160,(unsigned char *)"  ",RED,HS,32,0);
  51.                                                                          LCD_ShowString(320,200,(unsigned char *)"  ",RED,HS,32,0);
  52.                                                                 }
  53.                                                                 else if(List_Index == 3)
  54.                                                                 {
  55.                                                                          LCD_ShowString(320,160,(unsigned char *)"<=",RED,HS,32,0);
  56.                                                                          LCD_ShowString(320,120,(unsigned char *)"  ",RED,HS,32,0);
  57.                                                                          LCD_ShowString(320,80,(unsigned char *)"  ",RED,HS,32,0);
  58.                                                                           LCD_ShowString(320,200,(unsigned char *)"  ",RED,HS,32,0);
  59.                                                                 }
  60.                                                                 else if(List_Index == 4)
  61.                                                                 {
  62.                                                                         LCD_ShowString(320,160,(unsigned char *)"  ",RED,HS,32,0);
  63.                                                                         LCD_ShowString(320,120,(unsigned char *)"  ",RED,HS,32,0);
  64.                                                                         LCD_ShowString(320,80,(unsigned char *)"  ",RED,HS,32,0);
  65.                                                                         LCD_ShowString(320,200,(unsigned char *)"<=",RED,HS,32,0);
  66.                                                                         List_Index = 0;
  67.                                                                 }
  68.                                         }
  69.                                         break;
  70.                                 case '2':
  71.                                 {
  72.                                         /*------------------------------------打卡————————————————————*/
  73.                                         if(Temp_Index == 1)
  74.                                         {
  75.                                                  //打卡检测
  76.                                                 //首先进行界面切换
  77.                                                 LCD_Init();       //清屏                                
  78.                                                 LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用智能打卡系统",RED,Q_BLUE,32,0);
  79.                                                 LCD_ShowChinese(80,80,(unsigned char *)"请将手指放于打卡处",RED,GREEN,32,0);
  80.                                                  //如果检测到指纹则显示打卡成功                                
  81.                                                 while(1)
  82.                                                 {
  83.                                                         if(PS_Sta)         //检测PS_Sta状态,如果有手指按下
  84.                                                         {
  85.                                                                         Sign_Flag = press_FR();
  86.                                                                         if(Sign_Flag)      
  87.                                                                         {
  88.                                                                                 LCD_ShowChinese(120,120,(unsigned char *)"打卡成功",RED,GREEN,32,0);
  89.                                                                                                 //打卡人信息
  90.                                                                                 LCD_ShowChinese(120,160,(unsigned char *)"打卡",RED,GREEN,32,0);
  91.                                                                                 sprintf((char *)Figer_Info[4],"ID:%d ",ID_Flag);
  92.                                                                                 LCD_ShowString(180,160,(unsigned char *)Figer_Info[4],RED,GREEN,32,0);
  93.                                                                                 LCD_ShowChinese(120,200,(unsigned char *)"匹配得分:",RED,GREEN,32,0);
  94.                                                                                 LCD_ShowIntNum(280,200,Score,3,RED,GREEN,32);        
  95.                                                                         }
  96.                                                                         else
  97.                                                                         {
  98.                                                                                 LCD_ShowChinese(120,120,(unsigned char *)"打卡失败",RED,GREEN,32,0);
  99.                                                                         }        
  100.                                                                         break;                  //退出循环                                                
  101.                                                         }
  102.                                                 }                                       
  103.                                         }
  104.                                        
  105.                                         /*----------------------------------指纹添加------------------------------*/
  106.                                         else if(Temp_Index == 2)
  107.                                         {
  108.                                                  //指纹添加
  109.                                                 LCD_Init();       //清屏
  110.                                                 delay_ms(500);
  111.                                                 
  112.              //进行指纹添加界面的切换 并显示当前空的指纹数
  113.                                                 LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用智能打卡系统",RED,Q_BLUE,32,0);
  114.                                                 //剩余指纹容量
  115.                                                 LCD_ShowChinese(120,80,(unsigned char *)"指纹最大容量:",RED,GREEN,32,0);
  116.                                                 sprintf((char *)Figer_Info[0],"%d",AS608Para.PS_max);
  117.                                                 LCD_ShowString(340,80,Figer_Info[0],RED,HS,32,0);
  118.                                                 LCD_ShowChinese(120,120,(unsigned char *)"指纹添加中请稍等",RED,GREEN,32,0);
  119.                                                 ID_Num++;            /*指纹数++*/
  120.                                                 Add_FR(ID_Num);                        /*录哪个ID的指纹*/
  121.                                                 Temp = Count;       /*缓存指纹数*/
  122.                                                  //指纹对比成功则显示添加成功
  123.                                                 if(Add_Flag)
  124.                                                 {
  125.                                                         ID_Array[id_index++] = ID_Num;  /*将每个指纹ID记录在该数组中*/
  126.                                                         LCD_ShowChinese(120,160,(unsigned char *)"添加成功",RED,GREEN,32,0);                                                        
  127.                                                 }
  128.                                                  //显示添加失败
  129.                                                 else
  130.                                                 {
  131.                                                         LCD_ShowChinese(120,160,(unsigned char *)"添加失败",RED,GREEN,32,0);
  132.                                                 }
  133.                                                 //指纹信息
  134.                                                 LCD_ShowChinese(120,200,(unsigned char *)"有效指纹:",RED,GREEN,32,0);
  135.                                           sprintf((char *)Figer_Info[1],"%d ",Temp);
  136.                                                 LCD_ShowString(280,200,Figer_Info[1],RED,HS,32,0);
  137.                                                 LCD_ShowChinese(120,240,(unsigned char *)"剩余容量:",RED,GREEN,32,0);
  138.                                           sprintf((char *)Figer_Info[2],"%d ",AS608Para.PS_max-Temp);
  139.                                                 LCD_ShowString(280,240,Figer_Info[2],RED,HS,32,0);
  140.                                         }
  141.                                         /*-------------------------------------删除指纹-------------------------------*/
  142.                                                                                 //删除指纹
  143.                                         else if(Temp_Index == 3)
  144.                                         {
  145.                                                 LCD_Init();       //清屏
  146.                                                 delay_ms(500);
  147.                                                 LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用智能打卡系统",RED,Q_BLUE,32,0);
  148.                                                 //在删除指纹的索引值下进行
  149.                                                 LCD_ShowChinese(120,120,(unsigned char *)"有效指纹:",RED,GREEN,32,0);
  150.                                                 LCD_ShowIntNum(280,120,Count,2,RED,HS,32);        
  151.                                                 Temp1 = ID_Num;     /*删除时先缓存指纹数*/
  152.                                                 Del_FR(Temp1);                        /*删除哪个ID的指纹*/  
  153.                                                 ID_Num--;          /*指纹数--*/
  154.                                                 Temp--;            /*总的指纹数--*/
  155.                                                 /*更新总的指纹数*/
  156.                                                 //存在则删除成功  如果没有指纹或指纹错误则失败
  157.                                                         if(Del_Flag)
  158.                                                         {
  159.                                                                 LCD_ShowChinese(120,160,(unsigned char *)"删除成功",RED,GREEN,32,0);               
  160.                                                                 LCD_ShowChinese(120,120,(unsigned char *)"有效指纹:",RED,GREEN,32,0);
  161.                                                                 LCD_ShowIntNum(280,120,Count,2,RED,HS,32);                                                                        
  162.                                                         }
  163.                                                 else
  164.                                                         {
  165.                                                                 LCD_ShowChinese(120,160,(unsigned char *)"删除失败",RED,GREEN,32,0);
  166.                                                         }
  167.                                         }
  168.                                         /*-----------------------------------指纹查看-------------------------------------*/
  169.                                         else if(Temp_Index == 4)
  170.                                         {
  171.                                                 LCD_Init();       //清屏
  172.                                                 delay_ms(500);
  173.                                                 LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用智能打卡系统",RED,Q_BLUE,32,0);
  174.                                                 LCD_ShowChinese(150,60,(unsigned char *)"指纹列表",RED,GREEN,32,0);
  175.                                                 if(Count == 0)
  176.                                                 {
  177.                                                         LCD_ShowString(180,100,(unsigned char *)"NULL",RED,GREEN,32,0);
  178.                                                 }
  179.                                                 for(i = 0;i < Temp;i++)
  180.                                                 {        
  181.                                                         if(i <= 99)
  182.                                                         {
  183.                                                                         if(i % 6 == 0 && i!= 0)
  184.                                                                         {
  185.                                                                                  j += 40;
  186.                                                                          }
  187.                                                                         LCD_ShowIntNum(80*(i%6), 100 + j,ID_Array<i>,2,</i>RED,GREEN,32);        
  188.                                                         }
  189.                                                                         
  190.                                                 }
  191.                                         }
  192.                                 }
  193.                                 break;
  194.                                 /*-----------------------------------------界面返回--------------------------------*/
  195.                                 case '3':        //界面返回
  196.                                 {
  197.                                         LCD_Init();       //清屏
  198.                                         List_Index = Temp_Index;   //返回进行界面切换时的选择项
  199.                                         Operation_Interface();
  200.                                         if(List_Index == 4)
  201.                                         {
  202.                                                 List_Index = 0;
  203.                                         }                                       
  204.                                 }
  205.                                 break;
  206.                                 default: printf("\r\n接收失败\r\n");
  207.                                 break;
  208.                         }        
  209.                         
  210.                 }
  211. }
复制代码

main.c

  1. #include "public.h"
  2. u8  eu8_Flag = 0;                                                                /*全局变量串口一发生中断标志位*/
  3. u8  eu8_what = 0;                                  /*全局变量串口一接收到的一位数据*/

  4. #define usart2_baund  57600                        /*串口2波特率,根据指纹模块波特率更改*/
  5. SysPara AS608Para;                                                        /*指纹模块AS608参数*/
  6. u16 ValidN;                                                                                        /*模块内有效指纹个数*/
  7. extern unsigned char List_Index ;
  8. extern void Operation_Interface(void);
  9. void Init_Interface(void);


  10. /*-------------------------------功能操作界面--------------------------*/
  11. extern void Operation_Interface(void)
  12. {
  13.         LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用智能打卡系统",RED,Q_BLUE,32,0);
  14.         LCD_ShowChinese(150,80,(unsigned char *)"开始打卡",RED,GREEN,32,0);
  15.         LCD_ShowChinese(150,120,(unsigned char *)"添加指纹",RED,GREEN,32,0);
  16.         LCD_ShowChinese(150,160,(unsigned char *)"删除指纹",RED,GREEN,32,0);
  17.         LCD_ShowChinese(150,200,(unsigned char *)"指纹列表",RED,GREEN,32,0);
  18.         if(List_Index == 1)
  19.         {
  20.                 LCD_ShowString(320,80,(unsigned char *)"<=",RED,HS,32,0);
  21.                 LCD_ShowString(320,120,(unsigned char *)"  ",RED,HS,32,0);
  22.                 LCD_ShowString(320,160,(unsigned char *)"  ",RED,HS,32,0);
  23.                 LCD_ShowString(320,200,(unsigned char *)"  ",RED,HS,32,0);
  24.         }
  25.         else if(List_Index == 2)
  26.         {
  27.                 LCD_ShowString(320,120,(unsigned char *)"<=",RED,HS,32,0);
  28.                 LCD_ShowString(320,80,(unsigned char *)"  ",RED,HS,32,0);
  29.                 LCD_ShowString(320,160,(unsigned char *)"  ",RED,HS,32,0);
  30.                 LCD_ShowString(320,200,(unsigned char *)"  ",RED,HS,32,0);
  31.         }
  32.         else if(List_Index == 3)
  33.         {
  34.                 LCD_ShowString(320,160,(unsigned char *)"<=",RED,HS,32,0);
  35.                 LCD_ShowString(320,120,(unsigned char *)"  ",RED,HS,32,0);
  36.                 LCD_ShowString(320,80,(unsigned char *)"  ",RED,HS,32,0);
  37.                 LCD_ShowString(320,200,(unsigned char *)"  ",RED,HS,32,0);
  38.   }
  39.         else if(List_Index == 4)
  40.         {
  41.                 LCD_ShowString(320,160,(unsigned char *)"  ",RED,HS,32,0);
  42.                 LCD_ShowString(320,120,(unsigned char *)"  ",RED,HS,32,0);
  43.                 LCD_ShowString(320,80,(unsigned char *)"  ",RED,HS,32,0);
  44.                 LCD_ShowString(320,200,(unsigned char *)"<=",RED,HS,32,0);
  45.   }
  46.         

  47. }

  48. void Init_Interface(void)
  49. {  
  50.                 static unsigned int i = 0;
  51.                 LCD_ShowChinese(80,0,(unsigned char *)"欢迎使用智能打卡系统",RED,Q_BLUE,32,0);
  52.                 LCD_ShowString(90,40,(unsigned char *)"Author:Slow-Walker",RED,GREEN,32,0);
  53.                 LCD_ShowString(110,80,(unsigned char *)"Date:2022-09-19",RED,GREEN,32,0);
  54.                 LCD_ShowString(130,120,(unsigned char *)"Version:1.0",RED,GREEN,32,0);
  55.                 LCD_ShowChinese(140,240,(unsigned char *)"加载中",RED,GREEN,32,0);
  56.          while(i*8 < 472)
  57.                 {
  58.                          LCD_ShowString(i*8,280,(unsigned char *)".",RED,        WHITE,32,0);
  59.                                 delay_ms(20);        
  60.                                 i++;
  61.                 }
  62.                 delay_ms(500);
  63.                 LCD_ShowChinese(140,240,(unsigned char *)"加载成功",RED,GREEN,32,0);               
  64.                 delay_ms(2000);
  65.                 LCD_Init();
  66.                 Operation_Interface();
  67. }



  68. int main()
  69. {
  70.         u8 ensure;
  71.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  72.         
  73.         delay_init();                                                                /*延时初始化*/
  74.         USART_INIT();                                                                /*串口一初始化*/
  75.         LCD_Init();
  76.         LCD_Fill(0,0,LCD_W,LCD_H,GREEN);             //LCD屏颜色初始化
  77.         printf("初始化中\r\n");
  78.         USART3_init(usart2_baund);        /*初始化串口2,用于与指纹模块通讯*/
  79.         PS_StaGPIO_Init();                                        /*初始化FR读状态引脚*/
  80.         printf("与指纹模块握手\r\n");
  81.         while(PS_HandShake(&AS608Addr))                        /*与AS608模块握手*/
  82.         {
  83.                 delay_ms(400);
  84.                 printf("未检测到模块\r\n");
  85.                 delay_ms(800);
  86.                 printf("尝试重新连接模块\r\n");
  87.         }
  88.         printf("通讯成功\r\n");
  89.         printf("波特率:%d   地址:%x\r\n",usart2_baund,AS608Addr);                /*打印信息*/
  90.         PS_Empty();                                                /*清空所有指纹ID*/
  91.         ensure=PS_ValidTempleteNum(&ValidN);                                                                                /*读库指纹个数*/
  92.         if(ensure!=0x00)
  93.                 ShowErrMessage(ensure);                                                                /*显示确认码错误信息*/
  94.         ensure=PS_ReadSysPara(&AS608Para);                  /*读参数 */
  95.         if(ensure==0x00)
  96.         {
  97.                 printf("库容量:%d     对比等级: %d",AS608Para.PS_max-ValidN,AS608Para.PS_level);
  98.         }
  99.         else
  100.         {
  101.                 ShowErrMessage(ensure);        
  102.         }
  103.         Init_Interface();
  104.         
  105.   while(1)
  106.         {
  107.                         usart1_execute();                         /*串口一接收到串口屏数据后执行子函数*/
  108.         }
  109. }
复制代码

四、效果展示



7a4dd7a21fb44b328fa3cff72042c3d5.jpg

b04d8850a3a543b881fdcd74c8cc8dca.jpg

bf25039baf1c4cba8e945d782bffb3c2.jpg

58452edf2f97497185aae5fb2b2c3503.jpg

f8137fea8f8f4cef8a4a065f41872634.jpg

62ccc48102d34247bbad0d5f4d1a71db.png

————————————————
版权声明:@slow-walker


d1dbbad43f354246927a691c98f475a3.png
收藏 评论0 发布时间:2022-10-26 21:34

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版