基于STC89C52单片机的数字时钟设计.docx
《基于STC89C52单片机的数字时钟设计.docx》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的数字时钟设计.docx(19页珍藏版)》请在冰点文库上搜索。
基于STC89C52单片机的数字时钟设计
基于STC89C52单片机的数字时钟设计
2.2Protel及KeilC软件的使用
2.3protus的使用
第一章绪论
1.1数字电子钟的背景
20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。
但是,一旦重要事情,一时的耽误可能酿成大祸。
目前,单片机正朝着高性能和多品种方向发展趋势将是进一步向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。
下面是单片机的主要发展趋势。
单片机应用的重要意义还在于,它从根本上改变了传统的控制系统设计思想和设计方法。
从前必须由模拟电路或数字电路实现的大部分功能,现在已能用单片机通过软件方法来实现了。
这种软件代替硬件的控制技术也称为微控制技术,是传统控制技术的一次革命。
单片机模块中最常见的是数字钟,数字钟是一种用数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更更长的使用寿命,因此得到了广泛的使用。
1.2数字电子钟的应用与意义
数字钟已成为人们日常生活中:
必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。
所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.3数字电子钟的设计任务
采用STC89C52芯片为核心,外加设计相关的显示电路、键盘电路以及蜂鸣器电路,完成整个数字时钟功能,并进行Proteus仿真实现。
第二章软件环境介绍
2.1单片机的选择
单片机应用面广,使用数量大,带来的直接好处就是成本的降低。
目前世界各大公司为了提高竞争力,在提高单片机性能的同时,十分注意降低其产品的价格。
目前,我国生产很多型号的单片机,在此,我们采用型号为STC89C52的单片机。
因为:
STC89C52是一个低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-52指令系统,片内置通用8位中央处理器和Flash存储单元,内置功能强大的微型计算机的AT89C52提供了高性价比的解决方案。
STC89C52是一个低功耗高性能单片机,40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,2个16位可编程定时计数器,2个全双工串行通信口,STC89C51可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
2.2Protel及KeilC软件的使用
2.3Proteus的使用
第三章数字钟的硬件设计
3.1内部系统设计
1.外接晶体引脚
图3-2晶振连接的内部、外部方式图
XTAL1 19
XTAL2 18
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。
晶振的频率可以在1MHz-24MHz内选择。
电容取30PF左右。
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
AT89单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。
2.复位 RST 9
在振荡器运行时,有两个机器周期(24个振荡周期)以上的高电平出现在此引腿时,将使单片机复位,只要这个脚保持高电平,51芯片便循环复位。
复位后P0-P3口均置1引脚表现为高电平,程序计数器和特殊功能寄存器SFR全部清零。
当复位脚由高电平变为低电平时,芯片为ROM的00H处开始运行程序。
复位是由外部的复位电路来实现的。
片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。
复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路。
当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1K。
复位操作不会对内部RAM有所影响。
常用的复位电路如下图所示:
图3-3常用复位电路图
3.输入输出引脚
(1)P0端口[P0.0-P0.7]P0是一个8位漏极开路型双向I/O端口,端口置1(对端口写1)时作高阻抗输入端。
作为输出口时能驱动8个TTL。
对内部Flash程序存储器编程时,接收指令字节;校验程序时输出指令字节,要求外接上拉电阻。
在访问外部程序和外部数据存储器时,P0口是分时转换的地址(低8位)/数据总线,访问期间内部的上拉电阻起作用。
(2)P1端口[P1.0-P1.7]P1是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接收低8位地址信息。
(3)P2端口[P2.0-P2.7]P2是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接收高8位地址和控制信息。
在访问外部程序和16位外部数据存储器时,P2口送出高8位地址。
而在访问8位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(4)P3端口[P3.0-P3.7]P2是一个带有内部上拉电阻的8位双向I/0端口。
输出时可驱动4个TTL。
端口置1时,内部上拉电阻将端口拉到高电平,作输入用。
对内部Flash程序存储器编程时,接控制信息。
除此之外P3端口还用于一些专门功能,具体请看下表。
P3引脚
兼用功能
P3.0
串行通讯输入(RXD)
P3.1
串行通讯输出(TXD)
P3.2
外部中断0(INT0)
P3.3
外部中断1(INT1)
P3.4
定时器0输入(T0)
P3.5
定时器1输入(T1)
P3.6
外部数据存储器写选通WR
P3.7
外部数据存储器写选通RD
表3-1 P3端口引脚兼用功能表
3.2LED显示电路
显示器普遍地用于直观地显示数字系统的运行状态和工作数据,按照材料及产品工艺,单片机应用系统中常用的显示器有:
发光二极管LED显示器、液晶LCD显示器、CRT显示器等。
LED显示器是现在最常用的显示器之一,如下图所示。
图3-4LED显示器的符号图
发光二极管(LED)由特殊的半导体材料砷化镓、磷砷化镓等制成,可以单独使用,也可以组装成分段式或点阵式LED显示器件(半导体显示器)。
分段式显示器(LED数码管)由7条线段围成8字型,每一段包含一个发光二极管。
外加正向电压时二极管导通,发出清晰的光。
只要按规律控制各发光段亮、灭,就可以显示各种字形或符号。
LED数码管有共阳、共阴之分。
显示电路显示模块需要实时显示当前的时间,即时、分、秒,因此需要6个数码管,另需两个数码管来显示横。
采用动态显示方式显示时间,硬件连接如下图所示,时的十位和个位分别显示在第一个和第二个数码管,分的十位和个位分别显示在第四个和第五个数码管,秒的十位和个位分别显示在第七个和第八个数码管,其余数码管显示横线。
LED显示器的显示控制方式按驱动方式可分成静态显示方式和动态显示方式两种。
对于多位LED显示器,通常
都是采用动态扫描的方法进行显示,其硬件连接方式如下图所示。
图3-6数码管的硬件连接示意图
数码管使用条件:
a、段及小数点上加限流电阻
b、使用电压:
段:
根据发光颜色决定;小数点:
根据发光颜色决定
c、使用电流:
静态:
总电流80mA(每段10mA);动态:
平均电流4-5mA峰值电流100mA
3.3键盘控制电路
该设计需要校对时间,所以用四个按键来实现。
按s1,s2来调节小时的时间,按s3,s4来调节分针的时间。
下图是按键硬件连接图。
图3-7按键控制电路的硬件连接图
当用手按下一个键时,如图3-8所示,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。
这就是抖动。
抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。
很容易想到,抖动问题不解决就会引起对闭合键的识别。
用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,这之后,在读入键盘码。
键按下
前沿抖动
后沿抖动
闭合
稳定
图3-8按键抖动信号波形
第四章数字钟的软件编程调试
系统的软件设计也是工具系统功能的设计。
单片机软件的设计主要包括执行软件(完成各种实质性功能)的设计和监控软件的设计。
单片机的软件设计通常要考虑以下几个方面的问题:
(1)根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计出合理的总体结构,使软件开发清晰、简洁和流程合理;
(2)培养良好的编程风格,如考虑结构化程序设计、实行模块化、子程序化。
既便于调试、链接,又便于移植和修改;
(3)建立正确的数学模型,通过仿真提高系统的性能,并选取合适的参数;
(4)绘制程序流程图;
(5)合理分配系统资源;
(6)为程序加入注释,提高可读性,实施软件工程;
(7)注意软件的抗干扰设计,提高系统的可靠性。
4.1系统软件设计流程图
这次的数字电子钟设计用到很多子程序,它们的流程图如下所示。
开始
启动定时器
按键检测
时间显示
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
图4-1主程序流程图
按键处理是检测时按键是否按下,时按键如果按下,时就加1;如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;如果没有按下,就把时间显示出来。
图4-2按键处理流程图
定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。
N
24小时到?
分单元清零,时单元加1
N
N
N
Y
Y
时单元清零
时间显示
中断返回
开始
一秒时间到?
60秒时间到?
60分钟到?
秒单元加1
秒单元清零,分单元加1
Y
Y
图4-3定时器中断流程图
时间显示是先秒个位计算显示,然后是秒十位计算显示,再是分个位计算显示,再然后是分十位显示,再就是时个位计算显示,最后是时十位显示。
时十位计算显示
结束
开始
秒个位计算显示
秒十位计算显示
分个位计算显示
分十位计算显示
时个位计算显示
图4-4时间显示流程图
4.2数字钟的原理
数字电子钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外还有校时功能。
因此,一个基本的数字钟电路主要由显示器“时”,“分”,“秒”和单片机,还有校时电路组成。
数码管按照数码管动态显示的工作原理工作,将标准秒信号送入“秒单元”,“秒单元”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分单元”的时钟脉冲。
“分单元”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时单元”。
“时单元”采用24进制计时器,可实现对一天24小时的累计。
显示电路将“时”、“分”、“秒”通过七段显示器显示出来。
校时电路时用来对“时”、“分”显示数字进行校对调整,按一下s1,时单元就加1,按一下s2,时单元就减1,按一下s3,分单元就加1,按一下s3,分单元就减1。
4.3数字时钟程序
#include
sbits1=P2^3;//定义按键
sbits2=P2^4;
sbits3=P2^5;
sbits4=P2^6;
sbita=P1^1;//定义指示灯参数
sbitb=P1^3;//喇叭
codeunsignedchartab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴数码管0-9
unsignedcharStrTab[8];//定义缓冲区
unsignedcharminute=59,hour,second=55;//定义并且初始化值
voiddelay(unsignedintcnt)//延时函数
{
while(--cnt);
}
voidDisplaypro(void)//显示函数
{
StrTab[0]=tab[hour/10];//显示小时
StrTab[1]=tab[hour%10];
StrTab[2]=0x40;//显示"-"
StrTab[3]=tab[minute/10];//显示分钟
StrTab[4]=tab[minute%10];
StrTab[5]=0x40;//显示"-"
StrTab[6]=tab[second/10];//显示秒
StrTab[7]=tab[second%10];
}
main()//主函数
{
TMOD|=0x01;//定时器010msin12Mcrystal用于计时
TH0=0xd8;//初值
TL0=0xf0;
ET0=1;
TR0=1;
TMOD|=0x10;//定时器1用于动态扫描
TH1=0xF8;//初值
TL1=0xf0;
ET1=1;
TR1=1;
EA=1;
Displaypro();//调用显示处理
while
(1)//主循环
{
if(!
s1)//按键1去抖以及动作
{
delay(10000);
if(!
s1)
{
hour++;if(hour==24)hour=0;//正常时间小时加1
Displaypro();
}
}
if(!
s2)//按键2去抖以及动作
{
delay(10000);
if(!
s2)
{
hour--;if(hour==255)hour=23;//正常时间小时减1
Displaypro();
}
}
if(!
s3)//按键3去抖以及动作
{
delay(10000);
if(!
s3)
{
minute++;if(minute==60)minute=0;//分加1
Displaypro();
}
}
if(!
s4)//按键4去抖以及动作
{
delay(10000);
if(!
s4)
{
minute--;if(minute==255)minute=59;//分减1
Displaypro();
}
}
}
}
/*定时器1中断*/
voidtime1_isr(void)interrupt3using0//定时器1用来动态扫描
{
staticunsignedcharnum;
TH1=0xF8;//重入初值
TL1=0xf0;
switch(num)
{
case0:
P2=0;P0=StrTab[num];break;//分别调用缓冲区的值进行扫描
case1:
P2=1;P0=StrTab[num];break;
case2:
P2=2;P0=StrTab[num];break;
case3:
P2=3;P0=StrTab[num];break;
case4:
P2=4;P0=StrTab[num];break;
case5:
P2=5;P0=StrTab[num];break;
case6:
P2=6;P0=StrTab[num];break;
case7:
P2=7;P0=StrTab[num];break;
default:
break;
}
num++;//扫描8次,使用8个数码管
if(num==8)
num=0;
}
/*定时器0中断*/
voidtim(void)interrupt1using1
{
staticunsignedcharcount;//定义内部静态变量
TH0=0xd8;//重新赋值
TL0=0xf0;
count++;
switch(count)
{
case100:
Displaypro();break;//显示跳动
case50:
a=~a;break;//半秒闪烁
default:
break;
}
if(count==100)
{
count=0;
second++;//秒加1
if(second==60)
{
second=0;
minute++;//分加1
if(minute==60)
{
minute=0;
hour++;//时加1
b=0;
delay(80000);
b=1;
if(hour==24)
hour=0;
}
}
}
}
第5章总结与展望
我在这一次数字电子钟的设计过程中,很是受益匪浅。
通过对自己在大学三年时间里所学的知识的回顾,并充分发挥对所学知识的理解和对毕业设计的思考及书面表达能力,最终完成了。
这为自己今后进一步深化学习,积累了一定宝贵的经验。
撰写论文的过程也是专业知识的学习过程,它使我运用已有的专业基础知识,对其进行设计,分析和解决一个理论问题或实际问题,把知识转化为能力的实际训练。
培养了我运用所学知识解决实际问题的能力。
通过这次课程设计我发现,只有理论水平提高了;才能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。
这个实验十分有意义我获得很深刻的经验。
通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,,也从中得知了很多书本上无法得知的知识。
我们的学习不但要立足于书本,以解决理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课程研究,学生自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。
学习就应该采取理论与实践结合的方式,理论的问题,也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
参考文献
[1]郭天祥.新概念51单片机C语言教程[M].北京:
电子工业出版社,2009,1
[2]于佳琳.基于51单片机的数字钟设计.科技天地,2011,9(6):
62-63.
[3]公相.基于8051单片机的数字钟的设计与实现.科技天地,2010,4(5):
386-387.
[4]张芳.基于AT89S52单片机数字钟的实现.软件导刊,2008,7(10):
121-122.
[5]张开碧,王浩,曾勇斌.基于STC89C52单片机的多功能数字钟的设计.科技信息,2010,35:
12-13.
[6]盛蒙蒙,葛义斌,邱烨,马栋.基于单片机实现多功能数字时钟系统设计.电子科学,2009,10(20):
35.
[7]曾美云.基于单片机数字时钟系统的设计.高校理科研究,2011,30:
530-532
[8]李精华,杨端,庞前娟.基于数字钟设计的单片机课程项目开发,桂林航天工业高等专科学校学报2010,2:
150-152.