51单片机密码锁制作的程序和流程图

上传人:时****我 文档编号:231796896 上传时间:2023-09-08 格式:DOCX 页数:33 大小:1.27MB
收藏 版权申诉 举报 下载
51单片机密码锁制作的程序和流程图_第1页
第1页 / 共33页
51单片机密码锁制作的程序和流程图_第2页
第2页 / 共33页
51单片机密码锁制作的程序和流程图_第3页
第3页 / 共33页
资源描述:

《51单片机密码锁制作的程序和流程图》由会员分享,可在线阅读,更多相关《51单片机密码锁制作的程序和流程图(33页珍藏版)》请在装配图网上搜索。

1、51 单片机密码锁制作的程序和流程图51 单片机密码锁制作的程序和流程图(很具体)一、根本组成:单片机小系统+*矩阵键盘+显示+电机根本电路:键盘和和显示键盘接 P1 口,液晶的电源的开、关通过P2.7 口把握电机(把握口P2.4)二、根本功能描述:1 / 321 / 3251 单片机密码锁制作的程序和流程图1. 验证密码、修改密码a)锁的初始密码是 123456(密码最长为 10 位,最短为 1 位)。2. 恢复初始密码a)系统可以恢复初始密码,否则一旦遗忘密码而又不能恢复初始密码,该锁就永久打不开。但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。3.

2、使系统进入低功耗状态a) 在实际使用中,锁只有在开门时才被使用。因而在大多数的时间里,应当让锁进入休眠状态、以降低功耗,这使系统进入掉电状态, 可以大大降低系统功耗。b) 同时将LCD 背光灯关闭4. DC 电机模拟开锁动作。a)DC 电机启动时解除开锁把手的锁定,允许通过把手开锁。DC 电机不直接开锁,使得 DC 电机的功率不用太大,系统的组成和维护将变得简洁,功耗也降了下来。三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为 10 位。超过 10 位时系统将自动截取前 10 位、但不作密码长度溢出提示。2.0 开锁 10 秒后不允许更改密码、并提示修改超时_进入初始态,2 / 32

3、2 / 3251 单片机密码锁制作的程序和流程图需要重输入密码方可再次修改密码。3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。4.0 假设 2 分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节约电力。5.0 输入密码正确后、电机允许开锁时间为 5 秒, 5 秒后需要再次输入密码才可以再次开锁。6.0 修改密码键和恢复初始密码键最好置于室内。这是Proteus 仿真结果: 输入密码 123456:显示结果:密码正确时电机启动、电机将持续 5 秒:3 / 323 / 3251 单片机密码锁制作的程序和流程图这是键盘:开锁键是接INT0 引脚接的一个独立按键,用于

4、唤醒CPU 工作、进而开启整个系统密码正确时可以修改密码:再次输入密码,两次输入一样时、更改有效4 / 324 / 3251 单片机密码锁制作的程序和流程图固然你可以随时放弃修改密码改进:1.0 密码锁的隐秘没有存储,因而在掉电时最的密码将丧失,重上电后密码将恢复成为初始密码。这使得每次换电池或停电后密码都得恢复一次,给使用带来不便,但是为了要存储一个最多只有十几字节的密码就增加一个存储器、似乎不是很值,最好是所选的单片机自带这样的存储器(容量很小、如 32B)。固然假设电源来自市电的话, 就不会常常掉电了。2.0 系统的最好再增加电源监测的设计,在电池电力不够时发出提示。这时还可以增加备用电

5、池,这样就可以保证系统不会掉电。但是这些都要依靠于本钱。3.0 液晶的显示最好承受中文。通过对 1602 的CGRAM 的操作可以实现中文显示,使得用户界面更好。主函数:5 / 325 / 3251 单片机密码锁制作的程序和流程图确认函数_ confirm操作:0_将 ”0” 置于输入table_input结尾(table_input的长度返回值在length 里面) 依据操作标识选择任务:1_确认密码:判定输入密码正确与否6 / 326 / 3251 单片机密码锁制作的程序和流程图2_修改密码:确认第一次输入并保存要求其次次输入比较两次输入是否一样依据比较结果选择任务:修改失败,进入输入密码

6、态修改成功,将输入复制到table_password确认函数_confirm相关标识位名目: flag_display;/依据其值可以确定显示信息flag_confirm;/确认键依据此标识判定任务,默认为 0_即为确定密码状态flag_allow;/允许修改密码标识,在密码比较正确时置 1 flag_amend;/第一/二次输入密码标识flag_M;/允许电机开锁标识相关变量sbit M=P36;/电机把握口flag_confirm;/操作任务标识位flag_compare;/比较输入与密码|相等时返回 1,否则返回 0static flag_amend;/修改密码时的标识第一次输入前=1,

7、输入后置 2其次次输入前=2,输入后置 07 / 327 / 3251 单片机密码锁制作的程序和流程图flag_display=0;/确认键操作的返回值依据返回值可以确定显示信息flag_allow;/允许改密码标识,在密码比较正确时置 1,不正确时置 0process_char函数:_M;/DC 电机把握口process_char函数:_length;/跟踪记录输入table_input11的字符长度( =10 )lcd_display函数中标识位flag_display 的值与意义:=0:不显示|不刷显示=1:密码错误=2:密码正确=3:请输入密码=4:请再次输入密码=5:密码修改成功=6

8、:密码修改失败=7:显示输入密码状态_The password!=8:放弃修改密码=9:已开锁流图不怎么清楚、不过下一篇就是程序了,可以从程序推出流图。程序比较多,所以写成了几个文件,同时应用了相当多的标识位来8 / 328 / 3251 单片机密码锁制作的程序和流程图进展信号传递。我觉得边看程序边画它的流程图会更好地帮助我们读程序。1.0main.c 文件#include #include #include“mydefine_2.h“static void delay(unsigned int N)/N ms 延时_12MHz/准确性高unsigned int i=0,j=0; for(i=

9、1;i=N;i+) for(j=1;j=355;j+) ;void clockkey_clock=0; delay(15); key_clock=1;10 / 3210 / 32void initkey_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 maininit;while(1)temp=keyb

10、oard_matrix;/扫描输入if(temp)/有按键输入信息clock;/按键声TR0=0;/关闭计时timer=0;receive(temp);/输入的字符串长度为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

11、=0;i=0;break;lcd_display(flag_display);elseTR0=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_sys

12、tem;/恢复初始态i=0;key_clock=0; delay(250); key_clock=1; PCON|=0x01;lcd_display(7);/唤醒CPU 后显示初始态void int0 interrupt 0key_LCD=0;/开液晶电源key_clock=0;delay(250);key_clock=1; flag_clear=1;void Timer0 interrupt 1 /50msTH0=0x3C;/(65535-50000)/256 TL0=0xAF;/(65535-50000)%256timer+;2.0负责实现具体操作的 process_char.c 文件#i

13、nclude #include #include“mydefine.h“sbit key_self=P21;/独立按键,用于恢复初始密码sbit key_LED=P20;sbit key_M=P24;/DC 电机把握口sbit key_LCD=P27;/液晶电源把握口extern bit flag_clear;/恢复密码和开锁键_外部中断的有效标识extern unsigned int timer;/定时器 0 计数时段标记_50ms 一次定时中断extern unsigned char length=0;/跟踪记录输入table_input11的字符长度( =10 )extern unsig

14、ned 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(un

15、signed 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_i

16、nput 中的值extern void clear_systemtable_input0=”0”;/恢复初始态length=0;flag_allow=0; flag_confirm=0; flag_amend=0; flag_clear=0; key_LCD=1;/关液晶电源/接收键盘输入|以字符形式存入table_input11 extern void receive(unsigned char temp)/按键在松手时读取按键号,故不会重复读取按键值if(temp & length 0)/输入不为空table_inputlength=”0”; length=0;/输入字符串长度清 0if(

17、flag_confirm)/修改密码switch(flag_amend)case 1: strcpy(table_newpassword,table_input);/第一次输入密码table_input1=”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(!fla

18、g_compare_2)/两次输入一样=0strcpy(table_password,table_input); table_input1=”0”;/避开修改完成后再次被利用,造成重复修改,同时避开刚修改了就是pass 状态lcd_display(5);/修改成功delay(500);flag_display=7;elselcd_display(6);/修改失败delay(500); flag_display=7;break;else/验证密码flag_compare=strcmp(table_input,table_password); if(!flag_compare)/密码正确=0fla

19、g_allow=1;/允许修改密码flag_M=1;/允许开锁flag_display=2;/密码正确信息:Pass!table_input1=”0”;/转变输入,使不致出乱else/密码错误flag_allow=0;/不允许修改密码lcd_display(1);/密码错误信息:Error! delay(500);flag_display=7;/电机把握extern void DC_Moterif(flag_M)/允许开锁flag_M=0;key_M=0;/开锁key_LED=0; delay(1250); key_M=1; key_LED=1; timer=0;lcd_display(7);

20、/进入初始态/恢复初始密码extern void resume_passwordif(!key_self)/=0delay(3); if(!key_self)/=0while(!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_

21、修改密码:确认第一次输入并保存要求其次次输入比较两次输入是否一样依据比较结果选择任务:修改失败,进入输入密码态修改成功,将输入复制到table_password确认函数_confirm相关标识位名目: flag_display;/依据其值可以确定显示信息flag_confirm;/确认键依据此标识判定任务,默认为 0_即为确定密码状态flag_allow;/允许修改密码标识,在密码比较正确时置 1 flag_amend;/第一/二次输入密码标识flag_M;/允许电机开锁标识相关变量sbit M=P36;/电机把握口flag_confirm;/操作任务标识位flag_compare;/比较输入

22、与密码|相等时返回 1,否则返回 0static flag_amend;/修改密码时的标识第一次输入前=1,输入后置 2其次次输入前=2,输入后置 0flag_display=0;/确认键操作的返回值依据返回值可以确定显示信息flag_allow;/允许改密码标识,在密码比较正确时置 1,不正确时置 0process_char函数:_M;/DC 电机把握口process_char函数:_length;/跟踪记录输入table_input11的字符长度( =10 )lcd_display函数中标识位flag_display 的值与意义:=0:不显示|不刷显示=1:密码错误=2:密码正确=3:请输

23、入密码=4:请再次输入密码=5:密码修改成功=6:密码修改失败=7:显示输入密码状态_The password!=8:放弃修改密码=9:已开锁3.0定义各个数组的头文件mydefine.hextern unsigned char table_input11=0;/接收键盘输入unsigned char table_password11=“123456“;/密文unsigned char table_newpassword11=“456“;/接收密码unsigned char code table_original11=“123456“; /初始密码/显示信息unsigned char code

24、 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

25、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=P20;sb

26、it key_clock=P33;/蜂鸣器sbit key_LCD=P27;/液晶电源把握口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_input11;/接收输入extern unsigned char flag_allow;/允许改密码标识,在密码比

27、较正确时置 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

28、 char command); extern void display(unsigned char date);/键盘:extern_keyboard_no_T0_2.c*/矩阵键盘.无按键动作时其返回值num_key=0,否则返回按键号num_keyextern 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;/恢复初始密码

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!