赞
踩
目录
3)display函数功能---接收用户输入数据并调用相应函数进行操作
6)in_code函数---将后一个数组内容复制到前一个数组中
本设计是基于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<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;
- }
-
- }

- /*显示密码初始位及用户进行输入时的状态*/
- 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]);
-
- }
- }

负责完成实现电子密码锁的重置密码,判断密码正误等功能。
- 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];
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。