ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:1.53MB ,
资源ID:2073789      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2073789.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(指纹考勤机的设计与实现.docx)为本站会员(b****1)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

指纹考勤机的设计与实现.docx

1、指纹考勤机的设计与实现指纹考勤机硬件部分完成-小记最初的想法 1初步调试:基本资源、12864 2初步调试:例程的学习及移植 3成功移植 3程序中比较重要的指令和变量: 4Fingerprint.c中模块操作的主要函数: 5主函数分析 9指纹考勤机的硬件操作规范 11二次开发的技术要点及其实现方法 12实现了接续录入功能,这是很大的突破 12实现了单个指纹的删除 16实现了被删除指纹号的优先分配 19实现了考勤信息的存储 21实现了通信模式下向上位机传输考勤信息 22付出多多,收获多多 27缺憾 272B的错误 27待续 27最初的想法一直以来都对一些技术感兴趣,比如指纹识别算法、无线通信、红

2、外感应、微处理器体系架构等等,在大二的时候就想做一台指纹考勤机,进门的时候手指按一下,什么都搞定了,不用看着老师被忽悠,我也不解,如果我是一个技术出身的老师,我早就做这件事情了,何必点名,费劲。这段时间,有了空档,我就着手做这件事情。是这样设计的,硬件由指纹模块和控制板,上位机用VB开发。实现的功能大致是:上位机数据库保存人员信息,即指纹号对应学号、姓名等信息,指纹机可以脱机采集到岗信息(指纹号),在通信模式下,与上位机连接,将采集到的指纹号上传,上位机处理这些信息,生成缺勤名单文件(txt/word/excel皆可),并将缺勤名单发到指定的邮箱。硬件平台的选择求助了一下淘宝,可选的不多,一个

3、能存储162枚指纹的指纹模块进入了我的视线,4线,VCC/GND/TXD/RXD,还提供51例程,它用的是国产指纹识别专用DSP,只开放用串口用户命令接口。看到51就知道就知道它跟识别算法之类的没有关系,注定要对着daasheet编写驱动。但可以短时间内达到设计目标并以此为契机继续学习也不错。很明显,需要用VB实现的是:串行通信、数据库编程、文件操作、网络编程。串行通信和数据库编程毕业设计的时候用过,后两者要现学。开始的时候模块资料上写单片机的RXD P3.0和TXD P3.1只能连模块,连max232都不能有,所以至少双串口才可以实现与上位机通信,打算使用双串口的60S2,而且没有用户fls

4、ah,只能在录取完信息保持开机状态知道传输完信息给上位机处理。但测试后发现,模块在链接max232的情况下仍能正常工作,而且文档显示它有用户16页共512字节flash可以使用。这样,录入过程中将信息存入flash,在上位机通信模式下,重新初始化串口波特率实现上位机通信,为了提高运行速度,没有使用89C52,还是使用了60S2。这样软硬件都清晰了。任务示意如下:初步调试:基本资源、12864 对于60S2的使用,绝对可以用轻车熟路来形容了。实验室正好有一块51单片机开发板,串口、中断按钮、LED、12864屏都有,就是没有任何资料,管脚信息只能用万用表一点点测量。下载keil、下载STC_IS

5、P,单片机精灵、串口助手、拷贝之前的设计资料,测量端口、用了一天的时间,基本把LED、定时器、串口、按键、外部中断全部搞定了。对于12864的资料网上有很多,找到了一篇很有用的文章非常好-12864带字库液晶学习,跟着上面的步骤,用了一下午时间把LCD显示也搞好了。形成了第一个测试工程代码standard1。12864的端口定义如下:12864顾名思义有128*64个像素点,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。 驱动函数一般包括四个函数: 1、写命令函数; 2、写数据

6、函数; 3、读状态函数; 4、读数据函数; 这四个函数并不是必须全部写的,具体要看你实现的功能,如果只是单纯的显示汉字和字符,写命令、写数据、读状态这三个函数就够了,如过你还需要进行一些绘图的操作,那读数据函数也必须书写。 另外关于读状态函数,其实也就是用于判忙操作,我看郭天祥的书里面是这样说的:原则上每次对控制器进行读写操作之前,都必须进行读写检测,由于单片机的操作速度慢于液晶控制器的反应速度,因此可不进行读写检测,或者只进行简短的延时即可。因此,读状态函数也可以不写,只用简短的延时函数替换即可。知道这些信息后,下面就是驱动函数的移植和使用了,在三个基本驱动函数、初始化函数、延时函数的基础上

7、,用户要调用的函数有下面几个:void Set_Cursor(unsigned char x, unsigned char y)/设置光标void Display_Char(unsigned char Alphabet)/(设置光标后)显示单个字符void Lcd_ClrScreen()/清屏void Display_String(unsigned char x,unsigned char y,unsigned char *Alphabet)/在指定位置显示字符串void Display_HZ(unsigned char x,unsigned char y,unsigned char *HZ)

8、/在指定位置显示汉字void Display_HZ_Line(unsigned char x,unsigned char y,unsigned char *HZ)/在制定位置显示汉字,可自动换行初步调试:例程的学习及移植成功移植模块的默认波特率是9600bps,但是开发板用的是12M晶振,产生不了该波特率,误差太大,总是产生握手失败的错误,只能选用11.0592的晶振(从蛟哥的板子上取下),例程中的12864的工作方式是串行工作方式,一直显示不正常,于是我把之前测试通过的并行工作方式代码移植进了例程。又对例程中的端口进行了重定义,对工程代码进行了规范化(函数化、模块化、头文件)处理,将模块TX

9、D连到P3.0,RXD连到P3.1,在接通开发板上的5V。成功运行了例程,实现了:录入指纹、指纹识别、删除全部指纹的基本功能。形成了standard2工程文件包。此时工程文件如下,也是最终的样式。端口重定义如下(io.h):模块通过串口与单片机相连,通过查询的方式发送和接收,没有使用串口中断,串口初始化代码和发送代码在uart.c中。Timer.c中只有一个初始化函数和中断函数,不是很关键,只是为了实现命令发送函数中的一个毫秒级延时。Io.c中有端口定义和外部中外部中断相关的代码。Fingerprint.c中是与模块相关的驱动函数。指纹识别算法是模块内部的DSP实现的,对用户提供了串行命令接口

10、,使用的时候只需要调用这些命令帧,加上校验码就行了,再等待模块响应看是否成功。是用模块的过程是:设备握手、探测手指获取图像、生成特征模版1存入缓冲区、生成特征模版2存入缓冲区、将两个特征文件合成一个指纹模版存入指纹库、从库中进行指纹对比。这些功能都是有具体的指令进行操作的。此外,删除全部指纹、删除单个指纹、也是有专用的命令的。所以指纹模块的文档就显得非常重要。程序中比较重要的指令和变量:Savenumber是当前已经存储的指纹个数;searchnum是识别函数返回的搜索到的指纹号;modeflag是模式标志,例程有:识别模式、录入模式。由于中断中不能写太多的东西,主程序中通过查询clearal

11、lflag和changeflag进行删除全部指纹和模式转换的具体操作。外部中断转换模式的代码如下:消抖方式很有特色。FIFO是发送命令后接受模块相应的缓冲区,FIFOnumber是缓冲区中的数据个数。这个数据在命令发送函数中使用。标志为在中断中Fingerprint.c中模块操作的主要函数:一个最最重要的函数是命令发送函数,所有的操作都是通过这个函数。其帧处理方式还是很值得学习的。这个函数的处理过程:发送命令、接收响应帧到FIFO、判断校验码、返回值。bit Command(unsigned char *p,unsigned char MaxTime) /命令解析,给模块发送一个命令 unsi

12、gned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0; unsigned char 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 tem

13、p=*p+; TxdByte(temp);/将命令发送出去 result=TURE;/发送完成,结果为真 (真为1) FifoNumber=0; for (count=MAX_NUMBER+1; count!=0; count-)/清空所有FIFO数组里面的内容,写入0X00 FIFOcount-1=0x00; if (result) result=FALSE; start =FALSE; stop =FALSE; count=0; clk0=0; /清零CL0计数 do /do的内容/ restart0: if (RI=1)/如果接收到数据 tmpdat=SBUF;/先把接收到的数据放到tm

14、pdat中 RI=0;if (tmpdat=0xef)&(start=FALSE)/这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节 count=0; FIFO0=tmpdat;/读入第一个应答字节(0XEF),存在第“0”个元素中 flag=1; goto restart0; /继续接受收 if(flag=1)/第一个字节已经回来,所以flag=1成立 if(tmpdat!=0x01) /接收数据错误,将重新从缓冲区接收数据 flag=0;/接收应答失败 result=FALSE; start =FALSE; stop=FALSE; count=0; goto restart0; /如果成功接收到0xef01,可以开始接收数据 flag=2;/flag=2;表示应答成功,可以开始接收数据了 count+;/现在count=1; FIFOcount=tmpdat;/读入第二个应答字节(0X01),存在第“1”个元素中 start=TURE; /应答成功可以开始接收数据 goto

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1