版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、电子技术综合设计总结报告基于51单片机的电子密码锁姓 名: 学 号: 专业与班级: 设计题目: 基于51单片机的电子密码锁 时 间: 2011 2012 学年第(1)学期 指导教师: 成 绩: 日 期: 第一章 课题任务基于51单片机的简易电子密码锁一、 实现功能:1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。4、at24c02
2、保存密码,支持复位保存,掉电保存功能。第2章 系统总体方案设计方案一:采用数字电路控制。其原理方框图如图21所示。图21 数字密码锁电路方案采用数字密码锁电路的好处就是设计简单。用以74ls112双jk触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。电路由两大部分组成:密码锁电路和备用
3、电源(ups),其中设置ups电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。方案二:采用一种是用以at89s51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的io端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图22所示。显示模块键盘输入模块 at89c51报警电路复位电路开锁电路密码存储模块图22单片机控制方案通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而
4、且还可以方便的对系统进行升级,所以我们采用后一种方案。本方案采用一种是用以89c51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的i/o端口,及其控制的准确性,实现基本的密码锁功能。作用说明:开锁: 插上电源后,输入正确密码,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。1、 退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。2、 修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【d】(重设)键,再重复输入一次新密码并按【d】,会听到报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒
5、内又有按键,3秒再启动。当重置新密码时,新密码会保存于at24c02存储器里。第3章 硬件电路设计3.1 键盘电路设计使用矩阵键盘,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的i/o线的数目,在按键比较多的时候,通常采用这样方法。其原理如图3.1。图3.1 矩阵键盘每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要n条行线和m条列线,即可组成具有nm个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识
6、别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。对照图3.1所示的44键盘,说明线反转个工作原理。首先辨别键盘中有无键按下,有单片机i/o口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00h,把全部列线置为低电平,然后将列线的电平状态读入累加器a中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键
7、。具体的功能设计如下按键说明采用4x4键盘输入,键盘对应名称如下:4 2 3 a4 5 6 b7 8 9 c* 0 # d其中,【09】为数字键,用于输入相应的密码, 【*】号键为取消当前操作【#】号键为确认其它键无功能及定义3.2开关电路当输入正确密码时,二极管导通发光。输入错误密码时,二极管不能导通3.3报警电路当输入错误密码时,电路中蜂鸣器开始报警。当输入密码错误三次时,蜂鸣器持续报警34,密码存储模块密码经过修改后,存储在at24c02中,从而实现掉电保护3.5复位电路第四章 软件设计主程序设计流程图如图5-1所示。 开始 初始化 修改开锁密码正确 输入旧密码n原密码相同 y开锁出错报
8、警 n n y设新密码 返回 图5-1主程序流程图键功能程序流程图如图5-2所示。 键功能程序键值=09?键值=开锁?键值=确认?键值=设置? 返回密码输入程序确认程序设置程序开锁程序ynynyn yn 图5-2 键功能流程图开锁程序流程图如图5-3所示。lcd初始化按开锁键输入密码确认程序开锁n输入密码正确?报警程序开锁成功返回y 图5-3 开锁流程图程序如下:#include #include#define lcm_data p0#define uchar unsigned char #define uint unsigned int#define w 6/定义密码位数sbit lcd16
9、02_rs=p25;sbit lcd1602_rw=p26;sbit lcd1602_en=p27;sbit scl=p34;/24c02串行时钟sbit sda=p35;/24c02串行数据sbit alam = p21;/报警sbit key = p20;/开锁sbit open_led=p22;/开锁指示灯bit operation=0;/操作标志位bit pass=0;/密码正确标志bit reinputen=0;/重置输入充许标志bit s3_keydown=0;/3秒按键标志位bit key_disable=0;/锁定键盘标志unsigned char countt0,second
10、;/t0中断计数器,秒计数器void delay5ms(void);unsigned char code a=0xfe,0xfd,0xfb,0xf7; /控盘扫描控制表unsigned char code start_line= “password: “;unsigned char code name = “=coded lock=”;/显示名称unsigned char code correct = “ correct “; /输入正确unsigned char code error = “ error “; /输入错误unsigned char code codepass= “ pass
11、“; unsigned char code lockopen= “ open “;/openunsigned char code setnew = “setnewwordenable”;unsigned char code input = “input: “;/inputunsigned char code resetok = “resetpasswordok “;unsigned char code initword= “init password.”;unsigned char code er_try= “error,try again!”;unsigned char code again
12、= “input again “;unsigned char inputdata6;/输入密码暂存区unsigned char currentpassword6=1,3,1,4,2,0; /当前密码值unsigned char temppassword6;unsigned char n=0;/密码输入位数记数unsigned char errorcont;/错误次数计数unsigned char correctcont;/正确输入计数unsigned char reinputcont; /重新输入计数unsigned char code initpassword6=0,0,0,0,0,0;/=
13、5ms延时=void delay5ms(void)unsigned int tempcyc = 5552;while(tempcyc-);/=400ms延时=void delay400ms(void) unsigned char tempcyca = 5; unsigned int tempcycb; while(tempcyca-) tempcycb=7269; while(tempcycb-); /=/=24c02=/=void mdelay(uint t) /延时 uchar i; while(t-) for(i=0;i125;i+) ; void nop(void) /空操作 _nop
14、_(); _nop_(); _nop_(); _nop_();/*起始条件*/void start(void) sda=1; scl=1; nop(); sda=0; nop(); /*停止条件*/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
15、 data) uchar bitcounter=8; uchar temp; do temp=data; scl=0; nop(); if(temp&0x80)=0x80) sda=1; else sda=0; scl=1; temp=data1; data=temp; bitcounter-; while(bitcounter); scl=0;/*读一字节的数据,并返回该字节值*/uchar read(void)uchar temp=0;uchar temp1=0;uchar bitcounter=8;sda=1;doscl=0;nop();scl=1;nop();if(sda)temp=t
16、emp|0x01;elsetemp=temp&0xfe;if(bitcounter-1)temp1=temp1;temp=temp1;bitcounter-;while(bitcounter);return(temp);void wrtorom(uchar data,uchar address,uchar num) uchar i; uchar *pdata; pdata=data; for(i=0;inum;i+) start(); send(0xa0); ack(); send(address+i); ack(); send(*(pdata+i); ack(); stop(); mdela
17、y(20); void rdfromrom(uchar data,uchar address,uchar num) uchar i; uchar *pdata; pdata=data; for(i=0;i0;x-) for(y=110;y0;y-);/-写指令-write_1602com(uchar com)/*液晶写入指令函数*lcd1602_rs=0;/数据/指令选择置为指令lcd1602_rw=0; /读写选择置为写p0=com;/送入数据delay(1);lcd1602_en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;/en由高变低,产生下降
18、沿,液晶执行命令/-写数据-write_1602dat(uchar dat)/*液晶写入数据函数*lcd1602_rs=1;/数据/指令选择置为数据lcd1602_rw=0; /读写选择置为写p0=dat;/送入数据delay(1);lcd1602_en=1; /en置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; /en由高变低,产生下降沿,液晶执行命令/-初始化-void lcd_init(void)write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);/开显示不显示光标writ
19、e_1602com(0x06);/整屏不移动,光标自动右移write_1602com(0x01);/清显示/=/=/=将按键值编码为数值=unsigned char coding(unsigned char m) unsigned char k;switch(m)case (0x18): k=1;break;case (0x28): k=2;break;case (0x48): k=3;break;case (0x88): k=a;break;case (0x14): k=4;break;case (0x24): k=5;break;case (0x44): k=6;break;case (0
20、x84): k=b;break;case (0x12): k=7;break;case (0x22): k=8;break;case (0x42): k=9;break;case (0x82): k=c;break;case (0x11): k=*;break;case (0x21): k=0;break;case (0x41): k=#;break;case (0x81): k=d;break;return(k);/=按键检测并返回按键值=unsigned char keynum(void) unsigned char row,col,i; p1=0xf0; if(p1&0xf0)!=0xf
21、0) delay5ms(); delay5ms(); if(p1&0xf0)!=0xf0) row=p10xf0; /确定行线i=0;p1=ai; /精确定位while(i4) if(p1&0xf0)!=0xf0) col=(p1&0xff); /确定列线 break; /已定位后提前退出 else i+; p1=ai; else return 0;while(p1&0xf0)!=0xf0);return (row|col); /行线与列线组合后返回 else return 0; /无键按下时返回0/=一声提示音,表示有效输入=void onealam(void)alam=0;delay5ms
22、();alam=1;/=二声提示音,表示操作成功=void twoalam(void)alam=0;delay5ms();alam=1;delay5ms();alam=0;delay5ms();alam=1;/=三声提示音,表示错误=void threealam(void)alam=0;delay5ms();alam=1;delay5ms();alam=0;delay5ms();alam=1;delay5ms();alam=0;delay5ms();alam=1;/=显示输入的n个数字,用h代替以便隐藏=void displayone(void)/displayonechar(9+n,1,*)
23、;write_1602com(yi+5+n);write_1602dat(*);/=显示提示输入=void displaychar(void)unsigned char i;if(pass=1)/displaylistchar(0,1,lockopen);write_1602com(er);for(i=0;i16;i+)write_1602dat(lockopeni);elseif(n=0)/displaylistchar(0,1,error);write_1602com(er);for(i=0;i16;i+)write_1602dat(errori);else/displaylistchar
24、(0,1,start_line);write_1602com(er);for(i=0;i16;i+)write_1602dat(start_linei);void displayinput(void)unsigned char i;if(correctcont=1)/displaylistchar(0,0,input);write_1602com(er);for(i=0;i16;i+)write_1602dat(inputi);/=重置密码=/=void resetpassword(void)unsigned char i;unsigned char j;if(pass=0)pass=0;di
25、splaychar();threealam();else if(reinputen=1)if(n=6)reinputcont+;if(reinputcont=2)for(i=0;i6;)if(temppasswordi=inputdatai)/将两次输入的新密码作对比i+;else/displaylistchar(0,1,error);write_1602com(er);for(j=0;j16;j+)write_1602dat(errorj);threealam();/错误提示pass=0;reinputen=0;/关闭重置功能,reinputcont=0;displaychar();brea
26、k; if(i=6)/displaylistchar(0,1,resetok);write_1602com(er);for(j=0;j16;j+)write_1602dat(resetokj);twoalam();/操作成功提示 wrtorom(temppassword,0,6);/将新密码写入24c02存储reinputen=0;reinputcont=0;correctcont=0;elseonealam();/displaylistchar(0, 1, again); /显示再次输入一次write_1602com(er);for(j=0;j16;j+)write_1602dat(agai
27、nj);for(i=0;i6;i+)temppasswordi=inputdatai;/将第一次输入的数据暂存起来n=0;/输入数据位数计数器清零 /=输入密码错误超过三过,报警并锁死键盘=void alam_keyunable(void)p1=0x00;alam=alam;delay5ms();/=取消所有操作=void cancel(void)unsigned char i;unsigned char j;/displaylistchar(0, 1, start_line); write_1602com(er);for(j=0;j16;j+)write_1602dat(start_line
28、j);twoalam();/提示音for(i=0;i6;i+)inputdatai=0;key=1;/关闭锁alam=1;/报警关operation=0;/操作标志位清零pass=0;/密码正确标志清零reinputen=0;/重置输入充许标志清零errorcont=0;/密码错误输入次数清零correctcont=0;/密码正确输入次数清零reinputcont=0;/重置密码输入次数清零 open_led=1;s3_keydown=0;key_disable=0;n=0;/输入位数计数器清零/=确认键,并通过相应标志位执行相应功能=void ensure(void)unsigned cha
29、r i,j;rdfromrom(currentpassword,0,6); /从24c02里读出存储密码if(n=6) if(reinputen=0)/重置密码功能未开启for(i=0;i6;) if(currentpasswordi=inputdatai)i+;else errorcont+;if(errorcont=3)/错误输入计数达三次时,报警并锁定键盘write_1602com(er);for(i=0;i16;i+)write_1602dat(errori);doalam_keyunable();while(1);elsetr0=1;/开启定时key_disable=1;/锁定键盘p
30、ass=0;break;if(i=6)correctcont+;if(correctcont=1)/正确输入计数,当只有一次正确输入时,开锁,/displaylistchar(0,1,lockopen);write_1602com(er);for(j=0;j16;j+)write_1602dat(lockopenj);twoalam();/操作成功提示音key=0;/开锁pass=1;/置正确标志位tr0=1;/开启定时open_led=0;/开锁指示灯亮for(j=0;j6;j+)/将输入清除inputdatai=0;else/当两次正确输入时,开启重置密码功能/displaylistcha
31、r(0,1,setnew);write_1602com(er);for(j=0;j16;j+)write_1602dat(setnewj);twoalam(); /操作成功提示reinputen=1;/允许重置密码输入correctcont=0;/正确计数器清零 else/=当第一次使用或忘记密码时可以用131420对其密码初始化=if(inputdata0=1)&(inputdata1=3)&(inputdata2=1)&(inputdata3=4)&(inputdata4=2)&(inputdata5=0) wrtorom(initpassword,0,6); /强制将初始密码写入24c0
32、2存储/displaylistchar(0,1,initword);/显示初始化密码write_1602com(er);for(j=0;j16;j+)write_1602dat(initwordj);twoalam();delay400ms();twoalam();n=0;else/displaylistchar(0,1,error);write_1602com(er);for(j=0;j16;j+)write_1602dat(errorj); threealam();/错误提示音pass=0;else/当已经开启重置密码功能时,而按下开锁键,/displaylistchar(0,1,er_t
33、ry);write_1602com(er);for(j=0;j16;j+)write_1602dat(er_tryj);threealam();else/displaylistchar(0,1,error);write_1602com(er);for(j=0;j16;j+)write_1602dat(errorj); threealam();/错误提示音pass=0;n=0;/将输入数据计数器清零,为下一次输入作准备operation=1;/=主函数=void main(void) unsigned char key,num;unsigned char i,j; p1=0xff; tmod=0x11; tl0=0xb0; th0=0x3c; ea=1; et0=1; tr0=0; delay400ms(); /启动等待,等lcm讲入工作状态 lcd_init(); /lcd初始化write_1602com(yi);/日历显示固定符号从第一行第0个位置之后开始显示for(i=0;i16;i+)write_1602dat(namei);/向液晶屏写日历显示的固定符号部分write_1602com(er);/时间显示固定符号写入位置,从第2个位置后开始显示for(i=0;i16;i+)write_1602dat(start_line
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024甲方与乙方关于新能源发电项目的建设与运营合同
- 2024独家代理销售协议标准格式版
- 2024版标准担保协议中英文本版B版
- 二零二五年度夫妻分居期间财产管理合同3篇
- 2024版详尽连带担保合同电子版下载版B版
- 二零二五年度导购员客户关系管理与维护合同3篇
- 二零二五年度城市基础设施建设项目质押担保借款合同3篇
- 2024版事业单位人员聘用合同范文
- 2025年蚌埠货运从业资格仿真考题
- 2024经纪人与艺人签约协议
- 矿业公司规章制度汇编
- 《高低压配电室施工工艺标准》
- 《国家课程建设》课件
- 新教科版小学1-6年级科学需做实验目录
- 2024年贵州贵阳市贵安新区产业发展控股集团有限公司招聘笔试参考题库含答案解析
- 福建省厦门市2023-2024学年高二上学期期末考试语文试题(解析版)
- 美国RAZ分级读物目录整理
- 全口义齿-印模与模型-课件PPT
- 地方课程六年级上册
- 中科院大连化物所模板PPT课件
- YOX液力偶合器使用说明书
评论
0/150
提交评论