51单片机指纹密码锁C程序与proteus仿真及报告:密码解锁、密码修改、按键设置、LCD12...
先看硬件连线图(Proteus里拖出来的):STC89C52芯片挂着4x4矩阵键盘,LCD12864用并行模式接P0和P2口,蜂鸣器怼在P1^5,继电器挂在P1^6模拟开锁动作。最近在捣鼓一个基于51单片机的密码锁系统,虽然原计划带指纹解锁,但Proteus仿真实在搞不定硬件模块,咱们直接玩密码解锁也挺有意思。1、由于是proteus模拟仿真,没有指纹模块,所以不能通过指纹解锁!1、由于是prot
51单片机指纹密码锁C程序(.hex)、proteus仿真、报告! 支持密码解锁、密码修改 支持按键设置、LCD12864显示、蜂鸣器报警、继电器模拟开锁 注意: 1、由于是proteus模拟仿真,没有指纹模块,所以不能通过指纹解锁!!! 2、只有.hex程序可用!!!
最近在捣鼓一个基于51单片机的密码锁系统,虽然原计划带指纹解锁,但Proteus仿真实在搞不定硬件模块,咱们直接玩密码解锁也挺有意思。这个项目用Keil写的C代码生成hex文件,LCD12864实时显示操作提示,配合按键设置和蜂鸣器报警,倒是把单片机的基础外设玩了个遍。
先看硬件连线图(Proteus里拖出来的):STC89C52芯片挂着4x4矩阵键盘,LCD12864用并行模式接P0和P2口,蜂鸣器怼在P1^5,继电器挂在P1^6模拟开锁动作。这里有个坑——Proteus的LCD12864必须接上拉电阻,不然显示全是乱码,我当初在这卡了俩小时。
核心逻辑在密码验证部分,代码里用了个6位数密码存储到EEPROM。上电时先从0x10地址读取保存的密码:
#define PWD_ADDR 0x10
uchar read_eeprom(uchar addr) {
IAP_CONTR = 0x80; //使能IAP
IAP_CMD = 1; //读模式
IAP_ADDRH = addr >> 8;
IAP_ADDRL = addr & 0xFF;
IAP_TRIG = 0x5A; //触发命令
IAP_TRIG = 0xA5;
_nop_();
return IAP_DATA;
}
修改密码的操作挺有意思:输入旧密码→验证→两次输入新密码→比对→写入EEPROM。为了防止误操作,当输入错误三次直接触发蜂鸣器报警,这时候得长按#键复位系统。
51单片机指纹密码锁C程序(.hex)、proteus仿真、报告! 支持密码解锁、密码修改 支持按键设置、LCD12864显示、蜂鸣器报警、继电器模拟开锁 注意: 1、由于是proteus模拟仿真,没有指纹模块,所以不能通过指纹解锁!!! 2、只有.hex程序可用!!!
矩阵键盘扫描用了行列反转法,代码里用switch-case处理不同功能键。比如*键用于确认输入,#键作为取消/返回键:
void key_handle() {
uchar key = key_scan();
if(key != 0xFF) {
beep(100); //按键提示音
switch(key) {
case 12: //确认键
if(input_cnt == 6) check_password();
break;
case 15: //取消键
clear_input();
break;
//...其他数字键处理
}
}
}
显示部分用了个取模软件生成汉字字库,LCD初始化后先显示欢迎界面,操作过程中实时更新提示信息。有意思的是密码输入时的星号替换——每输入一位数字,LCD对应位置显示*,但内存里存的实际是ASCII码。
仿真时有个魔幻现象:继电器动作后如果立刻操作LCD会导致屏幕闪烁。解决方法是在控制继电器时加了10ms延时,估计是电平切换太快导致时序错乱。这点在实际硬件可能不存在,纯属Proteus的脾气。
最后说说报警模块:当密码错误时,蜂鸣器不是简单响一声,而是用for循环实现"滴-滴滴"的警示音,这比单调的提示音更有警示效果。代码里用定时器0产生2KHz方波,比单纯的高低电平延时更省资源。
整个系统编译后的hex才8KB,对于51来说算中等体量。Proteus仿真时记得在单片机属性里选好晶振频率(我用的11.0592MHz),否则串口通信和定时器都会抽风。虽然砍掉了指纹模块,但这套密码系统作为入门级的安防项目,拿来练手再合适不过了。

更多推荐
所有评论(0)