课程设计论文-基于单片机的遥控密码锁内容摘要:

case 0x5a: return(6)。 case 0x42: return(7)。 case 0x4a: return(8)。 case 0x52: return(9)。 case 0x98: return(10)。 case 0xb0: return(11)。 case 0xe0: return(12)。 case 0xa8: return(13)。 case 0x90: return(14)。 case 0x22: return(15)。 case 0x02: return(16)。 case 0xc2: return(17)。 case 0xa2: return(18)。 case 0x62: return(19)。 case 0xe2: return(20)。 default : return(99)。 } } 密码 判断、 报警及修改程序 电子密码锁的 软件编程主要分为两方面,分别是 接收密码后判断及报警 部分和密码修改 控制部分。 首先 介绍 密码判断及报警程序。 显示收到的键码并保存到接收缓存 receive_code[8],直到 8 位键码接收完毕。 然后和原密码缓存 origin_code[8]比较,判断密码是否正确。 若密码正确则将标志位 code_right=1 ;若不正确则报警并使 密码输入错误次数wrong_num++,再判断错误次数是否已达 3 次,若是则程序进入死循环锁定。 程序流程图 如图 16 所示。 13 图 16 密码判断及报警流程图 接着介绍密码修改控制程序。 当密码输入正确以后用户按下 “密码修改 键 ” 就会进入密码修改操作,单片机也就会运行密码修改程序。 程序流程图 如图 17 所示。 图 17 密码修改流程图 code_right=1 修改密码。 保存新密码 新密码接收完毕。 返回 N N N N Y Y Y Y 新密码确认完毕。 两次密码相同。 显示错误 输入密码 接收了 8 位键码。 code_right=1 密码是否正确 wrong_num++ wrong_num=3? 错误警告 报警锁定 N N N Y Y Y 14 进入密码修改程序首先等待新密码的第一次输入。 第一次输入的新密码放在 接收 缓存 receive_code[8]中,当输入完第 八 个密码后系统会提示再次输入密码,第二次输入的新密码放在 密码比较 缓存 _code[8]中。 第二次输 入密码完成后就检验两次输入的新密码是否相同,如果相同的话就更换密码 ,将新密码储存到 AT24C02 中。 关键程序如下: void check_code(void) { if(ir_flag==1) flag=0, key_data=key_match() , Beep(),ir_flag=0,j=0。 //Beep 函数发出按键声音 if(show==1amp。 amp。 flag==0) //接收 8 个密码 if(key_data10) { receive_code[rec_num]=key_data。 DisplayListChar(rec_num,1,*)。 flag=1。 rec_num++。 } else if(rec_num0amp。 amp。 key_data==10) //10 号键退格 { DisplayListChar(rec_num1,1, )。 flag=1。 rec_num。 } if(key_data==18) //跳到时钟模式 { key_data=99。 delay_LCM(10)。 LCM_cls()。 show=0。 beep_flag=0。 rec_num=0。 k=1。 } if(rec_num==8) //输入八个密码后密码检查 amp。 3 次错误后上锁 { 15 delay_LCM(500)。 for(j=7。 j0。 j) { if(origin_code[j]!=receive_code[j]) //与原密码比较 { wrong_num++。 if(wrong_num==1) { delay_LCM(1000)。 LCM_cls()。 delay_LCM(1000)。 DisplayListChar(0,0,Input it again!)。 } else if(wrong_num==2) { delay_LCM(1000)。 LCM_cls()。 delay_LCM(1000)。 DisplayListChar(0,0,the last time)。 } else if(wrong_num==3) { LCM_cls()。 DisplayListChar(0,0,Wrong!)。 DisplayListChar(0,1,Lock)。 LED1=1。 LED2=1。 LED3=0。 SPEAKER=0。 //3 次错误报警 delay_LCM(10000)。 while(1)。 } //3 次错误进入死循环锁定 code_right=0。 rec_num=0。 return。 } } LCM_cls()。 DisplayListChar(0,0, (^_^))。 //密码正确,开锁成功 DisplayListChar(0,1,What You Want?)。 rec_num=0。 show=0。 code_right=1。 //密码正确标识位 } } void change_code(void) { int i,j。 if(ir_flag==1) key_data=key_match(),flag=0,Beep(),ir_flag=0。 16 if( code_right==1 amp。 amp。 key_data==11) //11 号按键为修改密码按键的键码 { delay_LCM(500)。 LCM_cls()。 DisplayListChar(0,0,Input new code)。 new_code1=1。 } //修 II 改密码标识位 1 if(new_code1==1amp。 amp。 flag==0) { if(key_data10) { _code[rec_num]=key_data。 DisplayListChar(rec_num,1,*)。 rec_num++。 flag=1。 } else if(rec_num0amp。 amp。 key_data==10) { DisplayListChar(rec_num1,1, )。 rec_num。 flag=1。 } } if(code_right==1 amp。 amp。 rec_num==8 amp。 amp。 new_code1==1) //判断第一次新密码是否接收完 { delay_LCM(500)。 LCM_cls()。 DisplayListChar(0,0,Input again!)。 rec_num=0。 new_code2=1。 //修改密码标识位 2 new_code1=0。 } if(new_code2==1amp。 amp。 flag==0) { if(key_data10) { 1_code[rec_num]=key_data。 DisplayListChar(rec_num,1,*)。 rec_num++。 flag=1。 } else if(rec_num0amp。 amp。 key_data==10) { DisplayListChar(rec_num1,1, )。 rec_num。 flag=1。 17 } } if(code_right==1 amp。 amp。 rec_num==8 amp。 amp。 new_code2==1) //判断第二次新密码是否接收完 { rec_num=0。 new_code2=0。 j=8。 while(j) //判断两次输入是否一致 { if(_code[j]!=1_code[j]) { delay_LCM(10)。 LCM_cls()。 DisplayListChar(0,0,Not Match!)。 DisplayListChar(0,1,Press Change key)。 delay_LCM(200)。 return。 } } LCM_cls()。 for(i=0。 i8。 i++) //密码一致,开始修改密码 {origin_code[i]=_code[i]。 } DisplayListChar(0,0,New codes saved!)。 //修改密码成功 delay_LCM(5000)。 wrong_num=0。 code_right=0。 ir_flag = 0。 k=1。 //跳到时钟 } return。 } 时钟模式 一开始进入运行的是时钟模式。 while(1) //时钟部分程序 { F1: DisplayListChar(0,0, )。 DisplayListChar(0,1, )。 DisplayListChar(6,0,(0_0))。 DisplayListChar(3,1, : : )。 write_sfm(3,shi)。 write_sfm(6,fen)。 18 write_sfm(9,miao)。 while(1) {delay_LCM(2020)。 DisplayListChar(6,0,(^_^))。 if(ir_flag==1) key_data=key_match(),ir_flag=0。 if(key_data==14){key_data=99。 goto F2。 } if(key_data==18) //转入密码模式 { beep_flag=1。 Beep()。 key_data=99。 LCM_cls()。 delay_LCM(10)。 DisplayListChar(0,0,Input The code! )。 show=1。 beep_flag=1。 goto A1。 } miao++。 if(miao==60) { miao=0。 fen++。 if(fen==60) { fen=0。 shi++。 if(shi==24) { shi=0。 } write_sfm(3,shi)。 } write_sfm(6,fen)。 } write_sfm(9,miao)。 } } F2: while(1) { if(ir_flag==1) {key_data= key_match()。 switch(key_data) 19 { case 8: if(shi==23)shi=0。 else shi++。 ir_flag=0。 write_sfm(3,shi)。 break。 case 9: if(fen==59)fen=0。 else fen++。 ir_flag=0。 write_sfm(6,fen)。 break。 default: DisplayListChar(6,0,(_))。 ir_flag=0。 delay_LCM(3000)。 DisplayListChar(6,0,(^0^))。 break。 }} if(key_data==14){key_da。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。