1、1单片机原理课程设计设计说明书设计题目:智能钟带密码锁程序设计设 计 者: 李海军 班 级: 自动化 121 学 号: 100512123 指导教师: 陈伟利 日 期: 2014.01.052014.01.162目录1.设计的目的 .32.设计原则和要求 .32.1 设计原则 .32.2 设计要求 .33.设计任务 .33.1 设计思路 .33.2 设计题目要求 .43.3 设计流程 .44.单片机及各模块选择 .54.1 AT89C51 单片机 .54.2 矩阵键盘 .54.3 LCD1602.64.4 总系统仿真图 .75.系统设计框图 .76.主要程序介绍 .86.1 键盘扫描及键值返回
2、程序 .86.2 LCD 程序 .96.3 显示和中断程序 .96.4 密码锁程序 .97.设计总结 .108.参考文献 .119.附录 .123智能钟带密码锁的设计报告1.设计的目的1.通过单片机原理与应用课程设计,使学生理解单片机系统设计的方法和设计原则及相应的硬件调试、软件编程方法。进一步理解单片机应用系统的设计和应用。2.通过本次课程设计达到理论与实践相结合,提高学生分析问题和解决问题的能力。3.学会使用电子图书馆的数据库资源进行查找相关文献和资料。4.初步掌握 Keil 编程软件和 Protues 软件进行仿真设计,掌握编写设计说明书的基本方法。2.设计原则和要求2.1 设计原则1.
3、合理性。所设计内容应符合国家相关政策和法令,符合现行的行业行规要求。2.先进性。杜绝使用落后,淘汰的产品,不使用未经认可的技术,要充分考虑未来发展。3.实用性。考虑降低物耗,保护环境,综合利用等因素。2.2 设计要求1.独立设计原理图及相应的硬件电路。2.独立焊接电路板并对电路板调试。3.针对选择的设计题目,设计系统软件。软件要做到:操作方便,实用性强,稳 定可靠。4.设计说明书格式规范,层次合理,重点突出。并附上设计原理图、电路板图及相应的源程序。3.设计任务3.1 设计思路通过查找相关资料,复习单片机所学内容做好知识储备,然后根据题目要求利用 Protues 软件画出合理的仿真图,再利用
4、Keil 软件进行编程设计。多功能数字时钟和电子密码锁先分开仿真分别写程序,确定都仿真成功以后将4两个程序合理的进行无缝连接成为一个程序,最后将调试完成的程序写入同一个 Protues 仿真图中完成仿真。3.2 设计题目要求1.多功能数字时钟(1)在显示屏上显示时间。时间格式:LED 为“时:分”;LCD 为“时:分:秒”。(2)可显示“年、月、日、周”等信息。(3)可对时钟的“年、月、日、周、时:分:秒”进行更改。(4)增加 COM 接口程序,实现用计算机软件程序调节时钟及其附加功能。(5)扩展定时控制功能(选作)。(6)扩展计时器功能,可实现 30 个计时记录。(7)自定义的扩展功能。2.
5、电子密码锁(1)上电启动时,即显示输入密码。如果用数码管做为显示,输入密码为自定义字符(非正常的数字或字符);如果采用 LCD 做为显示,输入密码为“*”号。并要求有中文提示。(2)有修改密码的功能。但必须输入原密码后验正后才能修改密码。且修改密码也要两次验证。密码一旦更改,不再记忆原密码。密码为 6 位键盘码。(3)密码输入正确,显示开锁标志。否则,提示密码输入错误,并提示重新输入。当连续输入三次错误时,中止密码输入,并显示报警标志,2 个小时后放可进行下一次密码输入。(4)设置一个万能的通用密码,在必要时使用。且此密码长度要超过 6 位。(5)设置 COM 的接口程序,达到计算机可实现上述
6、所有功能。(6)自定义的扩展功能。3.3 设计流程输入密码正确 LCD 显示可以开启万年历可按键调节54.单片机及各模块选择4.1 AT89C51 单片机AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能 CMOS8 位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除 100 次。该器件采用 ATMEL 高密度非易失存储器制造技术制造,与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中,
7、ATMEL 的 AT89C51 是一种高效微控制器。其主要特性包括:(1)与 MCS-51 兼容 (2)4K 字节可编程闪烁存储器(3)三级程序存储器锁定(4)寿命:1000写/擦循环(5)1288 位内部 RAM(6)32 可编程 I/O 线(7)两个 16 位定时器/计数器(8)5 个中断源(9)可编程串行通道(10)片内振荡器和时钟电路4.2 矩阵键盘考虑到单片机的 I/O 口是十分宝贵的,并且我设计的万年历在进行年月日、时分秒的调节时是按不同的按键从而进入调节模式,这样一共需要 6 个按键。同时还有一个六位的密码锁、一个确认输入密码按键、一个密码锁和万年历模式切换按键以及调节万年历的加
8、减按键,这样一共需要 16 个按键。如果直接利用 I/O 口写的话必定会造成 I/O 口的浪费,这与设计原则不符,所以我决定采用矩阵键盘,这样只用八个 I/O 口就可以实现 16 按键控制。但是加减按键不能加入到矩阵键盘中,需要用两个 I/O 口单独引出。因为我写的程序中switch 函数是对矩阵键盘的键值进行寻键的,也就是只能在 switch 函数中执行一种情况。假使要对年份进行调节,按过年份调节按键后在按加减键是没有任何反应的。错误 LCD 显示万年历关闭 按键调节无效64.3 LCD160216 代表液晶显示器每行可显示 16 个字符,02 表示显示两行,由字符库可看出显示器显示的数字和
9、字母部分的代码,恰好是 ASCII 码表中的编码。单片机控制 LCD1602 显示时,只需将待显示字符部分的 ASCII 码写入内部的显示用数据存储器(DDRAM),内部控制电路就可将字符在显示器上显示出来。当向DDRAM 的 00H0FH(第一行)、40H4FH(第二行)地址中的任一处写入数据时LCD 将立即显示出来。LCD 是慢显示器件,所以在写每一条命令前,一定要查询忙标志位 BF,即 LCD1602 是否处于“忙”状态。如果 LCD 正忙于处理其他命令,就等待;如果不忙,则向 LCD 写入命令。LCD 的基本操作包括:(1)初始化LCD(2)读状态。检测“忙”标志位 BF,如果 BF
10、为 1 说明 LCD 正处于忙状态,不能对其写命令;如果 BF 为 0,则可以写入命令。(3)写命令。(4)写数据。将要显示字符的 ASCII 码写入 LCD 中的数据显示 RAM(DDRAM)(5)自动显示。我之所以用 LCD1602 是因为用数码管显示万年历和密码锁每次都要清屏(防止残影产生造成显示乱码)并且数码管由于本身的限制无法显示字符,在实际应用的时候没有 LCD 方便。同时,如果选用数码管的话必定会导致 I/O 的浪费,数码管要进行段码和位码的选择,而 LCD 则会简单很多。74.4 总系统仿真图85.系统设计框图6.主要程序介绍6.1 键盘扫描及键值返回程序1.键盘扫描程序uns
11、igned char KeyScan(void) /键盘扫描函数unsigned char cord_h,cord_l;/行列值中间变量P1=0x0f; /行线输出全为 0cord_h=P1 /读入列线值if(cord_h!=0x0f) /先检测有无按键按下delay(10); /去抖if(P1 /读入列线值P1=cord_h|0xf0; /输出当前列线值cord_l=P1 /读入行线值while(P1/等待松开并输出return(cord_h+cord_l);/键盘最后组合码值return(0xff); /返回该值2.键值返回程序unsigned char KeyPro(void)switc
12、h(KeyScan()case 0xee:return keyval=1;break;/0 按下相应的键显示相对应的码值说明:case 中有很多还有很多情况,此处并未列写,此处返回的键值方便主函数中的 switch 语句寻键时比较方便。并且这样在主函数中调用键盘扫描函数时只需写“KeyPro();”即可。6.2 LCD 程序1.判断液晶的忙碌状态函数:unsigned char BusyTest(void)2.将指令写入液晶模块:void WriteInstruction (unsigned char dictate)3.指定字符显示的实际地址:void WriteAddress(unsign
13、ed char x)4.将数据(字符的 ASCII 码)写入液晶模块:void WriteData(unsigned char y)5.LCD 的初始化:void LcdInitiate(void)说明:将这些 LCD 的小程序都写成函数的形式,方便其调用,具体的程序10会在附录中给出6.3 显示和中断程序1.将年份、月份、日期、小时、分钟、秒分别做成函数再调用2.所有的计时共能全部写在中断程序中6.4 密码锁程序Flag=1;/先把比较位置 1for(j=0;j8;j+)/循环比较 8 个数值,/如果有一个不等 则最终 Flag 值为 0Flag=Flag/比较输入值和已有密码for(j=0
14、;j8;j+)/清屏TempDataj=0;if(Flag)/如果比较全部相同,标志位置 1TempData0=0x3f; / “o“TempData1=0x73; / “p“TempData2=0x79; / “E“TempData3=0x54; / “n“说明:主程序中密码锁程序的一部分,密码锁的原理是将按键值存在缓存区中然后与之前设置好的密码数组每一位都经行比较,如果每一位都相同的话则 Flag 为 1,经行 OPEN 的显示。如果有一位不相同的话则 Flag 为 0,经行LOCK 的显示。7.设计总结在本次智能钟带密码锁的课程设计中,学习兼理论与实践相结合,初步掌握综合运用所学知识,增强了动手解决实际问题的能力。学会了踏实的迈开第一步。我分析应该将两者先分开设计然后再合在一起。按照这个思路我准备先进行万年历的设计,开始我想用数码管进行设计,因为原来用数码管做过秒表和一个简单的时钟。我找到自己原来写的程序,在此之上我又加了一个 8个显示的数码管进行年份、月份、日期的显示,但是这样只能用下加的小数点