历史上的今天
今天是:2024年12月19日(星期四)
2019年12月19日 | 基于51单片机的指纹考勤机源程序
2019-12-19 来源:51hei
基于51单片机的指纹考勤机电路原理图如下:
Altium Designer画的原理图和PCB图如下:
元件清单
1) 9*15万用板
2) 指纹传感器
3) 40脚座
4) 单片机
5) 12864有字库液晶
6) 20p插针
7) 20p单排母座
8) 按键*17
9) 103电位器(蓝白)
10) 1k电阻*3
11) 10k电阻*1
12) 10uf电容
13) 30pf电容*2
14) 11.0592m晶振
15) AMS1117
16) 100Uf*2
17) 自锁开关
18) DC电源接口
19) 导线若干
20) 焊锡若干
21) usb电源线
指纹模块、按键的调试
然后导入本设计的程序,测试指纹模块及按键是否工作,操作步骤为:
1)按下电源,电源指示灯点亮。
2)按“*”键后屏幕显示“请按指纹”,指纹模块亮,将手指放到指纹头处就可以识别指纹了。
3)若放入的指纹,指纹识别成功继电器动作,LED灯亮,门开锁,人员可以进入,按任意键返回初始界面,等待下一个人扫描指纹。若放入的指纹,指纹没有识别成功,继电器没有动作,LED灯不亮,将不能开锁,人员不能进入,按任意键返回初始界面,继续扫描指纹。
4)按下A按键,输入6位密码,按下B按键,可删除输入的数字,按下D按键确认,密码输入正确可进入管理员模式。
5)在管理员模式下,按数字键“1”进入录入指纹模式,指纹头亮起,这时就可以把手指放到指纹头上进行指纹的录入,录入指纹时需要录入2次指纹来完成这个指纹的录入存储,指纹录入成功后按任意键返回到管理员界面,如需再录入指纹重复上面操作即可。
6)按数字键“2”进入删除指纹模式,屏幕提示如下图所示信息,输入要删除指定的指纹号按“D”键确认,若指纹号输入错误可按“B”键删除,再重新输入要删除的指纹号即可。
7)在非正常情况下(指纹模块不好用或紧急情况)可按数字键“3”进行开锁。
8)按数字键“4”可进行管理员密码的修改。
如果以上步骤不符合要求则重新检查程序,直到实物可以正常工作。
如满足上述要求时,实物就算调试完成,达到设计要求。
小灯、继电器的调试
首先按下电源,看电源指示灯是否点亮,证明电源电路正常。然后测试单片机是否正常工作,在Keil上编写了一段红绿小灯以一秒间隔闪烁的程序,导入单片机,上电后发现小灯按照我所要求的方式工作,证明单片机及小灯工作正常。再加一条与继电器连接引脚电平高低变化的程序检测继电器是否正常工作。
液晶的调试
导入12864液晶的测试程序,上电后,通过调节液晶屏背面的电位器调节12864的对比度,在调试液晶时要注意:屏上显示小方格,产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,按照标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)--补充:也有可能是对比度太大,需要调整对比度电阻。
在经调试后液晶的结果为:
单片机源程序如下:
#include"reg52.h"
#include"12864.h"
#include"eeprom.h"
#include"matrixkey.h"
#include"AT24CXX.h"
#include"finger.h"
uchar code table1[]="A:签到 B:添加 ";
uchar code table2[]="C:清空 D:上课 ";
uchar code table3[]=" *查询缺勤人员 ";
uchar code table4[]=" #查询迟到人员 ";
uchar code table5[]="请输入删去密码: ";
uchar code table6[]=" 开始签到 ";
uchar code table7[]=" 请按指纹签到 ";
uchar code table8[]=" ";
uchar code table9[]="按D: 开始上课 ";
uchar code table10[]="请输入密码: ";
uchar code table11[]=" 签到成功 ";
uchar code table12[]="请按任意按键继续";
uchar code table13[]=" 编号为: ";
uchar code table14[]=" 请按手指 ";
uchar code table15[]=" 请再按一次 ";
uchar code table16[]=" 采集指纹成功 ";
uchar code table17[]="输入删去的指纹号";
uchar code table18[]="删去指纹库成功 ";
uchar code table19[]="删去指纹库失败 ";
uchar code table20[]=" 请输入新密码 ";
uchar code table21[]="请再次输入新密码";
uchar code table22[]=" 密码修改成功 ";
uchar code table23[]=" 两次密码不一样";
uchar code table24[]=" 输入密码错误 ";
uchar code table25[]=" 还有 机会 ";
uchar code table26[]=" 该指纹已存储 ";
uchar code table27[]=" 采集指纹失败 ";
uchar code table28[]="确定删去指纹库?";
uchar code table29[]="按D: 本节课结束";
uchar code table30[]="当前缺勤 人";
uchar code table31[]="当前迟到 人";
uchar code digital[15]={0x90,0x92,0x94,0x96,0x88,0x8a,0x8c,0x8e,0x98,0x9a,0x9c,0x9e};
uchar xdata table_qiandao[100];
uchar queqing=0;//缺勤人数
uchar zz;
uchar chidao=0;//迟到人数
uchar code admin[6]={1,3,1,4,2,0};//管理员的固定密码
uchar code init_code[6]={0,0,0,0,0,0};//上电第一次一般的初始化密码
uchar now_code[6]={0,0,0,0,0,0};//当前存储器中存储的密码
uchar user[6]={0,0,0,0,0,0};//用户输入的密码
uchar user2[6]={0,0,0,0,0,0};//输入第二次修改的密码
sbit relay=P3^7;//开锁继电器
sbit wake=P3^6;//检测手指按压,有手指按下就是高电平
uchar jishu=0;
uchar err_user=3;//用户三次输入错误密码
uchar err_admin=3;//管理员三次输入错误密码
uchar num;//存储矩阵键盘转换的对应按键值
uchar number=0;//输入密码的个数默认0
uchar key_flag=0;//进入手动密码标志
uchar i;
uchar code_flag=0;//密码修改标志第一次输入密码时候是等于0再次输入是等于1
void init_dispay(void)//初始化界面
{
PutStr(0,0,table1);
PutStr(1,0,table2);
PutStr(2,0,table3);
PutStr(3,0,table4);
}
void admin_dispay(void)//管理员界面
{
PutStr(0,0,table6);
PutStr(1,0,table7);
PutStr(2,0,table8);
PutStr(3,0,table9);
}
void init_shuju(void)
{
uchar i;
for(i=0;i<100;i++)
{
table_qiandao[i]=0x00;
}
}
void que_renshu(void)
{ queqing=0;//缺勤人数
// WriteCommand(0x80+2);
// WriteData(jishu/10+0x30);
// WriteData(jishu%10+0x30);
for(i=0;i if(table_qiandao[i]==0x00) { queqing++; WriteCommand(digital[queqing-1]); WriteData((i+1)/10+0x30); WriteData((i+1)%10+0x30); } } } void chidao_renshu(void) { queqing=0;//缺勤人数 // WriteCommand(0x80+2); // WriteData(jishu/10+0x30); // WriteData(jishu%10+0x30); for(i=0;i if(table_qiandao[i]>=2) { queqing++; WriteCommand(digital[queqing-1]); WriteData((i+1)/10+0x30); WriteData((i+1)%10+0x30); } } } void key(void) { num=keynum(); if((num==12)&&(key_flag==0))//查看缺勤人数 { LcmClearTXT();//清屏 PutStr(0,0,table30); que_renshu(); WriteCommand(0x80+6); WriteData(queqing/10+0x30); WriteData(queqing%10+0x30); while((keynum()>=16)); init_dispay(); } if((num==14)&&(key_flag==0))//查看迟到人数 { LcmClearTXT();//清屏
史海拾趣
|
使用VxWorks时出现了问题,请教各位,给点儿建议!cpu是MPC862 自己编了个小程序,在Tornador里结合VxWorks一起. 程序很简单,就是读存储器! xd0 = *(unsigned int *)(SDRAM_ADR); xd1 = *(unsigned int *)(BOOTFLASH_ADR); xd2 = *(unsigned short int *)(FLASH_ADR); 我的存储器有三种,一个是SDRAM,32位;一 ...… 查看全部问答> |
|
最近开始学习\"劭贝贝\"的,里面的例子需要bc45,费了好大劲终于找到了.现提供连接如下: borland c++ v4.5 Part3 http://www.tomore.com/3/23811.html borland ...… 查看全部问答> |
|
热地:开关电源无需使用变压器,其开关电路的“地”和市电电网有关,既所谓的“热地”,它是带电的 冷地:由于开关电源的高频变压器将输入、输出端隔离;又由于其反馈电路常用光电耦合、既能传送反馈信号又将双方的“地”隔离;所以输出端的地称之 ...… 查看全部问答> |
|
STM32101VCT6SRAM(62256)cpld7128lcd12232测试版电路 attach]20052[/attach]原理图 这个是62256的电路,贴出来 下载 (950.99 KB) 2010-3-26 10:05 电路描述:FSMC_NADV经非门后接573的锁存脚,FSMC_NE1接62256的片选/CS,FSMC_NOE接62256的/OE,FSMC_NOE接62256的/WE STM ...… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:43 编辑 本帖主要回顾集成运放在电路中的使用,即集成运算放大电路,前两贴作为此贴的基础,我采用循序渐进的阐述方法 1.F007放大电路 F007是通用型集成运放,它由正负15V两路电源供电。从+ ...… 查看全部问答> |
|
我是一个新人,对飞思卡尔单片机使用的不是很熟,最近在使用飞思卡尔128单片机和nrf905之间做一个无线传输的小协议,选择飞思卡尔为主机模式,并且作为接收终端,用于接收我的发送数据。我的发送端是用51做到已经好使了,没有问题了(发送端暂且不 ...… 查看全部问答> |
|
请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊 请求 继续团购 MSP430 LaunchPad MSP-EXP430G2 25元不用包邮啊 30元 也可以试试 [ 本帖最后由 ppiicc 于 2012-5-3 22:53 编辑 ]… 查看全部问答> |
|
这个算是个遗憾帖吧。 本来还准备了两个实验,但鉴于时间问题,不能在活动结束前完成了。不过等做完我会来让大家看看的。 其中一个是GPS的实验,模块已经买回来了,只 ...… 查看全部问答> |




