--
--
河南交通职业技术学院
交通信息工程
系
单片机数字时钟设计
专业电子11301姓名单德过学号1104060115
专业电子11301姓名楚洋坪学号1104060121
--
--
目录
摘要…………………………………………………………2
第一章电子时钟的设计…………………………………3
1.1电子时钟简介…………………………………………3
1.2电子时钟的工作原理……………………………………3
第二章硬件设计方案…………………………………………4
2.1硬件电路的设计方案……………………………………4
2.2硬件电路的原理图………………………………………4
2.3硬件电路说明…………………………………………5
第三章电子时钟的程序设计……………………………………8
3.1程序流程图……………………………………………8
3.2程序设计………………………………………………………1
1
总结…………………………………………………………………15
ﻬ摘要
--
--
随着现代生活的推进,电子时钟在人们的生活中已经普及,本课题的主要内
容就是结合单片机的强大功能,在一块普通的电子时钟集成多种功能,方便人
们的日常生活,该功能是通过单片机、8段数码管以及一些简单辅助电路实现的。
由于之前没有独立做过单片机实现多功能电子时钟方面的内容,所以在做设计
时总会遇见很多问题,本次设计是在结合老师的指导及同学的帮助下完成的,
并通过本人在网上所查的大量资料及单片机设计中常见的电路而构思出来的。
单片计算机即单片微型计算机。由RAM,ROM,CPU构成,定时,计数和多种
接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产业和
工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能
力。
本设计主要设计了一个基于AT89C51单片机的电子时钟。并在数码管上
显示相应的时间。并通过一个控制键用来实现时间的调节和是否进入省电模式的
转换。该方法仿真效果真实、准确,节省了硬件资源。
关键字:单片机、电子时钟、程序
ﻬ第一章电子时钟的设计
1.1电子时钟简介
电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走
时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断
改善和美化,在许多场合都用到电子时钟。
现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、
石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调
试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替
指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功
能,还可以进行时和分的校对,片选的灵活性好。
--
--
LCD数字电子钟除了在城市的主要营业场所、车站、码头等公共场所使
用,还可以改装在摩托车和汽车上,LCD显示,带蓝色背光,白天在太阳光
下也能非常清楚的看到显示时间,关钥匙可以关闭蓝色背光,时间还能显
示也不会清零,因LCD的显示耗电量很省的,所以一直工作也不必担心耗
电问题。在骑摩托车时,为了看时间,先要停下车子,取出手机,才能看时间,
是否有点麻烦,现在车上改装了一个蓝色背光的液晶电子钟后,不管白天黑
夜色,随时可以看时间,非常方便。
1.2电子时钟的工作原理
一般电子钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功
能和报时功能。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,
“秒”计数器、校时电路、报时电路和振荡器组成。主电路系统由秒信号发生
器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用
石英晶体振荡器加分频器来实现。将标准秒信号送入“秒计数器”,“秒计数
器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为
“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分
钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用2
4进制计时器,可实现对一天24小时的累计。译码显示电路将“时”、“分”、
“秒”计数器的输出状态用七段显示译码器译码,通过七段显示器显示出来。
整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音
频发生器实现报时。校时电路时用来对“时”、“分”、“秒”显示数字进行校对
调整。
而该电子时钟由89C51,六段数码管等构成,采用晶振电路作为驱动电路,
由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六
十分钟为一小时,满二十四小时为一天。而电路中个控制键可以实现多种不同的
功能;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连
续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
--
--
第二章设计方案
2.1硬件电路的设计方案
根据设计要求和设计思路,硬件电路有两部分组成,即单片机按键电路,LE
D显示器电路。图1为硬件电路设计框图。
ﻩﻩ
硬件电路设计框图
2.2硬件电路的原理图
设计原理图,如图所示。
A
T89S5
1
74LS2
45
数码管
复位,电路
晶振,电路
按键
控制
喇叭
驱动电路
--
--
设计原理图
ﻩ本设计电路,硬件部分共由五个模块组成:按键模块、复位电路模块、晶振电
路模块、发声指示模块、时间显示模块。晶振电路模块负责给单片机提供时钟周
期。复位单路模块负责上电后自动复位,或按键后强制复位。上电后,由单片机内
部定时器计时,同时通过动态显示函数自动将时分秒显示到数码管上。与此同时,
按键扫描函数,一直扫描按键引脚状态,一旦扫描到按键被按下,即进入相应的
功能函数。如果检测到定时时间到,则驱动蜂鸣器发声提示。
2.3硬件电路说明
2.3.1按键模块
--
--
按键模块如图所示。
按键模块
在该模块中,采用四个按键作为电子时钟的控制输入,通过按键来实现时钟
的时间设置、定时、秒表功能。电路中将四个按键的一端接公共地,而单片机的
P2口默认为高电平,一旦按键被按下,则该按键对应的额管脚被拉低,通过软件
扫描按键即可知道用户所要实现的功能,调用相应的按键子程序来完成该操作。
按键的去抖动由软件来实现。
2.3.2单片机的复位电路
单片机的复位电路,如图所示。
单片机的复位电路
--
--
当MCS-5l系列单片机的复位引脚RST(全称RESET)出现2个机器周期以
上的高电平时,单片机就执行复位操作。如果RST持续为高电平,单片机就处于循
环复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位和上电
或开关复位。上电复位要求接通电源后,自动实现复位操作。上电后,保持RST
一段高电平时间。
2.3.3单片机的晶振电路
单片机的晶振电路,如图所示。
单片机的晶振电路
石英晶体也连接在晶振引脚的输入和输出之间,等效为一个并联谐振回路,
振荡频率应该是石英晶体的并联谐振频率。晶体旁边的两个电容接地,实际上就
是电容三点式电路的分压电容,接地点就是分压点。以接地点即分压点为参考
点,振荡引脚的输入和输出是反相的,但从并联谐振回路即石英晶体两端来看,
形成一个正反馈以保证电路持续振荡。
2.3.5时间显示模块
--
--
时间显示
液晶显示电路
时间显示部分的电路也很简单,由八个七位的共阴8段数码管在显示过程
中,同时通过位选选通要显示的数码管。
第三章控制系统的软件设3.1程序流程图
系统的流程图如图a和图b所示:
--
--
图a主程序流程图
--
--
图b中断处理流程图
--
--
3.2依据流程图编写程序
本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整
程序、延时程序四大模块。在程序设计过程中,加强了部分软件抗干扰措施,下
面对部分模块作介绍。
#include<reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitqingling=P1^0;//清零
sbittiaofen=P1^1;//调分
sbittiaoshi=P1^2;//调时
sbitsounder=P1^7;//naozhong
uinta,b;
ucharhour,minu,c,//时钟
hour0,minu0,c0,//秒表
hour1,minu1,sec1;
h1,h2,m1,m2,s1,s2,//显示位
k,s;//状态转换标志
ucharcodeselect[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xf
d,0xfe};
--
--
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7
d,0x07,0x7f,0x6f};
/*****************函数声明***********************/
voidkeyscan();
voidinit();
voiddelay(ucharz);
voiddisplay(uchar,uchar,uchar);
voidsounde();
/*****************主函数*************************/
voidmain()
{
init();
while(1)
{
while(TR1)
{
keyscan();//扫描函数
while(s==1)//s是状态标志,当s=0时,闹钟取消。s=1时,设定闹
钟时间
{//s=2时,闹钟工作,时间与设定时刻一致时,闹钟响
--
--
keyscan();//s状态切换(0-》1-》2-》
0)通过外部中断1实现。
display(hour1,minu1,sec1);//闹钟时刻显示
}
display(hour0,minu0,sec0);//时钟表显示
while(k)/*k是秒表状态(0-》1-》2-》0)通过外部中
断0实现。*/
{
display(hour,minu,sec);//秒表显示
}
}
}
}
/*****************初始化函数***********************/
voidinit()
{
a=0;
b=0;
k=0;
--
--
s=0;
hour0=0;
minu0=0;
sec0=0;
hour=0;
minu=0;
sec=0;
hour1=0;
minu1=0;
c1=0;
TMOD=0x11;//定时器0,1工作于方式1;赋初
值
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
EA=1;
EX0=1;//秒表中断
EX1=1;//闹钟设定中断
ET0=1;
--
--
ET1=1;
IT0=1;//边沿触发方式
IT1=1;
PX0=1;
PX1=1;
TR0=0;//初始,秒表不工作
TR1=1;//时钟一开始工作
}
/*****************定时器0中断*************/
voidtimer0_int()interrupt1//秒表
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
a++;
if(a==2)
{
a=0;
c++;
if(sec==100)
--
--
{
sec=0;//毫秒级
minu++;
if(minu==60)
{
minu=0;//秒
hour++;
if(hour==60)//分
{
hour=0;
}
}
}
}
}
/*************外部中断0中断函数************/
voidex0_int()interrupt0
{
k++;
if(k==3)
--
--
k=0;
if(k==1)
{
TR0=~TR0;
if(TR0==1)
{
hour=0;
minu=0;
sec=0;
}
}
if(k==2)
{
TR0=~TR0;
}
}
/*************外部中断1中断函数************/
voidex1_int()interrupt2
{
s++;
if(s==3)
--
--
s=0;
}
/*************定时器1中断****************/
voidtimer1_int()interrupt3//控制时钟工作
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(s==2)
{
if(hour1==hour0&&minu0==minu1)
sounde();
}
b++;
if(b==20)
{
b=0;
sec0++;
if(c0==60)
{
c0=0;
minu0++;
--
--
if(minu0==60)
{
minu0=0;
hour0++;
if(hour0==24)
hour0=0;
}
}
}
}
/*************键盘扫描****************/
voidkeyscan()
{
if(s==1)
{
if(qingling==0)
--
--
{
delay(10);
if(qingling==0)
{
c1=0;
minu1=0;
hour1=0;
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu1++;
if(minu1==60)
{
minu1=0;
}
while(!tiaofen);
}
--
--
}
if(tiaoshi==0)
{
hour1++;
if(hour1==24)
{
hour1=0;
}
while(!tiaoshi);
}
}
el//调整时钟时间
{
if(qingling==0)
{
delay(10);
if(qingling==0)
{
sec0=0;
minu0=0;
hour0=0;
--
--
}
}
if(tiaofen==0)
{
delay(10);
if(tiaofen==0)
{
minu0++;
if(minu0==60)
{
minu0=0;
}
while(!tiaofen);
}
}
if(tiaoshi==0)
{
hour0++;
if(hour0==24)
{
hour0=0;
--
--
}
while(!tiaoshi);
}
}
}
/*************显示函数****************/
voiddisplay(ucharhour,ucharminu,ucharc)
{
h1=hour/10;
h2=hour%10;
m1=minu/10;
m2=minu%10;
s1=sec/10;
s2=c%10;
P0=0xff;
P2=table[h1];
P0=lect[7];
delay(5);
P0=0xff;
--
--
P2=table[h2];
P0=select[6];
delay(5);
P0=0xff;
P2=0x40;;
P0=lect[5];
delay(5);
P0=0xff;
P2=table[m1];
P0=select[4];
delay(5);
P0=0xff;
P2=table[m2];
P0=select[3];
delay(5);
P0=0xff;
P2=0x40;
P0=lect[2];
--
--
delay(5);
P0=0xff;
P2=table[s1];
P0=lect[1];
delay(5);
P0=0xff;
P2=table[s2];
P0=select[0];
delay(5);
}
/*************闹钟函数****************/
voidsounde()
{
sounder=~sounder;
}
/*************延时函数****************/
voiddelay(ucharz)
{
--
--
intx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
总结:本电子时钟设计硬件结构简单,软件设计条理清晰,是一个很实用及很常
见的多功能时钟。由于之前没有独立做过单片机实现多功能电子时钟方面的内
容,所以在做设计时总会遇见很多问题,本次设计是在结合老师的指导及同学的
帮助下完成的,并通过本人在网上所查的大量资料及单片机设计中常见的电路而
构思出来的。通过电子时钟的设计,使我对单片机的使用和工作原理有了更深刻
的理解,对伟福单片机编程环境熟悉了许多,进一步掌握了单片机的定时器、中
断处理的编程方法和数码显示电路的驱动方法。
本文发布于:2022-11-13 12:34:28,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/88/11033.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |