历史上的今天
返回首页

历史上的今天

今天是:2025年02月16日(星期日)

正在发生

2020年02月16日 | 单片机指纹识别程序

2020-02-16 来源:51hei

制作出来的实物图如下:
IMG_4524.JPG实物照片.JPG 

Altium Designer画的原理图和PCB图如下:
原理图.png?imageView2/2/w/550PCB图.png?imageView2/2/w/550 

单片机源程序如下:

#include

#include

#include"lcd1602.h"



sbit buzzer=P2^0;  //蜂鸣器        低电平打开蜂鸣器


sbit red=   P1^0;  //红色灯 表示录入模式

sbit green= P1^1;  //绿色灯 表示识别模式


sbit k2=P3^4; //录入一次指纹

sbit k1=P3^3; //模式识别转换

sbit k3=P3^2; //清除所有指纹(10个指纹清除)


#define Max_User 10

#define error 2

   

unsigned char         SaveNumber=0,searchnum=0;

unsigned int          SearchNumber=0;                

unsigned int         clk0=0;


unsigned char str[3]={0,'',''};


unsigned char code Identify[16]="Lock:   Idenfity";

unsigned char code Input[16]   ="Lock:   Input   ";


bit modeflag=0,clearallflag=0,changeflag=0;


// modeflag=0 为识别模式 modeflag=1为录入指纹模式

//每成功录入一次指纹 SaveNumber++


//////////////////////////////////////常用指令定义/////////////////////////////


//Verify  Password   :验证设备握手口令

unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};         //回送12个


//设置设备握手口令

unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};         //回送12个


//GetImage           :探测手指并从传感器上读入图像

unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05};        //回送12个


//Gen Templet1        :根据原始图像生成指纹特征1

unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};        //回送12个


//Gen Templet2        :根据原始图像生成指纹特征2

unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送12个        


        

//Search Finger      :以CharBufferA或CharBufferB中的特征文件搜索整个或部分指纹库

unsigned char code SEAT[18]={17,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,8, 4,1,0,0,    0,0x65,  0x00,0x73};        //回送16个



//Merge Templet      ;将CharBufferA与CharBufferB中的特征文件合并生成模板,结果存于ModelBuffer。

unsigned char code MERG[14]={12,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,3,5 , 0x00,0x09};//回送12个        


//Store Templet      :将ModelBuffer中的文件储存到flash指纹库中

unsigned char code STOR[16]={15,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,6,6,2,     0x00,0x00,     0x00,0x0f}; //回送12个


//Read Note

unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19,  0, 0x00,0x1e};


//Clear Note

unsigned char 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};


//DEL one templet

unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,7,  0x0c,    0x00,0x00, 0,1, 0x00,0x15};


//DEL templet      ;清空指纹库

unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,  0x0d,0x00,0x11};


//////////////////////////////////////常用指令定义-------结束///////////////////////////////////////////////////////////////////////////////////////



//////////////////////////////////////宏定义////////////////////////////////////////////////////////////////////////

#define FALSE 0

#define TURE  1


//状态定义表

#define on            1

#define off           0


#define MAX_NUMBER    63 

#define _Nop()  _nop_()



//////////////////////////////////////宏定义------------结束////////////////////////////////////////////////////////


unsigned char                   FifoNumber=0; 

xdata unsigned char   FIFO[MAX_NUMBER+1]={0};


/*********1毫秒延时程序**********/

void delay1ms(unsigned int t)

{

        unsigned int i,j;

        for(i=0;i           for(j=0;j<120;j++)

           ;

}



void TxdByte(unsigned char dat)//串口发送信息,通过查询方式发送一个字符

{

    TI = 0;                 //让TI=0

    SBUF = dat;         //读入数据

    while(!TI);         //等待发送完毕

    TI = 0;                 //清零

}


bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,给模块发送一个命令

{

          unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;

                  

        bit result=0, start=0,stop=0;


          TxdByte(0xef);//数据包包头识别码

           TxdByte(0x01);//数据包包头识别码

          i=*p;         //数组的第“0”个元素、里面存放了本数组的长度,把这个长度给变量i,方便进行操作

          p++; 

        p++;

          for (count=i-1; count!=1;count--)  //Sent command String

                  {

                         temp=*p++;//取第个“1”个元素的内容,然后发送 

                    TxdByte(temp);//将数据发送出去

                }  

          result=TURE;//发送完成,结果为真 (真为1)           

          FifoNumber=0;

          for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]数组里面的内容,写入0X00

                 FIFO[count-1]=0x00;  

        

          if (result)   

           {                

             result=FALSE;

              start =FALSE;

                   stop  =FALSE;

               count=0;

               clk0=0;        //清零CL0计数

                

               do /////////////////////////////do的内容////////////////////////////////

                {        

                        restart0:                                

                         if (RI==1)//如果接收到数据

                              {                                 

                                          tmpdat=SBUF;//先把接收到的数据放到tmpdat中

                            RI=0;

                            if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节

                                    { 

                                                        count=0;

                                                    FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存在第“0”个元素中    

                                                        flag=1;        

                                                        goto 

                                                                restart0;//可以用中断方式进行                        

                                                

                                     }

                                        if(flag==1)//第一个字节已经回来,所以flag==1成立

                                                {  

                                                        if(tmpdat!=0x01)  //接收数据错误,将重新从缓冲区接收数据

推荐阅读

史海拾趣

Elcos AG公司的发展小趣事

随着全球对环保和可持续发展的重视,Elcos AG也开始注重自身的环保责任和可持续发展战略。公司采用环保材料和生产工艺,减少了对环境的污染和资源的浪费。同时,Elcos AG还积极参与社会公益事业和环保活动,通过捐款、赞助和志愿服务等方式回馈社会。这些举措不仅提升了公司的社会形象和品牌价值,也为公司的长期发展奠定了坚实的基础。

Catalyst / ON Semiconductor公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,Catalyst / ON Semiconductor公司面临着前所未有的挑战。为了应对这些变革,公司进行了一系列的转型和调整。公司优化了组织架构和管理流程,提高了运营效率;同时,公司还加大了对新兴技术的投入和研发力度,以适应市场的不断变化。

Display Engineering Services公司的发展小趣事

在追求经济效益的同时,Catalyst / ON Semiconductor公司也高度重视可持续发展和社会责任。公司积极推行环保政策,减少生产过程中的污染排放;同时,公司还关注员工福利和社会公益事业,积极参与各种社会公益活动。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

这五个故事涵盖了Catalyst / ON Semiconductor公司从初创到发展壮大的不同阶段和方面,展现了公司在电子行业中的成长轨迹和贡献。虽然这些故事是基于假设和一般逻辑构建的,但它们旨在呈现一个企业在发展过程中可能遇到的挑战和机遇,以及企业如何应对这些挑战并抓住机遇。

Diodes公司的发展小趣事

随着科技的快速发展和市场的不断变化,客户需求也在不断更新。为了满足客户不断变化的需求,Diodes公司始终保持敏锐的市场洞察力和创新力。公司不断推出新产品、新技术和新应用方案,以满足客户在性能、可靠性、成本等方面的需求。同时,Diodes还积极与客户沟通交流,了解客户的实际需求和反馈意见,不断优化产品和服务。这些努力使得Diodes能够紧跟市场步伐、满足客户需求,在激烈的市场竞争中保持领先地位。

C&H Technology公司的发展小趣事

C&H Technology成立于2005年,由两位志同道合的电子工程师陈先生和何先生共同创立。两位创始人凭借在半导体领域的深厚技术积累,瞄准了当时正在兴起的智能手机市场,决定开发一款高性能、低功耗的手机芯片。他们租下一间小办公室,招募了几名志同道合的工程师,开始了艰苦的创业之旅。

起初,公司面临资金短缺、技术瓶颈和市场认可度低等重重困难。但陈先生和何先生凭借坚定的信念和不懈的努力,逐步攻克技术难题,与供应商建立了稳定的合作关系,并通过参加行业展会等方式,逐渐提高了品牌知名度。经过几年的努力,C&H Technology成功推出了首款手机芯片,并获得了市场的认可。

DBLECTRO公司的发展小趣事

进入21世纪后,随着全球对环保和可持续发展的关注度不断提高,迪贝电子也积极响应这一趋势,将环保和社会责任融入到企业的经营理念中。公司投入大量资金研发更加环保、节能的产品,并积极参与各种环保公益活动。同时,迪贝电子还积极推广绿色制造理念,通过优化生产流程、降低能耗和减少废弃物排放等措施,实现了企业的可持续发展。

问答坊 | AI 解惑

如何用软盘自动恢复D盘备份的VxWorks系统至C盘

复印机打印控制器使用的是VxWorks系统,机器配置如下: CPU:PⅢ 866MHz 硬盘:61G(C,D,E三分区) 内存:256M 软驱:1.44M 网卡:10M/100M 其它:1394接口卡 无显示器及输入设备。 现C盘系统损坏,无法启动,需恢复D盘备份系统至C盘: ...…

查看全部问答>

arm中断系统的疑惑

arm中断疑惑: 当中断产生时,通过中断向量表        b   ResetHandler       b   HandlerUndef    ;handler for Undefined mode     b   Handler ...…

查看全部问答>

关于UCLIBC支持locale support的问题?

我装了LIBXML2,用ARM-ELF-GCC编译程序时提示错误: attempted to include iconv.h when uclibc built local support 编译用的命令如下: arm-elf-gcc cmld.c -o cmld -lm -I /boot/xml/include/libxml2 -L /boot/xml/lib -l ...…

查看全部问答>

[高分]window mobile5 中操作通讯录

用vs2005(C++)写一个程序,在mobile5中能把数据按通讯录的格式导入数据到通讯录里。 请教各位大虾,如何实现,有哪些函数或方法…

查看全部问答>

关于usb固件编程,定义描述符时的问题

最近小弟我在研究usb固件编程,有一个疑惑,就是定义usb configuration descriptor的时候,其中的wTotalLength字段关于配置描述符的总长度时,为什么要进行高低字节交换。…

查看全部问答>

帮忙啦!谁有tornado2.2.1的补丁

谁有这两个补丁 make3_80.gvk_patches make3_80.tor2_2.new_dependency_rules 需要用。 谢谢! 原文地址:http://www.dre.vanderbilt.edu/~schmidt/DOC_ROOT/ACE/ACE-INSTALL.html#VxWorks/NT NOTE:The make (version 3.74) that is provide ...…

查看全部问答>

统计下SHT21焊接情况?

大家谈谈SHT21应该怎么焊接?https://bbs.eeworld.com.cn/thread-153506-1-1.html看来这个芯片焊接很需要功夫哦!…

查看全部问答>

lpc1343的开发板哪里能买到?

就是nxp网站上的那种,有卖的吗?现在做项目要用,已经错过申请板子的时间了 哪位有不用的话可以考虑转给我吗?价钱可以商量…

查看全部问答>

如何用msp430实现wifi 服务器

以前用ARM实现了wifi的发射,作为服务器使用。现在想移植到msp430上,本人对430一点不了解,请有经验的前辈给指明方法。谢谢!…

查看全部问答>

基于单片机的带有SD卡的MP3

想做一个基于单片机的带有SD卡的MP3,希望高手能够给些资料,谢谢!面临毕业,希望能够毕业前做些实事!…

查看全部问答>