多功能电子密码锁设计报告.doc_第1页
多功能电子密码锁设计报告.doc_第2页
多功能电子密码锁设计报告.doc_第3页
多功能电子密码锁设计报告.doc_第4页
多功能电子密码锁设计报告.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

电子系统设计报告系 部: 物理与机电工程学院 实验项目: 多功能密码锁 专业班级: 学 号: 学生姓名: 同组成员: 指导教师: 完成时间: 2011-06-19 报告成绩: 评阅意见: 评阅教师 日期 电子密码锁一、设计任务与要求1、采用stc89c52单片机为主控芯片,结合外围电路,通过软件程序实现多功能电子密码锁功能;2、在没输入密码时显示万年历,并可调;3、通过按键来确定输入密码,实现密码锁功能,正确输入密码后有开锁提示;二、方案设计与论证方案一:采用数字电路控制用以74ls112双jk触发器构成的数字逻辑电路作为密码锁的核心控制,将密码保存在jk触发器中,与输入密码通过比较器比较,判断结果是否相符合4。采用数字电路设计的方案好处就是设计简单,但控制的准确性和灵活性差,故不采用。方案二:采用以单片机为核心的控制方案选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机内部的随机存储器(ram)和只读存储器(rom)及其引脚资源,外接液晶显示(lcd),键盘输入等实现数据的处理传输和显示功能,基本上能实现设计指标。因此综合考虑,本系统采用方案二。三、硬件电路设计本设计主要由单片机、矩阵键盘、独立按键、液晶显示器等部分组成。其中矩阵键盘用于输入数字密码,独立按键用于实现可调万年历。由用户通过连接单片机的矩阵键盘输入密码,后经过单片机对用户输入的密码与自己保存的密码进行对比,从而判断密码是否正确,然后控制引脚的高低电平传到开锁电路或者报警电路控制开锁还是报警,实际使用时只要将单片机的负载由继电器换成电子密码锁的电磁铁吸合线圈即可。系统整体框图如图3-1所示。显示模块键盘输入模块 stc89c52复位电路开锁电路独立按键图3-1 系统结构框图各模块功能如下:1键盘输入模块:分为密码输入按键与几个功能按键,用于完成密码锁输入功能。2显示模块:用于完成对系统状态显示及操作提示功能。3复位电路:完成系统的复位。4独立键盘:用于完成可调万年历功能。6开锁电路:应用继电器及发光二极管模拟开锁,完成开锁及开锁提示。(一)、各个模块设计:1、复位电路模块:该电路上电单片机自动复位,按下按键手动复位。2、晶振电路模块:3、开关电路模块:4、矩阵键盘电路模块:用p1口组成4*4的矩阵键盘,各键的定义一次为:0、1、2、3、4、5、6、7、8、9、*、#、enetr(程序中设计只有该键按下才能进行密码输入等操作)、del(当密码按错时可以按下该键删除)、unclock(解锁键,即三次密码都错了只能按下它进行解锁)。5、独立按键模块: tiao是位功能选择,通过选择位来决定万年历的调整,+1、-1是调节功能键。5、液晶1602显示电路模块:6、继电器电路模块: 6、原理图7、pcb图四、软件设计总程序流程图如下:开始初始化tiao按下否?enter按下否?ny第几次按下?“+”功能键按下否“-”功能键按下否3秒到否nnyyynyny位选择被调数加一被调数减一输入密码密码输入错误?ok!yn显示调后万年历第八次按下结束n键功能程序流程图如下图所示: 键功能程序键值=09?键值=开锁?键值=确认?键值=设置? 返回密码输入程序确认程序设置程序开锁程序ynynyn yn 开锁程序流程图如下图所示:lcd初始化按开锁键输入密码确认程序开锁n输入密码正确?报警程序开锁成功返回y 开锁流程图程序清单见附录六、仿真过程与仿真结果 上电初始状态仿真图:按下独立按键tiao后,选择位功能仿真图如下:调整完时间之后:请输入密码,程序实时扫描矩阵键盘的输入:密码输入正确的仿真效果图,继电器处于工作状态:密码输入正确后3秒钟跳回时间显示:密码输入出错时仿真效果图:六、安装与调试 经过腐蚀制板、焊接元件,再上电调试各模块电路都能按照仿真里的正常工作。初始上电的时候lcd1602上电显示:设置正常其他状态都能正常显示4*4矩阵键盘各功能键正常工作,密码键正常输入独立按键各功能键能正常工作开锁驱动电路(8550驱动继电器)有开锁信号时继电器正常动作七、结论与心得 八、参考文献1 叶启明.单片机制作的新型安全密码锁j.家庭电子.2000,第六期:24-272 郭海英.基于单片机的电子安全密码锁的设计j.现代电子技术.2005,第三期:57-583 李明喜.新型电子密码锁的设计j.机电产品开发与创新.2004,第八期:77-794 祖龙起.刘仁杰.孙乃凌.一种新颖的电子密码锁j.电子世界.2001,第六期:88-905 李明喜.新型电子密码锁的设计j.机电产品开发与创新.2004,第五期:22-286 长沙太阳人电子有限公司通用型1602液晶pdf资料.7 周立功单片机开发网.附1:程序清单如下: #include #define lcd p2 #define uchar unsigned char #define uint unsigned int#define no_key 20 /无按键时的返回值sbit rs=p30;sbit rw=p31;/lcd数据命令选择端sbit e=p32;/lcd使能信号端sbit key1=p33; sbit key2=p34; sbit key3=p35; sbit key=p37;/开锁信号控制端sbit enter=p13;/该键按下后才能进行输入密码等操作uchar conflag,keyflag=3;uchar jz=20;/键值变量uchar temp1;/用此变量来存储键盘扫描的返回值,以便判断是否有键按下uchar code table06=3,0,3,0,3,0;/初始密码uchar code table96=3,1,3,1,3,1;/初始密码uchar code table1=2011-05-07 w-6;uchar code table2= time-03:03:00;uchar code table3=enter please:;uchar code table4=ok!;uchar code table6=erro!;uchar code table7=enter again:;uchar code table8=locked!;uchar code table10=unlocked!;uchar code table11=cant open!;unsigned char m;uchar num,t0,keynum,hour,min,sec,year,month,day,week; uchar table56;/定义输入密码值存储数组/*函数名称:delay*函数功能:软件延时,时间为z毫秒*入口参数:z延时控制值,值越大,延时越长*出口参数:无*/void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*函数名称:write_com*函数功能:1602写命令函数,可以用此函数写不同的指令*入口参数:com*出口参数:无*/void write_com(uchar com)rs=0;rw=0;e=0;p2=com;delay(5);e=1;delay(5);e=0;/*函数名称:write_date*函数功能:1602写数据函数,可以用此函数写不同的数据,程序对应的硬件1602的数据口为p2口*入口参数:date*出口参数:无*/void write_date(uchar date)rs=1;rw=0;e=0;p2=date;delay(5);e=1;delay(5);e=0; /*显示位*/ void write_week(uchar dte) uchar shi,ge; shi=dte/10; ge=dte%10; write_com(0x80+13); write_date(0x30+ge);void write_clock(uchar add,uchar dat) uchar first,second; second=dat/10; first=dat%10; write_com(0x80+0x40+add); write_date(0x30+second); write_com(0x80+0x40+add+1); write_date(0x30+first); void write_nyr(uchar add,uchar dte) uchar shi,ge; shi=dte/10; ge=dte%10; write_com(0x80+add); delay(5); write_date(0x30+shi); write_com(0x80+add+1); delay(5); write_date(0x30+ge); /*函数名称:init*函数功能:初始化函数*入口参数:无*出口参数:无*/void init()uchar hour=3,min=3,year=11,month=5,day=7,week=6; uchar num; e=0;write_com(0x38);/设置16*2显示,5*7点阵,8位数据接口write_com(0x0c);/开显示,不显示光标write_com(0x06);/当读或写一个字符后地址指针加1,且光标加1write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80);/设置数据地址指针for(num=0;num15;num+)write_date(table1num);/lcd显示初始设置时间;delay(5);write_com(0x80+0x40);for(num=0;num14;num+)write_date(table2num);/lcd显示初始设置时间;delay(5); /*定时器初始化*/ tmod=0x01; th0=(65536-50000)/256; tl0=(65536-50000)%256; ea=1; et0=1; tr0=1; while(1) if(key1=0) /时钟设置/key1按下 delay(5); if(key1=0) /key1真的按下了 keynum+; while(!key1) /去键抖 tr0=0; /时钟暂停 if(keynum=1) /key1按下第一次 write_com(0x80+0x40+13); write_com(0x0f); if(keynum=2) /key1按下第二次 write_com(0x80+0x40+10); if(keynum=3) /key1按下第三次 write_com(0x80+0x40+7); if(keynum=4) /key1按下第三次 write_com(0x80+13); if(keynum=5) /key1按下第三次 write_com(0x80+9); if(keynum=6) /key1按下第三次 write_com(0x80+6); if(keynum=7) /key1按下第三次 write_com(0x80+3); if(keynum=8) /key1按下第四次 keynum=0; /按键次数清零 write_com(0x0c); tr0=1; /继续运行时钟 /*按键加*/ if(keynum!=0) if(key2=0) delay(80); if(key2=0) while(!key2); if(keynum=1) sec+; if(sec=60) sec=0; write_clock(12,sec); write_com(0x80+0x40+13); if(keynum=2) min+; if(min=60) min=0; write_clock(9,min); write_com(0x80+0x40+10); if(keynum=3) hour+; if(hour=24) hour=0; write_clock(6,hour); write_com(0x80+0x40+7); if(keynum=4) week+; if(week=8) week=1; write_week(week); write_com(0x80+13); if(keynum=5) day+; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) if(day=32) day=1; else if(month=2) /注意这里没有考虑闰年 if(day=29) day=1; else if(day=31) day=1; write_nyr(8,day); write_com(0x80+9); if(keynum=6) month+; if(month=13) month=1; write_nyr(5,month); write_com(0x80+6); if(keynum=7) year+; if(year=99) year=0; write_nyr(2,year); write_com(0x80+3); /*按键减*/ if(key3=0) delay(80); if(key3=0) while(!key3); if(keynum=1) sec-; if(sec=-1) sec=59; write_clock(12,sec); write_com(0x80+0x40+13); if(keynum=2) min-; if(min=-1) min=59; write_clock(9,min); write_com(0x80+0x40+10); if(keynum=3) hour-; if(hour=-1) hour=23; write_clock(6,hour); write_com(0x80+0x40+7); if(keynum=4) week-; if(week=0) week=7; write_week(week); write_com(0x80+13); if(keynum=5) day-; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) if(day=0) month=31; else if(month=2) /注意这里没有考虑闰年 if(day=0) day=28; else if(day=0) day=30; write_nyr(8,day); write_com(0x80+9); if(keynum=6) month-; if(month=0) month=12; write_nyr(5,month); write_com(0x80+6); if(keynum=7) year-; if(year=-1) year=99; write_nyr(2,year); write_com(0x80+3); p1=14|10|11|12|13|15|16|07; if(enter=0)break; /*检测enter(p1.3)键是否按下,只有该键按下才能进行输入密码等操作*/p1=04|10|11|12|13|15|16|17;while(enter);if(enter=0)delay(5);if(enter=0) tr0=0; write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x02);/设置数据地址指针 for(num=0;num13;num+) write_date(table3num);/lcd显示“enter please:”delay(5); while(!enter);/判断按键是否释放 delay(5); while(!enter); p1=0xff; /*函数名称:keyscan*函数功能:3*4键盘扫描*入口参数:无*出口参数:jz*/ uchar keyscan() uchar temp;p1=0xfe;/第一行扫描temp=p1;temp=temp&0xf0; while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xee:jz=0;break;case 0xde:jz=1;break;case 0xbe:jz=2;break;case 0x7e:jz=3;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;p1=0xfd;/第二行扫描temp=p1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xed:jz=4;break;case 0xdd:jz=5;break;case 0xbd:jz=6;break;case 0x7d:jz=7;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;p1=0xfb;/第三行扫描temp=p1;temp=temp&0xf0;while(temp!=0xf0)delay(5);temp=p1;temp=temp&0xf0;while(temp!=0xf0)temp=p1;switch(temp)case 0xeb:jz=8;break;case 0xdb:jz=9;break;case 0xbb:jz=*;break;case 0x7b:jz=#;break;while(temp!=0xf0)temp=p1;temp=temp&0xf0;return jz;/*函数名称:codein*函数功能:完成密码输入,并判断密码是否正确*入口参数:无*出口参数:无*/void codein() uchar t=0;write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t6;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 p1=0xdf;/判断是否要删除输入的密码 if(enter=0) delay(5);if(enter=0) write_com(0x80+0x41+t); /确定删除对象 write_date( ); /显示空格即为删除 t-; while(!enter);/判断按键是否释放 delay(5); while(!enter); / p1=0xff temp1=keyscan();/继续扫描按键直至有键按下 table5t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示“*” delay(5);jz=20; t=0; for(t=0;t6;t+) if(table5t!=table0t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=6)/要是条件退出的话说明六个数全对密码 conflag=1; / 进行标志密码正确 /*函数名称:codeout*函数功能:根据密码输入正确与否作出相应的反应*入口参数:无*出口参数:无*/void codeout() uchar t; if(conflag) t=0; write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x07);/设置数据地址指针 for(t=0;t3;t+) write_date(table4t);/lcd显示“ok!”delay(5); key=0; while(1); if(!conflag) keyflag-; t=0; write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x05);/设置数据地址指针 for(t=0;t5;t+) write_date(table6t);/lcd显示“erro!”delay(5); write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x02);/设置数据地址指针 for(t=0;t12;t+) write_date(table7t);/lcd显示“enter again:” delay(5); /*函数名称:codeen*函数功能:当密码输入错误次数达到3次时,要按下解锁键,输入万能密码,此函数能判断万能密码正确与否并做出相应反应*入口参数:无*出口参数:无*/void codeen() uchar t=0;write_com(0x80+0x40+0x02);/重新设置lcd数据地址指针for(t=0;t6;t+) temp1=keyscan(); while(temp1=no_key)/若相等则此时没有键按下 /p1=0xdf;p1=05|10|11|12|13|14|16|17; if(enter=0) delay(5);if(enter=0) write_com(0x80+0x41+t); /确定删除对象 write_date( ); /显示空格即为删除 t-; while(!enter);/判断按键是否释放 delay(5); while(!enter); p1=0xff;temp1=keyscan();/继续扫描按键直至有键按下 table5t=temp1;/实时保存输入密码值write_com(0x80+0x41+t); /重新设置数据地址指针 write_date(*);/lcd显示“*” delay(5);jz=20; t=0; for(t=0;t6;t+) if(table5t!=table9t)/对数组中的内容进行逐一比较,一旦有数据不对马上退出循环 break; if(t=6)/要是条件退出的话说明六个数全对密码 t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x03);/设置数据地址指针for(t=0;t9;t+)write_date(table10t);/lcd显示“unlocked!”delay(5); while(1) key=0; else t=0;write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x03);/设置数据地址指针 for(t=0;t11;t+)write_date(table11t);/lcd显示“cant open!”delay(5); while(1)key=1; void main() uchar i=0; uchar j=0; init(); while(keyflag) codein();codeout(); write_com(0x01);/显示清屏:数据指针、所有显示清0write_com(0x80+0x04);/设置数据地址指针for(i=0;i7;i+)write_date(table8i);/lcd显示“locked!”delay(5); while(1) p1=0xbf; /判断解锁键是否按下 if(enter=0) delay(5);if(enter=0) write_com(0x01);/显示清屏:数据指针、所有显示清0 write_com(0x80+0x02);/设置数据地址指针 for(i=0;i13;i+) write_date(table3i);/lcd显示“seeting code:”delay(5); while(!enter);/判断按键是否释放 delay(5); while(!enter); p1=0xff;break; key=1; codeen(); /*定时器中断*/void timer0() interrupt 1 tmod=0x01; th0=(65536-50000)/256; tl0=(65536-50000)%256; t0+; if(t0=20) /1秒到清零 t0=0; sec+; if(sec=60) /1分钟到清零 sec=0; min+; if(min=60) min=0; hour+; if(hour=24) week+; if(week=8) week=1; write_week(week); if(hour=24) hour=0; day+; if(day=31) day=1; month+; if(month=13) month=1; year+;if(year=100) year=0;write_nyr(2,year); write_nyr(5,month); write_nyr(8,day); write_clock(6,hour); write_clock(9,min); write_clock(12,sec); 硕士论文 是硕士研究生所撰写的学术论文,具有一定的理论深度和更高的学术水平,更加强调作者思想观点的独创性,以及研究成果应具备更强的实用价值和更高的科学价值。硕士论文是硕士研究生所撰写的学术论文。优秀的硕士论文能够反映出作者对所学习专业的理论知识掌握的程度和水平,能够帮助作者构建起良好的完整的知识体系,还能够反映作者独立的科研能力和学术理论的应用水平,对研究的课题的思考和独立见解。较之学士论文,硕士论文应当具有一定的理论深度和更高的学术水平,更加

温馨提示

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

评论

0/150

提交评论