迪文科技论坛

 找回密码
 立即注册
搜索
查看: 216|回复: 0

【2024.6.26获奖项目】指纹识别门锁

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11954
发表于 2024-7-2 09:54:23 | 显示全部楼层 |阅读模式
【开源】指纹识别门锁

该方案使用屏幕串口4与STM32进行modbus通讯,控制指纹识别模块,实现了指纹录入和指纹识别。


演示视频效果:












屏幕使用UART4 ,modbus 通信和STM32,参考代码如下:

  1. int main(void)
  2. {   
  3.        INIT_CPU();
  4.        T2_Init();
  5.        UART4_Init();
  6.        EA=1;
  7. //     UART4_SendStr("hello",sizeof("hello"));
  8.        WDT_ON();//打开开门狗

  9.        while(1)
  10.        {   
  11.               WDT_RST();//喂狗
  12.               Process();
  13.        }
  14. }

  15. void MainMachineHandle(void)
  16. {
  17.        if(UartDataHandle)
  18.        {
  19.               uartHandle(Uart4_Rx,uart4_rx_count);
  20.               CLR_UartMp3();
  21.        }
  22. }

  23. bool uartHandle(u8 *Tdata,u8 len)
  24. {
  25.        u16Wlen=0;
  26.        u16CRC_1=0,BegAddr=0;
  27.        u8  xdata RetData[Uart4_Rx_Maxlen+10];
  28.        u8  errnum=0;

  29. CRC_1=CalcCrcAll(0xffff,Tdata,len-2);
  30.        if(CRC_1!= ((Tdata[len-1])<<8 | (Tdata[len-2])))
  31.               returnfalse;

  32.        //这个为写指令
  33.        if(Tdata[0]==0&& Tdata[1]!=0x06)
  34.        {
  35.               returnfalse;
  36.        }
  37.        elseif(Tdata[0]!=DevAddr) //设备地址
  38.        {
  39.               returnfalse;
  40.        }

  41.        //这个为写指令
  42.        if(Tdata[1]!=0x03&& Tdata[1]!=0x06 && Tdata[1]!=0x10 )
  43.        {
  44.               SendModbusAckErr(Tdata,1);
  45.               returnfalse;
  46.        }

  47.        Wlen=(Tdata[4]<<8|Tdata[5]);           //长度
  48.        BegAddr=(Tdata[2]<<8|Tdata[3]);       //开始地址

  49.        if(Tdata[1]==0x06)//写内存
  50.        {
  51.               write_dgusii_vp(BegAddr,&Tdata[4],1);
  52.        }
  53.        elseif(Tdata[1]==0x10)
  54.        {
  55.               write_dgusii_vp(BegAddr,&Tdata[7],Wlen);
  56.        }

  57.        //读操作响应
  58.        //[01][0x03][00][6B][00][02][CRC高][CRC低]
  59.        if(Tdata[1]==0x03)
  60.        {
  61.               RetData[0]=Tdata[0];
  62.               RetData[1]=0x03;
  63.               RetData[2]=Wlen*2;
  64.               read_dgusii_vp(BegAddr,&RetData[3],Wlen);
  65.               CRC_1=CalcCrcAll(0xFFFF,RetData,3+Wlen*2);
  66.               RetData[Wlen*2+3]=CRC_1;
  67.               RetData[Wlen*2+3+1]=CRC_1>>8;
  68.               SendModbusAckOK(RetData,3+Wlen*2+2);
  69.        }
  70.        elseif(Tdata[1]==0x10)
  71.        {
  72.               memcpy(RetData,Tdata,6);
  73.               CRC_1=CalcCrcAll(0xFFFF,(INT8U*)&RetData,6);
  74.               RetData[6]=CRC_1;
  75.               RetData[7]=CRC_1>>8;
  76.               SendModbusAckOK(RetData,8);
  77.        }
  78.        elseif(Tdata[1]==0x06 && Tdata[0]) //当地址码为真,才应答
  79.        {
  80.               memcpy(RetData,Tdata,8);
  81.               SendModbusAckOK(RetData,8);         
  82.        }

  83.        returntrue;
  84. }

  85. 指纹识别使用了STM32的串口和指纹模块通信,部分代码如下:


  86. void CheckFingerIn(void)
  87. {
  88.         static u8  FingerST=0;

  89.         if(!CanFingerEn)
  90.         {
  91.                 FingerST=0;

  92.                 if(FingeTouchOn)
  93.                 {
  94.                         LockDMTTipSend("指纹注册状态下,只有用密码");
  95.                 }
  96.                 return;
  97.         }

  98.         if(FingeTouchOn && !FingerST && DmtDataBuf[MPageid][1]==9)
  99.         {
  100.                 FingerST=1;
  101.                 FingerEven=FingerIdentify;
  102.         }
  103.         else if(!FingeTouchOn && FingerST)
  104.         {
  105.                 FingerST=0;
  106.         }
  107. }

  108. void Init_Fingerpara(void)
  109. {
  110.         SysPara P;
  111.         u16 TeNum=0;
  112.         u8  i=0;
  113.         u8  FingerOk=0;

  114.         ZWPwr=1;
  115.         ZWPwr_Flag=1;
  116.         Delay_ms(1000);

  117.         FingerEven=FingerNull;

  118.         for(i=0;i<5;i++)
  119.         {
  120.                 if(PS_HandShake(&FppassAddr)!=0)
  121.                 {
  122.                         FingerOk=0;
  123.                         Delay_ms(1000);
  124.                 }
  125.                 else
  126.                 {
  127.                         FingerOk=1;
  128.                         break;
  129.                 }
  130.         }

  131.         if(FingerOk==0)  //握手失败
  132.         {
  133.                 DevERR_TORecord(Dev_Finger);
  134.                 while(1)
  135.                 {
  136.                         Delay_ms(1000);
  137.                 }
  138.         }

  139.         PS_ReadSysPara(&P);
  140. }

  141. void EvenHandle(void)
  142. {
  143.         if(FingerEven==FingerNull)
  144.                 return;

  145.         if(!ZWPwr_Flag)
  146.         {
  147.                 ZWPwr=1;
  148.                 ZWPwr_Flag=1;
  149.                 delay_ms(1500);
  150.         }

  151.         PwrFingerCountTime=0;

  152.         switch(FingerEven)
  153.         {
  154.                 case FingerEnroll:
  155.                 {
  156.                         if(FingerToFlashNUM!=0xffff)
  157.                         {
  158.                                 if(PS_AutoEnroll(FingerToFlashNUM)==0)
  159.                                         FingerEnroolOK=1;               
  160.                                 else
  161.                                         FingerEnroolOK=2;
  162.                         }
  163.                 }
  164.                 break;

  165.                 case FingerIdentify:
  166.                 {
  167.                         if(PS_AutoIdentify(0xffff)==0)
  168.                                 FingerSecreatOK=1;
  169.                         else
  170.                                 FingerSecreatOK=0;

  171.                         if(FingerSecreatOK)
  172.                         {
  173.                                 FingerTipSend("        指纹识别成功");
  174.                         }
  175.                         else
  176.                                 FingerTipSend("        非法指纹");

  177.                         PS_ControlBLN(BreatheLed,CloseAllLed,0,0,0);
  178.                 }
  179.                 break;

  180.                 default:
  181.                         break;
  182.         }

  183.         FingerEven=FingerNull;
  184. }


  185. //0:成功  0xff:等待超时
  186. u8 PS_AutoEnroll(u16 Flash_ID)
  187. {
  188.         u8  *data;
  189.         u8         ensure=0xff;
  190.         u8  Par1=0,Par2=0;
  191.         u8         FingerCountTimesOut=0;

  192.         AutoEnrollCmd(Flash_ID,0x09,GetFingerTimes);
  193. //        AutoEnrollCmd(Flash_ID,0x0029,GetFingerTimes); //不要求离开
  194.   data=JudgeStr(3000);

  195.         if(data) //发送自动注册成功
  196.         {
  197.                 ensure=data[9];
  198.                 Par1=data[10];
  199.                 Par2=0;
  200.                 if(ensure!=0)
  201.                 {
  202.                         printffinger2((u8 *)EnsureMessage(ensure),(u8 *)AutoEnrollPar1(Par1),(u8 *)AutoEnrollPar2(Par2));
  203.                         return 0xff;
  204.                 }
  205.         }
  206.         else
  207.         {
  208.                 return 0xff;
  209.         }
  210. //        printffinger("请手指按下");
  211.         while(1)
  212.         {
  213.                 data=JudgeStr(1500);

  214.                 if(data)
  215.                 {
  216.                         FingerCountTimesOut=0;

  217.                         ensure=data[9];
  218.                         Par1=data[10];
  219.                         Par2=data[11];
  220.                         printffinger2((u8 *)EnsureMessage(ensure),
  221.                                         (u8 *)AutoEnrollPar1(Par1),(u8 *)AutoEnrollPar2(Par2));

  222.                         if(Par2<=GetFingerTimes)
  223.                         {
  224.                                 if(!ensure && Par1==2 && Par2!=GetFingerTimes)
  225.                                 {
  226.                                         printffinger("请手指离开");
  227.                                 }

  228.                                 if(!ensure && Par1==3)
  229.                                 {
  230.                                         printffinger("请手指按下");
  231.                                 }

  232.                                 if(ensure == 0x26)
  233.                                 {
  234.                                         printffinger("超时退出");
  235.                                         return 0x26;
  236.                                 }

  237.                         }
  238.                         else
  239.                         {
  240.                                 if(ensure==0x0a && Par1==0x04 && Par2==0xf0)
  241.                                 {
  242.                                         printffinger("合成失败");
  243.                                         return 0xff;
  244.                                 }

  245.                                 if(ensure)
  246.                                         return 0xff;

  247.                                 if(!ensure && Par1==0x06&&Par2==0xf2)
  248.                                         return 0;
  249.                         }
  250.                 }
  251.                 else
  252.                 {
  253.                         FingerCountTimesOut++;
  254.                         if(FingerCountTimesOut>5)
  255.                                 return 0xff;
  256.                 }
  257.         }
  258. }




  259. u8 PS_AutoIdentify(u16 Flash_ID)
  260. {
  261.         u8  *data;
  262.         u8         ensure=0xff;
  263.         u8  Par1=0;
  264. //        u8         FingerTimesOK=0;

  265.         AutoIdentifyCmd(Flash_ID,0x02,1);
  266.   data=JudgeStr(3000);

  267.         if(data) //发送自动识别成功
  268.         {
  269.                 ensure=data[9];
  270.                 Par1=data[10];
  271.                 if(ensure!=0)
  272.                 {
  273.                         LockDMTTipSend((u8 *)EnsureMessage(ensure));
  274.                         return 0xff;
  275.                 }
  276.         }
  277.         else
  278.         {
  279.                 return 0xff;
  280.         }

  281.         LockDMTTipSend("正在检测指纹");

  282.         while(1)
  283.         {
  284.                 data=JudgeStr(2000);
  285.                 if(data)
  286.                 {
  287.                         ensure=data[9];
  288.                         Par1=data[10];

  289.                         if(ensure)
  290.                         {
  291.                                 LockDMTTipSend((u8 *)EnsureMessage(ensure));
  292.                                 return 0xff;
  293.                         }

  294.                         if(!ensure && Par1==05)
  295.                         {
  296.                                 return 0;
  297.                         }
  298.                 }
  299.                 else        
  300.                         return 0xff;
  301.         }

  302. }
复制代码

备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=10571&extra=&_dsign=ea69763b

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-21 22:56 , Processed in 0.077940 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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