简易数字钟的设计Word下载.docx
《简易数字钟的设计Word下载.docx》由会员分享,可在线阅读,更多相关《简易数字钟的设计Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
使用单片机的定时/计数器实现数字中的定时计数功能,秒计60次成分,分计60次成小时,小时计24次则计满一天。
本设计LED显示部分采用动态显示,其中2个LED显示器显示秒,2个LED显示器显示分钟,2个LED显示器显示小时。
同时为了使用方便,本题目还需要设计几个简单按键,可以通过按键实现时、分的调整,这样在主程序中需要加入键盘设置子程序。
2设计思路
基于单片机的简易数字钟设计主要可以分为以下几个模块来考虑:
对于单片机AT89C51的T0,T1定时中断部分。
本次设计中的单片机晶振频率采用了精准的11.0592MHZ。
故对T1初值设定为:
DC00h,实现了10ms的定时,然后C程序中通过定义一个变量i,对i进行i++的100次循环,如此即可达到最小1S的实现。
而后在这个1S程序段的基础之上,我们可以分别编写出对时,分的程序段。
对于定时器T0,我们可以将其用来作为数码管动态扫描的定时中断,本次设计设为50ms左右,初值为FC17h。
这个取值通过最后的仿真及实际效果看出合理,不会出现闪烁等情况。
校时电路。
本次设计要求了该简易数字钟必须具备时、分的调整功能。
故必须接入2个简单的按键(本设计设置问p1.4调时、p1.5调分,按键为实验箱单次脉冲按键模块),并且在软件部分必须引入这2个独立按键的子程序。
显示电路。
考虑采用动态显示部分,用P0口作为数码管数据(段选),P2口作为数码管控制(位选)。
动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任意时刻都只有一位数码管被点亮,但由于人眼存在视觉暂留效应,只要每位数码管间隔时间足够短,就可以给人以通俗显示的感觉。
上面第一部分已提到,我们采用了50ms左右的时间间隔,并且是合理的。
6位数码管,实验室的硬件是共阴极的,故我们的数码表采用{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
晶振电路。
在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
复位电路。
这部分设计用来完成对单片机的复位。
以上是对本次设计课题的初步分析,以下将对各部分模块设计进行详细阐述。
3设计方框图
3.1数字钟硬件部分示意图
该简易数字钟硬件部分主要由晶振、手动复位、单片机AT89C51、数码管显示、时间调整按键模块组成。
框图如下:
图3.1数字钟硬件系统示意图
3.2数字钟软件部分组成框图
3.2.1时间调整的程序流程
图3.2时间调整程序流程框图
3.2.2时钟显示程序流程
图3.324小时时钟
4各部分模块介绍
4.1单片机AT89C51芯片分析
AT89C51单片机引脚图如下:
图4.1AT89C51引脚图
该单片机是标准的40引脚双列直插式集成电路芯片,其各个引脚功能如下:
VCC:
+5V电源。
VSS:
接地。
RST:
复位信号。
当输入的复位信号延续两个周期以上的高电平时即为有效,用来完成单片机的初始化操作。
XTAL1和XTAL2:
外接晶体引线端。
当使用芯片内部时钟时,此二引线端用于外接石英晶体和微调电容;
当使用外部时钟时,用于接外部时钟脉冲信号。
PO口:
P0口作为一个8位漏极开路双向I/O口,当作输出口使用时,必须接上拉电阻才有高电平输出;
当作输入口使用时,必须先向电路中的锁存器写入“1”,使FET截止,以避免锁存器为“0”时对引脚输入的干扰。
本次设计采用P0口作为数码管段选输出使用。
P2口:
内部有上拉电阻的8位I/O口,本次设计中作为数码管位选输出使用。
4.2晶振电路模块
在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
图4.2晶振电路
4.3复位电路模块
单片机复位的条件是:
必须使RST/VPD或RST引脚加上两个机器周期(即24个振荡周期)的高电平。
例如,若时钟频率为12MHz,每个机器周期为1us,则只需要2us以上时间的高电平,在RST引脚出现高电平后的第二个机器周期执行复位。
单片机常见的复位如图所示。
电路为上电复位,它利用电容充电来实现的。
在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。
只要保证RESET为
高电平的时间大于两个机器周期,便能正常复位。
该电路除具有上电复位功能外,若要复
位,只需按图中的RESET键,此时电源VCC经电阻分压,在RESET端产生一个复位高
电平。
图4.3复位电路
4.4显示模块
图4.4显示模块
4.5时间校对按键模块
图4.5时间校对按键电路
5简易数字钟源程序
5.1源程序
#include<
reg51.h>
intrins.h>
unsignedchardatadis_digit;
unsignedcharkey_s,key_v;
unsignedcharcodedis_code[11]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsignedchardatadis_buf[6];
unsignedchardatadis_index;
unsignedcharhour,min,sec;
unsignedcharsec100;
sbitK1=P1^4;
sbitK2=P1^5;
bitscan_key();
voidproc_key();
voidinc_sec();
voidinc_min();
voidinc_hour();
voiddisplay();
voiddelayms(unsignedcharms);
voidmain(void)
{
P0=0x00;
P2=0x00;
TMOD=0x11;
//定时器0,1工作模式1,16位定时方式
TH1=0xdc;
TL1=0;
TH0=0xFC;
TL0=0x17;
hour=12;
min=00;
sec=00;
sec100=0;
dis_buf[0]=dis_code[hour/10];
//时十位
dis_buf[1]=dis_code[hour%10];
//时个位
dis_buf[2]=dis_code[min/10];
//分十位
dis_buf[3]=dis_code[min%10];
//分个位
dis_buf[4]=dis_code[sec/10];
//秒十位
dis_buf[5]=dis_code[sec%10];
//秒个位
dis_digit=0xfe;
dis_index=0;
TCON=0x01;
IE=0x8a;
//使能timer0,1中断
TR0=1;
TR1=1;
key_v=0x03;
while
(1)
{
if(scan_key())
{
delayms(10);
if(scan_key())
{
key_v=key_s;
proc_key();
}
}
}
}
bitscan_key()
key_s=0x00;
key_s|=K2;
key_s<
<
=1;
key_s|=K1;
return(key_s^key_v);
voidproc_key()
EA=0;
if((key_v&
0x01)==0)//K1
inc_hour();
elseif((key_v&
0x02)==0)//K2
min++;
if(min>
59)
min=0;
dis_buf[2]=dis_code[min/10];
dis_buf[3]=dis_code[min%10];
EA=1;
voidtimer0()interrupt1
//定时器0中断服务程序,用于数码管的动态扫描
//dis_index---显示索引,用于标识当前显示的数码管和缓冲区的偏移量
//dis_digit---位选通值,传送到P2口用于选通当前数码管的数值,如等于0xfe时,
//选通P2.0口数码管
//dis_buf---显于缓冲区基地址
P0=dis_buf[dis_index];
//显示代码传送到P0口
P2=dis_digit;
//
dis_digit=_crol_(dis_digit,1);
//位选通值左移,下次中断时选通下一位数码管
dis_index++;
if(dis_index==0x06)//6个数码管全部扫描完一遍之后,再回到第一个开始
{//扫描
dis_index=0;
dis_digit=0xfe;
}
voidtimer1()interrupt3
sec100++;
if(sec100>
=100)
sec100=0;
inc_sec();
voidinc_sec()
sec++;
if(sec>
sec=0;
inc_min();
//秒个位
voidinc_min()
min++;
if(min>
min=0;
voidinc_hour()
hour++;
if(hour>
23)
hour=0;
9)
dis_buf[0]=dis_code[hour/10];
else
dis_buf[0]=0x00;
//当小时的十位为0时不显示
voiddelayms(unsignedcharms)
//延时子程序
{
unsignedchari;
while(ms--)
for(i=0;
i<
120;
i++);
6数字钟源程序的仿真
6.1编译、连接
将数字钟源程序输入到keil软件,建立工程项目,添加完成程序的编译、连接,通过后无错误。
如图所示:
图6.1编译、连接图
6.2仿真
6.2.1生成HEX文件
利用keil将编译、连接无误的源程序生成hex文件,准备与protues联调进行仿真。
图6.2.1从keil里生成十六进制文件
6.2.2仿真结果
在protues里面将HEX文件导入单片机,运行。
得到仿真如下:
图6.2.2仿真结果显示
7数字钟硬件原理图
7.1总原理图
图7.1数字钟硬件原理图
8主要原器件清单
元件名称
规格型号/参数
数量
单片机
AT89C51
1
电容
15pF
2
晶振
11.0592MHz
10uF
数码管
7SEG-MPX6-CC-RED
电阻
10K
12
按键
BUTTON
3
小结
本次课程设计我们小组选择的课题是简易数字钟的设计。
主要的设计思路是运用5个单元模块的组合来实现符合设计要求的数字钟。
五大模块设置合理,各自发挥自己的作用,成为一个整体。
分模块来调试,最终实现。
课程设的三周是忙碌、充实而又紧张的。
虽然临近期末考试早已结束近一个月之久,但我们不仅没有把这当成一种考试后的娱乐,去随意对待,反而调整好自己心态,把这次课程设计当作一次难得的全面复习机会。
通过这次课程设计,我学会了很多书本上学不到的知识,熟练掌握了Keil的开发环境,也加深了软件的使用。
这个课设从自己找相关软件、装软件、学软件再到仿真,充满许多艰辛,付出了很多汗水和时间,在同组人员互相鼓励,互相探讨,互相竞争的团队协作下,克服这探索道路上的种种困难,最后终于做成了一份完整的课程设计。
心里还是不免有一种成功后的喜悦之情。
刚开始拿到题目,心中不免有一丝欣喜,因为对于数字钟这个课题,我想我们大部分人拿来就会有很清晰的思路,因为我们已经做了很多运用单片机来进行定时、计数的相关习题。
后来经过查找一些资料,写出了定时、循环计数、动态扫描等各部分程序段。
硬件部分由于是焊接好的实验箱,极大方便了本次设计。
但是在软硬件融合的阶段还是遇到了一些难题,经过几天反复的调试,最后发现是动态扫描的程序段,在循环移位的时候出现了问题,最后终于调试出来了希望得到的实际效果。
对于自己的设计,最大的败笔就是最后想加入一个跑秒程序段没能调出来,虽然基本满足设计的要求,但还是有点不甘心,造成这一现象的原因经过分析讨论认为是程序中对于此项功能的中断设置不合理,一个中断源不应该同时应用2个功能程序段。
最后由于时间等方面因素,我放弃了加这一项功能。
总之,回顾这一次单片机原理及应用的课程设计,让人感慨颇多,既为这门学科知识之深奥、奇妙所吸引,更为那些设计出那些经典程序的前人所折服。
学习的道路是没有尽头的,也是艰辛的,但只要我们能够独立去思考、去想、去做,那么我们总能学到真正的实用知识。
致谢
首先,在本设计的开题论证、课题研究、论文撰写和论文审校整个过程中,得到了教授田景贺的亲切关怀和精心指导,使得本设计能够顺利完成,其中无不包含着田老师的汗水和心血。
老师敏锐的学术思想、严谨踏实的治学态度、渊博的知识、精益求精的工作作风、诲人不倦的育人精神,将永远铭记在我心中,使我终身受益。
他对本设计的构思、框架和理论给与了我许多深入的指导,使得设计得以顺利的完成。
再次谨向田老师表示衷心的感谢和崇高的敬意。
其次,向本次设计中有缘同为一组的组员表示感谢。
是他们要我看到了团队协作的重要性,高效锻炼了自己的团队协作能力。
本次设计中我们遇到了许多问题,有时一个难题摆在面前,我们要经过半天、甚至一两天的努力去攻克这个难题,特别是他们的执着、严谨、高涨的热情和一丝不苟的态度让我坚定了坚持下去的信心,让我获益匪浅,同时也受益终身。
最后,感谢一下虽不是同一组的,却一直互相帮助的同学邓亮亮等人。
同学之间的互相帮助,热心恳切,让我为之感动。
是他们的关系和帮助,让我感受到了家的温暖。
参考文献
[1]单片机原理及应用,黄勤、李楠、杨天怡编著,清华大学出版社。
[2]单片机程序设计及应用,杨将新、李华军、刘东骏编著,电子工业出版社。
[3]基于PROTEUS的电路及单片机仿真,周景润等著,北京航空航天工业出版社。
[4]C程序设计(第二版),谭浩强编著,清华大学出版社。
[5]TCP/IP,W.RichardStevens编,范建华译.机械工业出版社。
[6]计算机网络(第4版),AndrowS.tanenbaum编,机械工业出版社。