一、 实现功能: 1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。 2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。 3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。 4、AT24C02保存密码,支持复位保存,掉电保存功能。 二、按键说明 按键定义图 如图示:采用4X4键盘输入,键盘对应名称如下: 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D 其中, 【0—9】为数字键,用于输入相应的密码, 【*】号键为取消当前操作 【#】号键为确认 【D】键为修改密码 其它键无功能及定义 三、作用说明: 密码锁初始密码为:000000. 1、 开锁:插上电源后,程序自动调入初始密码,此时依次输 入:000000,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。(首次使用输入:131420,对密码进行初始化,当显示出现:initpassword,证明密码初始化完成,此时初始密码即为:000000)。 2、 退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。 3、 修改密码:在开锁状态下,再 )键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02。(如两次输入的新密码不一样,则重设密码失败)。 4、 报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内又有按键,3秒再启动。 5、 当重置新密码时,新密码会保存于AT24C02存储器里。
图3-1 系统结构框图 主程序设计流程图如图5-1所示。
N
图5-1主程序流程图 键功能程序流程图如图5-2所示。
Y N Y N Y N Y N 图5-2 键功能流程图 开锁程序流程图如图5-3所示。
图5-3 开锁流程图 部分程序 #include #include #define LCM_Data P0 #define uchar unsigned char #define uint unsigned int #define w 6 //定义密码位数 ***it lcd1602_rs=P2^5; ***it lcd1602_rw=P2^6; ***it lcd1602_en=P2^7; ***it Scl=P3^4; //24C02串行时钟 ***it Sda=P3^5; //24C02串行数据 ***it ALAM = P2^1; //报警 ***it KEY = P2^0; //开锁 ***it open_led=P2^2; //开锁指示灯 bit pass=0; //密码正确标志 bit ReInputEn=0; //重置输入充许标志 bit s3_keydown=0; //3秒按键标志位 bit key_disable=0; //锁定键盘标志 unsigned char countt0,second; //t0中断计数器,秒计数器 void Delay5Ms(void); unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};//控盘扫描控制表 unsigned char code start_line[] = {"password: "}; unsigned char code name[] = {"===Coded Lock==="}; unsigned char code Correct[] = {" correct "}; //输入正确 unsigned char code Error[] = {" error "}; //输入错误 unsigned char code codepass[] = {" pass "}; unsigned char code LockOpen[] = {" open "}; //OPEN unsigned char code SetNew[] = {"SetNewWordEnable"}; unsigned char code Input[] = {"input: "}; //INPUT unsigned char code ResetOK[] = {"ResetPasswordOK "}; unsigned char code initword[] = {"Init password..."}; unsigned char code Er_try[] = {"error,try again!"}; unsigned char code again[] = {"input again "}; unsigned char InputData[6]; //输入密码暂存区 unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //当前密码值 unsigned char TempPassword[6]; unsigned char N=0; //密码输入位数记数 unsigned char ErrorCont; //错误次数计数 unsigned char CorrectCont; //正确输入计数 unsigned char ReInputCont; //重新输入计数 unsigned char code initpassword[6]={0,0,0,0,0,0}; //=====================5ms延时 void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); } //===================400ms延时============================== void Delay400Ms(void) { unsigned char TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); } //----------------延时函数,后面经常调用---------------------- void delay(uint xms)//延时函数,有参函数 { uint x,y; for(x=xms;x>0;x--) for(y=110;y>0;y--); } //--------------------------写指令--------------------------- write_1602com(uchar com)//****液晶写入指令函数**** { lcd1602_rs=0;//数据/指令选择置为指令 lcd1602_rw=0; //读写选择置为写 P0=com;//送入数据 delay(1); lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令 //-------------------------写数据----------------------------- write_1602dat(uchar dat)//***液晶写入数据函数**** { lcd1602_rs=1;//数据/指令选择置为数据 lcd1602_rw=0; //读写选择置为写 P0=dat;//送入数据 delay(1); lcd1602_en=1; //en置高电平,为制造下降沿做准备 delay(1); lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令 //-------------------------初始化------------------------- void lcd_init(void) { write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602com(0x0c);//开显示不显示光标 write_1602com(0x06);//整屏不移动,光标自动右移 write_1602com(0x01);//清显示 //*********************************中断服务函数************************************** void time0_int(void) interrupt 1 { TL0=0xB0; TH0=0x3C; //TR0=1; countt0++; if(countt0==20) { countt0=0; second++; if(pass==1) { if(second==1) { open_led=1; //关指示灯 TR0=0; //关定时器 TL0=0xB0; TH0=0x3C; second=0; else if(second==3) { TR0=0; second=0; key_disable=0; s3_keydown=0; TL0=0xB0; TH0=0x3C; } else TR0=1; } } }
|