51单片机密码锁制作的程序和流程图很详细.docx

上传人:b****2 文档编号:2844822 上传时间:2023-05-04 格式:DOCX 页数:17 大小:356.61KB
下载 相关 举报
51单片机密码锁制作的程序和流程图很详细.docx_第1页
第1页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第2页
第2页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第3页
第3页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第4页
第4页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第5页
第5页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第6页
第6页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第7页
第7页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第8页
第8页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第9页
第9页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第10页
第10页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第11页
第11页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第12页
第12页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第13页
第13页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第14页
第14页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第15页
第15页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第16页
第16页 / 共17页
51单片机密码锁制作的程序和流程图很详细.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

51单片机密码锁制作的程序和流程图很详细.docx

《51单片机密码锁制作的程序和流程图很详细.docx》由会员分享,可在线阅读,更多相关《51单片机密码锁制作的程序和流程图很详细.docx(17页珍藏版)》请在冰点文库上搜索。

51单片机密码锁制作的程序和流程图很详细.docx

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;//允许电机开锁标识

相关变量

sbitM=P3^6;//电机控制口

flag_confirm;//操作任务标识位

flag_compare;//比较输入与密码|相等时返回1,否则返回0

staticflag_amend;//修改密码时的标识

第一次输入前=1,输入后置2

第二次输入前=2,输入后置0

flag_display=0;//确认键操作的返回值根据返回值可以确定显示信息

flag_allow;//允许改密码标识,在密码比较正确时置1,不正确时置0

process_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)/256

TL0=0xAF;//(65535-50000)%256

timer++;

}

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;//输入字符串长度清0

if(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);//==0

strcpy(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;//允许修改密码标识,在密码比较正确时置1

flag_amend;//第一/二次输入新密码标识

flag_M;//允许电机开锁标识

相关变量

sbitM=P3^6;//电机控制口

flag_confirm;//操作任务标识位

flag_compare;//比较输入与密码|相等时返回1,否则返回0

staticflag_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:

显示输入密码状态_Thepassword!

=8:

放弃修改密码

=9:

已开锁

3.0定义各个数组的头文件mydefine.h

externunsignedchartable_input[11]={0};//接收键盘输入

unsignedchartable_password[11]="123456";//密文

unsignedchartable_newpassword[11]="456";//接收新密码

unsignedcharcodetable_original[11]="123456";//初始密码

//显示信息

unsignedcharcodetable_pass[]="Pass!

";//成功进入

unsignedcharcodetable_error[]="OperateError!

";//密码错误信息

unsignedcharcodetable_enter[]="Thepassword:

";//输入密码

unsignedcharcodetable_new[]="Newpassword:

";//输入新密码

unsignedcharcodetable_again[]="Enteragain:

";//再次输入新密码

unsignedcharcodetable_changed[]="Changed!

";//密码修改成功

unsignedcharcodetable_fail[]="Failchangce!

";//密码修改失败

unsignedcharcodetable_abandon[]="Abandonchangce!

";//放弃修改密码

unsignedcharcodetable_close[]="Locked!

";//锁闭

unsignedcharcodetable_resume[]="Resumed!

";//恢复初始密码

4.0头文件mydefine_2.h

定义了各个外部文件向主函数用到的操作函数和外部变量

#ifndef_mydefine_2_h_

#define_mydefine_2_h_

sbitkey_LED=P2^0;

sbitkey_clock=P3^3;//蜂鸣器

sbitkey_LCD=P2^7;//液晶电源控制口

externbitflag_clear=0;//恢复密码和开锁键_外部中断的有效标识

externunsignedinttimer=0;//定时器0计数时段标记_50ms一次定时中断

staticunsignedchari=0;//显示*用变量

unsignedchartemp=0;//用于接收键盘输入(按键在松手时读取按键号)

externunsignedinttable_input[11];//接收输入

externunsignedcharflag_allow;//允许改密码标识,在密码比较正确时置1

externunsignedcharflag_confirm;//确认键根据此标识判定任务,默认为0_即为确定密码状态

externunsignedcharflag_display;//确认键操作的返回值,根据返回值可以确定显示信息

externunsignedcharflag_amend;//第一/二次输入新密码标识

externunsignedcharlength;//输入input的字符长度(length<=16)

//1602液晶:

extern_1602.c*****************************************************************

externvoidinit_1602();

externvoidcommand(unsignedcharcommand);

externvoiddisplay(unsignedchardate);

//键盘:

extern_keyboard_no_T0_2.c*********************************************************

//矩阵键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key

externunsignedcharkeyboard_matrix();//(在松手时读取按键号****检测高四位)

//密码处理:

process_char.c****************************************************************

//电机控制

externvoidDC_Moter();

//接收键盘输入|以bit形式存入input__返回值为输入的字符串长度length(length<=10)

externvoidreceive(unsignedchartemp);//涉及文件间变量length

//确认按键操作

externvoidconfirm(void);//涉及跨文件调用的变量flag_confirm,flag_allow,flag_amend

//根据任务选择显示信息

externvoidlcd_display(unsignedcharflag_display);//涉及跨文件调用的变量flag_display

externvoidclear_system();//恢复初始态

externvoidresume_password();//恢复初始密码

//****************************************************************************************

#endif

键盘和1602显示的程序见其他文章。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2