基于单片机的数字时钟的设计.docx
- 文档编号:5863276
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:34
- 大小:136.04KB
基于单片机的数字时钟的设计.docx
《基于单片机的数字时钟的设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字时钟的设计.docx(34页珍藏版)》请在冰豆网上搜索。
基于单片机的数字时钟的设计
河南农业大学
《智能仪器设计实习》
设计说明书
题目:
基于单片机的数字时钟的设计
学院:
理学院
专业:
电子信息科学与技术专业
班级:
学号:
姓名:
指导教师:
成绩:
时间:
2012年12月7日至2012年12月24日
智能仪器设计实习
设计任务书
题目基于单片机的数字秒时钟的设计
专业、班级学号姓名
主要内容、基本要求、主要参考资料等:
主要内容:
功能要求:
完成数字时钟的设计
1)时钟显示在1602液晶上,并且按秒实时更新。
2)能够使用按键随时调节时钟的年月日时分秒星期,按键可设计成三个有效键,分别为功能选择键,数值增大键,数值减小键。
基本要求:
●明确设计任务,复习与查阅有关资料。
●设计所用硬件芯片按给定使用。
●按要求对设计进行简要说明,总体设计方案,各部分的详细设计。
●写出体会和总结。
要求全部使用A4纸打印稿,不少于5000字。
主要参考资料:
●[1]何立民等.《单片机中级教程:
原理与应用》[M].北京:
航空航天大学出版社,2006
●[2]宋彩利等.《单片机原理与C51编程》[M].西安:
西安交通大学出版社,2008
●[3]郭天祥等.《51单片机C语言教程》[M].北京:
电子工业出版社,2010
完成期限:
2012年12月24日
指导教师签名:
2012年12月7日
基于单片机的数字时钟的设计
一、背景及意义
随时代的发展,生活节奏的加快,人们的时间观念愈来愈强;随自动化、智能技术的发展,机电产品的智能度愈来愈高,用到时间提示、定时控制的地方也会愈来愈多,因此,设计开发数字时钟具有良好的应用前景。
由于单片机价格的低成本、高性能,在自动控制产品中得到了广泛的应用。
本设计利用Atmel公司的AT89S52单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用c语言进行软件编程,并用实验板进行演示、验证。
在介绍本单片机的发展情况基础上,说明了本设计实现的功能,以及实验板硬件情况,并对各功能电路进行了分析。
主要工作放在软件编程上,用实验板实现时间、日期、及它们的设定功能,详细对软件编程流程以及调试进行了说明,并对计时误差进行了分析及校正。
实验证明效果良好,可以投入使用。
数字钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站,码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
二、系统分析
(一)总体方案设计
系统设计要求
(1)时钟显示在1602液晶上,并且按秒实时更新。
(2)能够显示年月日时分秒以及星期,并能够根据实际运行情况刷新数据。
(3)能够使用按键随时调节时钟的年月日时分秒星期,按键可设计成三个有效键,分别为功能选择键,数值增大键,数值减小键。
(4)系统主要包括时钟电路、复位电路、按键电路以及LCD显示电路。
按键部分使用实验板上的矩阵键盘分离出的三个按键。
系统的整体组成框图如图1所示。
图1系统方框图
(二)系统组成部分
1单片机的选型
由于本系统只需要单片机完成对计时的显示以及处理定时/计数的中断,对于I/O资源以及处理速度无特殊要求,所以选择STC公司生产的STC89C52单片机。
AT89C52增加了在线调试功能,程序可以通过JTAG接口下载、调试和固化,可实现实时仿真和在线编程或在系统编程,具有通过网络进行升级、维护的功能。
2时钟电路
单片机工作的时间基准是由时钟电路提供的。
在单片机的XTAL1和XTAL2两个管脚,接一只晶振及两只电容就构成了单片机的时钟电路。
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。
内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。
晶振的频率可以在1MHz-24MHz内选择。
电容取30PF左右。
系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
AT89单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
3复位电路
单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态,并从这个状态开始工作。
无论是在单片机刚开始接上电源时,还是断电后或者发生故障后都要复位。
89系列单片机的复位信号是从RST引脚输入到芯片的施密特触发器中的。
当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期),则CPU就可响应并且将系统复位。
复位分为手动复位和上电复位。
4LCD显示电路
本设计显示电路使用1602液晶设计,1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
显示电路使用LCD1602进行设计,1602采用标准的16脚接口。
其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
5按键电路
本系统包括功能按键KEY1,数值增大键key2,数值减小键key3,使用实验板上的矩阵键盘分离出的三个按键。
三、系统硬件设计
(一)系统原理图
图2
(二)时钟电路
本设计采用外部时钟方式,分别接到单片机的XTAL1和XTAL2引脚,采用的晶振为11.0592MHz,原理图如图2。
图3
(三)复位电路
复位电路采用上电复位,上电瞬间,由于电容两端的电压为零不能突变,RST端的电压逐渐下降,只要在RST端保持足够长时间的高电平,8051单片机便可自动复位,原理图如图3。
图4
(四)LCD显示电路
显示电路使用LCD1602进行设计,1602采用标准的16脚接口,此部分原理图如图4。
其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极。
图5
四、系统软件设计
本设计的源程序主要包含以下几个函数:
(一)延时函数
在程序中进行延时时调用此函数
voiddelay(ucharz)
{uchari;
for(z;z>0;z--)
for(i=110;i>0;i--);
}
(二)显示函数
显示程序包括对LCD1602写指令函数,写数据函数,数的拆分函数,显示年月日时分秒函数,显示星期函数五个部分。
1写指令函数
1602液晶的写指令函数,在使用LCD1602显示数据前需要调用此函数对LCD1602写指令
voidwrite_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
2写数据函数
在对LCD1602写指令之后调用此函数对1602写数据
voidwrite_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
3数的拆分函数
write_sfm,write_nyr把时,分,秒,年,月,日的个位与十位分别赋值给shi,ge。
voidwrite_sfm(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
4显示年月日时分秒函数
voidwrite_nyr(ucharadd,uchardate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
5星期显示函数
write_zhou根据运行情况把星期送给LCD1602进行显示。
voidwrite_zhou(uchardate)
{
ucharn;
write_com(0x80+12);
if(date==1)
{
for(n=0;n<3;n++)
{
write_date(table2[n]);
delay(5);
}
}
if(date==2)
{
for(n=0;n<3;n++)
{
write_date(table3[n]);
delay(5);
}
}
if(date==3)
{
for(n=0;n<3;n++)
{
write_date(table4[n]);
delay(5);
}
}
if(date==4)
{
for(n=0;n<3;n++)
{
write_date(table5[n]);
delay(5);
}
}
if(date==5)
{
for(n=0;n<3;n++)
{
write_date(table6[n]);
delay(5);
}
}
if(date==6)
{
for(n=0;n<3;n++)
{
write_date(table7[n]);
delay(5);
}
}
if(date==7)
{
for(n=0;n<3;n++)
{
write_date(table8[n]);
delay(5);
}
}
}
(三)初始化函数
对LCD1602进行初始化,并设置定时器0为工作方式1并对定时器装初值.完成初始状态的显示。
voidinit()
{
ucharnum;
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<16;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;
}
(四)键盘检测
对按键进行检测,当key1按下时选中功能键,光标开始在相应的位置闪烁,此时按下key2或key3便可以对光标对应位置的数据进行加1减1操作。
voidkeyscan()
{
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)
{
write_com(0x80+13);
}
if(s1num==5)
{
write_com(0x80+9);
}
if(s1num==6)
{
write_com(0x80+6);
}
if(s1num==7)
{
write_com(0x80+3);
}
if(s1num==8)
{
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(s1num==4)
{
m++;
if(m==8)
m=1;
write_zhou(m);
write_com(0x80+13);
}
if(s1num==5)
{
ri++;
if(ri==31)
ri=1;
write_nyr(9,ri);
write_com(0x80+9);
}
if(s1num==6)
{
yue++;
if(yue==13)
yue=1;
write_nyr(6,yue);
write_com(0x80+6);
}
if(s1num==7)
{
nian++;
if(nian==100)
nian=0;
write_nyr(3,nian);
write_com(0x80+3);
}
}
}
if(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);
}
if(s1num==4)
{
m--;
if(m==0)
m=7;
write_zhou(m);
write_com(0x80+13);
}
if(s1num==5)
{
ri--;
if(ri==0)
ri=30;
write_nyr(9,ri);
write_com(0x80+9);
}
if(s1num==6)
{
yue--;
if(yue==0)
yue=12;
write_nyr(6,yue);
write_com(0x80+6);
}
if(s1num==7)
{
nian--;
if(nian==-1)
nian=99;
write_nyr(3,nian);
write_com(0x80+93);
}
}
}
}
}
五、结束语
经过与标准时间对比,我们可以发现时钟计数后出现了误差,所设计的数字式秒表比我们的标准时间要慢,而且相比较的时间越长他的时差越大。
经过分其主要原因是软件都有关。
本设计采用的晶振为11.0592MHz,而我们在为定时器装入初值时为了计算方便把晶振当成12MHz算的,所以定时器装入的初值在计算时并不准确,并且中断函数在运行时也会占用一段时间,这些开始时并未考虑在内。
经过软件调试时把原本的判断语句if(count==20)改为if(count==18),从而把误差控制在一个可以接受的范围内。
【参考文献】
[1]何立民等.《单片机中级教程原理与应用》[M].北京:
航空航天大学出版社,2006
[2]宋彩利等.《单片机原理与C51编程》[M].西安:
西安交通大学出版社,2008
[3]郭天祥等.《51单片机C语言教程》[M].北京:
电子工业出版社,2010
附录1
数字时钟成品展示
附录2
源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdula=P2^6;
sbitwela=P2^7;
sbitrs=P3^5;
sbitlcden=P3^4;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitrd=P3^7;
sbitwr=P3^6;
ucharcount,s1num,m=5;
charmiao,shi,fen,nian=12,yue=12,ri=14,zhou;
ucharcodetable[]="2012-12-14FRI";
ucharcodetable1[]="00:
00:
00";
ucharcodetable2[]="MON";
ucharcodetable3[]="TUE";
ucharcodetable4[]="WED";
ucharcodetable5[]="THU";
ucharcodetable6[]="FRI";
ucharcodetable7[]="SAT";
ucharcodetable8[]="SUN";
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voidwrite_com(ucharcom)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchardate)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()
{
ucharnum;
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<16;num++)
{
write_date(table[num]);
delay
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 数字 时钟 设计