几年前我们在科幻电影中看到的指纹传感器,现在变得非常普遍,用于验证一个人出于各种目的的身份。目前,我们在日常生活中随处可见基于指纹的系统,例如办公室考勤,银行员工验证,自动取款机中的现金提取或存款,政府办公室的身份验证等。我们已经将其与arduino和raspberry pi接口,今天我们将指纹传感器与pic微控制器连接。
必需组件
pic16f877a 微控制器
指纹模块
按钮或键盘
16x2 液晶显示器
10k锅
18.432000 mhz 晶体振荡器
面包板或印刷电路板(从jlcpcb订购)
跳线
指示灯(可选)
电阻 150 欧姆 -1 k 欧姆(可选)
5v 电源
电路图及说明
在这个pic微控制器指纹传感器接口项目中,我们使用了4个按钮:这些按钮用于多功能。密钥 1用于在系统中存储或删除指纹时匹配指纹和递增指纹 id。密钥 2用于注册新指纹以及在系统中存储或删除指纹时递减指纹 id。键 3 用于从系统中删除存储的手指,键 4 用于确定。led用于指示检测到或匹配指纹。在这里,我们使用了适用于uart的指纹模块。因此,在这里,我们将此指纹模块与pic微控制器连接,其默认波特率为57600。
因此,首先,我们需要进行所有必需的连接,如下面的电路图所示。连接很简单,我们刚刚将指纹模块连接到pic微控制器的uart。16x2 lcd 用于显示所有消息。10k电位器也与lcd一起使用,以控制其对比度。16x2 lcd 数据引脚是连接的 porta 引脚。lcd 的 d4、d5、d6 和 d7 引脚分别与 pic 微控制器的引脚 ra0、ra1、ra2 和 ra3 连接。四个按钮(或键盘)连接到 portd 的引脚 rd0、rd1、rd2 和 rd,led 也连接到端口 portc 的引脚 rc3。在这里,我们使用了一个18.432000 mhz的外部晶体振荡器来为微控制器提供时钟。
带pic微控制器的指纹传感器的操作
该项目的操作很简单,只需在pic编程器或刻录机(pickit2或pickit3或其他)的帮助下,将从源代码生成的十六进制文件上传到pic微控制器中,然后您将通过lcd看到一些介绍消息,然后要求用户输入操作选项。要匹配指纹,用户需要按键1,然后lcd将要求将手指放在指纹传感器上。现在,通过将手指放在指纹模块上,我们可以检查我们的指纹是否已存储。如果您的指纹已存储,则lcd将显示带有类似指纹的“id:2”存储id的消息,否则将显示“未找到”。
现在要注册指纹,用户需要按注册按钮或键 2 并按照 lcd 屏幕上的说明消息进行操作。
如果用户想要删除任何指纹,则用户需要按删除按钮或键3。之后,lcd将询问要删除的指纹的id。现在,通过使用递增按钮或键1(匹配按钮或键1)和递减按钮或键2(注册按钮或键2)进行递增和递减,用户可以选择保存的指纹的id,然后按确定按钮删除该指纹。
指纹接口 注意:这个项目的程序对于初学者来说有点复杂。但其简单的接口代码是利用读取r305指纹模块数据表制作的。该指纹模块的所有功能说明都在数据表中给出。
在这里,我们使用帧格式与指纹模块通信。每当我们向指纹模块发送命令或数据请求帧时,它都会以相同的帧格式响应我们,其中包含与应用命令相关的数据或信息。所有数据和命令帧格式已在用户手册或r305指纹模块的数据表中给出。
编程说明
在编程中,我们使用了以下帧格式。
我们通过设置配置位并定义lcd,按钮和led的宏和引脚来开始程序,您可以在该项目结束时给出的完整代码中签入。
然后我们声明并初始化了一些变量和数组,并制作了一个框架,我们需要在这个项目中使用它来连接指纹模块和pic微控制器。
uchar buf[20];
uchar buf1[20];
volatile uint index=0;
volatile int flag=0;
uint mscount=0;
uint g_timerflag=1;
volatile uint count=0;
uchar data[10];
uint id=1;
enum
{
cmd,
data,
sbit_cren=4,
sbit_txen,
sbit_spen,
};
const char passpack[]={0xef, 0x1, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x7, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1b};
const char f_detect[]={0xef, 0x1, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x3, 0x1, 0x0, 0x5};
const char f_imz2ch1[]={0xef, 0x1, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x4, 0x2, 0x1, 0x0, 0x8};
const char f_imz2ch2[]={0xef, 0x1, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x4, 0x2, 0x2, 0x0, 0x9};
const char f_createmodel[]={0xef,0x1,0xff,0xff,0xff,0xff,0x1,0x0,0x3,0x5,0x0,0x9};
char f_storemodel[]={0xef,0x1,0xff,0xff,0xff,0xff,0x1,0x0,0x6,0x6,0x1,0x0,0x1,0x0,0xe};
const char f_search[]={0xef, 0x1, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x8, 0x1b, 0x1, 0x0, 0x0, 0x0, 0xa3, 0x0, 0xc8};
char f_delete[]={0xef,0x1,0xff,0xff,0xff,0xff,0x1,0x0,0x7,0xc,0x0,0x0,0x0,0x1,0x0,0x15};
之后,我们制作了lcd功能来驱动lcd。
void lcdwrite(uchar ch,uchar rw)
{
lcdport= ch>>4 & 0x0f;
rs=rw;
en=1;
__delay_ms(5);
en=0;
lcdport= ch & 0x0f;
en=1;
__delay_ms(5);
en=0;
}
lcdprint(char *str)
{
while(*str)
{
lcdwrite(*str++,data);
//__delay_ms(20);
}
}
lcdbegin()
{
uchar lcdcmd[5]={0x02,0x28,0x0e,0x06,0x01};
uint i=0;
for(i=0;i0)
flag=1;
rcif = 0; // clear rx flag
}
}
void serialflush()
{
for(int i=0;i
{
buf[i]=0;
}
}
之后,我们需要创建一个函数来准备要传输到指纹的数据并解码来自指纹模块的数据。
int sendcmd2fp(char *pack, int len)
{
uint res=error;
serialflush();
index=0;
__delay_ms(100);
for(int i=0;i
{
serialwrite(*(pack+i));
}
__delay_ms(1000);
if(flag == 1)
{
if(buf[0] == 0xef && buf[1] == 0x01)
{
if(buf[6] == 0x07) // ack
{
if(buf[9] == 0)
{
uint data_len= buf[7];
data_len<>4 & 0x0f;
rs=rw;
en=1;
__delay_ms(5);
en=0;
lcdport= ch & 0x0f;
en=1;
__delay_ms(5);
en=0;
}
lcdprint(char *str)
{
while(*str)
{
lcdwrite(*str++,data);
//__delay_ms(20);
}
}
lcdbegin()
{
uchar lcdcmd[5]={0x02,0x28,0x0e,0x06,0x01};
uint i=0;
for(i=0;i0)
flag=1;
rcif = 0; // clear rx flag
}
}
void serialflush()
{
for(int i=0;i
{
buf[i]=0;
}
}
int sendcmd2fp(char *pack, int len)
{
uint res=error;
serialflush();
index=0;
__delay_ms(100);
for(int i=0;i
{
serialwrite(*(pack+i));
}
__delay_ms(1000);
if(flag == 1)
{
if(buf[0] == 0xef && buf[1] == 0x01)
{
if(buf[6] == 0x07) // ack
{
if(buf[9] == 0)
{
uint data_len= buf[7];
data_len<<=8;
data_len|=buf[8];
for(int i=0;i
data[i]=0;
for(int i=0;i
{
data[i]=buf[10+i];
}
res=pass;
}
else
{
res=error;
}
}
}
index=0;
flag=0;
return res;
}
}
uint getid()
{
uint id=0;
lcdwrite(1, cmd);
while(1)
{
lcdwrite(0x80, cmd);
checkkey(id);
sprintf(buf1,enter id:%d ,id);
lcdprint(buf1);
__delay_ms(200);
if(ok == low)
return id;
}
}
void matchfinger()
{
lcdwrite(1,cmd);
lcdprint(place finger);
lcdwrite(192,cmd);
__delay_ms(2000);
if(!sendcmd2fp(&f_detect[0],sizeof(f_detect)))
{
if(!sendcmd2fp(&f_imz2ch1[0],sizeof(f_imz2ch1)))
{
if(!sendcmd2fp(&f_search[0],sizeof(f_search)))
{
lcdwrite(1,cmd);
lcdprint(finger found);
uint id= data[0];
id<<=8;
id+=data[1];
uint score=data[2];
score8) & 0xff;
f_storemodel[12]= id & 0xff;
f_storemodel[14]= 14+id;
if(!sendcmd2fp(&f_storemodel[0],sizeof(f_storemodel)))
{
lcdwrite(1,cmd);
lcdprint(finger stored);
sprintf(buf1,id:%d,id);
lcdwrite(192,cmd);
lcdprint(buf1);
__delay_ms(1000);
}
else
{
lcdwrite(1,cmd);
lcdprint(finger not stored);
}
}
else
lcdprint(error);
}
else
lcdprint(error);
}
else
lcdprint(no finger);
}
}
else
{
lcdprint(no finger);
}
__delay_ms(2000);
}
void deletefinger()
{
id=getid();
f_delete[10]=id>>8 & 0xff;
f_delete[11]=id & 0xff;
f_delete[14]=(21+id)>>8 & 0xff;
f_delete[15]=(21+id) & 0xff;
if(!sendcmd2fp(&f_delete[0],sizeof(f_delete)))
{
lcdwrite(1,cmd);
sprintf(buf1,finger id %d ,id);
lcdprint(buf1);
lcdwrite(192, cmd);
lcdprint(deleted success);
}
else
{
lcdwrite(1,cmd);
lcdprint(error);
}
__delay_ms(2000);
}
int main()
{
void (*fp)();
adcon1=0b00000110;
leddir= 0;
swportdir=0xf0;
swport=0x0f;
serialbegin(57600);
lcdportdir=0x00;
trise=0;
lcdbegin();
lcdprint(fingerprint);
lcdwrite(192,cmd);
lcdprint(interfacing);
__delay_ms(2000);
lcdwrite(1,cmd);
lcdprint(using pic16f877a);
lcdwrite(192,cmd);
lcdprint(circuit digest);
__delay_ms(2000);
index=0;
while(sendcmd2fp(&passpack[0],sizeof(passpack)))
{
lcdwrite(1,cmd);
lcdprint(fp not found);
__delay_ms(2000);
index=0;
}
lcdwrite(1,cmd);
lcdprint(fp found);
__delay_ms(1000);
lcdinst();
while(1)
{
fp=match
fp();
}
区块链如何使数字媒体获得更高的利润
常用电容的识别
首个无人驾驶出租车采用初速度科技研发的L4级别完全无人驾驶技术
苹果OLED显示屏订单落入韩企三星口袋:日本显示器公司明显慌了
数码彩扩机技术介绍
如何将指纹传感器与PIC微控制器连接
共模电感设计方案,零欧电阻、磁珠、电感有何区别
汽车线束生产线到底有哪些防错装置
电视扫描技术原理
电源ic芯片在选型替代过程当中,如何保证产品效率?
5G手机防水滤网膜材料是如何实现IP68级防水的
区块链与云技术将如何构建新型游戏生态系统
PCB行业未来三大发展趋势,新三板市场相关PCB企业介绍
拜腾汽车已经完成了三轮融资,还有8亿欠款却豪言要上市
用鸿蒙取代安卓前,华为需要解决的问题
浅谈ASDM40P55KQ的高效电源管理解决方案
老用户福利!查看消费报告,领百万礼包! 更有华为P30pro等你赢!
如何让MCU I/O线路免受ESD影响
ART虚拟机method tracing技术解析
【能源管理在线能耗监测分析系统】