1、山东交通学院单片机原理与应用课程设计院(部): 轨道交通学院 班 级: 自动化 121 学生姓名: 学 号: 指导教师: 时 间: 2015.6.12015.6.12 课 程 设 计 任 务 书题 目 电子密码锁设计 系 (部) 轨道交通学院 专业班级 自动化 121 学生姓名 学 号 06 月 01 日至 06 月 12 日 共 2 周指导教师(签字) 系 主 任(签字) 年 月 日一、设计内容及要求本实验基于 51 单片机利用矩阵按键、步进电机、lcd1602 等模块实现电子密码锁的输入密码、密码比对、步进电机的驱动、修改密码等功能。设计内容包括:1)lcd1602 显示;2)矩阵按键的输
2、入;3)24C08的储存于读取;4)步进电机的驱动;5)线路的链接。设计要求:1)能演示;2)能回答答辩过程中提问的问题;3)完成设计报告。 二、设计原始资料单片机原理及接口技术 李全利 2010 年 1 月单片机原理及应用教程 范立南 2006 年 1 月单片机原理及应用教程 刘瑞新 2003 年 07 月 三、设计完成后提交的文件和图表1计算说明书部分1)方案论证报告打印版或手写版2)程序流程图3)具体程序 2图纸部分:具体电路原理图打印版四、进程安排教学内容 学时 地点资料查阅与学习讨论 2 天 406 实验室分散设计 4 天 406 实验室编写报告 2 天 406 实验室成果验收 2
3、天 406 实验室 按分组选择不同的实验台,每组 3 人,题目可重复选择,但每题目不得超过 10 人。五、主要参考资料电子设计自动化技术基础马建国、孟宪元编 清华大学出版 2004 年 4 月单片机原理及接口技术 张毅刚 人民邮电出版社.2008 年实用电子系统设计基础 姜威 2008 年 1 月单片机系统的 PROTEUS 设计与仿真 张靖武 2007 年 4月指导老师成绩 答辩小组成绩 总成绩目录摘要.11.设计要求.22.功能概述.23.总体设计.24.硬件设计.34.1 矩阵按键设计.34.2 LCD 显示设计.44.3 步进电机模块设计.54.4 密码修改设计.54.5 密码比较模块
4、65.软件设计及流程图.66.个人体会.87.参考文献.9附录.100摘要设计运用了 ATMEL 公司的 AT89S52 芯片系统,将微处理器、总线、蜂鸣器、矩阵键盘、存储器和 I/O 口等硬件集中一块电路板上,通过读取键盘输入的数据(密码)并储存到ATMEL912 24C08 存储器中,然后判断之后键盘输入的数据与已存储的数据是否相同来决定打开密码箱或锁键盘或报警。在 keil4 软件中编程,系统可实现 6 位密码的处理,并通过控制步进电机控制密码箱门的电子锁,同时还可以修改改密码。利用单片机系统制作的密码箱安全性能更高,更易操作且体积小。关键词:单片机、密码锁、修改密码11.设计要求本实验
5、将实现六位数的电子密码锁。要求使用 4X4 行列式键盘作为输入,并用 LCD实时显示。具体要求如下:1. 开机时 LCD 显示“welcome to use”,初始化密码为“123456”,密码可以更改。 2. 按下“10”,开始则显示“Enter Please:”。3. 随时可以输入数值,并在 LCD 上实时显示*。当键入数值时,为了保密按从左到右依次显示*,可键入值为 09。 4. 按下“13”键,则表示确定键按下,进行密码对比。如相符则在 LCD 第一行显示“Open the door!”,同时指示灯亮起并且步进电机旋转一定的角度;如不符,则 LCD 第一行显示“Wrong passwo
6、rd!”,并且蜂鸣器同时提示一下。如果密码连续三次错误 则蜂鸣器连续响 5 下,并且持续 5 秒不能进行任何操作 5.在开锁状态下按下“12”键,进入修改密码状态,LCD 同时提示“Enter new code!”。6.14为删除按键,出入之后可以进行删除。7.15 按键为关闭按键,只有在打开状态下才可以关闭,按下之后 LCD 显示“Close the door!”。2.功能概述此设计分为四个功能模块。第一模块:按键输入模块,用于密码的输入以及其他的密码操作按键。第二模块:LCD 模块,是与使用者交流的界面,用于显示各种状态下的内容。第三模块:步进电机模块,用于控制密码锁的打开与关闭。第四模块
7、:24C08 模块,用于储存输入的密码并读出来。3.总体设计本次设计作品的主要构成部分包括 80C51 单片机、LCD1602、24C08、矩阵按键、LED 等、蜂鸣器。 如图 1 总体仿真图,图 2 实物图。图 1 总体电路图2图 2 密码锁实物图4.硬件设计4.1 矩阵按键设计如图 3 所示矩阵按键由 P1 口控制,了加强密码的保密性,采用一个 44 的矩阵式键盘可以任意设置用户密码(1-16 位长度),从而提高了密码的保密性,同时也能减少与单片机接口时所占用的 I/O 口线的数目,节省了单片机的宝贵资源,在按键比较多的时候,通常采用这种方法。每一行与每一列的交叉处不相同,而是通过一个按键
8、来连通,利用这种行列式矩阵结构只需要 N 根行线与 M 根列线,即可组成具有 N M 个按键的矩阵键盘。在这种行列式矩阵键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就是要识别哪一个按键被按下。对键的识别方法通常有两种:一种是通用的组行扫描查询法;另一种是速度较快的线反转法。此系统中,我们采用线反转法。首先辨别键盘中有无按键被按下,在单片机 I/O 口向键盘送全扫描字,然后读入行线状态来判断。具体方法是:向行线输出全扫描字 00H,把全部列线置成低电平,然后将列线的电平状态读入累加器 A 中。如果有按键被按下,总会有一根行线电瓶被拉至
9、低电平从而使行线不全为 1。判断键盘中哪一个按键被按下通常是通过将列线逐列至低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后检查所有行线状态,如果全为 1,则所按下的按键不在此列;如果不全为 1,则所按下的按键必在此列,而且是在与零电平行线相交的交点上的那个按键。3图 3 矩阵按键电路4.2 LCD 显示设计显示电路是为了给使用者以提示而设置的,显示部分由液晶显示器 LCD1602(如图 4所示)取代普通的数码管完成。P0 口作为数据传输口 P2.0、P2.1、P2.2 分别连接RS、RW、E。开锁时,按下键盘上的开锁按键后,利用键盘上的数字键 09 输入密码,每按下一个数字
10、键后在显示器上显示一个*,输入多少位就显示多少个*。当密码输入完成时,如果输入的密码正确的话, LCD 显示“open the dore!”。如果密码不正确,LCD 显示屏会显示“Wrong password!”,同时红灯亮起。通过 LCD 显示屏,可以清楚地判断出密码锁所处的状态。图 4 LCD 显示屏44.3 步进电机模块设计步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度步进角。您可以通过控制脉冲个来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到
11、调速的目的。步进电机 28BYJ48 型四相八拍电机,电压为 DC5VDC12V。当对步进电机施加一系列连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机可以在不同的通电方式下运行,常见的通电方式有单(单相绕组通电)四拍(A-B-C-D-A.),双(双相绕组通电)四拍(AB-BC- CD-DA-AB-.),八拍(A-AB-B-BC-C-CD-D-DA-A.)。如图4 所示。由 ULN2003 来控制,ULN2003 的 1、2、3、4
12、 引脚分别连接P3.0、P3.1、P3.2、P3.3 口。图 5 步进电机模块4.4 密码修改设计AT24C02 是 美 国 ATMEL 公 司 的 低 功 耗 CMOS 串 行 EEPROM, 它 是 内 含 2568 位 存 储 空 间 , 具 有工 作 电 压 宽 ( 2.55 .5V) 、 擦 写 次 数 多 ( 大 于 10000 次 ) 、 写 入 速 度 快 ( 小 于 10ms) 等 特 点 。下 面 是 它 的 电 路 图 。图 5 中 AT24C02 的 1、2、3 脚是三条地址线,用于确定芯片的硬件地址。在 AT89C51试验开发板上它们都接地,第 8 脚和第 4 脚分别
13、为正、负电源。第 5 脚 SDA 为串行数据输入/输出,数据通过这条双向 I2C 总线串行传送,在 AT89C51 试验开发板上和单片机的P3.5 连接。第 6 脚 SCL 为串行时钟输入线,在 AT89C51 试验开发板上和单片机的 P3.4 连接。SDA 和 SCL 都需要和正电源间各接一个 5.1K 的电阻上拉。第 7 脚需要接地。5通过使用 24C02 便可以实现对密码的储存于读取进一步实现密码锁的改密码功能。图 6 AT24C024.5 密码比较设计该模块将输入密码字符串与设定密码字符串比较。如果相同,执行开锁动作并将输入错误次数清零;如果不同,累计错误次数,如果是第三次输入错误,系
14、统锁死并发出声光告警;如果小于三次,显示密码错误信息,返回密码输入环节。逻辑框图如图 6 所示。图 7 密码比较流程图 5.软件设计及流程图系统的软件设计采用汇编语言编码。设计方法是先用文本编辑器编写源码,然后用软件Keil C51 编译,如果没有错误,可连接生成.HEX 格式的文件。如果有错误则无法连接,模块启动验证密码判断错误次数显示错误并且锁定 10 秒发出报警 系统锁死作出相应 的动作连续错误次数小于三次密码正确密码错误6但可在生成的.OBJ 文件中找到代码错误的地方,便于修改。当然也可以直接在 Keil 中编码。生成的 HEX 文件是记录文本行的 ASCII 文本文件,在 HEX 文
15、件中,每一行是一个 HEX记录,由十六进制数组成的机器码或者数据常量。HEX 文件经常被用于将程序或数据传输存储到 ROM、EPROM,大多数编程器和模拟器使用 HEX 文件。图 8 单片机控制总体电路图 7 为单片机控制总体电路,图 8 软件运行流程图。7图 9 软件运行流程图6.个人体会通 过 这 次 课 程 设 计 , 让 我 更 加 深 刻 了 解 课 本 知 识 , 和 以 往 对 知 识 的 疏 忽 得 以 补 充 ,在 设 计 过 程 中 遇 到 一 些 模 糊 的 操 作 和 专 业 用 语 , 比如说单片机定时器,以及中断的选择,通过对单片机的操作实现自己设计的功能, 在 使
16、 用 手 册 时 , 有 的 数 据 很 难 查 出 ,但 是 这 些 问 题 经 过 这 次 设 计 , 都 一 一 得 以 解 决 , 我 相 信 单 片 机 这 本 书 中 还 有 很 多 我为 搞 清 楚 的 问 题 , 但 是 这 次 的 课 程 设 计 给 我 相 当 的 基 础 知 识 , 为 我 以 后 工 作 打 下 了 严实 的 基 础 。虽 然 这 次 课 程 是 那 么 短 暂 的 2 周 时 间 , 我 感 觉 到 这 些 天 我 的 所 学 胜 过 我 这 一 学 期所 学 , 这 次 任 务 原 则 上 是 设 计 , 其 实 就 是 一 次 大 的 作 业 ,
17、是 让 我 对 课 本 知 识 的 巩 固 和应 用 , 对 程 序 的 设 计 , 修 改 以 及 调 试 , 使 我 做 事 的 耐 心 和 仔 细 程 度 得 以 提 高 。 课 程 设计 是 培 训 学 生 运 用 本 专 业 所 学 的 理 论 知 识 和 专 业 知 识 来 分 析 解 决 实 际 问 题 的 重 要 教 学环 节 , 是 对 三 年 所 学 知 识 的 复 习 和 巩 固 。 同 样 , 也 促 使 了 同 学 们 的 相 互 探 讨 , 相 互 学 习 。 因 此 , 我 们 必 须 认 真 、 谨 慎 、 踏 实 、 一 步 一 步 的 完 成 设 计 。 如
18、 果 时 间 可 以 重 来 , 我 可 能 会认 真 的 去 学 习 和 研 究 , 也 可 能 会 自 己 独 立 的 完 成 一 个 项 目 , 我 相 信 无 论 是 谁 看 到 自 己做 出 的 成 果 时 心 里 一 定 会 很 兴 奋 。8此 次 设 计 让 我 明 白 了 一 个 很 深 刻 的 道 理 : 团 队 精 神 固 然 很 重 要 , 但 人 往 往 还 是 要 靠自 己 的 努 力 , 自 己 亲 身 去 经 历 , 这 样 自 己 的 心 里 才 会 踏 实 , 学 到 的 东 西 才 会 更 多 。参考文献1 马建国、孟宪元.电子设计自动化技术基础.机械工业出
19、版社.2004.2 姜威.实用电子系统设计基础.北京理工大学出版社.2008.3 张靖武.单片机系统的 PROTEUS 设计与仿真.电子工业出版社.2007.4 孙福成.KEIL C 项目教程.西安电子科技大学出版社.2012.5 张毅刚.单片机原理及接口技术.人民邮电出版社.2008.98.附录:源程序#include#include #define OP_READ 0xa1 / 器件地址以及读取操作,0xa1 即为 1010 0001B#define OP_WRITE 0xa0 / 器件地址以及写入操作,0xa1 即为 1010 0000B#define uint unsigned int
20、#define uchar 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 使用修改后的密码开锁标志位ucha
21、r n=0,h=0; /中间标志位 用于传递信息 保证密码修改过后 按复位按键 密码修改标志位不改变10uchar 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 ta
22、ble3=“Close the door!“;uchar code 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; /键盘锁定标志uc
23、har startflag; /开始标志uchar open; /门打开标志位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_ne
24、wcode(); /显示输入新密码void display_codefinish(); / 显示新密码成功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 a
25、larm(); /发出警报声void reset(); /复位函数void reset_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;i0;j-) /蜂鸣器响大约 500MSBEEP = BEEP;delay(1);/延时 500US 发出大约 1KHZ 频率的响声 BEEP=1; /蜂鸣器不响delay(500);light1=1;
26、break; y+;if(y=3)while(1)light1=0;display_wrong();for(j=3000;j0;j-) /蜂鸣器响大约 500MSBEEP = BEEP;delay(1);/延时 500US 发出大约 1KHZ 频率的响声 BEEP=1; /蜂鸣器不响delay(500);light1=1; i+;if(i=4)break; lockflag=1;void enter_code(uchar t) /输入密码并在屏幕上显示星号if(t=0light1=1;lockflag=0;void init() /初始化uchar num;open=1;TMOD=1;TH0=
27、(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;EA=1;TR0=1;lcdrw=0;lcden=0;19wright_com(0x38);wright_com(0x0c);wright_com(0x01);wright_com(0x80);for(num=0;num0;z-)for(y=110;y0;y-);uchar keyscan() /4*4 按键扫描函数uchar temp,num=No_key;/第一行KEY=0xfe;temp=KEY;temp=temp /读出高四位while(temp!=0xf0)delay(10);temp=KEY
28、;temp=tempwhile(temp!=0xf0)temp=KEY;switch(temp)case 0xee:num=1;break;case 0xde:num=2;break;20case 0xbe:num=3;break;case 0x7e:num=10;break;while(temp!=0xf0) /等待松手temp=KEY;temp=temp/第二行KEY=0xfd;temp=KEY;temp=temp /读出高四位while(temp!=0xf0)delay(10);temp=KEY;temp=tempwhile(temp!=0xf0)temp=KEY;switch(temp
29、)case 0xed:num=4;break;case 0xdd:num=5;break;case 0xbd:num=6;break;case 0x7d:num=11;break;while(temp!=0xf0) /等待松手temp=KEY;temp=temp/第三行KEY=0xfb;temp=KEY;temp=temp /读出高四位while(temp!=0xf0)delay(10);temp=KEY;temp=tempwhile(temp!=0xf0)temp=KEY;switch(temp)case 0xeb:num=7;break;case 0xdb:num=8;break;case
30、 0xbb:num=9;break;case 0x7b:num=12;break;while(temp!=0xf0) /等待松手temp=KEY;temp=temp21/第四行KEY=0xf7;temp=KEY;temp=temp /读出高四位while(temp!=0xf0)delay(10);temp=KEY;temp=tempwhile(temp!=0xf0)temp=KEY;switch(temp)case 0xe7:num=0;break;case 0xd7:num=13;break;case 0xb7:num=14;break;case 0x77:num=15;break;while(temp!=0xf0) /等待松手temp=KEY;temp=tempreturn num;