您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 51单片机密码锁制作的程序和流程图很详细
51单片机密码锁制作的程序和流程图(很详细)一、基本组成:单片机小系统+4*4矩阵键盘+1602显示+DC电机基本电路:键盘和和显示键盘接P1口,液晶的电源的开、关通过P2.7口控制电机(控制口P2.4)小系统就不贴上来了吧。。。二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。b)同时将LCD背光灯关闭4.DC电机模拟开锁动作。a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。三、密码锁特点说明:1.0输入将被以字符形式输入,最长为10位。超过10位时系统将自动截取前10位、但不作密码长度溢出提示。2.0开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。3.0系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。4.0若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。5.0输入密码正确后、电机允许开锁时间为5秒,5秒后需要再次输入密码才可以再次开锁。6.0修改密码键和恢复初始密码键最好置于室内。这是Proteus仿真结果:输入密码123456:显示结果:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接INT0引脚接的一个独立按键,用于唤醒CPU工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效当然你可以随时放弃修改密码改进:1.0密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。这使得每次换电池或停电后密码都得恢复一次,给使用带来不便,但是为了要存储一个最多只有十几字节的密码就增加一个存储器、似乎不是很值,最好是所选的单片机自带这样的存储器(容量很小、如32B)。当然如果电源来自市电的话,就不会经常掉电了。2.0系统的最好再增加电源监测的设计,在电池电力不够时发出提示。这时还可以增加备用电池,这样就可以保证系统不会掉电。但是这些都要依赖于成本。3.0液晶的显示最好采用中文。通过对1602的CGRAM的操作可以实现中文显示,使得用户界面更好。主函数:确认键操作:确认函数_confirm()操作:0_将'\0'置于输入table_input[]结尾(table_input[]的长度返回值在length里面)根据操作标识选择任务:1_确认密码:判定输入密码正确与否2_修改密码:确认第一次输入并保存要求第二次输入比较两次输入是否相同根据比较结果选择任务:修改失败,进入输入密码态修改成功,将输入复制到table_password[]确认函数_confirm()相关标识位目录:flag_display;//根据其值可以确定显示信息flag_confirm;//确认键根据此标识判定任务,默认为0_即为确定密码状态flag_allow;//允许修改密码标识,在密码比较正确时置1flag_amend;//第一/二次输入新密码标识flag_M;//允许电机开锁标识相关变量sbitM=P3^6;//电机控制口flag_confirm;//操作任务标识位flag_compare;//比较输入与密码|相等时返回1,否则返回0staticflag_amend;//修改密码时的标识第一次输入前=1,输入后置2第二次输入前=2,输入后置0flag_display=0;//确认键操作的返回值根据返回值可以确定显示信息flag_allow;//允许改密码标识,在密码比较正确时置1,不正确时置0process_char()函数::_M;//DC电机控制口process_char()函数::_length;//跟踪记录输入table_input[11]的字符长度(;#include;#include"mydefine_2.h"staticvoiddelay(unsignedintN)//Nms延时_12MHz/准确性高{unsignedinti=0,j=0;for(i=1;i;0){length--;//input[]位置后退一位}break;case10:confirm();//确定i=0;break;case13://修改密码的过程中取消修改密码|将系统置于初始态即可if((flag_amend==1)||(flag_amend==2)){flag_amend=0;flag_confirm=0;lcd_display(8);delay(500);flag_display=7;length=0;i=0;}break;}lcd_display(flag_display);}else{TR0=1;//开始计时等待}DC_Moter();resume_password();if(flag_clear)//恢复密码和开锁键_外部中断有效时重新计时{flag_clear=0;timer=0;}if(timer==100)//10秒后不允许更改密码{flag_allow=0;flag_amend=0;flag_confirm=0;length=0;i=0;lcd_display(7);//显示初始态,以提示修改超时}if(timer==1200)//≈2分钟后休眠|空闲方式{TR0=0;timer=0;clear_system();//恢复初始态i=0;key_clock=0;delay(250);key_clock=1;PCON|=0x01;lcd_display(7);//唤醒CPU后显示初始态}}}voidint0()interrupt0{key_LCD=0;//开液晶电源key_clock=0;delay(250);key_clock=1;flag_clear=1;}voidTimer0()interrupt1//50ms{TH0=0x3C;//(65535-50000)/256TL0=0xAF;//(65535-50000)%256timer++;}2.0负责实现具体操作的process_char.c文件#include;#include;#include"mydefine.h"sbitkey_self=P2^1;//独立按键,用于恢复初始密码sbitkey_LED=P2^0;sbitkey_M=P2^4;//DC电机控制口sbitkey_LCD=P2^7;//液晶电源控制口externbitflag_clear;//恢复密码和开锁键_外部中断的有效标识externunsignedinttimer;//定时器0计数时段标记_50ms一次定时中断externunsignedcharlength=0;//跟踪记录输入table_input[11]的字符长度(;0)//输入不为空{table_input[length]='\0';length=0;//输入字符串长度清0if(flag_confirm)//修改密码{switch(flag_amend){case1:strcpy(table_newpassword,table_input);//第一次输入新密码table_input[1]='\0';//避免第一次输入的内容在放弃修改时再次被利用flag_amend=2;flag_display=4;//请再次输入密码break;case2:flag_compare_2=strcmp(table_input,table_newpassword);//第二次输入新密码flag_amend=0;//清0,允许再次修改flag_confirm=0;//进入初始之确认密码状态if(!flag_compare_2)//两次输入相同==0{strcpy(table_password,table_input);table_input[1]='\0';//避免修改完成后再次被利用,造成重复修改,同时避免刚修改了就是pass状态lcd_display(5);//修改成功delay(500);flag_display=7;}else{lcd_display(6);//修改失败delay(500);flag_display=7;}break;}}else//验证密码{flag_compare=strcmp(table_input,table_password);if(!flag_compare)//密码正确==0{flag_allow=1;//允许修改密码flag_M=1;//允许开锁flag_display=2;//密码正确信息:Pass!table_input[1]='\0';//改变输入,使不致出乱}else//密码错误{flag_allow=0;//不允许修改密码lcd_display(1);//密码错误信息:Error!delay(500);flag_display=7;}}}}//电机控制externvoidDC_Moter(){if(flag_M)//允许开锁{flag_M=0;key_M=0;//开锁key_LED=0;delay(1250);key_M=1;key_LED=1;timer=0;lcd_display(7);//进入初始态}}//恢复初始密码externvoidresume_password(){if(!key_self)//==0{delay(3);if(!key_self)//==0{while(!key_self);//==0strcpy(table_password,table_original);flag_clear=1;lcd_display(10);delay(500);lcd_display(7);}}}确认函数_confirm()操作:0_将'\0'置于输入table_input[]结尾(table_input[]的长度返回值在length里面)根据操作标识选择任务:1_确认密码:判定输入密码正确与否2_修改密码:确认第一次输入并保存要求第二次输入比较两次输入是否相同根据比较结果选择任务:修改失败,进入输入密码态修改成功,将输入复制到table_password[]确认函数_confirm()相关标识位目录:flag_display;//根据其值可以确定显示信息flag_confirm;//确认键根据此标识判定任务,默认为0_即为确定密码状态flag_allow;//允许修改密码标识,在密码比较正确时置1flag_amend;//第一/二次输入新密码标识flag_M;//允许电机开锁标识相关变量sbitM=P3^6;//电机控制口flag_confirm;//操作任务标识位flag_compare;//比较输入与密码|相等时返回1,否则返回0staticflag_amend;//修改密码时的标识第一次输入前=1,输入后置2第二次输入前=2,输入后置0flag_display=0;//确认键操作的返回值根据返回值可以确定显示信息flag_allow;//允许改密码标识,在密码比较正确时置1,不正确时置0process_char()函数::_M;//DC电机控制口process_char()函数::_length;//跟踪记录输入table_input[11]的字符长度(=10)lcd_display()函数中标识位flag_display的值与意义:=0:不显示|不刷新显示=1:密码错误=2:密码正确=3:请输入新密码=4:请再次输入新密码=5:密码修改成功=6:密码修改失败=7:显示输入密码状态_Thepassword!=8:放弃修改密
本文标题:51单片机密码锁制作的程序和流程图很详细
链接地址:https://www.777doc.com/doc-5432908 .html