目录
器件选择
电路图
代码
1、LCD显示功能
1)LCD端口
2)字模的定义
3)提示符的显示
4)输入密码/重置密码时密码行的显示
2、总控制
1)主函数
2)key函数---判断用户想要进行的操作
3)display函数功能---接收用户输入数据并调用相应函数进行操作
4)判断密码正误
5)重置密码
6)in_code函数---将后一个数组内容复制到前一个数组中
程序运行效果
1、启动
2、输入密码时的显示
3、重置密码时的显示
4、其他提示符的显示
1)密码输入正确提示符
2)密码输入错误提示符
3)密码错误三次时的提示符
本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。
序号 |
器件编号 |
Proteus器件名称 |
器件性质 |
参数及说明 |
1 |
U1 |
AT89C51 |
单片机 |
12MHz |
2 |
D1-D2 |
LED |
发光二极管 |
red,green |
3 |
R1-R2 |
RES |
电阻 |
470欧 |
4 |
LCD1 |
LMO16L |
液晶显示屏 |
/ |
5 |
K0-K9,KA,KB |
BUTTON |
按钮开关 |
置数 |
/*LCD端口定义*/
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
/*字模的定义*/
uchar code string1[]={"input code"};//输入密码字符显示
uchar code string2[]={"INCORRET"};//提示密码错误
uchar code string3[]={"TRY AGAIN"};//输入密码字符显示
uchar code string4[]={"CORRET"};//密码正确提示
uchar code string5[]={"UNLOCK"};
uchar code string6[]={"ERROR THREE TIMES"};//密码错误三次提示
uchar code string7[]={"LOCK ---"};//密码正确提示
uchar code string8[]={"input new code"};//提示输入新密码
uchar code string9[]={"SUCCESS!"};//提示输入新密码
/*坐标*/
uchar data table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
/*输出提示字符*/
/*input code*/
void ic(uchar m)
{
for(m=0;m
/*显示密码初始位及用户进行输入时的状态*/
uchar data nnumin[]={"- - - -"};
uchar code nnum[]={"- - - -"};
uchar code numshow[]={"* * * *"};
/*初始化初始状态显示数组*/
void initialize()
{
uint i;
for(i=0;i
负责完成实现电子密码锁的重置密码,判断密码正误等功能。
void main()
{
lcd_init(); //初始化lcd
lcd_wcom(0x40); //设定CGRAM地址
LEDR=1;
LEDG=1;
while(1)
{
key();//判断用户想要进行的操作(开锁or重置密码)
if(keyin==1)
{
display();
}
}
}
bit keyin=0;//输入状态
bit keyre=0;//判断是否为重置密码状态
/*判断按键的内容*/
void key()
{
num=KeyPro();
if(num=='A')
{
keyin=~keyin;
LEDR=0;
}
if(num=='B')
{
keyre=~keyre;
//重置密码之前需先解锁
display();
reset();
}
}
密码行初始状态为“----”,输入的密码位会显示为“*”,用户完全输入4位密码后会判断密码正误并根据具体情况输出相应提示符,同时亮相应颜色LED灯。
若用户在输入密码中途触发按钮“A”或“B”则之前输入的密码会清空,密码行状态重置为“----”。
uchar data scode[]={0,0,0,0};//设置的密码,初始为0000
uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000
uchar data ncode2[]={9,9,9,9};//储存用户输入的内容
bit keyin=0;//输入状态
bit keyre=0;//判断是否为重置密码状态
uint inc=1;//判断是否出现连续三次的错误
/*输入密码,若判断为正确则解锁,
为错误则跳转界面重新输入*/
void display()
{
uint count=1;
string_show(1);
input(0);
while(count<5)//输入四位密码后验证并跳转
{ num=KeyPro();
if(num!=0xff)
{
if(num>=0&&num<=9)
{
ncode2[count-1]=num;
input(count);
count++;
}
else//若在输入途中点击按钮A或B,则清零重新输入
{
memset(ncode2,'-',sizeof(ncode2));//ncode2重置
count=1;
input(0);
}
}
}
//判断后输出提示
if(confirm())
{ LEDG=0;
string_show(2);
if(keyre!=1) keyin=0;//LCD停止显示
inc=1;
//红灯亮,绿灯灭
LEDG=1;
LEDR=0;
}
else
{ LEDR=0;
if(inc<3)
{
string_show(3);
inc++;
}
else
{ //错误三次后设置密码失效,锁定5秒
in_code(scode,ncode);//将密码初始化为最初状态
string_show(4);
inc=1;
}
count=1;
}
}
uchar data ncode[]={0,0,0,0};//设置的密码,初始为0000
uchar data ncode2[]={9,9,9,9};//储存用户输入的内容
bit check;//判断输入密码是否正确
/*验证密码,按钮A功能*/
uchar confirm(void)
{
uint i,j;
LEDR=1;
LEDG=1;
for(i=0;i<4;i++)
{
j=i;
if(ncode[i]==ncode2[j])
{
check=1;
}
else
{
check=0;
break;
}
}
memset(ncode2,'-',sizeof(ncode2));
return check;
}
uchar data ncode2[]={9,9,9,9};//储存用户输入的内容
bit keyre=0;//判断是否为重置密码状态
/*重置密码*/
void reset()
{
uint count=1,cc;
string_show(5);
reset_code(0,ncode2);
while(count<6)
{ num=KeyPro();
if(num!=0xff)
{
if(num>=0&&num<=9)
{
ncode2[count-1]=num;
reset_code(1,ncode2);
count++;
cc=1;
}
else//若在输入途中点击按钮A或B,则停止
{
cc=0;
count=6;
break;
}
}
}
//若成功输入四位密码,则成功修改密码
if(cc==1)
{
in_code(ncode,ncode2);
}
string_show(6);
keyre=0;
}
void in_code(uchar *cc,uchar *cc1)
{
uint i,j;
for(i=0;i<4;i++)
{
j=i;
cc[i]=cc1[i];
}
}