当前位置:文档之家› 51单片机密码锁制作的程序和流程图

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;//允许修改密码标识,在密码比较正确时置1 flag_amend;//第一/二次输入新密码标识 flag_M;//允许电机开锁标识

相关变量 sbit M=P3^6;//电机控制口 flag_confirm;//操作任务标识位 flag_compare;//比较输入与密码|相等时返回1,否则返回0 static flag_amend;//修改密码时的标识 第一次输入前=1,输入后置2 第二次输入前=2,输入后置0 flag_display=0;//确认键操作的返回值根据返回值可以确定显示信息 flag_allow;//允许改密码标识,在密码比较正确时置1,不正确时置0 process_char()函数::_M;//DC电机控制口 process_char()函数::_length;//跟踪记录输入table_input[11]的字符长度( <=10 )

lcd_display()函数中标识位flag_display的值与意义: =0:不显示|不刷新显示 =1:密码错误 =2:密码正确 =3:请输入新密码 =4:请再次输入新密码 =5:密码修改成功 =6:密码修改失败 =7:显示输入密码状态_The password! =8:放弃修改密码 =9:已开锁

流图不怎么清晰、不过下一篇就是程序了,可以从程序推出流图。

程序比较多,所以写成了几个文件,同时应用了相当多的标识位来进行信号传递。

我觉得边看程序边画它的流程图会更好地帮助我们读程序。 1.0 main.c文件 #include #include #include"mydefine_2.h"

static void delay(unsigned int N)//N ms延时_12MHz/准确性高 { unsigned int i=0,j=0; for(i=1;i<=N;i++) for(j=1;j<=355;j++) ; }

void clock() { key_clock=0; delay(15); key_clock=1; }

void init() { key_LCD=0; init_1602();

TMOD=0x01; TH0=0x3C;//=(65535-5000)/256 TL0=0xAF;//(65535-5000)%256 EA=1; ET0=1; TR0=0;

EA=1;//外部中断0唤醒CPU(空闲方式) EX0=1; IT0=1; command(0x80); lcd_display(7); }

void main() { init(); while(1) { temp=keyboard_matrix();//扫描输入 if(temp)//有按键输入信息 { clock();//按键声 TR0=0;//关闭计时 timer=0; receive(temp);//输入的字符串长度为length( <= 10) if(i!=length)//输入时显示"*" { command(0xC0+length);//为显示密码输入设定位置 display('*'); i=length; } switch(temp)//根据按键号调用任务 { //修改密码 case 12: if((flag_allow) && (flag_amend==0))//输入密码正确的条件下可以更改 { table_input[0]='\0'; flag_display=3;//请输入新密码 flag_confirm=1;//确认键进入确认修改密码功能 flag_amend=1;//每次按下修改键时都是第一次输入新密码 length=0; //重按修改键时也是第一次输入新密码 i=0; } else { flag_confirm=0;//恢复初始态 flag_amend=0; lcd_display(1);//密码不正确 delay(500); flag_display=7; length=0; i=0; } break; case 11: //取消 command(0xC0+length);//擦出显示 display(' ');//显示后光标_显示地址又加了1 command(0xC0+length);//重置光标_显示地址|实为将光标拉回来 i=0; if(length > 0) { length--;//input[]位置后退一位 } break; case 10: confirm();//确定 i=0; break; case 13: //修改密码的过程中取消修改密码|将系统置于初始态即可 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;

相关主题