51单片机密码锁制作的程序和流程图
51单片机课程设计 电子密码锁

华中师范大学武汉传媒学院传媒技术学院电子信息工程2011仅发布百度文库,版权所有.基于单片机的密码锁的设计1设计题目:电子密码锁要求采用AT89S51单片机为主控芯片,通过软件程序组成电子密码锁系统2设计框图3方案设计课题设计目标本设计采用AT89S51单片机为主控芯片,通过软件程序组成电子密码锁系统,能够实现:1.正确输入密码前提下,开锁提示;2.错误输入密码情况下,蜂鸣器报警;3.密码可以根据用户需要更改;4.断电存储功能主控部分的选择选用单片机作为系统的核心部件,实现控制与处理的功能。
单片机具有资源丰富、速度快、编程容易等优点。
利用单片机内部的随机存储器(RAM)和只读存储器(ROM)及其引脚资源,外接液晶显示(LCD),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标。
密码输入方式的选择由各按键组成的矩阵键盘每条行线和列线都对应一条I/O口线,键位设在行线和列线的交叉点,当一个键按下就会有某一条行线与某一条列线接触,只要确定接触的是哪两条线,即哪两个I/O口线,就可以确定哪一个键被触动。
行线设计成上拉口线,初始时被置高电位,列线悬空,初始置低。
通过不断读行线口线,或者中断方式触发键位扫描。
当发现有键按下,将列线逐一置低,其他列线置高,读行线口线。
当某条列线置低时,某条行线也被拉低,则确定这两条线的交点处的按钮被按下。
每个按键都可通过程序赋予功能,从而完成密码识别。
4 硬件原图设计5程序流程图主程序流程图键功能程序流程图开锁程序流程图6仿真图7制作本设计主要由单片机、矩阵键盘、液晶显示器和密码存储等部分组成。
其中矩阵键盘用于输入数字密码和进行各种功能的实现。
由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈。
基于51单片机的电子密码锁

电子密码锁一、工作原理本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O 线的数目,在按键比较多的时候,通常采用这样方法。
每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N ×M个按键的键盘。
在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。
4×4矩阵键盘的工作原理在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图5所示。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
扫描原理把每个键都分成水平和垂直的两端接入,比如说扫描码是从垂直的入,那就代表那一行所接收到的扫描码是同一个bit,而读入扫描码的则是水平,扫描的动作是先输入扫描码,再去读取输入的值,经过比对之后就可知道是哪个键被按下。
由于这种按键是机械式的开关,当按键被按下时,键会震动一小段时间才稳定,为了避免让8051误判为多次输入同一按键,我们必须在侦测到有按键被按下,就Delay一小段时间,使键盘以达稳定状态,再去判读所按下的键,就可以让键盘的输入稳定。
利用51单片机设计一个用16个按键输入,6位数字输出显示的电子时钟。
如图1-1所示。
图1-1按键分布图具体要求和按键功能介绍如下:1. 上电后,6 位数码管显示“—”;2. 设置6 位密码,密码通过键盘输入,按“确定”键确认,如密码正确,将锁打开;3. 密码由用户自己设定,若密码正确即锁被打开,则指示灯被点亮;4. 若密码1 次输入错误,则报警;5. 按Set 键,修改密码;6. 按Cle 键可清除已输入的密码,重新进行输二、系统硬件组成本次设计的主要有键盘,数码管,STC89C52芯片,以及LED灯。
基于51单片机的密码锁程序

*************************************************/
void lcd_char(uchar row ,uchar cloum,uchar dat)
{
if(row==1)
{
lcd_writecom(0x80+cloum);
lcd_writedata(dat);
}
else
{
lcd_writecom(0x80+0x40+cloum);
lcd_writedata(dat);
}
}
/*********************************************
名称:lcd_string(uchar row,uchar cloum,uchar *p)
}
/********************************************************************
* 名称 : Delay_xMs()
* 功能 : 延时子程序,经过软件调试,测得延时程序大概为55us.
* 输入 : x
* 输出 : 无
***********************************************************************/
uchar init_password[6]="123456";
uchar a[5]="RIGHT";
uchar b[16]="The new password";
unsigned char code pu[282]={
基于51单片机的密码锁设计程序_

uchar temp,count,aa,bb,cc。/*一般将这些变量定义在C文件中
当主函数需要时用extern引用*/
bit shu_flag,modify_flag,rst。
bit fun_flag。//功能键Байду номын сангаас志位没使用
bit down_flag,up_flag,open_flag。
write_ds1302_byte(dat)。
T_CLK=1。
T_EN=0。
}
uchar read_ds1302_data(uchar addr)
{
uchar date。
T_EN=0。
T_CLK=0。
T_EN=1。
write_ds1302_byte(addr)。
date=read_ds1302_byte()。
sda=1。
delay1()。
}
void i2c_ack()
{
uchar i。
scl=1。
delay1()。
while((sda==1)&&(i<250)) i++。
scl=0。
delay1()。
}
void i2c_nack()
{
scl=1。
delay1()。
sda=1。
scl=0。
delay1()。
lcd_rs_port=1。
lcd_rw_port =0。
lcd_en_port=0。
P0=dat。
lcd_en_port=1。
lcd_en_port=0。
}
void wtite_lcd_1602_dat(uchar x_pos,uchar y_pos,uchar dat)
51单片机密码锁程序.

/*停止条件*/ void Stop(void) { Sda=0; Scl=1; Nop(); Sda=1; Nop(); } /*应答位*/ void Ack(void) { Sda=0;
Nop(); Scl=1; Nop(); Scl=0; } /*反向应答位*/ void NoAck(void) { Sda=1; Nop(); Scl=1; Nop(); Scl=0; } /*发送数据子程序,Data 为要求发送的数据*/ void Send(uchar Data) { uchar BitCounter=8; uchar temp; do { temp=Data; Scl=0; Nop(); if((temp&0x80)==0x80) Sda=1; else Sda=0; Scl=1; temp=Data<<1; Data=temp; BitCounter--; } while(BitCounter); Scl=0; } /*读一字节的数据,并返回该字节值*/ uchar Read(void) { uchar temp=0; uchar temp1=0; //判断是否传送完成 //将待发送数据暂存 temp
= {"===Coded Lock==="}; = {" correct "}; = {" error "}; = {" pass "}; = {" open "}; = {"SetNewWordEnable"}; = {"input: "}; = {"ResetPasswordOK "};
unsigned char code initword[] unsigned char code Er_try[] unsigned char code again[]
单片机51--数字密码锁

-------------------------------------------------------------------------------------------------------------------;复位 SERR: MOV A, PAR ;C 为复位 CJNE A, #0CH, ERR ;若按下不是复位则继续出错 MOV IDX,#01H JB 00H, IPT2 LCALL DCODE AJMP CHEK IPT2 : LCALL ECODE AJMP CHEK --------------------------------------------------------------------------------------------------------------------;出错状态 ERR: MOV DPTR, #6000H ;二极管地址 MOV A, #40H ;错误指示灯 MOV @DPTR, A MOV IDX, #04H MOV RW, #00H AJMP CHEK --------------------------------------------------------------------------------------------------------------------;解码指示灯亮 DCODE: MOV DPTR, #6000H ;二极管地址 MOV A, #10H ;开始解码指示灯 MOV @DPTR, A RET -------------------------------------------------------------------------------------------------------------------;设置密码指示灯亮 ECODE: MOV DPTR, #6000H ;二极管地址 MOV A, #20H ;开始设密码指示灯 MOV @DPTR, A RET -------------------------------------------------------------------------------------------------------------------;延时 20ms DELAY1:MOV R7,#50H DEL11: MOV R6,#7BH NOP DEL12: DJNZ R6,DEL12 DJNZ R7,DEL11 RET --------------------------------------------------------------------------------------------------------------------;延时 5ms DELAY2: MOV R6,#28H DEL21: MOV R7,#07BH DEL22: DJNZ R7,DEL22 DJNZ R6,DEL21
51单片机密码锁程序

sbit beep=P2^0; //蜂鸣器,低电平叫
sbit red=P2^1; //红灯,低电平亮
sbit close=P2^7; //锁合指示灯,黄色。低电平亮
1 2 3 确定
0
---------------------------------------------------------------------------------------------------------------------------------------------------------*/
初始密码为四位,1,2,3,4 如果想修改密码的长度,可将程序中的密码长度4改为你想设置的长度值
初始密码1,2,3,4也可在函数init_main()函数中修改
密码锁上电后,锁合灯亮,初始密码为1,2,3,4 。
当输入的四位密码按确定键后,密码正确时锁开灯亮,锁合灯灭。当不正确时,锁合灯继续亮,蜂鸣器短报警
pwflag = 0; // 密码标志先置为0
last_pwflag=0;
close=0; //锁合灯亮,其它灯灭
delay();
red=1;
delay();
delay();
delay();
delay();
red=0;
delay();
delay();
delay();
delay();
red=1;
}
//快闪红灯,重新输入自定义密码
void flashred_S(void)
case 0xdb: return 8;break;
51单片机设计电子锁密码锁含代码

电子锁设计报告一,实验目的1. 学习8051定时器时间计时处理,键盘扫描及LED数码管显示的设计方法。
2. 设计任务及要求利用实验平台上8个LED数码管,设计带有报警功能的可掉电保存的电子密码锁。
3.通过本次实验,加强对所学知识的理解,增强编程能力及实践能力。
二,实验要求A.基本要求:1:用4×4矩阵键盘组成0-9数字键及确认键和删除键。
2:可以自行设定或删除8位密码,能够掉电保存。
3:用5位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用绿色led发光二极管亮一秒钟做为提示,若密码不正确,禁止按键输入3秒,同时用红色led发光二极管亮三秒钟做为提示;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
4:自由发挥其他功能.5:要求有单片机硬件系统框图,电路原理图,软件流程图B.拓展部分:无三,实验基本原理单片机密码锁是集计算机技术、电子技术、数字密码技术为一体的机电一体化高科技产品,具有安全性高,使用方便等优点。
本系统考虑到单片机密码锁成本及体积因素,在设计单片机密码锁部分时,以AT89S52单片机为核心,24C04、LED等构成外围电路。
本系统单片机密码锁硬件部分结构简单、成本低,软件部分使用电子加密提高锁的安全性,具有比较好的市场前景。
同时,由于本电子密码锁可以实现掉电保存,而且可以自行设计或者删除8位密码,所以具有较高的实用价值。
本密码锁采用5位数码管组成显示电路提示信息,当输入密码时,只显示“8.”,当密码位数输入完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则门开,此处用绿色led 发光二极管亮一秒钟做为提示,若密码不正确,禁止按键输入3秒,同时用红色led 发光二极管亮三秒钟做为提示;若在3秒之内仍有按键按下,则禁止按键输入3秒被重新禁止。
此项功能方便用户使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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;//允许电机开锁标识相关变量sbit M=P3^6;//电机控制口flag_confirm;//操作任务标识位flag_compare;//比较输入与密码|相等时返回1,否则返回0static flag_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:显示输入密码状态_The password!=8:放弃修改密码=9:已开锁流图不怎么清晰、不过下一篇就是程序了,可以从程序推出流图。
程序比较多,所以写成了几个文件,同时应用了相当多的标识位来进行信号传递。
我觉得边看程序边画它的流程图会更好地帮助我们读程序。
1.0 main.c文件#include<reg52.h>#include<string.h>#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)/256TL0=0xAF;//(65535-5000)%256EA=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(' ');//显示后光标_显示地址又加了1command(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;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后显示初始态}}}void int0() interrupt 0{key_LCD=0;//开液晶电源key_clock=0;delay(250);key_clock=1;flag_clear=1;}void Timer0() interrupt 1 //50ms{TH0=0x3C;//(65535-50000)/256TL0=0xAF;//(65535-50000)%256timer++;}2.0 负责实现具体操作的 process_char.c 文件#include<reg52.h>#include<string.h>#include"mydefine.h"sbit key_self=P2^1;//独立按键,用于恢复初始密码sbit key_LED=P2^0;sbit key_M=P2^4;//DC电机控制口sbit key_LCD=P2^7;//液晶电源控制口extern bit flag_clear;//恢复密码和开锁键_外部中断的有效标识extern unsigned int timer;//定时器0计数时段标记_50ms一次定时中断extern unsigned char length=0;//跟踪记录输入table_input[11]的字符长度( <=10 )extern unsigned char flag_display=0;//根据其值可以确定显示信息extern unsigned char flag_confirm=0;//确认键根据此标识判定任务,默认为0_即为确定密码状态extern unsigned char flag_allow=0;//允许修改密码标识,在密码比较正确时置1extern unsigned char flag_amend=0;//第一/二次输入新密码标识unsigned char flag_M=0;//允许电机开锁标识extern void command(unsigned char command);extern void display(unsigned char date);//向I2C地址为address处写入数据dateextern void write_I2C(unsigned char address,unsigned char date);//读出I2C地址为address处的数据extern unsigned char read_I2C(unsigned char address);static void delay(unsigned int N)//N ms延时/准确性高{unsigned int i=0,j=0;for(i=1;i<=N;i++)for(j=1;j<=355;j++) ;}//休眠前清除table_input中的值extern void clear_system(){table_input[0]='\0';//恢复初始态length=0;flag_allow=0;flag_confirm=0;flag_amend=0;flag_clear=0;key_LCD=1;//关液晶电源}//接收键盘输入|以字符形式存入table_input[11]extern void receive(unsigned char temp){//按键在松手时读取按键号,故不会重复读取按键值if(temp && length<=9)//如此,则无按键时执行效率高{switch(temp){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9: table_input[length++]=temp+48;//以字符形式存入table_input[11]break;case 14: table_input[length++]=48;//字符0}}}//根据任务选择显示信息extern void lcd_display(unsigned char temp){unsigned char i=0,*p=NULL;if(temp){switch(temp)//选择显示信息{case 1: p=table_error;//密码不正确break;case 2: p=table_pass;//密码正确break;case 3: p=table_new;//请输入新密码break;case 4: p=table_again;//请再次输入新密码break;case 5: p=table_changed;//密码修改成功break;case 6: p=table_fail;//密码修改失败break;case 7: p=table_enter;//显示输入密码:The password!break;case 8: p=table_abandon;//放弃修改密码break;case 9: p=table_close;//锁闭break;case 10: p=table_resume;//锁闭break;}command(0x01);delay(1);command(0x80);while(*p!='\0'){display(*(p++));}flag_display=0;//显示后清0,避免重复显示}}//确认extern void confirm(void){unsigned char flag_compare=0;//用于记录比较输入与密码的结果|相等时返回1,否则返回0unsigned char flag_compare_2=0;//用于记录对两次输入的新密码的比较结果|相等时返回1,否则返回0unsigned char i=0;if(length > 0)//输入不为空{table_input[length]='\0';length=0;//输入字符串长度清0if(flag_confirm)//修改密码{switch(flag_amend){case 1: strcpy(table_newpassword,table_input);//第一次输入新密码table_input[1]='\0';//避免第一次输入的内容在放弃修改时再次被利用flag_amend=2;flag_display=4;//请再次输入密码break;case 2: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;}}}}//电机控制extern void DC_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);//进入初始态}}//恢复初始密码extern void resume_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;//允许电机开锁标识相关变量sbit M=P3^6;//电机控制口flag_confirm;//操作任务标识位flag_compare;//比较输入与密码|相等时返回1,否则返回0static flag_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:显示输入密码状态_The password!=8:放弃修改密码=9:已开锁3.0 定义各个数组的头文件mydefine.hextern unsigned char table_input[11]={0}; //接收键盘输入unsigned char table_password[11]="123456"; //密文unsigned char table_newpassword[11]="456"; //接收新密码unsigned char code table_original[11]="123456"; //初始密码//显示信息unsigned char code table_pass[]="Pass!"; //成功进入unsigned char code table_error[]="Operate Error!"; //密码错误信息unsigned char code table_enter[]="The password:"; //输入密码unsigned char code table_new[]="New password:"; //输入新密码unsigned char code table_again[]="Enter again:"; //再次输入新密码unsigned char code table_changed[]="Changed!"; //密码修改成功unsigned char code table_fail[]="Fail changce!"; //密码修改失败unsigned char code table_abandon[]="Abandon changce!";//放弃修改密码unsigned char code table_close[]="Locked!";//锁闭unsigned char code table_resume[]="Resumed!";//恢复初始密码4.0 头文件mydefine_2.h定义了各个外部文件向主函数用到的操作函数和外部变量#ifndef _mydefine_2_h_#define _mydefine_2_h_sbit key_LED=P2^0;sbit key_clock=P3^3;//蜂鸣器sbit key_LCD=P2^7;//液晶电源控制口extern bit flag_clear=0;//恢复密码和开锁键_外部中断的有效标识extern unsigned int timer=0;//定时器0计数时段标记_50ms一次定时中断static unsigned char i=0;//显示*用变量unsigned char temp=0;//用于接收键盘输入(按键在松手时读取按键号) extern unsigned int table_input[11];//接收输入extern unsigned char flag_allow;//允许改密码标识,在密码比较正确时置1extern unsigned char flag_confirm;//确认键根据此标识判定任务,默认为0_即为确定密码状态extern unsigned char flag_display;//确认键操作的返回值,根据返回值可以确定显示信息extern unsigned char flag_amend;//第一/二次输入新密码标识extern unsigned char length;//输入input的字符长度(length <= 16) //1602液晶:extern_1602.c***************************************************************** extern void init_1602();extern void command(unsigned char command);extern void display(unsigned char date);//键盘:extern_keyboard_no_T0_2.c********************************************************* //矩阵键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key extern unsigned char keyboard_matrix();//(在松手时读取按键号****检测高四位)//密码处理:process_char.c**************************************************************** //电机控制extern void DC_Moter();//接收键盘输入|以bit形式存入input__返回值为输入的字符串长度length(length <= 10)extern void receive(unsigned char temp);//涉及文件间变量length //确认按键操作extern void confirm(void);//涉及跨文件调用的变量flag_confirm,flag_allow,flag_amend//根据任务选择显示信息extern void lcd_display(unsigned char flag_display);//涉及跨文件调用的变量flag_displayextern void clear_system();//恢复初始态extern void resume_password();//恢复初始密码。