

免费预览已结束,剩余27页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一.设计目的在日常的生活和工作中,住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。若使用传统的机械式钥匙开锁,人们常需要携带多把钥匙,使用极不方便,且钥匙丢失后安全性即大打折扣。随着科学技术的不断发展,人们对日常生活中的安全保险器件的要求越来越高。为了满足人们对锁的使用要求,增加其安全性,用密码代替钥匙的密码锁应运而生。密码锁具有安全性高、成本低、功耗低、易操作等优点。在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少,安全性能差的缺点,使密码锁无论在技术上还是在性能上都大大提高一步。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的只能密码锁,它除了具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。本设计采用单片机为主控芯片,结合外围电路,组成电子密码锁,用户想要打开锁,必先通过提供的键盘输入正确的密码才能将锁打开,密码输入错误就有提示,为了提高安全性,当密码输入错误次将报警。密码可以由用户自己修改设定,锁开后才能修改密码。修改密码前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。二设计要求和方案选择1、 方案:用at89c52设计的多功能密码锁。以单片机作为微控制器,可以实现基于以上优点,按键有效指示、输入错误、控制开锁、错误报警、密码修改等功能,工作稳定可靠,保密性高,实用性强。at89c52晶振电路密码存储复位电路键盘输入开锁电路报警电路显示电路电源输入2、 电子密码锁总体设计三硬件部分at89c52简介:单片机at89c52简介at89c52是美国atmel公司生产的低电压,高性能cmos 8位单片机,片内含4k bytes的可反复擦写的只读程序存储器(eprom)和128bytes的随机存取数据序存器(ram),器件采用atmel公司的高密度/非易失性存储技术生产,兼容标准mcs-51指令系统,片内置通用8位中央处理器(cpu)和flash存储单元,at89c52单片机为许多嵌入式控制系统提供了一种灵活行高且价廉的方案。主要特性: 与mcs-51 兼容 4k字节可编程flash存储器(寿命:1000写/擦循环) 全静态工作:0hz-24khz 三级程序存储器保密锁定 128*8位内部ram 32条可编程i/o线at89c52 两个16位定时器/计数器 5个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路1. 总电路图 2. 键盘电路按键与家庭电话式的按键方式3. 复位电路4. 晶振电路5. 显示电路显示容量芯片工作电压工作电流字符尺寸16*2个字符4.55.5v2.0ma(5v)3.95*4.35mm时刻显示输入输出的内容以及操作过程。6. 报警电路当输入密码错误次数大于等于3次时,会发出声响报警。7. 开锁电路四软件设计1.程序设计流程图修改密码输入新密码修改密码键上锁上锁键判断按键结束开锁正确?输入密码开始2.程序代码#include #include#define lcm_data p0#define uchar unsigned char #define uint unsignedint#define w 6/定义密码位数sbit lcd1602_rs=p25;sbit lcd1602_rw=p26;sbit lcd1602_en=p27;sbitscl=p34;/24c02串行时钟sbitsda=p35;/24c02串行数据sbit alam = p21;/报警sbit key = p20;/开锁sbitopen_led=p22;/开锁指示灯bit operation=0;/操作标志位bit pass=0;/密码正确标志bit reinputen=0;/重置输入充许标志bit s3_keydown=0;/3秒按键标志位bit key_disable=0;/锁定键盘标志unsigned char countt0,second;/t0中断计数器,秒计数器void delay5ms(void);unsigned char code a=0xfe,0xfd,0xfb,0xf7; /控盘扫描控制表unsigned char code b=0123456789;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 ; 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= 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;/=5ms延时=void delay5ms(void)unsignedinttempcyc = 5552;while(tempcyc-);/=400ms延时=void delay400ms(void)unsigned char tempcyca = 5;unsignedinttempcycb;while(tempcyca-) tempcycb=7269;while(tempcycb-); /=24c02=void mdelay(uint t) /延时 uchari;while(t-)for(i=0;i125;i+);void nop(void) /空操作_nop_();_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();/*应答位*/voidack(void)sda=0;nop();scl=1;nop();scl=0;/*反向应答位*/voidnoack(void)sda=1;nop();scl=1;nop();scl=0; /*发送数据子程序,data为要求发送的数据*/void send(uchar data)ucharbitcounter=8;uchar temp;dotemp=data;scl=0;nop();if(temp&0x80)=0x80)sda=1;elsesda=0;scl=1;temp=data1;data=temp;bitcounter-;while(bitcounter);scl=0;/*读一字节的数据,并返回该字节值*/uchar read(void)uchar temp=0;uchar temp1=0;ucharbitcounter=8;sda=1;doscl=0;nop();scl=1;nop();if(sda)temp=temp|0x01;elsetemp=temp&0xfe;if(bitcounter-1)temp1=temp1;temp=temp1;bitcounter-;while(bitcounter);return(temp);voidwrtorom(uchar data,ucharaddress,ucharnum)uchari;uchar *pdata;pdata=data;for(i=0;inum;i+) start();send(0xa0);ack();send(address+i);ack();send(*(pdata+i);ack();stop();mdelay(20); voidrdfromrom(uchar data,ucharaddress,ucharnum)uchari;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由高变低,产生下降沿,液晶执行命令/-写数据-write_1602dat(uchardat)/*液晶写入数据函数*lcd1602_rs=1;/数据/指令选择置为数据lcd1602_rw=0; /读写选择置为写p0=dat;/送入数据delay(1);lcd1602_en=1; /en置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; /en由高变低,产生下降沿,液晶执行命令/-初始化-voidlcd_init(void)write_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);/开显示不显示光标write_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 (0x84): 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)!=0xf0)delay5ms();delay5ms();if(p1&0xf0)!=0xf0)row=p10xf0; /确定行线i=0;p1=ai;/精确定位while(i4)if(p1&0xf0)!=0xf0)col=(p1&0xff); /确定列线break; /已定位后提前退出 elsei+;p1=ai;elsereturn 0;while(p1&0xf0)!=0xf0);return (row|col);/行线与列线组合后返回else return 0;/无键按下时返回0/=一声提示音,表示有效输入=voidonealam(void)alam=0;delay5ms(); alam=1;/=二声提示音,表示操作成功=voidtwoalam(void)alam=0;delay5ms(); alam=1;delay5ms();alam=0;delay5ms(); alam=1;/=三声提示音,表示错误=voidthreealam(void)alam=0;delay5ms(); alam=1;delay5ms();alam=0;delay5ms(); alam=1;delay5ms();alam=0;delay5ms(); alam=1;/=显示输入的n个数字,用h代替以便隐藏=voiddisplayone(void)/displayonechar(9+n,1,*);write_1602com(yi+5+n);write_1602dat(*);/=显示提示输入=voiddisplaychar(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(0,1,start_line);write_1602com(er);for(i=0;i16;i+)write_1602dat(start_linei);voiddisplayinput(void)unsigned char i;if(correctcont=1)/displaylistchar(0,0,input);write_1602com(er);for(i=0;i16;i+)write_1602dat(inputi);/=重置密码=/=voidresetpassword(void)unsigned char i;unsigned char j;if(pass=0)pass=0;displaychar();threealam();elseif(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();break; 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(againj);for(i=0;i6;i+)temppasswordi=inputdatai;/将第一次输入的数据暂存起来n=0;/输入数据位数计数器清零 /=输入密码错误超过三过,报警并锁死键盘=voidalam_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_linej);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 char i,j;rdfromrom(currentpassword,0,6); /从24c02里读出存储密码if(n=6) if(reinputen=0)/重置密码功能未开启for(i=0;i6;)if(currentpasswordi=inputdatai)i+;elseerrorcont+;if(errorcont=3)/错误输入计数达三次时,报警并锁定键盘write_1602com(er);for(i=0;i16;i+)write_1602dat(errori);doalam_keyunable();while(1);elsetr0=1;/开启定时key_disable=1;/锁定键盘pass=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/当两次正确输入时,开启重置密码功能/displaylistchar(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); /强制将初始密码写入24c02存储/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_try);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 key2,num,m;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_linei);/写显示时间固定符号,两个冒号write_1602com(er+9);/设置光标位置write_1602com(0x0f);/设置光标为闪烁delay5ms(); /延时片刻(可不要)n=0;/初始化数据输入位数while(1)if(key_disable=1)alam_keyunable();elsealam=1;/关报警key2=keynum();if(key2!=0)if(key_disable=1)second=0;elsenum=coding(key2);switch(num)case (a): ; break;case (b):; break;case (c): ; break;case (d): resetpassword();break; /重新设置密码case (*): cancel();break; /取消当前输入case (#): ensure(); break; /确认键,default: /displaylistchar(0,1,input);write_1602com(er);for(i=0;i16;i+)write_1602dat(inputi);operation=0;if(n6) /当输入的密码少于6位时,接受输入并保存,大于6位时则无效。 onealam();/按键提示音/displayonechar(6+n,1,*);for(j=0;j=n;j+)write_1602com(er+6+j);write_1602dat(bnum);delay5ms();delay5ms();write_1602com(er+6+j); write_1602dat(*);inputdatan=num;n+;else/输入数据位数大于6后,忽略输入onealam();for(j=0;j=n;j+)write_1602com(er+6+j); write_1602dat(*);n=6;break; /*中断服务函数*void time0_int(void) interrupt 1 tl0=0xb0;th0=0x3c;/tr0=1;countt0+;if(countt0=20)countt0=0;second+;if(pass=1)if(second=1)open_led=1;/关指示灯tr0=0;/关定时器tl0=0xb0;th0=0x3c;second=0;elseif(second=3)tr0=0;second=0;key_disable=0;s3_keydown=0;tl0=0xb0;th0=0x3c;else tr0=1;五.调试及运行结果1、 使用keil生成hex文件2、 使用proteus仿真使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售员劳动合同样书
- 职业规范培训知识课件
- 食物中毒应急模拟演练脚本(2篇)
- 2025年查体技术学院校临床技能考核案例分析试题答案及解析
- 2025年器官原位再生试题答案及解析
- 缫丝工突发故障应对考核试卷及答案
- 职业病卫生培训知识课件
- 钨、钼、钴粉还原工主管竞选考核试卷及答案
- 园林绿化作业人员检测卷及完整答案详解(各地真题)
- 2026届山东省齐河县一中化学高一上期末考试模拟试题含解析
- 医院培训课件:《肺源性心脏病》
- 二零二五年度炉渣资源化利用项目合作协议书
- 2025四川能投合江电力有限公司员工招聘11人笔试参考题库附答案解析
- 2025-2026学年鲁科版(五四学制)(2024)初中生物六年级上册教学计划及进度表
- 湖北省圆创高中名校联盟2026届高三第一次联合测评 英语试卷(含答案详解)
- 2025行测的考试题及答案
- 2025年《中华人民共和国工会法》工会法律知识竞赛题库(含答案解析)
- 2025年湖南省教师招聘考试(公共基础知识)历年参考题库含答案详解(5卷)
- 施工进度计划管理制度
- 中国汽车零配件出口分析及各国进口政策影响白皮书 2025
- 工伤劳动能力鉴定课件
评论
0/150
提交评论