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

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

51单片机简易密码锁学号:201114040215HEBEI UNITED UNIVERSITY单片机课程设计说明书设计题目:简易电子密码锁学生姓名:李红辉专业班级:测控技术及仪器2学院:电气工程学院指导教师:曹晓华2014年06月05日成绩评定表AbstractIn daily life and work, the department of housing and security, unit documents, financial statements and some personal information to save more in order to lock the ways to solve. If use the traditional mechanical key to open the lock, people often need to carry multiple keys, use very convenient, and the key missing after security is compromised. With the continuous development of science and technology, people in daily life the demand is higher and higher safety insurance device. To meet the requirements of people on the use of the lock, increase its safety, use the password instead of the key combination lock arises at the historic moment. Combination lock with high safety, low cost, low power consumption, easy operation, etc.In the field of security technology to guard against, with electronic combination lock anti-theft alarm function gradually replace the traditional mechanical combination lock, overcoming the mechanical combination lock password quantity is little, the shortcomings of poor safety performance, make the combination lock both in technology and step in performance are improved greatly. With the development of large scale integrated circuit technology, especially the single chip microcomputer, appeared with the intelligent combination of the microprocessor, it besides has the function of electronic combination lock, also introduced the intelligent management, expert analysis system, and other functions, so that the combination lock of high security, reliability, and increasingly widely used.The course design of electronic combination lock based on MCU is introduced, the design of the hardware is mainly composed of AT89C52 minimum system, matrix circuit, 1602 LCD display circuit, power circuit and alarm circuit and so on several parts. Software is mainly composed of C language programming. The combination lock by the single chip microcomputer technology, through the matrix circuit setting, change passwords, passwordprotection, and by the LCD display password input, so as to realize the password Settings, protection.Key words: single chip microcomputer, trick lock, the 1602, the smallest system, matrix keyboard目录摘要 ............................................................................................ 错误!未定义书签。
基于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单片机四位密码锁课程设计

51单片机四位密码锁课程设计51单片机四位密码锁是一种常见的电子锁,它使用51单片机作为控制核心,通过输入四位密码来控制锁的开关。
本文将介绍关于51单片机四位密码锁的课程设计。
我们需要明确设计的目标和要求。
本设计的主要目标是实现一个四位密码锁系统,并且需要满足以下要求:1.能够输入四位数字密码。
2.密码输入正确时,能够解锁并输出解锁信号。
3.密码输入错误时,不能解锁。
4.能够重置密码。
接下来,我们将详细介绍设计的步骤和实现。
1.硬件设计:在硬件设计方面,我们需要准备以下器件:- 51单片机-数码管显示模块-按键模块-继电器模块-电源模块2.软件设计:在软件设计方面,我们需要编写51单片机的程序,通过编程实现密码锁的功能。
以下是设计的主要步骤:-初始化:设置输入输出引脚,并初始化时钟和数码管显示。
-输入密码:设计密码输入的函数,通过按键模块获取用户输入的密码。
-检验密码:设计密码检验的函数,将用户输入的密码与预设的密码进行比对。
-解锁信号:如果密码输入正确,输出解锁信号,通过继电器控制开关,实现解锁。
-密码错误:如果密码输入错误,通过数码管显示密码错误的提示信息。
-重置密码:设计密码重置的函数,将新设置的密码保存。
3.程序流程:根据以上设计的步骤,我们可以得到以下主要的程序流程:-初始化引脚和时钟。
-设置初始密码。
-进入主程序循环。
-接收用户输入的密码。
-检验密码是否正确。
-如果密码正确,显示解锁信号并控制继电器解锁。
-如果密码错误,显示密码错误信息。
-进入下一次循环。
4.调试和测试:完成程序编写后,我们需要进行调试和测试。
在测试过程中,我们需要输入正确和错误的密码进行验证,检查程序是否能够正常运行,并且能够正确判断和处理用户输入的情况。
5.优化改进:如果在测试中发现问题或不足之处,我们可以对程序进行优化和改进。
例如,可以增加密码输入的最大尝试次数,增加延时等待时间,增加密码保护等功能。
总结:通过对51单片机四位密码锁的课程设计,我们学习了如何使用51单片机编写程序,实现密码锁的功能。
单片机课程设计密码锁程序和仿真图

#include<at89x51.h>#define uchar unsigned char#define uint unsigned intuint num=10; //开始让数码管什么都不显示bit set=0; //定义设置密码的位char count=-1; //开始让COUNT=-1,方便后面显示数码管sbit Beep=P1^2; //蜂鸣器uchar temp;uchar pws[6]={3,6,2,3,3,0}; //原始密码uchar pwx[6]; //按下的数字存储区bit rightflag; //密码正确标志位uchar workbuf[6];uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40 }; //段选码,共阴极uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码uint keyscan();void delay(uchar z) //延时,ms级{uchar y;for(;z>0;z--)for(y=120;y>0;y--);}void setpw() //设置密码函数{keyscan();}uint keyscan() //键盘扫描函数{P3=0xfe;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5); //键盘去抖,最好ms以上,这里用了mstemp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;//按键计数加temp=P3;switch(temp){case 0xee:{num=7;if(count<6) //六位密码,所以COUNT<6{if(set==0) //设置密码键没有按下时pwx[count]=num; //存储按下的数字elsepws[count]=num; //设置密码键按下时,设置新密码workbuf[count]=tabledu[11]; //相应位的数码管显示"--",不显示相应的数字,密码是保密的}}break;case 0xde:{num=8;if(count<6) //以下扫描键盘的原理差不多同上{if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbe:{num=9;{if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}}break;case 0x7e: //设置密码键按下{set=1; //设置密码标志位置P1_3=0; //设置密码指示灯亮workbuf[0]=0x00;//数码管第一位不显示workbuf[1]=0x00;//......workbuf[2]=0x00;//......workbuf[3]=0x00;workbuf[4]=0x00;workbuf[5]=0x00;//......count=-1; //按键计数复位为-1if(count<6) //密码没有设置完,继续设置密码{setpw(); //设置密码}}break;}while(temp!=0xf0) //按键抬起检测{temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xed:{num=4;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdd:{num=5;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbd:{num=6;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xeb:{num=1;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xdb:{num=2;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xbb:{num=3;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;if(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;if(temp!=0xf0){count++;temp=P3;switch(temp){case 0xd7:{num=0;if(count<6){if(set==0)pwx[count]=num;elsepws[count]=num;workbuf[count]=tabledu[11];}}break;case 0xe7: num=20;break; //确定键按下检测case 0x77: //复位键或者输入密码全部一次删除{P1_1=0; //锁关P1_3=1; //密码设置指示灯灭set=0; //不设置密码num=10; //num复位count=-1; //COUNT复位workbuf[0]=tabledu[10]; //第一位数码管不显示workbuf[1]=tabledu[10]; //第二位数码管不显示workbuf[2]=tabledu[10];workbuf[3]=tabledu[10];workbuf[4]=tabledu[10];workbuf[5]=tabledu[10]; //......P1_0=1; //锁关}break;case 0xb7: //输入密码删除键(一位一位删除){count--;workbuf[count]=0x00; //因确定键按下时,COUNT也会加,而确定键不是密码,所以这里是COUNT,而不是COUNT+1count--; //因确定键按下时,确定键不是密码,COUNT也会加,这里COUNT再自减if(count<=-1)count=-1;}break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}return(num);}void init() //利用定时显示数码管{TMOD=0x01;TH0=(65536-500)/200;TL0=(65536-500)%200;ET0=1;EA=1;TR0=1;}bit compare() //密码比较函数{if((pwx[0]==pws[0])&(pwx[1]==pws[1])&(pwx[2]==pws[2])&(pwx[3]==pws[3])&(pwx[4]==pws[4])&(pw x[5]==pws[5]))rightflag=1;elserightflag=0;return(rightflag);}void main(){uint i,j;init();P0=0;P1_1=0; //锁关while(1){keyscan();if(num==20) //如果确定键按下(修改密码和输入密码共用的确定键){if(count==6){if(set==1) //修改密码确定{P1_3=1;workbuf[0]=0;workbuf[1]=0;workbuf[2]=0;workbuf[3]=0;workbuf[4]=0;workbuf[5]=0;}else//输入密码确定{set=0;compare();if(rightflag==1) //如果密码正确{P1_0=0; //锁开P1_1=1;workbuf[0]=tabledu[8]; //数码管第一位显示"8"workbuf[1]=tabledu[8]; //数码管第二位显示"8"workbuf[2]=tabledu[8];workbuf[3]=tabledu[8];workbuf[4]=tabledu[8];workbuf[5]=tabledu[8]; //......}else{P1_1=0; //锁仍然是关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71; //......for(i=0;i<1000;i++) //密码错误报警{for(j=0;j<80;j++);Beep=~Beep;}break;}}}else//若输入的密码位数不为位时{P1_1=0; //锁仍然关workbuf[0]=0X71; //数码管第一位显示"F"workbuf[1]=0X71;workbuf[2]=0X71;workbuf[3]=0X71;workbuf[4]=0X71;workbuf[5]=0X71;for(i=0;i<1000;i++){for(j=0;j<80;j++);Beep=~Beep;}break;}}}}void timer0() interrupt 1 //显示数码管{uchar i;TH0=(65536-500)/200; TL0=(65536-500)%200; for (i=0;i<6;i++) { P0=workbuf[i]; P2=tablewe[i]; delay(5); P0=0;}}XTAL218XTAL119ALE 30EA31PSEN 29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD 10P3.1/TXD 11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR 16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51234567891RP1RESPACK-812365489=7+CONABCD1243D2LED-RED锁开锁关LS1SOUNDERD3LED-BLUE设置密码指示灯R11kR21kR310KR410K+12VQ3TIP127Q4TIP127Q18050Q28050Q5TIP122Q6TIP122+88.8Amps+88.8Amps+88.8Volts。
基于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单片机智能门锁程序设计

51单片机智能门锁程序设计.txt 51单片机智能门锁程序设计摘要本文介绍了使用51单片机设计智能门锁的程序。
该门锁通过输入密码,识别指纹或使用智能卡来解锁门禁。
门锁控制系统由51单片机和其他必要的电子元器件组成,实现了简单而安全的门禁控制。
程序设计流程1. 初始化:设置门锁控制系统的初始参数和状态。
2. 输入密码:用户输入预设的密码进行门锁解锁。
3. 校验密码:将用户输入的密码与预设的密码进行比对校验。
4. 判断密码是否正确:如果密码输入正确,允许开锁;否则,提示密码错误。
5. 识别指纹:用户将指纹放置在指纹识别模块上,进行指纹识别。
6. 判断指纹是否正确:如果指纹识别通过,允许开锁;否则,提示指纹识别失败。
7. 读取智能卡:用户将智能卡放置在感应区,进行卡片读取。
8. 判断智能卡是否有效:如果智能卡读取成功且有效,允许开锁;否则,提示卡片无效。
9. 开锁操作:门锁控制模块驱动电机开启门禁,用户可以进入。
10. 关门操作:门锁控制模块驱动电机关闭门禁。
11. 重置设备:将门锁控制系统恢复到初始状态。
主要功能模块密码输入模块- 用户通过键盘输入预设密码。
- 将用户输入的密码与预设密码进行比对。
指纹识别模块- 用户将指纹放置在指纹识别模块上。
- 使用指纹识别算法对指纹进行比对和辨识。
智能卡读取模块- 用户将智能卡放置在感应区进行读取。
- 对智能卡进行识别和验证。
门锁控制模块- 根据密码验证、指纹识别或智能卡读取结果来控制门锁状态。
- 驱动电机实现开门和关门操作。
结论本文提供了一种基于51单片机的智能门锁程序设计。
该程序设计实现了通过输入密码、识别指纹或使用智能卡来解锁门禁。
通过简单而安全的门锁控制系统,用户可以方便地使用和管理门禁,提高安全性。
基于51单片机的密码锁(可改密码)

实习报告实习名称:单片机应用实习院(系)名称:电气与信息工程学院专业班级:xxxxxxxxx学生姓名:xxxxxx学号:xxxxxx指导教师:xxxxxxxxxx黑龙江工程学院教务处制2014年7月目录第1章总体设计方案 (4)1.1总体设计方案 (4)第2章硬件电路设计 (5)2.1单片机最小系统电路设计 (5)2.2液晶显示模块 (6)2.3键盘输入模块 (7)2.4 AT24C02密码存储模块 (8)2.5 系统供电电路设计 (9)2.6 蜂鸣器和继电器模块 (10)第3章系统软件设计 (11)3.1软件总体设计思路 (11)3.2主程序流程设计 (12)总结 (13)参考文献 (14)附录 (15)附录一 (15)附录二 (15)实习任务书学生姓名xxxx 系部电气与信息工程学院专业班级测控12-1指导教师姓名xxx 职称副教授讲师是否外聘□是否题目名称键盘式电子密码锁一、设计的内容、目的和意义本次实习是有关于键盘式电子密码锁的设计。
在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。
若使用传统的机械式钥匙开锁,人们常需携带多把钥匙, 使用极不方便, 且钥匙丢失后安全性即大打折扣。
随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。
为满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。
密码锁具有安全性高、成本低、功耗低、易操作等优点。
本次实习的目的是实现电子密码锁的功能,并运用单片机技术设计一个结构简单,并且相对低成本的密码锁。
二、设计的技术指标要求1、研究方法(1)总体按照最优化的方法进行软件设计和硬件设计,走软件实现道路;(2)对软硬件进行模块划分,并对各单元电路结合EDA工具进行论证设计;(3)在查阅文献基础上展开设计,力求创新。
2、技术要求(1)采用6位密码(2)报警、锁定键盘功能。
- 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;//允许修改密码标识,在密码比较正确时置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;