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