1、宁德师范学院单片机课程设计报告专 业 电气工程及其自动化 学生姓名 钱泳舟 学 号 B2013052129 题 目 LCD 电子时钟 指导教师 袁秋凤 2015 年 12 月 8 日11 方案设计与论证1.1 主控制器模块方案 1 采用 STC89C52 芯片作为硬件核心。 STC89C52 内部具有 8KB ROM 存储空间,512 字节数据存储空间,带有 2K 字节的 EEPROM 存储空间,与 MCS-51 系列单片机完全兼容,STC89C52 可以通过串口下载。方案 2采用 AT89S52 芯片作为硬件核心。AT89S52 片内具有 8K 字节程序存储空间,256 字节的数据存储空间没
2、有 EEPROM 存储空间,也与 MCS-51 系列单片机完全兼容,具有在线编程可擦除技术。两种单片机都完全能够满足设计需要,STC89C52 相对 ATS89C52 价格便宜,且抗干扰能力强。考虑到成本因素,因此选用 STC89C52。1.2 显示模块方案 1用 LED 数码管进行显示。数码管由于显示速度快,使用简单,显示效果简洁明了而得到了广泛应用。方案 2采用 LCD 的方法,具有硬件制作简单可直接与单片机接口,显示内容多,功耗小,成本低等优点,LCD1602 可显示 32 个字符,采用 LCD 的缺点是亮度不够。比较以上两种方案:方案 1 硬件简单、功耗小;方案 2 硬件简单,显示内容
3、多,功耗小,成本低等。本系统设计要求达到功耗小、体积小、成本低,显示信息多等要求,权衡两种方案,选择方案 2。2 硬件电路设计2.1 原理框图12.2 单片机最小系统电路主控制器最小系统仿真电路如下图 1 所示。主要由 STC89C52 单片机、内部时钟电路和按键手动复位电路构成。图 1 最小系统仿真电路图2.2.1 复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用上电复位方式。如图 2 所示: 图 2 复位电路图2.2.2 晶振电路晶振可以选用频率为 12MHz 的晶振,晶振两端接单片机 XTA1、XTA2 引脚。如图 3 所示2图 3 晶振电路图2.3 LCD 液晶屏显示电路显示
4、电路采用 LCD 液晶显示器,采用动态扫描显示方式。单片机的 P0 端口作为段选线,P2.0P2.3 作为位选线。显示仿真电路如图所示,实际电路制作时采用 PNP 三极管 9012 来驱动 4 位数码管,驱动电路如图 4 所示,9012 的基极接单片机的 P2.5P2.7 引脚,集电极接数码管的 COM 引脚。图 4 LCD 显示电路图2.4 按键电路图 5 按键电路图K1 设置时钟(按键 1 次设置秒,2 次设置分,3 次设置时。 ) ,K2 增加一(设置中对所选择变量加一) ,K3 减少一(设置中对所选择变量减一) ,K4 复位(时分秒归零) 。3 软件设计3.1 主程序主程序包括键盘识别
5、控制及液晶屏显示 2 个子程序,实现时钟的显示,调节功能。初始化子程序包括 1602 液晶显示模式和定时器初值。利用定时器 0 来控制时间,实现分钟,小时的计算。开始初始化子程序33.2 子程序3.2.1 按键子程序通过按键子程序的设置,可以通过按键来调整时间,三个按键分别为功能键(K1) 、增加键(K2)、减小键(K3).和复位键( K4):NN Y NY YY YY N N YY Y3.2.2 显示子程序显示子程序通过取商取余的方法将日期、时间分离,然后通过“写命令” 、 “写数据”两条指令程序将分离后的日期、时间送入 1602 进行显示,程序框图如图 3-3 所示。按键子程序入口按键扫码
6、功能键是否按下增加键是否按下 减小键是否按下根据增加键按下次数来设置时、分、秒根据减小键按下次数来设置时、分、秒功能键是否按下 4 次功能键是否按下 4 次显示设置时间 显示设置时间次数清零 次数清零写命令模式将命令字送到数据中等待数据稳定44 安装与调试4.1 电路安装步骤(1)检查元件的好坏按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。而且要认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。(2)放置、焊接各元件按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的
7、元件要后焊,在焊集成芯片时连续焊接时间不要超过 10s,注意芯片的安装方向。4.2 系统调试(1)在 Keil 软件中编写并调试程序,修改语法错误,最终生成.hex 目标程序。(2)利用 Proteus 软件绘制电路图,在确保电路连接正确无误的情况下,载入目标程序,仿真开始 3 秒后查看结果,如图所示。使能端给一高脉冲延时使能端置 05图 3 秒系统仿真效果5 性能测试与结果分析使用 STC-ISP 软件输入目标程序,观察实物运行效果,可以通过按动按键来调整时间,按下K1(选择“秒”位)再按下 K2 (加)4 次,再次按下 K1(选择 “分”位)后按下 K3 (减)3 次,再按 K1(选择“时
8、”位)再按下 K3(减)2 次结果如下图所示。该电子时钟设计方案正确、可行,各项指标稳定、可靠。6 心得体会在这个两个星期的时间里我学到了很多宝贵的知识和单片编程的经验,在这次课程设计过程中我遇到了许多困难和问题,其中一些我通过自己上网找资料和询问同学的方式找到了解决的方法,就是在这个过程中我学会了许多书本上学不到的东西,还有一些是我自己解决不了的问题,这些问题都是需要靠我以后的经验积累和不断的学习才能得到解决的,从这次课程设计中我体会到了自己用汗水换来的成果的喜悦。我在刚开始设计这个东西时是一头雾水,没有一个方向和目标,后来从网上找到一些有关的资料通过相似的题目我一步一步的完成我自己的课程设
9、计的功能,尤其是在编写程序的时候,每一个模块都要经过非常仔细的考虑后在写,因为程序的运行过程中需要考虑各个模块之间的影响和互助,有一些模块是我们没有学习过的我从网上找到相似的然后经过修改变成我能用的,在这之间我锻炼了我的变成能力。这次课程设计采用的是 AT89C51 系列单片机,而接口电路则是一个数字时钟,经过反反复复的修改、调试,程序终于达到预期功能。通过 protrus 仿真演示也达到预期的功能。电路的设计相对编程来说要容易一些,总体来说电路图都是大同小异的,只是他们中的分支做一些修改来。课程设计需要很大的耐心,尤其是遇到困难的时候,这也是对我们的考验。在设计过程中,我们遇到问题不是感到急
10、躁,而是耐心地寻找解决的办法,与同学进行交流讨论,寻求最佳的解决办法。最重要的学习就是一个课程设计的过程的整体思路,先做什么后做什么最后来一个总结经验的过程,这给我以后的设计过程打下了基础,这次设计中,我深刻体会到专研的重要性,一个看似简单的系统,却需要着大量的知识储备和很强的专研精神,理论和实践往往是两回事,理论上很简单的事情6在实际操作中往往会遇到很多意想不到的困难,学科的知识不光来自于书本知识,更来自于实践。参考文献:1 苏平.单片机的原理与接口技术M.北京:电子工业出版社,2006,1-113.2 王忠民.微型计算机原理M.西安:西安科技大学出版社,2003,15-55.3 左金生.电
11、子与模拟电子技术M.北京:电子工业出版社,2004,105-131.4 新编单片机原理与应用(第二版).西安电子科技大学出版社,2007.25 张萌.单片机应用系统开发综合实例M. 北京:清华大学出版社,2007.7附录:1 电路图2 实物图正面7反面3 源程序#include#define uchar unsigned char #define uint unsigned intsbit lcdrs=P25;sbit lcswr=P26;sbit lcden=P27;8sbit s1=P10;sbit s2=P11;sbit s3=P13;sbit rd=P37;uchar count,s1
12、num;char miao,shi,fen;uchar code table=“ 2013052129 “;uchar code table1=“ 00:00:00“;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void write_com(uchar com)lcdrs=0;lcswr=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date)lcdrs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5)
13、;lcden=0;void init()uchar num;lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num15;num+)9write_date(tablenum);delay(5);write_com(0x80+0x40);for(num=0;num12;num+)write_date(table1num);delay(5);TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=
14、1;ET0=1;TR0=1;void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void keyscan()rd=0;if(s1=0)delay(5);if(s1=0) s1num+;while(!s1);if(s1num=1)TR0=0;write_com(0x80+0x40+10);write_com(0x0f);if(s1num=2)10write_com(0x80+
15、0x40+7);if(s1num=3)write_com(0x80+0x40+4);if(s1num=4)s1num=0;write_com(0x0c);TR0=1;if(s1num!=0)if(s2=0)delay(5);if(s2=0)while(!s2);if(s1num=1)miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)fen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi+;if(
16、shi=24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);11if(s3=0)delay(5);if(s3=0)while(!s3);if(s1num=1)miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);if(s1num=2)fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);if(s1num=3)shi-;if(shi=-1)shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);void main()init();while(1)keyscan();12void timer0() interrupt 1TH0=(65536-50000)/256;TL0=(65536-50000)%256;count+;if(count=18)count=0;miao+;if(miao=60)miao=0;fen+;if(fen=60)fen=0;shi+;if(shi=24)shi=0;write_sfm(4,shi);write_sfm(7,fen);write_sfm(10,miao);