找回密码
 立即注册

QQ登录

只需一步,快速开始

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

六脚的指纹识别模块,有谁做过这个模块的开发?

  [复制链接]
跳转到指定楼层
楼主
ID:103094 发表于 2016-4-2 20:12 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
有谁做过这个模块的开发?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:103094 发表于 2016-4-3 16:37 | 显示全部楼层

这是我修改的程序,但是握手口令无法通过,我不知道是什么原因

本帖最后由 45555mkkl 于 2016-4-3 16:38 编辑
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar SaveNumber=0,searchnum=0;
  6. uint SearchNumber=0;
  7. uint clk0=0;
  8. //sbit relay=P1^4;
  9. sbit buzzer=P2^0;
  10. sbit red=P1^0;
  11. sbit green=P1^1;
  12. sbit k1=P3^3;  //zhuanhuan
  13. sbit k2=P3^4;
  14. sbit k3=P3^2;//qing
  15. bit changeflag=0,modeflag=0,clearalflag=0;
  16. //验证手握指令
  17. uchar code VPWD[16]={16,0x01,0xff,0xff,0xff,0xff,0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};
  18. // 设置设备握口令
  19. uchar code STWD[16]={16,0X01,0Xff,0xff,0xff,0xff,0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};
  20. //从传感器读入图片
  21. uchar code GIMG[14]={12,0X01,0Xff,0xff,0xff,0xff,0x01,0,3,1,0x00,0x05};
  22. //根据原始图像生成指纹特征1/2
  23. uchar code GENT1[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};
  24. uchar code GENT2[14]={13,0X01,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09};
  25. //由特征文件搜索指纹库
  26. uchar code SEAT[18]={17,0x01,0xff,0xff,0xff,0xff,0x01,0,8,4,1,0,0,0,0x65,0x00,0x73};
  27. //特征文件合成模板
  28. uchar code MERG[14]={12,0x01,0xff,0xff,0xff,0xff,0x01,0,3,5,0x00,0x09};
  29. //文保保存
  30. uchar code STOR[16]={15,0x01,0xff,0xff,0xff,0xff,0x01,0,6,6,2,0x00,0x00,0x00,0x0f};
  31. //读取记事本
  32. uchar code RDNT[14]={13,0x01,0xff,0xff,0xff,0xff,0x01,0,4,0x19,0,0x00,0x1e};
  33. //清除记事本
  34. uchar code DENT[46]={45,0X01,0Xff,0xff,0xff,0xff, 0x01, 0,36,0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,0x3d};
  35. //删除一个指纹
  36. uchar code DELE_one[16]={16,0X01,0Xff,0xff,0xff,0xff, 0x01, 0,7,0x0c,0x00,0x00, 0,1, 0x00,0x15};
  37. //清空所有指纹
  38. uchar code DELE_all[12]={12,0X01,0Xff,0xff,0xff,0xff, 0x01, 0,3, 0x0d,0x00,0x11};
  39. #define FALSE 0
  40. #define TURE  1
  41. #define on 1
  42. #define off 0
  43. #define MAX_NUMBER 63
  44. #define _Nop() _nop_()
  45. uchar FifoNumber=0;
  46. uchar FIFO[MAX_NUMBER+1]={0};
  47. ////////12864
  48. #define com 0
  49. #define dat 1
  50. sbit cs =P3^7;
  51. sbit sid=P3^6;
  52. sbit sck=P3^5;
  53. sbit beef=P2^0;
  54. uchar com_data,untemp,temp;
  55. uchar bdata datbyte;
  56. sbit datbyte0=datbyte^0;
  57. sbit datbyte7=datbyte^7;  
  58. void delay1ms(uint x)
  59. {
  60.         uint i,j;
  61.         for(i=0;i<x;i++)
  62.         for(j=0;j<120;j++);
  63. }
  64. void w_12864byte(uchar byte)
  65. {
  66.         uchar i;
  67.         for(i=0;i<8;i++)
  68.         {
  69.                 sck=0;
  70.                 byte<<=1;
  71.                 sid=CY;
  72.                 sck=1;
  73.         }
  74. }
  75. uchar r_12864byte(void)
  76. {
  77.         uchar i,temp1,temp2;
  78.         temp1 = 0;
  79.         temp2 = 0;
  80.         for(i=0;i<8;i++)
  81.         {
  82.                 temp1=temp1<<1;
  83.                 sck = 0;
  84.                 sck = 1;
  85.                 sck = 0;
  86.                 if(sid) temp1++;
  87.         }
  88.         for(i=0;i<8;i++)
  89.         {
  90.                 temp2=temp2<<1;
  91.                 sck = 0;
  92.                 sck = 1;
  93.                 sck = 0;
  94.                 if(sid) temp2++;
  95.         }
  96.         return ((0xf0&temp1)+(0x0f&temp2));
  97. }
  98. void c_12864busy( void )
  99. {
  100.         do
  101.         w_12864byte(0xfc);
  102.         while(0x80&r_12864byte());
  103. }
  104. void w_12864(bit dat_com,uchar byt)
  105. {
  106.         uchar temp;
  107.         if(dat_com==0)
  108.         temp=0xf8;
  109.         else
  110.         temp=0xfa;
  111.         cs=1;
  112.         c_12864busy();
  113.         w_12864byte(temp);
  114.         w_12864byte(byt&0xf0);
  115.         w_12864byte(byt<<4);
  116.         cs=0;
  117. }
  118. void init_12864(void)
  119. {
  120.         w_12864(com,0x30);
  121.         w_12864(com,0x0c);
  122.         w_12864(com,0x01);
  123.         w_12864(com,0x06);
  124. }
  125. /////////////////////////////////////////////
  126. void TxdByte(uchar dat1)
  127. {
  128.   TI=0;
  129.   SBUF=dat1;  //读入数据
  130.   while(!TI);        //等待发送完毕
  131.   TI=0;
  132. }

  133. bit Command(uchar *p,uchar MaxTime)         //发送一个命令
  134. {
  135.         uchar count=0,tmpdat=0,        temp=0,i=0,package=0,flag=0,checksum=0;
  136.         bit result=0,start=0,stop=0;
  137.         TxdByte(0xef);        //数据包包头识别码
  138.          TxdByte(0x01);
  139.          i=*p; ///
  140.          p++;p++;
  141.          for(count=i-1;count!=1;count--)
  142.          {
  143.                  temp=*p++;          //取第1个元素的内容,然后发送
  144.                  TxdByte(temp);         //将数据发送
  145.          }
  146.          result=TURE;          //发送完成,结果为真(1)
  147.          FifoNumber=0;
  148.          for(count=MAX_NUMBER+1;count!=0;count--) //清空FIFO数组里面的内容写入0x00
  149.          FIFO[count-1]=0x00;
  150.          if(result)
  151.          {
  152.                  result=FALSE;
  153.                  start=FALSE;
  154.                  stop=FALSE;
  155.                  count=0;
  156.                  clk0=0;          //清零计数
  157.                  do
  158.                  {

  159.                          r:if(RI==1)           //如果接受到数据
  160.                          {
  161.                                  tmpdat=SBUF;//先把接收到的数据放到tmdat中
  162.                                  RI=0;
  163.                                  if((tmpdat==0xef)&&(start==FALSE))         //        第一个传回来的数据,指令应答的第一个字节
  164.                                  {
  165.                                          count=0;
  166.                                          FIFO[0]=tmpdat; //读入第一个应答字节
  167.                                          flag =1;
  168.                                          goto r;
  169.                                  }
  170.                                  if(flag==1)//第一个字节已经回来
  171.                                  {
  172.                                          if(tmpdat!=0x01) //接收数据错误,将重新从缓冲区接收数据
  173.                                           {
  174.                                           flag=0;  //接收应答失败
  175.                                           result=FALSE;
  176.                                           start=FALSE;
  177.                                           stop=FALSE;
  178.                                           count=0;
  179.                                           goto r;        
  180.                                           }
  181.                                         //如果成功接收到0xef01,可以开始接收数据
  182.                                           flag=2;        //应答成功,可以接收数据了
  183.                                           count++;
  184.                                           FIFO[count]=tmpdat;
  185.                                           start=TURE;
  186.                                           goto  r;
  187.                                  }
  188.                          if((flag==2)&&(start==TURE))
  189.                          {
  190.                                  count++;   //数据元素下表++
  191.                                  FIFO[count]=tmpdat;//存入数据
  192.                                  if(count>=6)
  193.                                  {
  194.                                          checksum=FIFO[count]+checksum; //计算校验和
  195.                                  }
  196.                                  if(count==8)
  197.                                  {
  198.                                          package=FIFO[7]*0x100+FIFO[8];        //计算包长
  199.                                          stop=TURE;
  200.                                   }
  201.                                  if(stop)
  202.                                  {
  203.                                          if(count==package+8)
  204.                                          {
  205.                                                  checksum=checksum-FIFO[count-1]-FIFO[count];
  206.                                                  if(checksum!=(FIFO[count]&0xff))
  207.                                                          result=FALSE; //校验失败,置结果标志为0
  208.                                                  else
  209.                                                         result=TURE;
  210.                                                  flag=0;
  211.                                                  break;
  212.                                           }
  213.                                   }

  214.                           }
  215.                  }
  216.          }
  217. while((clk0<=MaxTime)&&(count<=MAX_NUMBER)&&(changeflag==0));//由定时器以及最大接收数据来控制,保证不会在此一直循环
  218.          FifoNumber=count;  //保存接收到的数据个树
  219. }
  220. return result;
  221. }
  222. bit VefPSW(void) //验证设备握手口令,成功返回1
  223. {
  224.         uchar count=0;
  225.         while(1)
  226.         {
  227.                 if(Command(VPWD,20)&&(FifoNumber==11)&&(FIFO[9]=0x00))
  228.                 return 1;
  229.                 count++;
  230.                 if(count>=2)  //如果不成功,再次验证,如果两次不成功,返回失败
  231.                         return 0;
  232.         }
  233. }
  234. void Clear_All(void) //清空指纹库
  235. {
  236.         delay1ms(200);
  237.         Command(DELE_all,50);//清空指纹库
  238. }
  239. uchar ImgProcess(uchar BUFID)//发获取图像并生成特征文件,存入BUFID中。输入参数为缓存区号
  240. {
  241.                 if(Command(GIMG,89)&&(FifoNumber==11)&&(FIFO[9]==0x00))
  242.                 {
  243.                         if(BUFID==1)
  244.                         {
  245.                                 if(Command(GENT1,60)&&(FifoNumber==11)&&(FIFO[9]==0x00))
  246.                                 {
  247.                                         return 1;
  248.                                 }
  249.                                 else
  250.                                  {
  251.                                  return 0;
  252.                                  }
  253.                         }
  254.                         else if(BUFID==2)
  255.                         {
  256.                                 if(Command(GENT2,60)&&(FifoNumber==11)&&FIFO[9]==0x00)
  257.                                 return 1;
  258.                                 else
  259.                                 return 0;
  260.                         }
  261.                 }
  262.                 else return 0;
  263.                 return         0;
  264. }
  265. bit Searchfinger() //搜搜指纹(发送搜索命令,以及根据返回值确定是否存在)
  266. {
  267.         if(Command(SEAT,60)&&(FifoNumber==15)&&(FIFO[9]==0x00))
  268.         {
  269.                 SearchNumber=FIFO[10]*0x100+FIFO[11]; //搜索到的页码值
  270.                 //MatchScore=FIFO[12]*0x100+FIFO[13];
  271.                 return 1;
  272.         }
  273.         else
  274.         {
  275.         return 0;
  276.         }
  277. }
  278. uchar search()          //搜索指纹
  279. {
  280.         uchar SearchBuf=0,i=0;
  281.         while(i<20)
  282.         {
  283.                 if(ImgProcess(1)==1)  //首先读入一次指纹
  284.                 {
  285.                         SearchBuf=Searchfinger();  //进行指纹比对,如果搜索到,返回搜索到的指纹序号
  286.                         if(SearchBuf==1)
  287.                         {
  288.                                 return SearchNumber;
  289.                         }
  290.                         else
  291.                                 return 255;        //表示搜索到的指纹不正确
  292.                 }
  293.                 i++;
  294.         }
  295.         return 0;
  296. }
  297. bit savefingure(uchar ID) //保存指纹
  298. {
  299.         uchar i=0;         //开始进行储存指纹模块的操作
  300.         for(i=0;i<16;i++)//保存指纹信息
  301.         {
  302.                 FIFO[i]=STOR[i];
  303.         }
  304.         FIFO[12]=ID; //校验和
  305.         FIFO[14]=FIFO[14]+ID;
  306.         if(Command(FIFO,70)==1)//进行存放指纹模板的命令
  307.         {
  308.                 return 1;
  309.         }
  310.         else
  311.                 return 0;        //不成功
  312. }
  313. uchar enroll() //采集两次指纹,生成一个指纹模板
  314. {
  315.         uchar temp=0,count=0;
  316.         while(1)
  317.         {
  318.                 temp=ImgProcess(1);//生成特征1
  319.                 if(temp==1)        //生成特征文件成功
  320.                 {         //采集第一个特征成功
  321.                         count=0;
  322.                         buzzer=0;
  323.                         delay1ms(100);
  324.                         buzzer=1;
  325.                         break;
  326.                 }
  327.                 else
  328.                 {
  329.                         if(temp==0)        //采集指纹没有成功
  330.                         {
  331.                                 count++;
  332.                                 if(count>=40)//采集了40次,还不成功,直接采集失败,直接退出enroll函数,返回0
  333.                                         return 0;
  334.                         }
  335.                 }
  336.         }
  337.         delay1ms(2000);//延时2秒开始采集下一个特征
  338.         //开始采集第二个特征
  339.         while(1)  
  340.         {
  341.                 temp=ImgProcess(2);        //生成特征2
  342.                 if(temp==1)           //生成特征文件2成功
  343.                 {
  344.                         if((Command(MERG,40)&&(FifoNumber==11)&&(FIFO[9]==0x00))==1)//合并成功返回1
  345.                         {
  346.                                 buzzer=0;
  347.                                 delay1ms(100);
  348.                                 buzzer=1;
  349.                                 delay1ms(100);
  350.                                 buzzer=0;
  351.                                 delay1ms(100);        //响两声表示一个模板成功
  352.                                 buzzer=1;
  353.                                 return 1;
  354.                         }
  355.                         else
  356.                         return         0;
  357.                 }
  358.                 else
  359.                 {
  360.                         if(temp==1)//采集指纹没有成功
  361.                 {
  362.                                 count++;
  363.                                 if(count>=25)
  364.                                 return 0;
  365.                         }
  366.                 }
  367.         }
  368. }
  369. void main(void)
  370. {
  371.         uchar i=0;
  372.         init_12864();
  373.         ET0=1;         //定时器0开中断
  374.         TL0=0x97;  //17ms的初值
  375.         TH0=0xbd;
  376.         SCON=0x50; //UART方式1:8位UART:REN=1:允许接收
  377.         PCON=0x00; //SMOD=0,波特率不加倍
  378.         TMOD=0x21;        //T1方式2,用于UART波特率
  379.         TH1=0xfd;
  380.         TL1=0xfd;  //UART波特率设置9600
  381.         TR1=1; //开定时器
  382.         TR0=1; //中断0低电平中断
  383.         IT0=0; //中断1低电平中断
  384.         IT1=1; //开中断0
  385.         EX0=1; //开中断1
  386.         EX1=1;
  387.         EA=1;  
  388.         w_12864(com,0x90);
  389.         w_12864(dat,0x34);
  390.         //SMG_g=0;
  391.         //P0=tab[0];
  392.         for(i=0;i<6;i++)//开始握手6次,如果没有一次成功,表示模快通信不正常,只要成功跳出循环
  393.         {
  394.                 if(VefPSW()==1)        //与模块握手通过,绿灯亮起。进入识别模式
  395.                 {
  396.                 w_12864(com,0x90);
  397.                 w_12864(dat,0x37);
  398.                         green=0;
  399.                         buzzer=0;
  400.                         delay1ms(300);
  401.                         buzzer=1;
  402.                         green=1;
  403.                         red=0;
  404.                         break;//成功就退出这个循环
  405.                 }
  406.         }
  407.         while(1)
  408.         {
  409.                 if(k2==0)//录入一个指纹
  410.                 {
  411.                         delay1ms(10);
  412.                         if(k2==0)//如果仍为低电平,表示按键有效
  413.                         {
  414.                                 while(k2==0); //等待松手
  415.                                 if(VefPSW()==1&&modeflag==1&&SaveNumber<10)//与模块握手通过
  416.                                 {                                         
  417.                                 /*        w_12864(com,0x80);
  418.                                         w_12864(dat,'y');
  419.                                         w_12864(dat,'e');
  420.                                         w_12864(dat,'s');*/                                                                                                                                                                                                
  421.                                         if(enroll()==1)//采集两次,生成一个指纹模块成功
  422.                                         {        
  423.                                                 if(savefingure(SaveNumber+1)==1)//保存也成功
  424.                                                 {
  425.                                                         SaveNumber++; //加一次
  426.                                                         //P0=tab[SaveNumber];
  427.                                                         delay1ms(200);
  428.                                                         //P0=0xff;
  429.                                                         delay1ms(200);
  430.                                                         //P0=tab[SaveNumber];
  431.                                                                 //w_12864(com,0x90);
  432.                                                 //w_12864(dat,0x31);
  433.                                                 }
  434.                                         }
  435.                                 }
  436.                                 else
  437.                                 {
  438.                                         buzzer=0;
  439.                                         for(i=0;i<8;i++)
  440.                                         {
  441.                                                 delay1ms(100);
  442.                                                 red=~red;
  443.                                         }
  444.                                         red=0;
  445.                                         buzzer=1;
  446.                                 //w_12864(com,0x88);
  447.                                 //w_12864(dat,0x32);
  448.                                 }
  449.                         }
  450.                 }
  451.                 if(modeflag==0)//为识别模式
  452.                 {
  453.                         green=0;
  454.                         red=1;
  455.                         searchnum=search();
  456.                         if(searchnum>=1&&searchnum<=162)//只能存入162个指纹
  457.                         {
  458.                                 //P0=tab[searchnum];//显示搜索到的指纹模块
  459.                                         //w_12864(com,0x87);
  460.                                 //w_12864(dat,0x33);
  461.                                 //relay=0;
  462.                                 buzzer=0;
  463.                                 delay1ms(100);
  464.                                 buzzer=1;
  465.                                 delay1ms(3000);
  466.                                 //relay=1;
  467.                         }
  468.                         if(searchnum==255)        //不正确的指纹,蜂鸣器响三声
  469.                         {
  470.                                 //P0=tab[0];//显示
  471.                                          //w_12864(com,0x86);
  472.                                 //w_12864(dat,0x35);
  473.                                 buzzer=0;delay1ms(100);buzzer=1;delay1ms(100);
  474.                                 buzzer=0;delay1ms(100);buzzer=1;delay1ms(100);
  475.                                 buzzer=0;delay1ms(100);buzzer=1;delay1ms(100);
  476.                         }
  477.                 }
  478.                 if(modeflag==1)//录入模式
  479.                 {
  480.                         green=1;
  481.                         red=0;
  482.                 }
  483.                 if(clearalflag==1)
  484.                 {        
  485.                         clearalflag=0;
  486.                         Clear_All();
  487.                         red=0;
  488.                         green=1;
  489.                         modeflag=1;//进入录入指纹模式
  490.                 //        P0=tab[0];//表示没有指纹录入
  491.                                  //w_12864(com,0x98);
  492.                         //        w_12864(dat,0x38);
  493.                         buzzer=0;
  494.                         delay1ms(800);
  495.                         buzzer=1;
  496.                         SaveNumber=0;
  497.                 }
  498.                 if(changeflag==1)
  499.                 {
  500.                         changeflag=0;
  501.                         if(modeflag==0)//识别模式
  502.                         {
  503.                                 green=0;
  504.                                 red=1;
  505.                         //        P0=tab[0];//显示当前几个指纹
  506.                                 //w_12864(com,0x92);
  507.                                 //w_12864(dat,0x37);
  508.                          }
  509.                          else          //录入模式
  510.                         {
  511.                                 red=0;
  512.                                 green=1;
  513.                          //        P0=tab[0]; //显示0
  514.                          //w_12864(com,0x94);
  515.                                 //w_12864(dat,0x38);
  516.                         }
  517.                 }
  518.           }
  519.         }
  520.         void Timer0() interrupt 1  //定时器0中断函数
  521.         {
  522.                 TL0=0x97;
  523.                 TH0=0xbd;
  524.                 clk0++;        //延时17ms
  525.         }
  526.         void int0()interrupt 0 //中断0,清除所有指纹
  527.         {
  528.                 if(k3==0) //清除所有指纹
  529.                 {
  530.                         delay1ms(10);
  531.                         if(k3==0)//如果仍为低电平,表示按有效
  532.                         {
  533.                                  while(k3==0); //等待松手
  534.                                 clearalflag=1;
  535.                                 changeflag=1;
  536.                         }
  537.                 }
  538.         }
  539.         void int1()        interrupt 2        //中断1,模式转换
  540.         {
  541.                 if(k1==0)  //模式转换 其中用modeflag来标志。默认从1个指纹开始录入
  542.                 {
  543.                         delay1ms(10);
  544.                         if(k1==0)
  545.                         {
  546.                                 while(k1==0);
  547.                                 modeflag=~modeflag;//0表示录入 1表示识别指纹
  548.                                 changeflag=1;
  549.                         }
  550.                 }
  551. }
复制代码
回复

使用道具 举报

板凳
ID:103094 发表于 2016-4-5 19:53 | 显示全部楼层
已解决,问题出在模块的波特率,用上位机软件将模块波特率改过来后就好用了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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