1、【四】程序框本系统共有两部分构成,即硬件部分与软件部分。其中硬件部分由键盘输入部分、密码存储部分、显示部分、开锁部分组成,软件部分对应的由主程序、初始化程序、键盘扫描程序、启动程序、关闭程序、密码设置程序等组成。具体原理框图如附录图所示。【五】实验结果在keil软件上输入完成程序之后运行逻辑没有错误,然后将程序下载如开发板。完成之后,依次输入5个数字密码,由于程序中设有原始密码,输入后将与设定好的密码对比,若5个数字相同进入in界面,说明密码正确。若5个数字不与设定密码相同,系统返回help界面,说明密码不正确。 最后用户在3次内都没能输入正确的密码,则蜂鸣器长时间报警,结束之后开始60秒倒计
2、时,在这一分钟之内用户不能在键盘上进行任何操作,直至60S结束才能重新进行操作。在输入密码的时候,输入的数字不显示,密码只有操作者自己知道。在一段时间确认没有键盘输入时,*键上锁或者一段时间后自动上锁,时间由确定的j的大小决定,自动上锁的时间不会很长。修改密码的时候,密码输入成功之后进入in界面之后才能修改。【六】设计中遇到的问题及解决方法这次密码锁设计遇到的最大的两个问题一个是错误三次锁死无法实现,一个是定时器功能无法实现。一个问题产生的主要原因是因为早期将键盘扫描程序mat_keyget()写在了错误是否小于3次的判断语句之前,导致即使错误3次仍然能执行键盘扫描,未能达到锁死键盘的效果。后
3、来将mat_keyget ()写在了主程序判断错误语句的里面,这样一旦错满3次,自动跳到外面,脱离了键盘扫描,从而达到了锁死键盘的效果。 实习中还遇到了其他些许问题,如定时12s,使用户若未能在12s内输入完密码并且按下确认键,即使密码输入正确也会被判为无效,即错误一次。在实际操作过程中,t自加一次用时50ms,所以定时12s应为:50*20*12。而在实际操作过程中,由于晶振误差和操作误差,实际时间长于12s,因此最后将数值设为200,在循环内进行操作,减小了误差。【七】总结实践是检验真理的唯一标准,当然也是检验学习成果的标准。在经过一段时间的学习之后,我们需要了解自己的所学应该如何应用在实
4、践中,因为任何知识都源于实践,归于实践,所以要将所学的知识在实践中来检验。从这次试验如果要一个人来做,我想也是做不了这么快的,因此我们不得不归功于集体的力量,分配合作对于这种近乎于模块化设计的东西来说是非常有利的,当然我们也碰到过问题,这在调试错误这一节中也说得很是明白了,但是我们也并没有灰心丧气,也是把问题一点一点地克服了下来.在这个之中我也是深切的感受到了理论知识的重要性,不能光是从手头上从硬件上找问题,我们也要从软的例如程序上或是设计思路上思考这样的解决方案是不是有较大的缺陷. 通过这个不难也不是很简单的实验我们认识到了团结协作,互帮互助的好处,这次课程设计也可以说是考完试后通过实践检验
5、真理的一次宝贵机会,我们都为能够顺利完成本次实验感到无比的骄傲和自豪。附录:主要源程序以及原理实现框图程序代码:main.c#includereg52.hstring.hdisplay.hmat_keyget.h24c02.hstatus.hunsigned char digital_display=16,16,16,16,16,16,16,16;unsigned char e2prom_addr=0x00,0x01,0x02,0x03,0x04;unsigned char code cipher=2,2,3,4,5;unsigned char cipher_temp6,password5;u
6、nsigned char error_num=0;unsigned char code digital_lock=26,26,17,18,19,26,26,26; /-OUT-unsigned char code digital_open=26,26,20,21,22,23,26,26; /-OPEN-unsigned char code digital_help=26,26,20,22,25,21,26,26;/-HELP-unsigned char code digital_in=26,26,26,24,25,26,26,26 ;/-IN-void lock(void)/ 关锁 unsig
7、ned char i; for(i=0;i0) i-; digital_displayi=23; else if(j=12); /#键无效 else cipher_tempi=j; digital_displayi=27;/隐藏密码 i+; while(mat_keyget()!=10)digital_tube(digital_display);/松手检测 digital_tube(digital_display); while(mat_keyget()!=12)digital_tube(digital_display); for(j=0;j5;j+) wrbyte_24c02(e2prom_
8、addrj,cipher_tempj); for(j=0; passwordj=rdbyte_24c02(e2prom_addrj); /读取密码j+) /显示成功界面 digital_displayj=digital_inj; while(j0) i-; digital_displayi=23; /无效按键 /隐藏密码 if(memcmp(cipher_temp,password,5)=0) /密码相同,开锁 open();j=0; while(j digital_display6=j/10; digital_display7=j%10; for(i=0;150; j-; lock();vo
9、id init(void) passwordi=rdbyte_24c02(e2prom_addri); lock();void main(void) init(); while(1) if(mat_keyget()=12) /#键开始密码输入 if(mat_keyget()=12) while(mat_keyget()!=10) /松手检测 cipher_input(); /输入密码 /待机界面键盘扫描模块:/ 34键盘矩阵扫描函数 unsigned char mat_keyget(void) unsigned char temp=10; P1=0xfe; switch(P1) case 0x
10、ee:temp=1;/对应显示1 case 0xde:temp=2;2 case 0xbe:temp=3;3 default: P1= 0xfd; switch(P1) case 0xed:temp=4;4 case 0xdd:temp=5;5 case 0xbd:temp=6;6 P1 =0xfb; case 0xeb:temp=7;7 case 0xdb:temp=8;8 case 0xbb:temp=9;9 P1=0xf7; case 0xe7:temp=11;* case 0xd7:temp=0;0 case 0xb7:temp=12;# default: return(temp);#
11、ifndef _DISPLAY_H#ifndef _MAT_KEYGET_H#define _MAT_KEYGET_Hunsigned char mat_keyget();#endif数码管显示模块:unsigned char digital_duan=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xC0,0xC1,0xCE, /16:全灭 17:0 18:U 19:T0x89,0x8C,0x86,0xC8, /20:H 21:P 22:E 23:N0XCF,0XC7,
12、0xBF,0x00, /24:I 25:L 26:- 27:全亮 ; /全灭;0xff 全亮:0x00;/OPEN O:0XC0; P:0X8C; E:0X86; N:0XC8 -:0XBFunsigned char digital_wei=0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe;/延时nmsvoid delay_500us(unsigned int nms) unsigned int i,j; for(i=nms;i0;i-) for(j=110;jj-);void digital_tube(unsigned char display) for(i=0
13、; P2=digital_weii; /打开第i个COM口 P0=digital_duandisplayi; /送入显示数据 delay_500us(1);#define _DISPLAY_H#include void delay_500us(unsigned int nms);void digital_tube(unsigned char display);蜂鸣器模块:sbit buzzer=P37;void buzzer_off(void) /蜂鸣器打开 buzzer=1;void buzzer_on(void) /蜂鸣器关闭 buzzer=0;#ifndef _STATUS_H#define _STATUS_Hvoid buzzer_on(void);void buzzer_off(void);24c02存储模块:void iic_start(void) SDA = 1; _nop_(); SCL = 1; somenop; SDA = 0; SCL = 0;void iic_stop(void)void iic_ack(bit ackbit) if(ackbit) else bit iic_waitack(void) if(SDA) iic_stop(); return 0; else
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1