当前位置:文档之家› 基于MSP430的电子密码锁设计

基于MSP430的电子密码锁设计

基于MSP430的电子密码锁设计一、预期性能指标1、(1)密码通过键盘输入,若密码正确,则将锁打开。

(2)报警、锁定键盘功能。

密码输入错误数码显示器会出现错误提示,若密码输入错误次数超过 3 次,LED红灯亮并且锁定键盘。

2、密码锁设计的关键问题是实现密码的输入、清除、更改、开锁等功能:(1)密码输入功能:按下一个数字键,一个“-”就显示在最右边的数码管上,再输入时显示数码管向右移动一个。

(2)密码清除功能:当按下清除键时,清除前面输入的所有值,并清除所有显示。

(3)开锁功能:当按下开锁键,系统将输入与密码进行检查核对,如果正确锁打开,否则不打开。

二、工作原理1、工作原理概述利用MSP430单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。

此次课程设计是以以前学过的msp430F149 单片机为核心,加上一些外围模块来实现电子锁应该具有的基本功能。

单片机灵活的编程设计和丰富的IO 端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能,为其功能的扩展提供便利。

由于条件的限制此次实验只实现其基本功能,锁的开启关闭与锁定以二极管的发光来模拟,密码的输入用4X4 键盘替代,功能键用键盘上对应的10 以后的数字代替,这实现了在条件有所限制的情况下以有限的资源模拟电子锁的功能。

输入密码用矩形键盘,包括数字键和功能键。

LED 数码管显示输入密码,用uln2003A 驱动数码管发光且控制哪一位显示数码,用430 的P4 脚控制各位显示器分时进行显示。

用发光二极管代替开锁的电路,发光表示开锁锁定。

输入密码错误次数超过3 次,系统蜂鸣器响,发出警报。

打开电源后,显示器显示“0000”,设原始密码为“1234”,只要输入此密码便了开门。

这样可预防停电后再来电时无密码可用。

按“C”键,清除显示器为“000000”。

欲重新设定密码,先输入密码在案“*”。

输入密码,再按“D”键。

若密码与设定密码相同,则开门。

否则显示器清为“0000”。

软件的设计主要包括键盘键值的读取,LED 显示程序,密码比较程序和报警程序2、设计方案与原理框图(1)主要的设计实施过程:第一步,选用 msp430单片机,以及选购其他电子元器件(电阻(100欧、150欧、2K欧等)、发光二极管、三极管、数码管(阴极)、ULN2003AG芯片、按键、电线、PADS9.3软件、MATLEB软件、焊接电路板一块)。

第二步,使用PADS9.3软件设计硬件电路原理图,并设计 PCB图完成人工布线。

第三步,焊接电路第四步,MATLEB软件编写单片机的 C 语言程序、仿真、软件调试。

第五步,联合软、硬件调试电路板,完成本次设计。

(2)原理框图:3、原理框图的说明用户根据数码管显示使用键盘输入密码,输入密码时用户可以按相应的功能键来进行不同的操作控制,按键A 可以删除上一次输入的一位密码,按键B 确认密码,按键C 可以再“锁开”的状态下修改原始密码。

用户输入完密码后,单片机将用户输入的密码与真的密码进行比较,如果正确就开锁,如果不正确提示用户再次输入密码并累加密码输入错误的次数,当密码输入错误的次数大于3 时就发出警报,如果从新输入正确的密码则将累加器清零。

在输入密码正确锁开的状态下,按功能键C,就可以输入新的密码,新的密码需要进行二次确认,如果前后两次输入的密码一致单片机则保存新输入的4 位数字作为密码。

三、硬件设计1、器件选型选用 msp430单片机,以及选购其他电子元器件(电阻(100欧、150欧、2K 欧等)、发光二极管、三极管、数码管(阴极)、ULN2003AG芯片、按键、电线、PADS9.3软件、MA TLEB软件、焊接电路板一块)。

2、参数匹配键盘通过阻值为10 千欧的电阻与单片机的引脚可直接相连。

数码管的驱动电流很大,不能直接与单片机相连,选用可以同时驱动8 路500mA电流的uln2003a 芯片驱动数码管显示。

3、原理图及PCB图(包括PADS软件使用)(1)键盘电路设计Msp430单片机接口相对本次设计较多,故,采用独立按键的接法,一个按键占用一条I/O线的数目。

下图(为电路按键按键一组(4个)的解法):键盘处理程序首先执行等待按键并确认有无按键按下的程序段。

当确认有按键按下后,下一步就要识别哪一个按键按下。

对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的中断响应法。

(2)LED显示电路显示电路是为了给使用者以提示而设置。

MSP430单片机驱动数码管发光显示数码和控制位选信号,以完成显示功,能显示电路的电路。

原理图如图:数码管的a,b,c,d,e,f,g,dp八个管脚,接在单片机的P4口八个口上,ULN2003的4个IN脚接在P3.7-P3.4口,用来控制那个数码管亮。

(3)msp430单片机的接口电路通过把MATLEB软件编写的单片机 C 语言程序,烧到单机芯片中,来运行功能、响应按键、控制输出。

(4)开锁和报警电路用发光二极管代替电磁锁,来反应单片机运行的功能。

电路图如下图:绿灯亮表示电子锁已经打开;红灯亮表示密码输入错误;黄灯亮表示设置密码阶段,允许修改密码;白灯亮表示单片机已锁且正常工作。

(5)ULN2003AG电路ULN2003AG是提高控制信号的驱动能力(即驱动芯片),用来作输出瑞驱动,单片机通过控制ULN2003AG的输入来控制是哪一个数码管亮。

(6)PCB图软件设计1、软件框图(1)键盘扫描(2)LED显示(3)密码比较与报警2、流程图4、设计体会这是一次理论结合实践的课程设计,而且对于实践的要求特别强,需要接触实际的器件和电路,查阅相关资料,并动手设计电路图和PCB图,这次硬件电路的设计,让我学会了用PADS 软件自己去设计一块满足要求的电路板,在老师的示范下,一步一步的按照要求如何画原理图。

刚刚开始时,使用软件还不熟练,有的地方画错了而不自知,或者不知道怎么样画,随着对软件的熟悉,和别的同学请教,慢慢掌握了技巧,比如器件它实际的形状和在电路板上的实际焊接,比如元器件如何画封装,画完图后还检查出很多不知道如何修改的电气错误,请教别人之后,就换种方法画,把错误一点点的改正,最终达到良好的设计效果,修改过程中是比较繁琐的,要耐着性子,细心认真的修改才行,当最终设计完成后心里是非常自豪和有成就感的。

不仅学习了新知识,加强了动手能力,还养成了越是繁琐的工作越要细致的好习惯。

说明键盘采用行列式矩阵键盘,键盘处理程序首先执行等待按键并确认有无按键按下的程序段,采用中断响应法响应即在有按键按下时中断处理程序才会执行,节省电量。

LED显示采用动态扫描显示,一次只显示一个数码管,不同时刻在不同位的数码管上显示相应的数字,但是更新的频率为2ms,所以显示的效果与静态一样。

按不同的功能键会调出不同的处理程序,实现相应的功能。

四、调试试验1、试验验证方法设计完硬件后,完成软件的设计,把程序烧录进单片机,就可以直接测试。

首先,正确的输入4 位密码,锁开在锁开的状态下按下修改密码键,两次真确输入新的密码,按确定键输入新密码,所重新打开连续输入错误的密码3 次,键盘锁定2、遇到问题及解决方法新输入的密码无法同时显示,由于数码管只由一个口8 线控制显示,所以显示时一个时间只能显示同一数字。

解决方法:使用动态显示,修改程序。

在没有开锁的情况下按修改密码键的时候仍然可以修改。

解决办法:无论什么时候按键,首先提示输入以前的密码,如果正确才让修改。

有时候会忘记自己的密码。

解决办法:在修改密码的时候,连续两次输入新的密码,两次输入的密码一致时,才保存新的密码。

在未完全输入密码时,按其他的功能键,有时候系统也会去相应,造成系统发生错误。

解决办法:在输入密码时(解锁或者修改密码),屏蔽其他中断,直到输入完毕,按确定键为止。

五、总结分析1、性能分析密码锁的基本功能:解锁,密码修改,电路报警,基本实现。

密码设计的是四位十进制密码,碰巧打开的机会很少。

由于缺少掉电保护,所以在断电后,再次开启的时候,前面的操作会失效。

而且有可能在修改密码后,出现密码复原现象。

2、试验结果分析实验过程中,规范的输入密码,开锁,修改密码都会成功。

当不按规范输入时,程序有时会出错,数码管出现乱码,需要断电后再开启才能恢复正常。

修改完密码后断电,再开启,密码依旧是没有修改的密码。

连续输入错误密码3 次系统会报警10 秒,且键盘锁定。

结果分析:程序编的不是很完善,缺少错误处理措施。

硬件没有断电保护电路,无法记忆前序操作六、自我评价1、设计总结课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。

因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。

回顾这两个星期的课程设计,我发现自己收获很大,学到很多的东西,不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识,更重要的是养成了细致耐心的处理复杂枯燥工作的习惯,刚刚开始时确实遇到很多困难,但随着一项一项的解决,自己也受到了很大的磨练。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有把所学的理论知识与实践相结合起来,才能做出有用、实用的东西来,提高自己的实际动手能力和独立思考的能力。

在设计的过程中遇到问题,由于第一次做,有很多不懂的,错误的。

在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,对单片机汇编语言掌握得不好,通过这次课程设计之后,把以前所学过的书重新翻了出来,温习以前的相关内容。

最终顺利的完成了任务。

2、进一步改进措施通过这次课程设计,我学到了很多。

首先在设计之前要想好自己要设计什么,设计的东西要达到什么标准,有什么要求,在这次设计过程中我们小组就犯了这样的错误,在选题上没有彻底了解选题的内容,在做到一定程度后发现自己做不下去了,就只能改变选题了。

设计必须要有一个清晰地思路,要有一个大体的框架。

最初设计的时候,老是觉得设计过于复杂,到现在想一下,整个系统分为键盘,显示,系统,开锁模块是非常容易清晰的。

程序的设计必须依据硬件电路,还有就是要考虑各种意外情况,增加错误处理程序这样的系统才能稳定,接下来的改进措施应该注重电子锁的安全性、稳定性进行设计,还可以加上一些人性化设计。

七、附录1、软件和硬件工作时的图片报警中的图片2、程序主程序:/*********************************************** 程序功能:电子锁------------------------------------------------跳线设置:将跳线座J3 上的短路帽拔下------------------------------------------------测试说明:按动K1~K16 按键,观察数码管显示,聆听按键时蜂鸣器是否发声************************************************/ #include <msp430x14x.h>#include "Boa rdConfig.h"#include "Keypad.h"#include "gdata.h"uint num;ucha r a[4];/*******************报警函数*******************/ void alert(void ){long int i;P6OUT = 0; //蜂鸣器报警for(i = 99999; i > 0; i--);P6OUT |= BIT7;num++;}/**********************************************//********************主函数********************/void ma in(void){uint j,x,fla g,fla g1;long int i;num=0;fla g=0; //标记新一轮输入fla g1=0; //改码a[0]=1; a[1]=2; a[2]=3; a[3]=4;//初始密码值BoardConfig(0x80); //打开数码管、流水灯,关闭电平转换WDTCTL = WDT_ADL Y_1_9; //设置内部看门狗工作在定时器模式,1.9ms 中断一次IE1 |= WDTIE; //使能看门狗中断P2DIR = 0xff; //LED 显示P4DIR = 0xff;P5DIR = 0xff; //设置P2,P4,P5 的IO 方向为输出P6DIR |= BIT7;P2OUT = 0xff;P4OUT = 0x00; //设置P4,P5 的输出初值P5OUT = 0xff;P6OUT |= BIT7; //蜂鸣器对应IO 设置为输出_EINT(); //打开全局中断Init_Keypad();for(j=0;j<4;j++) //初始显示为“AAAA”Dispbuf[j] = 10;j=0;while(1){if(num>2){P1DIR = 0x00;P1OUT |= 0x00;P6OUT = 0;P2OUT ^= 0xff;for(i=999999;i>0;i--);P6OUT |= BIT7;P2OUT = 0xff;P1DIR = 0xf0; //P1.0~P1.3 设置为输入状态, P1.4~P1.7 设置为输出状态P1OUT |= 0xf0; // P1.4~P1.7 输出高电平num=0;}Key_Event();if(key_Fla g == 1) //按键已释放{key_Fla g = 0;if((key_val==12)||(key_val==14)||(key_val==15)) //容错{fla g=1;alert();for(j=0;j<4;j++)Dispbuf[j] = 10;j=0;}if(key_val==11) //取消密码{fla g=1;for(j=0;j<4;j++)Dispbuf[j] = 10;j=0;}/*GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGG*/if(fla g1==2) //改码{P2OUT ^= 0xff;for(i = 2000; i > 0; i--);P2OUT = 0xff; //提示灯a[j]=key_val;if(j==4){fla g=1; //fla g1=0;for(j=0;j<4;j++)Dispbuf[j] = 10;j=0;}}if(key_val==13) //改码的另一个条件{P2OUT ^= 0xff;for(i = 2000; i > 0; i--);P2OUT = 0xff; //提示灯fla g=1;fla g1+=1;for(j=0;j<4;j++)Dispbuf[j] = 10;j=0;} if(fla g1!=2)fla g1=0; //若两条件不同时满足,则取消/*GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG GGGGGGGGGGGGGGGGGGGGGG*/if(j==4) //验证密码{fla g=1;if(key_val==10){if(a[0]==Dispbuf[0]){if(a[1]==Dispbuf[1]){if(a[2]==Dispbuf[2]){if(a[3]==Dispbuf[3]){P2OUT ^= 0xff;for(i = 99999; i > 0; i--);P2OUT = 0xff;fla g1=1; //改码的一个条件num=0;} else alert();} else alert();} else alert();} else alert();}else alert();for(j=0;j<4;j++)Dispbuf[j] = 10;j=0;}if(fla g==0){Dispbuf[3-j] = key_val; //Dispbuf[]为一数组,用于存放键值switch(3-j){case 2:x=Dispbuf[2];Dispbuf[2]=Dispbuf[3];Dispbuf[3]=x;break;case1:x=Dispbuf[1];Dispbuf[1]=Dispbuf[2];Dispbuf[2]=Dispbuf[3];Dispbuf[3]=x;break; case0:x=Dispbuf[0];Dispbuf[0]=Dispbuf[1];Dispbuf[1]=Dispbuf[2];Dispbuf[2]=Dispbuf [3];Dispbuf[3]=x;break;} j++;} elsefla g=0;P6OUT = 0; //蜂鸣器响一声for(i = 2000; i > 0; i--);P6OUT |= BIT7;}}}/*******************************************函数名称:watchdog_timer功能:看门狗中断服务函数,在这里输出数码管的段选和位选信号参数:无返回值:无********************************************/#pragma vector=WDT_VECTOR__interrupt void watchdog_timer(void){P5OUT = 0xff;P4OUT = scandata[Dispbuf[cnt]]; //输出段选信号P5OUT &= ~(1 << (cnt+2)); //输出位选信号cnt++; //位计数变量在0~4 之间循环if(cnt == 4) cnt = 0;}。

相关主题