一.硬件方案
本设计以STC89C52为主控芯片的单片机密码锁,其硬件部分由单片机主控器电路,液晶显示电路, 矩阵按键电路,继电器驱动电路,射频IC卡电路,蜂鸣器报警电路组成;软件部分由程序主函数,各硬件模块初始化函数,显示屏驱动函数,4*4矩阵按键处理函数,EEPROM存储函数组成。整体通过识别用户输入的密码实现密码锁的。
二.设计功能
(1)在用户输入密码时,在显示屏不是显示实际密码,均采用*号显示;
(2)设计开锁密码位六位密码的电子密码锁;
(3)当密码输入正确时,系统开锁,显示屏显示“OPEN”;当密码输入错误时,系统不开锁,显示屏显示“ERROR”,蜂鸣器进行鸣响三次提示;
(4)当用户三次输入密码错误时,蜂鸣器报警,系统进入锁定状态,用户无法再输入密码。;
(5)4*4的矩阵按键功能为:0-9的数字键,A、B、C、D的功能键,和*、#按键;
(6)用户可对密码进行修改(仅且支持6位数密码),修改密码之前必须再次输入密码,当确认二次新密码正确时,修改密码成功;如果两次新密码不一致,修改密码不成功。当修改密码成功后,单片机将覆盖EEPROM的旧密码。
(7)输入正确的密码继电器闭合,可以驱动电子锁通断电;
(8)支持RFID解锁,可先对IC卡进行注册、删除等操作;注册成功后,可使用IC卡进行解锁。
三.设计原理图
原理图主要采用AD软件进行设计,如图:
四.程序设计
主程序源码如下:
//==============================主函数===============================
void main()
{
unsigned char KEY,NUM;
unsigned char i,j;
P1=0xFF;
EA=1;
TMOD=0x01;
IT1=1;//下降沿有效
EX1=1;//外部中断1开
TH0=0;//T0赋初值
TL0=0;
TR0=1;//t0开始计时
TL1=0x3c;
TH1=0xb0;
ET1=1;
TR1=0;
Delay400Ms(); //启动等待,等LCM讲入工作状态
lcd_init(); //LCD初始化
write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
init_rc522();
init_eeprom();
read_eeprom();
for(i=0;i<16;i++)
{
write_1602dat(name[i]);//向液晶屏写日历显示的固定符号部分
}
write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
for(i=0;i<16;i++)
{
write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号
}
write_1602com(er+9); //设置光标位置
write_1602com(0x0f); //设置光标为闪烁
Delay5Ms(); //延时片刻(可不要)
N=0; //初始化数据输入位数
while(1)
{
ctrl();
if(key_disable==1)
Alam_KeyUnable();
else
ALAM=1; //关报警
KEY=keynum();
if(KEY!=0||IrOK==1)
{
if(key_disable==1)
{
second=0;
}
else
{
NUM=coding(Im[2],KEY);
{
switch(NUM)
{
case ('A'): if(chushihua==1)
{
current_id++;
if(current_id>5)
current_id=0;
} break;
case ('B'): if(chushihua==1)
write_eeprom_jj(current_id) ; break;
case ('C'): if(chushihua==1)
write_eeprom_j(current_id) ; break;
case ('D'): chushihua=0;ResetPassword(); break; //重新设置密码
case ('*'): chushihua=0;Cancel(); break; //取消当前输入
case ('#'): chushihua=0; Ensure(); break; //确认键,
default:
{
chushihua=0;
//DisplayListChar(0,1,Input);
write_1602com(er);
for(i=0;i<16;i++)
{
write_1602dat(Input[i]);
}
operation=0;
if(N<6) //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
{
OneAlam(); //按键提示音
//DisplayOneChar(6+N,1,'*');
for(j=0;j<=N;j++)
{
write_1602com(er+6+j);
write_1602dat('*');
}
InputData[N]=NUM;
N++;
}
else //输入数据位数大于6后,忽略输入
{
N=6;
break;
}
}
}
}
}
}
}
}
资料链接:https://pan.baidu.com/s/1AocImbubd1WYWz8Qn81LFw?pwd=j4qh
提取码:j4qh