《数字密码锁单片机课程设计(26页).doc》由会员分享,可在线阅读,更多相关《数字密码锁单片机课程设计(26页).doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-数字密码锁单片机课程设计-第 - 26 - 页课 程 设 计课 程 名 称: 单 片 机 原 理 与 应 用 课 题 名 称: 数 字 密 码 锁 设 计 所在 学院 名称: 湖南大学电气与信息工程学院 设 计 人 员: 宁 枫 根 宋 浩 冉目录一、 前言- 2 -二、 总体方案设计- 3 -2.1方案论证与比较- 3 -2.2方案选择- 4 -三、 单元模块设计- 4 -3.1硬件支持- 4 -3.2功能单元模块设计- 4 -3.2.1 开锁机构- 4 -3.2.2 矩阵键盘设计电路- 5 -3.2.3 声音提示电路设计- 5 -3.2.4 显示模块设计- 6 -四、程序设计与系统仿真-
2、 7 -4.1 模块介绍- 7 -4.1.1 主程序模块- 9 -4.1.2 密码比较判断模块- 9 -4.1.3 键盘扫描模块- 9 -4.1.4 修改密码模块- 10 -五、系统功能- 12 -六设计总结- 12 -七、附录:源程序- 12 -一、 前言随着社会物质财富的日益增长和人们生活水平的提高,安全成为现代居民最关心的问题之一。而锁自古以来就是把守门的铁将军,人们对它要求甚高,即要求可靠地防盗,又要使用方便。传统的门锁既要备有大量的钥匙,又要担心钥匙丢失后的麻烦。随着单片机的问世,出现了数字密码锁,其保密性高,使用灵活性好,安全系数高,故受到广大用户的青睐。数字密码锁通常使用ARM和
3、单片机控制,单片机相对ARM实现较为简单,功能较为完善,因此使用单片机控制较多。用单片机控制的密码锁常使用汇编语言编写程序,数码管做显示器 。但本设计使用移植性及可读性强的C语言编写;同时采用显示清楚、功率消耗小而且寿命长的1602A液晶显示器。从经济实用的角度出发,采用ADUC848单片机设计出一种具有密码设置、报警等功能的数字密码锁,并通过Proteus软件成功地进行了仿真。任务及设计要求1.设计一多位电子密码锁,输入密码用“F”表示,输入密码正确,绿灯亮(或显示其它标志、蜂鸣器替代),输入密码错误,红灯亮(或显示其它标志、蜂鸣器替代).2.具有确定键和取消键,在未确定之前可以取消,重新输
4、入.3.连续输入三次错误密码,红灯闪烁,报警电路动作,键盘锁定.4.具有密码重置、修改功能.5.具有密码输入等待操作时间限制功能,超过限定时间报警.6.显示北京时间,时间可调整.7.可利用蜂鸣器添加提示音.二、 总体方案设计2.1方案论证与比较方案一:以ADUC848单片机为数字密码锁系统核心,使用4*4矩阵键盘作为数据输入方式,驱动1602A显示器提示程序运行过程和开锁的步骤,利用AT24C02芯片实现掉电存储。图1为单片机控制密码锁的系统原理框图。ADUC848单片机AT24C02存储芯片矩阵键盘控制LCD1602A蜂鸣器提示电路电源模块LED密码校验提示图1 单片机控制密码锁的系统原理框
5、图方案二:以74LS112双JK触发器构成的数字逻辑电路控制方案,如图2。 输入按扭开关组输入锁存电路密码存储电路开锁控制电路机械动作构件5秒定时电路20秒定时电路声光指示电路图2 数字逻辑控制方案数字密码锁原理框图2.2方案选择由于利用单片机灵活的编程设计和强大的I/O端口,及其控制的准确性,不但能实现基本的密码锁功能,还可以增添掉电存储、声光提示等功能,故选用方案一。三、 单元模块设计3.1硬件支持使用的元器件有:核心芯片ADUC848、存储芯片AT24C02、液晶显示1602A、44矩阵键盘、报警蜂鸣器、发光二极管和三极管。3.2功能单元模块设计3.2.1 开锁机构通过单片机送给开锁执行
6、机构,电路驱动电磁锁吸合,从而达到开锁的目的。如图3所示,为密码锁开锁电路原理图。当用户输入的密码正确时,单片机便输出开门信号,送到开锁驱动电路,然后驱动电磁锁,达到开门的目的。本次设计中,基于节省成本考虑,用发光二极管代替电磁锁,信息通过LCD显示,并利用蜂鸣器和二极管声光指示。其中,绿发光二极管亮,表示开锁;否则,表示密码输入错误并开启报警电路。开锁驱动电路STC89C52单片机密码正确超次锁定电磁锁是否图3 密码锁开锁电路原理图3.2.2 矩阵键盘设计电路每一条水平(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要M条行线和N条列线,即可组成具有
7、MN个按键的键盘。由于本设计中要求使用16个按键输入,为减少键盘与单片机接口时所占用的I/O线的数目,故使用矩阵键盘。本设计中,矩阵键盘行线和单片机P1.0-P1.3相连,列线与单片机P1.4-P1.7相连。矩阵键盘设计电路图,如图4所示。键盘扫描采用行扫描法,即依次置行线中的每一行为低电平,其余均为高电平,扫描列线电平状态,为低电平即表示该键按下。1234567890退位确认设置时间*关闭图4 矩阵键盘设计电路图3.2.3 声音提示电路设计声音提示电路采用小蜂鸣器提示。蜂鸣器能够根据脉冲信号,以及信号的频率发出各种不同的声音,这样可以根据系统要求在密码出入正确和密码输入错误时发出不同的声音提
8、示,已达到报警的要求。蜂鸣器电路,如图5所示。图5 蜂鸣器电路3.2.4 显示模块设计本设计中,显示电路采用1602A液晶显示器显示。如下所示,图6为1602A液晶显示器的接口示意图,表1为接口说明。图6 1602A液晶显示器的接口示意图表1 接口说明管脚序名称电平功能描述1VSS0V接地2VCC5.0V电源输入3V0LCD驱动电压输入4RSH/L寄存器选择:RS=H,选择数据寄存器;RS=L,选择指令寄存器5R/WH/L读写信号线:R/W=H,读操作;R/W=L,写操作6EH,HL使能信号7DB0H/L数据线8DB1H/L数据线9DB2H/L数据线10DB3H/L数据线11DB4H/L数据线
9、12DB5H/L数据线13DB6H/L数据线14DB7H/L数据线15BLA5.0V背光电源正极16BLK0V背光电源负极本设计中液晶串口一共用到11根导线与单片机相连, 具体连接情况如表2显示模块与MCU连接说明所示。表2 显示模块与MCU连接说明序号1602A液晶显示器引脚ADUC848单片机引脚1RS引脚P2.5(A13)2R/W引脚P2.6(A14)3E引脚P2.7(A15)4D0引脚P0.0(AD0)5D1引脚P0.1(AD1)6D2引脚P0.2(AD2)7D3引脚P0.3(AD3)8D4引脚P0.4(AD4)9D5引脚P0.5(AD5)10D6引脚P0.6(AD6)11D7引脚P0
10、.7(AD7)四、程序设计与系统仿真4.1 模块介绍与硬件电路相关联,本系统软件包括主程序模块、密码比较判断模块、键盘扫描模块、修改密码模块、1602A液晶显示模块等。系统程序流程如图9所示。开始系统初始化调用E2PROM密码显示主界面输入密码判断密码确定密码开锁模拟声光锁定键盘YN返回Y判断次数N超过N次未超过N次再次输入密码密码设置完毕N设置新密码Y按键N判断按键值返回主界面NY设置解码次数产生随机密码输入密码N=0x84N=0x82N=0x11图9 系统程序流程图4.1.1 主程序模块主程序主要用于定义全局变量,给全局变量赋初值,初始化E2PROM,启动定时器以及从AT24C02中读取密
11、码,为整个程序提供数据;检测按键;调用显示等功能。4.1.2 密码比较判断模块该模块的功能是将键盘输入的密码利用if语句与设定的密码进行逐个比较,若密码完全正确则开锁;若不正确,则开启报警电路,复位后重新输入密码。其密码输入和比较判决流程图如图10所示。输入密码核对键盘锁定,开启报警电路开锁,灯亮,可密码修改NY复位图10 密码输入和比较判决流程图4.1.3 键盘扫描模块键盘使用矩阵式键盘,由行和列组成,CPU对所有键盘进行监视,从而实现逐列扫描键盘确定被按键的具体位置、判断键盘上有无键按下、消除去抖动、判断闭合的键是否释放等功能。如图11所示,为键盘扫描流程图。开始延时去抖动计算输入键值键值
12、送入单片机有按键输入?有按键输入?有按键输入?返回NNYY图11 键盘扫描流程图4.1.4 修改密码模块在密码输入正确情况下,可以按下“重置密码”对密码进行重新设置,每设定一位就将密码送给AT24C02存储起来,当设置6位密码完毕后,系统将自动跳到程序开始,调用新设置的密码。图12为修改密码流程图。开始输入原密码密码比较比较正确?输入新密码再次输入新密码调用AT24C02中密码比较正确修改成功返回菜单键盘锁定,启动报警电路复位YN图12 修改密码流程图五、系统功能本设计中系统可实现功能如下:(1)通过切换,对输入的18位密码进行显示或隐藏;(2)通过发光二极管和蜂鸣器,对解密正确或者错误进行声
13、光报警;(3)18位密码修改;(4)在密码遗失情况下,通过初始密码进行密码再设置;(5)具有1-3次的解锁次数任意设定功能;六设计总结作为一名电子信息工程的学生,通过本次课程设计,我很好的了解了单片机C语言设计的思考模式,熟悉了C语言的编程规则,知道了如何去运用一个完全陌生的单片机,会根据单片机的不同结构来采用不同的命令实现功能。在此次课程设计中我负责的模块出现了问题导致在数码管上显示状态的时候混乱了,主要是因为延时上没有处理好,Aduc848的定时器处理时是要加上一定的延时来防止冲突的。另外还有键盘的防抖模块,一开是没有考虑好,所以键盘按下后显示会乱变。综上而言,通过此次课程设计,我很好的学
14、习了单片机的应用以及其编程。七、附录:源程序#include #include#define uint unsigned int#define uchar unsigned char /*状态声明*/#define opened 0#define new1 15#define new2 16#define succed 5#define fanin 10#define null 11#define error 12#define different 13#define tover 14/*按键声明*/#define enter 10#define back 11#define trevise
15、12#define revise 13#define cancel 14#define vain 15#define off 16#define end 17#define finish 18/*函数声明*/void p_base();void p_revise();void p_new1();void p_new2();void p_trevise();void p_show(); uchar p_scan();void p_record();void p_delay(uint f_n);void p_state(uchar f_s);uchar p_compare(uchar *f_k1,
16、uchar *f_k2);void p_copy(uchar *f_s,uchar *f_k);/*I/O口声明*/sbit p00=P00;sbit p10=P10;sbit p11=P11;sbit p12=P12;sbit p13=P13;sbit p14=P14;sbit p15=P15;sbit p16=P16;sbit p17=P17;sbit p20=P20;sbit p21=P21;sbit p22=P22;sbit p23=P23;sbit p24=P24;sbit p25=P25;sbit p26=P26;sbit p27=P27;sbit p30=P30;sbit p31
17、=P31;sbit p32=P32;sbit p33=P33;sbit p34=P34;sbit p35=P35;sbit p36=P36;sbit p37=P37;/*变量声明*/uchar bot,key19,key29,save9,t4,s,min,h,mino,mint,ho,ht,n1=1,n2=1,lock,minu,sign,tov,state,n,sound,point=1, showlist=0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x71,0xff,0x21,0x85,0xe1,0x7f,0x7d;uint ms;
18、 /*主函数*/void main()EA=1; /开总中断ET0=1; /开内部中断0ET1=0;/关内部中断1TMOD=0x11;TH0=0xf9; /计数器0高八位TL0=0xdb; /计数器0低八位TR0=1; /计数器0开始计数I2CCON=0xe8;sound=0;tov=1; /超时计数置为1P1=0x00; /P1全置为0作为输入if(sign!=1)p_new1(); /调用首次使用判断函数p_base();/调用基础解锁函数/*基础解锁函数*/void p_base() n=0; /密码数组置首位state=fanin; /指示管置为输入状态faninwhile(1) /无
19、限循环if(n=0)state=fanin;elsestate=n; bot=p_scan();if(n!=0&tov=0)/判断密码数组是不是在首位,超时计数是否为0p_state(tover);/调用指示管状态闪烁函数,置为用超时状态tovermain(); /调用主函数switch(bot)case vain:break;case enter:key1n=end; /把密码后一位置为endif(p_compare(key1,save) /判断输入的密码是否与原密码相同p_state(succed);/调用指示管状态闪烁函数,置为成功状态succedlock=0;/锁定键盘计数置为0poi
20、nt=1; /多次密码输入错误计数state=opened;/指示管置为输入状态openedwhile(1) bot=p_scan();switch(bot)case off:main();break;case back:while(1)bot=p_scan();switch(bot)case off:main();break;case enter:main();break;elsep_state(error);/调用指示管状态闪烁函数,置为用错误状态errorp_record();/调用错误计数函数main(); /调用主函数break;case cancel:main();break;ca
21、se back:if(n!=0) /判断当前密码是否为首位key1n-=end;/当前密码位置end,密码退位break;case revise:p_revise();break;case trevise:p_trevise();break; default:if(n+1=9)p_state(error);main();key1n+=bot; /*密码修改模块*/void p_revise() ET0=1;ET1=0;n=0;p_state(fanin);state=fanin;while(1)if(n=0)state=fanin;elsestate=n;bot=p_scan();if(tov
22、=0)p_state(tover); main();switch(bot)case vain:break;case enter:key1n=end;if(p_compare(key1,save)lock=0;point=1;p_state(succed);p_new1();elsep_state(error);p_record();main();break;case cancel:main();break;case back: if(n!=0)key1n-=end;break;case revise:p_revise();case off:break;case trevise:p_trevis
23、e();break; default:if(n+1=9)p_state(error);main();key1n+=bot; /*首次使用设置密码*/void p_new1() n=0;state=new1;while(1)if(n=0)state=new1;elsestate=n; if(tov=0&sign=1)|(n!=0&tov=0)p_state(tover); main();bot=p_scan();switch(bot)case vain:break;case enter:key1n=end;p_new2();break;case cancel:main();break;case
24、back:if(n!=0)key1n-=end;break;case revise:if(sign=1)p_revise();break;case trevise:p_trevise();break; default:if(n+1=9)p_state(error);main();key1n+=bot;/*首次使用二次确定密码*/void p_new2() n=0;state=new2;while(1)if(n=0)state=new2;elsestate=n;bot=p_scan();if(tov=0)p_state(tover); main();switch(bot)case vain:br
25、eak;case enter:key2n=end;if(p_compare(key1,key2)sign=1;p_copy(save,key2);lock=0;p_state(succed);main();elsep_state(different);main();break;case cancel:main();break;case back: if(n!=0)key2n-=end;break;case revise:if(sign=1)p_revise();break;case off:break;case trevise:p_trevise();break; default:if(n+1
26、=9)p_state(error);main();key2n+=bot; /*键盘模块*/uchar p_scan() uchar f_s=vain;P2=P2&0xf0;if(P1!=0xff)p_delay(10);if(P1!=0xff)tov=1;P2=P2&0xf0;P2=P2|0x07;switch(P1)case 0xfe:f_s=1;break;case 0xfd:f_s=4;break;case 0xfb:f_s=7;break;case 0xf7:f_s=back;break;while(P1!=0xff)sound=1;sound=0;P2=P2&0xf0;P2=P2|0
27、x0b;switch(P1)case 0xfe:f_s=2;break;case 0xfd:f_s=5;break;case 0xfb:f_s=8;break;case 0xf7:f_s=0;break;while(P1!=0xff)sound=1;sound=0;P2=P2&0xf0;P2=P2|0x0d;switch(P1)case 0xfe:f_s=3;break;case 0xfd:f_s=6;break;case 0xfb:f_s=9;break;case 0xf7:f_s=enter;break;while(P1!=0xff)sound=1;sound=0;P2=P2&0xf0;P
28、2=P2|0x0e;switch(P1)case 0xfe:f_s=cancel;break;case 0xfd:f_s=off;break;case 0xfb:f_s=revise;break;case 0xf7:f_s=trevise;break;while(P1!=0xff)sound=1;sound=0;p_delay(10);return f_s;void time() interrupt 1 /定时器0中断子函数TH0=0xf9;TL0=0xdb;TR0=1;ms+;ms=ms%1000;/1000毫秒后ms置为0p_show(); /调用显示函数if(sound) /判断声音标志
29、sound是否为1p26=!p26; /蜂鸣器交替 p26取反if(ms=0) /判断ms是否为0tov+; /超时计数tov加1tov=tov%11; /11秒后超时计数tov置为0s+; /秒计数s加1s=s%60; /60秒后秒计数s置为0if(s=0)/判断秒计数s是否为0minu+;/键盘解锁计时加1minu=minu%30; /30分钟后键盘解锁计时if(minu=0)lock=0;min+;min=min%60;mino=min%10;mint=min/10;if(min=0)h+;h=h%24;ho=h%10;ht=h/10; /*显示模块*/void p_show() swi
30、tch(n1)case 1:P3=0x80;P0=showlistht;n1+; break;case 2:P3=0x20;P0=showlistmint;n1+;break;case 3:P3=0x00;p24=1;P0=showliststate; n1+;p00=point;break; case 4:p24=0;P3=0x08;P0=showlistmino;n1+;break; case 5:P3=0x40;P0=showlistho;p00=0;n1=1;/*时间修改模块*/void p_trevise() n=3;n2=1;ET0=0;ET1=1;TH1=0xf9;TL1=0xd
31、b;TR1=1;p24=0;P3=0x80;P0=showlistht;while(1)if(tov=0)P0=showlisttover;P3=0x00;while(n-)p24=1;sound=1;p_delay(99999);p24=0;sound=0;p_delay(99999);main();if(bot!=finish)bot=p_scan();switch(bot)case vain:break;case finish:if(t1+t0*10=24|t3+t2*10=60)P0=showlisterror;while(n-)p24=1;sound=1;p_delay(99999)
32、;p24=0;sound=0;p_delay(99999);bot=vain;p_trevise();ht=t0;ho=t1;mint=t2;mino=t3;h=ho+ht*10;min=mino+mint*10;s=1;main();break;case enter: break;case cancel:main();break;case back: break;case revise:if(sign=1)p_revise();break;case off:break;case trevise:p_trevise();break; default:switch(n2) case 4:P3=0
33、x08;P0=showlistbot;t3=bot;n2=1; bot=finish;p_delay(99999);P3=0x00;break;case 3: P3=0x20;P0=showlistbot;t2=bot;n2+;p_delay(99999);P0=showlistmino;P3=0x08;break;case 2:P3=0x40;P0=showlistbot;t1=bot;n2+;p_delay(99999);P0=showlistmint;P3=0x20;break;case 1:P3=0x80;P0=showlistbot;t0=bot;n2+;p_delay(99999)
34、;P0=showlistho;P3=0x40;void atime() interrupt 3 /定时器1中断TH1=0xf9;TL1=0xdb;TR1=1;ms+;if(sound)p26=!p26;ms=ms%1000;if(ms=0)tov+;tov=tov%11; /*错误记录模块*/void p_record() /三次解锁错误则置状态为errorlock+;/键盘锁定计数加1minu=0; /键盘解锁计时置0while(lock=3)/当键盘锁定计数为3时循环sound=1;point=0; /3次错误标志置为0,表示逻辑1state=error;p_delay(99999);st
35、ate=null;p_delay(99999); /*状态显示模块*/void p_state(uchar f_s) /指示管状态闪烁函数uchar f_n=3;while(f_n-)state=f_s;sound=1;p_delay(99999999);state=null;sound=0;p_delay(99999999);void p_delay(uint f_n) /延时子函数f_n=100*f_n;while(f_n-); /*密码判定模块*/uchar p_compare(uchar *f_k1,uchar *f_k2) /输入与原始密码比较子函数uchar f_k=0,f_n=0
36、;while(1)if(*(f_k1+f_n)=end&*(f_k2+f_n)=end)f_k=1;break;else if(*(f_k1+f_n)!=*(f_k2+f_n)f_k=0;break;f_n+;return f_k;/*密码修改模块*/void p_copy(uchar *f_s,uchar *f_k)uchar f_n;for(f_n=0;*(f_k+f_n)!=end;f_n+)*(f_s+f_n)=*(f_k+f_n);*(f_s+f_n)=end;使用说明书本产品为多功能密码锁.01.第一次启动后需要设定新密码,此时指示管显示一,输入新密码后按ENTER.然后需要确定新密码,此时指示管显示二,输入相同的密码后.指示管显示s闪烁3次,表示新密码设定成功.若两次密码不相同,则指示管显示d闪烁3次,然后指示管重新显示一,表明你需要重新输入新密码并确定.02.密码设定成功后,指示管显示f,表明你可以输入密码打开密码锁了.输入密码并按ENTER,如果密码正确,指示管