1、山东交通学院单片机原理和应用课程设计院(部): 轨道交通学院 班 级: 自动化121 学生姓名: 学 号: 指导老师: 时 间: .6.1.6.12 课 程 设 计 任 务 书题 目 电子密码锁设计 系 (部) 轨道交通学院 专业班级 自动化121 学生姓名 学 号 06 月 01 日至 06 月 12 日 共 2 周指导老师(签字) 系 主 任(签字) 年 月 日一、设计内容及要求本试验基于51单片机利用矩阵按键、步进电机、lcd1602等模块实现电子密码锁输入密码、密码比对、步进电机驱动、修改密码等功效。设计内容包含:1)lcd1602显示;2)矩阵按键输入;3)24C08储存于读取;4)
2、步进电机驱动;5)线路链接。设计要求:1)能演示;2)能回复答辩过程中提问问题;3)完成设计汇报。 二、设计原始资料单片机原理及接口技术 李全利 1月单片机原理及应用教程 范立南 1月单片机原理及应用教程 刘瑞新 07月三、设计完成后提交文件和图表1计算说明书部分1)方案论证汇报打印版或手写版2)程序步骤图3)具体程序 2图纸部分:具体电路原理图打印版四、进程安排教学内容 课时 地点资料查阅和学习讨论 2天 406试验室分散设计 4天 406试验室编写汇报 2天 406试验室结果验收 2天 406试验室 按分组选择不一样试验台,每组3人,题目可反复选择,但每题目不得超出10人。五、关键参考资料
3、 电子设计自动化技术基础马建国、孟宪元编 清华大学出版 4月 单片机原理及接口技术 张毅刚 人民邮电出版社. 实用电子系统设计基础 姜威 1月 单片机系统PROTEUS设计和仿真 张靖武 4月指导老师成绩答辩小组成绩总成绩目录 摘要.1 1.设计要求.2 2.功效概述.2 3.总体设计.2 4.硬件设计.3 4.1矩阵按键设计.3 4.2 LCD显示设计.4 4.3步进电机模块设计.5 4.4密码修改设计.5 4.5密码比较模块.6 5.软件设计及步骤图.6 6.个人体会.8 7.参考文件.9 附录.10摘要设计利用了ATMEL企业AT89S52芯片系统,将微处理器、总线、蜂鸣器、矩阵键盘、存
4、放器和I/O口等硬件集中一块电路板上,经过读取键盘输入数据(密码)并储存到ATMEL912 24C08存放器中,然后判定以后键盘输入数据和已存放数据是否相同来决定打开密码箱或锁键盘或报警。在keil4软件中编程,系统可实现6位密码处理,并经过控制步进电机控制密码箱门电子锁,同时还能够修改改密码。利用单片机系统制作密码箱安全性能更高,更易操作且体积小。关键词:单片机、密码锁、修改密码1.设计要求本试验将实现六位数电子密码锁。要求使用4X4 行列式键盘作为输入,并用LCD实时显示。具体要求以下:1. 开机时LCD显示“welcome to use”,初始化密码为“123456”,密码能够更改。 2
5、. 按下“10”,开始则显示“Enter Please:”。3. 随时能够输入数值,并在LCD上实时显示*。当键入数值时,为了保密按从左到右依次显示*,可键入值为09。 4. 按下“13”键,则表示确定键按下,进行密码对比。如相符则在LCD第一行显示“Open the door!”,同时指示灯亮起而且步进电机旋转一定角度;如不符,则LCD第一行显示“Wrong password!”,而且蜂鸣器同时提醒一下。假如密码连续三次错误 则蜂鸣器连续响5下,而且连续5秒不能进行任何操作 5.在开锁状态下按下“12”键,进入修改密码状态,LCD同时提醒“Enter new code!”。6.14为删除按键
6、,出入以后能够进行删除。7.15按键为关闭按键,只有在打开状态下才能够关闭,按下以后LCD显示“Close the door!”。2.功效概述此设计分为四个功效模块。第一模块:按键输入模块,用于密码输入和其它密码操作按键。第二模块:LCD模块,是和使用者交流界面,用于显示多种状态下内容。第三模块:步进电机模块,用于控制密码锁打开和关闭。第四模块:24C08模块,用于储存输入密码并读出来。3. 总体设计 此次设计作品关键组成部分包含80C51单片机、LCD1602、24C08、矩阵按键、LED等、蜂鸣器。 图1总体仿真图,图2实物图。图1 总体电路图图2 密码锁实物图4.硬件设计4.1 矩阵按键
7、设计图3所表示矩阵按键由P1口控制,了加强密码保密性,采取一个44矩阵式键盘能够任意设置用户密码(1-16位长度),从而提升了密码保密性,同时也能降低和单片机接口时所占用I/O口线数目,节省了单片机宝贵资源,在按键比较多时候,通常采取这种方法。每一行和每一列交叉处不相同,而是经过一个按键来连通,利用这种行列式矩阵结构只需要N根行线和M根列线,即可组成含有N M 个按键矩阵键盘。在这种行列式矩阵键盘编码单片机系统中,键盘处理程序首先实施等候按键并确定有没有按键按下程序段。当确定有按键按下后,下一步就是要识别哪一个按键被按下。对键识别方法通常有两种:一个是通用组行扫描查询法;另一个是速度较快线反转
8、法。此系统中,我们采取线反转法。首先分辨键盘中有没有按键被按下,在单片机I/O口向键盘送全扫描字,然后读入行线状态来判定。具体方法是:向行线输出全扫描字00H,把全部列线置成低电平,然后将列线电平状态读入累加器A中。假如有按键被按下,总会有一根行线电瓶被拉至低电平从而使行线不全为1。判定键盘中哪一个按键被按下通常是经过将列线逐列至低电平后,检验行输入状态来实现。方法是:依次给列线送低电平,然后检验全部行线状态,假如全为1,则所按下按键不在此列;假如不全为1,则所按下按键必在此列,而且是在和零电平行线相交交点上那个按键。图3 矩阵按键电路4.2 LCD显示设计 显示电路是为了给使用者以提醒而设置
9、,显示部分由液晶显示器LCD1602(图4所表示)替换一般数码管完成。P0口作为数据传输口P2.0、P2.1、P2.2分别连接RS、RW、E。开锁时,按下键盘上开锁按键后,利用键盘上数字键09输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。当密码输入完成时,假如输入密码正确话, LCD显示“open the dore!”。假如密码不正确,LCD显示器会显示“Wrong password!”,同时红灯亮起。经过LCD显示器,能够清楚地判定出密码锁所处状态。图4 LCD显示器4.3步进电机模块设计步进电机是一个将电脉冲转化为角位移实施机构。通俗一点讲:当步进驱动器接收到
10、一个脉冲信号,它就驱动步进电机按设定方向转动一个固定角度步进角。您能够经过控制脉冲个来控制角位移量,从而达成正确定位目标;同时您能够经过控制脉冲频率来控制电机转动速度和加速度,从而达成调速目标。步进电机28BYJ48型四相八拍电机,电压为DC5VDC12V。当对步进电机施加一系列连续不停控制脉冲时,它能够连续不停地转动。每一个脉冲信号对应步进电机某一相或两相绕组通电状态改变一次,也就对应转子转过一定角度(一个步距角)。当通电状态改变完成一个循环时,转子转过一个齿距。四相步进电机能够在不一样通电方法下运行,常见通电方法有单(单相绕组通电)四拍(A-B-C-D-A.),双(双相绕组通电)四拍(AB
11、-BC-CD-DA-AB-.),八拍(A-AB-B-BC-C-CD-D-DA-A.)。图4所表示。由ULN来控制,ULN1、2、3、4引脚分别连接P3.0、P3.1、P3.2、P3.3口。 图5 步进电机模块4.4 密码修改设计 AT24C02是美国ATMEL企业低功耗CMOS串行EEPROM,它是内含2568位存放空间,含有工作电压宽(2.55.5V)、擦写次数多(大于10000次)、写入速度快(小于10ms)等特点。下面是它电路图。 图5中AT24C021、2、3脚是三条地址线,用于确定芯片硬件地址。在AT89C51试验开发板上它们全部接地,第8脚和第4脚分别为正、负电源。第5脚SDA为串
12、行数据输入/输出,数据经过这条双向I2C总线串行传送,在AT89C51试验开发板上和单片机P3.5连接。第6脚SCL为串行时钟输入线,在AT89C51试验开发板上和单片机P3.4连接。SDA和SCL全部需要和正电源间各接一个5.1K电阻上拉。第7脚需要接地。经过使用24C02便能够实现对密码储存于读取深入实现密码锁改密码功效。 图6 AT24C024.5密码比较设计 该模块将输入密码字符串和设定密码字符串比较。假如相同,实施开锁动作并将输入错误次数清零;假如不一样,累计错误次数,假如是第三次输入错误,系统锁死并发出声光告警;假如小于三次,显示密码错误信息,返回密码输入步骤。逻辑框图图6所表示。
13、模块开启验证密码判定错误次数显示错误而且锁定10秒发出报警 系统锁死作出对应 动作连续错误次数小于三次密码正确密码错误 图7 密码比较步骤图 5. 软件设计及步骤图系统软件设计采取汇编语言编码。设计方法是先用文本编辑器编写源码,然后用软件Keil C51编译,假如没有错误,可连接生成.HEX格式文件。假如有错误则无法连接,但可在生成.OBJ文件中找到代码错误地方,便于修改。当然也能够直接在Keil中编码。生成HEX文件是统计文本行ASCII文本文件,在HEX文件中,每一行是一个HEX统计,由十六进制数组成机器码或数据常量。HEX文件常常被用于将程序或数据传输存放到ROM、EPROM,大多数编程
14、器和模拟器使用HEX文件。图8 单片机控制总体电路图7为单片机控制总体电路,图8软件运行步骤图。图9 软件运行步骤图6.个人体会经过这次课程设计,让我愈加深刻了解书本知识,和以往对知识疏忽得以补充,在设计过程中碰到部分模糊操作和专业用语,比如说单片机定时器,和中止选择,经过对单片机操作实现自己设计功效, 在使用手册时,有数据极难查出,不过这些问题经过这次设计,全部一一得以处理,我相信单片机这本书中还有很多我为搞清楚问题,不过这次课程设计给我相当基础知识,为我以后工作打下了严实基础。即使这次课程是那么短暂2周时间,我感觉到这些天我所学胜过我这一学期所学,这次任务标准上是设计,其实就是一次大作业,
15、是让我对书本知识巩固和应用,对程序设计,修改和调试,使我做事耐心和仔细程度得以提升。课程设计是培训学生利用本专业所学理论知识和专业知识来分析处理实际问题关键教学步骤,是对三年所学知识复习和巩固。一样,也促进了同学们相互探讨,相互学习。 因 此 , 我 们 必 须 认 真 、谨 慎 、踏 实、一步一步 完 成 设 计。如 果 时 间 可 以 重来,我可能会认真去学习和研究,也可能会自己独立完成一个项目,我相信不管是谁看到自己做出结果时心里一定会很兴奋。此次设计让我明白了一个很深刻道理:团体精神当然很关键,但人往往还是要靠自己努力,自己亲身去经历,这么自己心里才会扎实,学到东西才会更多。参考文件
16、1 马建国、孟宪元.电子设计自动化技术基础.机械工业出版社. 2 姜威.实用电子系统设计基础.北京理工大学出版社. 3 张靖武.单片机系统PROTEUS设计和仿真.电子工业出版社. 4 孙福成.KEIL C项目教程.西安电子科技大学出版社. 5 张毅刚.单片机原理及接口技术.人民邮电出版社.8.附录:源程序#include#include #defineOP_READ0xa1/ 器件地址和读取操作,0xa1即为1010 0001B#defineOP_WRITE 0xa0/ 器件地址和写入操作,0xa1即为1010 0000B#define uint unsigned int#define uc
17、har unsigned char#define KEY P1#define No_key 20#define lcddata P0sbit SDA=P35; /将串行数据总线SDA位定义在为P3.5引脚sbit SCL=P34; /将串行时钟总线SDA位定义在为P3.4引脚sbit lcden=P22;sbit lcdrs=P20;sbit lcdrw=P21;sbit light=P23;sbit light1=P24;sbit deng=P37;sbit BEEP= P36;uchar j,z,y,j1,j2; /h使用修改后密码开锁标志位uchar n=0,h=0; /中间标志位 用于
18、传输信息 确保密码修改过后 按复位按键 密码修改标志位不改变uchar aa;uchar code FFW8=0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9;uchar code REV8=0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1; /反转编码uchar code table =Welcome to use!;uchar code table1=Open the door! ;uchar code table2=Enter Please: ; uchar code table3=Close the door!;uchar c
19、ode table4=Wrong password!; uchar code table5=Enter new code!;uchar code table6=New code finish;uchar code key_table16=1,2,3,10, 4,5,6,11, 7,8,9,12, 0,13,14,15;uchar Password=1,2,3,4,5,6; /设置初始密码uchar save15;uchar mima15;uchar conflag; /确定标志uchar lockflag; /键盘锁定标志uchar startflag; /开始标志uchar open; /门
20、打开标志位uchar begain;/开始标志void delay1(uint t);void delay(uint z);void wright_com(uchar com); /写命令函数void wright_data(uchar date); /写数据函数void init(); /初始化函数void display_open(); /显示open the doorvoid display_close();/显示close the doorvoid display_wrong();void display_newcode(); /显示输入新密码void display_codefini
21、sh(); / 显示新密码成功void delete(); /删除输入最终一个数uchar keyscan(); /带返回值键盘扫描程序void enter_code(uchar t); /void enter_code1(uchar t);void enter_code2(uchar t);void confirm(); /确定密码对不对,把输入数据和密码逐一对比void confirm1();void succeed_an(); /密码正确时响应void fail_an(); /密码失败时响应void alarm(); /发出警报声void reset(); /复位函数void reset
22、_save();void display_enter(); /显示输入void motor_ffw();void motor_rev();/*函数功效:延时1ms(3j+2)*i=(333+2)10=1010(微秒),能够认为是1毫秒*/void delay1ms() uchar i,n; for(i=0;i10;i+) for(n=0;n33;n+) ; /*函数功效:延时若干毫秒入口参数:n*/ void delaynms(uint n) uchar i;for(i=0;in;i+) delay1ms(); void start() / 开始位SDA = 1; /SDA初始化为高电平“1”
23、 SCL = 1; /开始数据传送时,要求SCL为高电平“1”_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期SDA = 0; /SDA下降沿被认为是开始信号_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期SCL = 0; /SCL为低电平时,SDA上数据才许可改变(即许可以后数据传输) void stop() / 停止位SDA = 0; /SDA初始化为低电平“0”_nSCL = 1; /结束数据传送时
24、,要求SCL为高电平“1”_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期SDA = 1; /SDA上升沿被认为是结束信号_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期_nop_(); /等候一个机器周期SDA=0;SCL=0;/*从AT24Cxx读取数据*unsigned char ReadData()/ 从AT24Cxx移入数据到MCUunsigned char i;unsigned char x; /储存从AT24Cxx中读出数据f
25、or(i = 0; i 8; i+)SCL = 1; /SCL置为高电平x=1; /将x中各二进位向左移一位x|=(unsigned char)SDA; /将SDA上数据经过按位“或“运算存入x中SCL = 0; /在SCL下降沿读出数据return(x); /将读取数据返回/*函数功效:向AT24Cxx目前地址写入数据*/在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(unsigned char y)unsigned char i;bit ack_bit; /储存应答位for(i = 0; i 8; i+)/ 循环移入8个位 SDA =
26、 (bit)(y&0x80); /经过按位“和”运算将最高位数据送到S /因为传送时高位在前,低位在后 _nop_(); /等候一个机器周期 SCL = 1; /在SCL上升沿将数据写入AT24Cxx _nop_(); /等候一个机器周期 _nop_(); /等候一个机器周期 SCL = 0; /将SCL重新置为低电平,以在SC线形成传送数据所需个脉冲y = 1; /将y中各二进位向左移一位SDA = 1; / 发送设备(主机)应在时钟脉冲高电平期间(SCL=1)释放SDA线, /以让SDA线转由接收设备(AT24Cxx)控制_nop_(); /等候一个机器周期 _nop_(); /等候一个机
27、器周期 SCL = 1; /依据上述要求,SCL应为高电平_nop_(); /等候一个机器周期 _nop_(); /等候一个机器周期 _nop_(); /等候一个机器周期 _nop_(); /等候一个机器周期 ack_bit = SDA; /接收设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 /若送高电平,表示没有接收到,传送异常SCL = 0; /SCL为低电平时,SDA上数据才许可改变(即许可以后数据传输)return ack_bit;/ 返回AT24Cxx应答位/*向AT24Cxx中指定地址写入数据*)void WriteSet(unsigned char add, un
28、signed char dat)/ 在指定地址addr处写入数据WriteCurrentstart(); /开始数据传输WriteCurrent(OP_WRITE); /选择要操作AT24Cxx芯片,并通知要对其写入数据WriteCurrent(add); /写入指定地址WriteCurrent(dat); /向目前地址(上面指定地址)写入数据stop(); /停止数据传输delaynms(4); /1个字节写入周期为1ms, 最好延时1ms以上unsigned char ReadCurrent() /从AT24Cxx中目前地址读取数据unsigned char x;start(); /开始数
29、据传输WriteCurrent(OP_READ); /选择要操作AT24Cxx芯片,并通知要读其数据x=ReadData(); /将读取数据存入xstop(); /停止数据传输return x; /返回读取数据unsigned char ReadSet(unsigned char set_addr) /从AT24Cxx中指定地址读取数据start(); /开始数据传输WriteCurrent(OP_WRITE); /选择要操作AT24Cxx芯片,并通知要对其写入数据WriteCurrent(set_addr); /写入指定地址return(ReadCurrent(); /从指定地址读出数据并返
30、回void gaimima() /*改密码程序*uchar temp,i;SDA=1;SCL=1;if(z=1)while(1)temp=keyscan();enter_code(temp);if(temp=13)for(i=0;i6;i+) WriteSet(i,savei); delaynms(10); for(i=0;i6;i+) mimai=ReadSet(i); delaynms(10);display_codefinish();reset_save();break;if(temp=14)delete(); void main(void)uchar temp;y=0;open=1;
31、/open门开关标志位 1为关闭 0为打开while(1)init();if(h=1)deng=0;while(1)begain=0;if(lockflag)temp=keyscan(); /按键期间也要进行键盘扫描if(temp!=No_key) /重新计时三秒aa=0; /重新在定时器中计数elsetemp=keyscan(); /反复扫描输入,等候随时输入if(temp!=No_key) /有按键按下才能进行下一步if(temp=10&open=1)reset();startflag=1; /开始标志位if(startflag)if(h=0)/更改密码前密码确定enter_code(te
32、mp); /每扫描一次键盘就要进行一次处理 保留输入数值if(temp=13&open=1) /按下确定键进行密码确定confirm();/进行确定判定if(conflag)succeed_an(); /密码正确作出对应反应open=0;z=1;reset_save();elsefail_an(); /密码错误作出对应反应else /更改密码后密码确定enter_code(temp); /每扫描一次键盘就要进行一次处理 保留输入数值if(temp=13&open=1) /按下确定键进行密码确定confirm1();/进行确定判定if(conflag)succeed_an(); /密码正确作出对
33、应反应open=0;z=1;elsefail_an(); /密码错误作出对应反应if(temp=14)delete();if(temp=12&z=1)reset();display_newcode();gaimima();h=1;/ 改密码成功标志位 用于以后选择密码对比if(temp=15&z=1)uchar r;open=1;display_close();for(r=0;r18;r+) motor_rev(); /电机反转if(temp=11&begain=0&open=1)begain=1;break;void motor_rev() /电机反转函数uchar i;uint j;z=0;for (j=0; j8; j+) /转1n圈for (i=0; i8; i+) /一个周期转45度 P3 = REVi; /取数据 delay1(2); /调整转速void motor_ffw() /电机转动函数 uchar i; uint j; for (j=0; j8; j+) /转1*n圈 for (i=0; i8; i+) /一个周期转45度 P3 = FFWi; /取数据 delay1(2); /调整转速 void display_enter()/显示enteruc
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100