目录
器件选择
电路图
代码
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 |
按钮开关 |
置数 |
电路图
代码
1、LCD显示功能
1)LCD端口
/*LCD端口定义*/
sbit RS=P2^0;
sbit RW=P2^1;
sbit E=P2^2;
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};
3)提示符的显示
/*输出提示字符*/
/*input code*/
void ic(uchar m)
{
for(m=0;m<sizeof(string1);m++)
lcd_write(m+3,0,string1[m]);
}
/*密码正确提示*/
void correct(uchar m)
{
for(m=0;m<sizeof(string4);m++)
{ lcd_write(m+5,0,string4[m]);
}
for(m=0;m<sizeof(string5);m++)
{ lcd_write(0,m+5,string5[m]);
}
delay(1000);
initialize();
lcd_wcom(0x01); //清显示,光标复位到地址00H位置
}
/*密码错误提示*/
void incorrect(uchar m)
{
for(m=0;m<sizeof(string2);m++)
{ lcd_write(m+4,0,string2[m]);
}
for(m=0;m<sizeof(string3);m++)
{ lcd_write(0,m+3,string3[m]);
}
delay(500);
lcd_init(); //清显示,光标复位到地址00H位置
initialize();
}
/*密码错误三次提醒*/
void three(uchar m)
{
uint i;
for(i=0;i<6;i++)
{
for(m=0;m<sizeof(string6);m++)
{ lcd_write(m,0,string6[m]);
}
for(m=0;m<sizeof(string7);m++)
{ lcd_write(0,m+1,string7[m]);
}
delay(500);
lcd_write(0,10,table[5-i]);
lcd_write(0,11,'s');
}
lcd_init(); //清显示,光标复位到地址00H位置
initialize();
}
/*输入新密码提示*/
void new_code(uchar m)
{
for(m=0;m<sizeof(string8);m++)
lcd_write(m+1,0,string8[m]);
}
/*成功提示*/
void new_su(uchar m)
{
for(m=0;m<sizeof(string9);m++)
lcd_write(m+5,0,string9[m]);
delay(1000);
lcd_init(); //清显示,光标复位到地址00H位置
initialize();
}
/*输出input code*/
void string_show(uchar choice)
{
uchar m;
lcd_init();
switch(choice)
{
case 1:ic(m);break;//输入提示
case 2:correct(m);break;//正确提示
case 3:incorrect(m);break;//错误提示
case 4:three(m);break;//错误三次提示
case 5:new_code(m);break;//输入新密码提示
case 6:new_su(m);break;//重置密码成功
default:break;
}
}
4)输入密码/重置密码时密码行的显示
/*显示密码初始位及用户进行输入时的状态*/
uchar data nnumin[]={"- - - -"};
uchar code nnum[]={"- - - -"};
uchar code numshow[]={"* * * *"};
/*初始化初始状态显示数组*/
void initialize()
{
uint i;
for(i=0;i<sizeof(nnum);i++)
{ nnumin[i]=nnum[i];
}
}
/*用户输入密码时的显示*/
void input(uchar num)
{
uchar n,i;
for(n=0;n<8;n++)
{
if(sizeof(num)!=0)
{
if(num!=0)
{
for(i=0;i<num;i++)
{
nnumin[2*i]=numshow[2*i];
}
}
else initialize();//输入密码时按下A/B按钮,则重新开始
}
lcd_write(0,n+5,nnumin[n]);
}
}
/*用户重置密码时显示*/
void reset_code(uint c,uchar *num)
{
uchar n,i;
for(n=0;n<8;n++)
{
if(c!=0)
{
for(i=0;i<sizeof(num)+1;i++)
{
if(num[i]!='-')
nnumin[2*i]=table[num[i]];
}
}
lcd_write(0,n+5,nnumin[n]);
}
}
2、总控制
负责完成实现电子密码锁的重置密码,判断密码正误等功能。
1)主函数
void main()
{
lcd_init(); //初始化lcd
lcd_wcom(0x40); //设定CGRAM地址
LEDR=1;
LEDG=1;
while(1)
{
key();//判断用户想要进行的操作(开锁or重置密码)
if(keyin==1)
{
display();
}
}
}
2)key函数---判断用户想要进行的操作
bit keyin=0;//输入状态
bit keyre=0;//判断是否为重置密码状态
/*判断按键的内容*/
void key()
{
num=KeyPro();
if(num=='A')
{
keyin=~keyin;
LEDR=0;
}
if(num=='B')
{
keyre=~keyre;
//重置密码之前需先解锁
display();
reset();
}
}
3)display函数功能---接收用户输入数据并调用相应函数进行操作
密码行初始状态为“----”,输入的密码位会显示为“*”,用户完全输入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;
}
}
4)判断密码正误
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;
}
5)重置密码
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;
}
6)in_code函数---将后一个数组内容复制到前一个数组中
void in_code(uchar *cc,uchar *cc1)
{
uint i,j;
for(i=0;i<4;i++)
{
j=i;
cc[i]=cc1[i];
}
}
程序运行效果
1、启动
2、输入密码时的显示
3、重置密码时的显示
4、其他提示符的显示
1)密码输入正确提示符
2)密码输入错误提示符
文章来源:https://www.toymoban.com/news/detail-494166.html
3)密码错误三次时的提示符
文章来源地址https://www.toymoban.com/news/detail-494166.html
到了这里,关于单片机课程设计--电子密码锁(源代码+proteus仿真)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!