电子时钟设计与实现.docx
《电子时钟设计与实现.docx》由会员分享,可在线阅读,更多相关《电子时钟设计与实现.docx(29页珍藏版)》请在冰豆网上搜索。
电子时钟设计与实现
单片机应用系统与开发技术
课题名称:
数字时钟的设计与实现
班级:
学号:
姓名:
数码科技系
题目:
数字时钟的设计与实现
前言
一、概要设计········6
1、项目描述·········6
2、功能描述·········6
3、系统框图········6
硬件设计及简介
二、时钟硬件设计······7
1、单片机简介·······7
2、AT89C51单片机介绍·····8
3、AT89C51单片机原理图······8
4、数码管显示工作原理········11
5、共阳数码管的原理······13
6、所需元件···········13
7、部分电路图···········14
三、焊接········18
四、软件设计··········19
1、主程序····19
1·1、主程序的概念·······19
1·2、主程序流程图······20
2、LED显示子程序·······20
2·1、LED显示子程序····20
3、键盘扫描功能设置子程序···20
3·1、调用键盘扫描功能时的方法··20
3·2、定时中断子程序流程图·····21
3.3、编制程序····21
五、设计总结·······27
前言
时钟,自从它发明的那天起,就成为人类的朋友,但随着时间的推移,科学技术的不断发展,人们对时间计量的精度要求越来越高,应用越来越广。
怎样让时钟更好的为人民服务,怎样让我们的老朋友焕发青春呢?
这就要求人们不断设计出新型时钟。
现今,高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟,石英表,石英钟都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调校,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。
在一个单片机应用系统中,时钟有两方面的含义:
一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间,它通常有两种实现方法:
一是用软件实现,即用单片机内部的可编程定时/计数器来实现,但误差很大,主要用在对时间精度要求不高的场合;二是用专门的时钟芯片实现,在对时间精度要求很高的情况下,通常采用这种方法,典型的时钟芯片有:
DS1302,DS12887,X1203等都可以满足高精度的要求。
本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89S51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。
一设计要求
一、概要设计;
1、项目描述:
用六位LED数码管实现电子时钟的功能,显示方式为时、分、秒,采用24小时计时方式。
使用按键实现时、分的调整。
2、功能描述:
1:
显示时间方式:
时,分,秒。
2:
计时方式:
24h(小时)制。
3:
上电显示为:
12--00—00
3:
电子时钟的系统框图。
CPU
复位、时钟等电路
按键电路
电源系统
数码管显示电路
图1电子钟系统框图
二硬件设计及部分电路简介
二、时钟硬件设计;
1、单片机简介。
单片机全称为单片机微型计算机(SingleChipMicrosoftcomputer)。
从应用领域来看,单片机主要用来控制,所以又称为微控制器(MicrocontrollerUnit)或嵌入式控制器。
单片机是将计算机的基本部件微型化并集成在一块芯片上的微型计算机。
2、AT89C51单片机介绍。
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
口管脚
备选功能
P3.0RXD
(串行输入口)
P3.1TXD
(串行输出口)
P3.2/INT0
(外部中断0)
P3.3/INT1
(外部中断1)
P3.4T0
(记时器0外部输入)
P3.5T1
(记时器1外部输入)
P3.6/WR
(外部数据存储器写选通)
P3.7/RD
(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
3、AT89C51单片机原理图,(如图2所示)
图2单片机
4、数码管显示方案。
动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。
显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗
5、数码管显示工作原理;
数码管是一种把多个LED显示段集成在一起的显示设备。
有两种类型,一种是共阳型,一种是共阴型。
共阳型就是把多个LED显示段的阳极接在一起,又称为公共端。
共阳型就是把多个LED显示段的阳极接在一起,即为公共商。
通常的数码管又分为8段,即8个LED显示段,分别为A、B、C、D、E、F、G、DP,其中DP是小数点位段。
而多位数码管,除某一位的公共端会连接在一起,不同位的数码管的相同端也会连接在一起。
即,所有的A段都会连在一起,其它的段也是如此,这是实际最常用的用法。
数码管显示方法可分为静态显示和动态显示两种。
静态显示就是数码管的8段输入及其公共端电平一直有效。
动态显示的原理是,各个数码管的相同段连接在一起,共同占用8位段引管线;每位数码管的阳极连在一起组成公共端。
利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清晰显示出来。
6、共阳极数码管原理图;
图3共阳极数码管内部结构图
7、所需元件
1、8位数码管
图3数码管
2、电容、
图4电容器
3:
电阻、
图5电阻
4:
晶体、
图6晶振
7、部分硬件电路图,
1、复位电路
图复位电路
1、单片机最小系统,如图所示;
图6单片机最小系统
2、键盘扫描电路,(系统中用3个按键作为功能键,K1,K2,K3,所以采用独立式键盘结构。
)
该设计只用了三个键盘,但实现的功能却是比较完善,减少了硬件资源的损耗,该键可以实现时、分、秒的调节。
当按键按下第一个键(k1)松开时,则可以通过第二个按键实现小时的累加,可以通过第三个键(K3)实现小时的累减,每按一次小时加一或减一,当再次按第一个键(K1)时,此时分钟进行闪烁,则可以进行对分钟的加、减,同样按第一个键(K1)就可以对跑秒进行调节,每按(k1)一次选中要调节的对象,按(k2)一次加一,按(k3)一次减一。
达到时间调节的目的。
图7独立按键
3、数码管扫描驱动电路,(用8个NPN型三极管来驱动8位动态数码管)
图8三极管驱动电路
4、电子时钟的硬件电路图。
图9
三、焊接模块。
1、物品清单与元件特性
表1-1物品清单:
元件名称
规格型号
单位
数量
瓷片电容
30P
只
2
电解电容
47UF/16V
只
1
电解电容
10UF/16V
只
2
电阻
10kΩ
只
8
电阻
200Ω
只
8
芯片
AT89S51
片
1
芯片座
DIP40
只
1
无源晶振
12M
只
1
4位数码管
0.5寸/共阳
只
2
三极管
9012
个
8
二极管
1N4148
只
1
按键
无自锁
只
4
电池盒
个
1
电路板
9.55*5.664
CM2
1
表1-2AT89c51功能特性:
·兼容MCS-51指令系统
·4k可反复擦写(>1000次)ISPFlashROM
·32个可编程I/O口
·4.0-5.5V工作电压范围
·2个16位可编程定时/计数器
·全静态工作模式:
时钟频率0-33MHz
·全双工UART串行中断口线
·128x8bit内部RAM
·5个中断源
·低功耗空闲和掉电模式
焊接总结:
本次实验提供8051芯片和PNP型三极管.焊接的时候一不小心就会犯错,,实际上的电路图不会和仿真软件的电路图完全一致,不过大体上还是一样的。
本次焊接实际上需要比较多的电线,尤其是数码管部分,由于相邻引脚非常贴近,在焊接的时候要非常留心,谨防相邻两点短路。
1、主程序。
1·1、主程序的概念:
主程序主要是循环调用显示子程序及键盘扫描功能设置子程序,
1·2、主程序流程图
图10主程序流程图
2、LED显示子程序
2·1、码管显示的数据存放在内存单元dis[0]~dis[5]中。
每一单元均为十进制BCD码。
由于采用软件动态扫描方式实现数据显示的功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出dis[0]~dis[5]某一地址中的数据,然后查的对应的显示用段码,并从p0口输出,p2口将对应的数码管选中供电,就能显示该地址单元的数据值。
3、键盘扫描功能设置子程序
3·1、调用键盘扫描功能时的方法如下:
按下p1.0口按键,则进入调整时间状态,等待操作,p1.0口或p1.2口按键时,在调时间状态下可实现加1或减1的功能。
3·2、定时中断子程序流程图
图T0中断服务程序流程图
3.3、编制程序
********************
:
*功能描述:
K0---时分位选择,K1--------加1,K2------减1
:
*上电时初始化显示:
12-00-00,12Hz晶振,8位共阳数码管
********************
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineled_dataP0//段码控制端
#defineled_bitP2//位选端
sbitkey0=P1^0;//功能切换按键
sbitkey1=P1^1;//加一按键
sbitkey2=P1^2;//减一按键
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共阳0--9段码,0xff为清零码,0xbf为显示“—”用;
uchardatascan_con[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//位控制码;
uchardatatimedata[8]={0x01,0x02,0x0b,0x00,0x00,0x0b,0x00,0x00};//用作数码管显示时分秒计数;
uchardatadis[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0xff};//数码管的显示;
uchardatacon1s=0x00,con03s=0x00,con=0x00;
voiddelay1ms(uintt)//延时函数
{
intj;
for(;t>0;t--)
for(j=0;j<120;j++);
}
voidkeyscan()//按键扫描函数
{
EA=0;//关中断
if(key0==0)
{
delay1ms(5);
while(key0==0);
con++;
TR0=0;
ET0=0;
TR1=1;
ET1=1;
if(con>=8)//如con>=8,则恢复时钟正常显示,并对con的值清零;
{
con=0;
TR1=0;
ET1=0;
TR0=1;
ET0=1;
dis[8]=0x0a;
}
}
if(con!
=0)//con的值不为零,说明此时正在调时模式下等待调时;
{
if(key1==0)
{
delay1ms(5);
while(key1==0);
timedata[con]++;
switch(con)
{
case1:
if(timedata[con]<10)//判断小时的个位是否小于十;
{
if(timedata[con]>=4&&timedata[con-1]==2)//判断小时是否加到“24”,如果是小时位变成“00”;
{
timedata[con]=0;
timedata[con-1]=0;
}
}
else//小时的个位大于等于十,就使小时的十位加一;
{
timedata[con]=0;
timedata[con-1]++;
}
break;
case3:
//3和6分别代表分与秒的十位,它的值大于5时,就对当前值清零;
case6:
if(timedata[con]>=6)
timedata[con]=0;
break;
case4:
//4和7分别代表分与秒的个位,它的值大于9时,就对当前值清零;
case7:
if(timedata[con]>=10)
timedata[con]=0;
break;
}
dis[con]=timedata[con];
dis[con-1]=timedata[con-1];
dis[8]=0x0a;
}
}
if(con!
=0)
{
if(key2==0)
{
BEEP();
delay1ms(5);
while(key2==0);
switch(con)
{
case1:
if(timedata[con]==0)
{
timedata[con]=9;
timedata[con-1]--;
if(timedata[con-1]==0&&timedata[con]==0)
{
timedata[con]=3;
timedata[con-1]=2;
}
}
else
timedata[con]--;
break;
case3:
case6:
if(timedata[con]==0)
timedata[con]=5;
else
timedata[con]--;
break;
case4:
case7:
if(timedata[con]==0)
timedata[con]=9;
else
timedata[con]--;
break;
}
dis[con]=timedata[con];
dis[con-1]=timedata[con-1];
dis[8]=0x0a;
}
}
EA=1;
}
voiddisplay()//显示函数
{
uchark;
for(k=0;k<8;k++)
{
led_data=table[dis[k]];
led_bit=scan_con[k];
delay1ms
(1);
P2=0x00;
}
}
voidinitializa()//初始化
{
inti;
for(i=0;i<8;i++)
{
dis[i]=timedata[i];
}
/***打开T0和T1定时中断,并对T0和T1赋定时50ms的初值***/
TH0=0X3C;
TL0=0XB0;
TH1=0X3C;
TL1=0XB0;
TMOD=0X11;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
EA=1;
}
main()
{
initializa();//初始化函数
while
(1)
{display();//显示函数
keyscan();//按键检测函数
}
}
voidtime_int0()interrupt1//T0定时1s中断服务函数
{
ET0=0;
TR0=0;
TH0=0x3c;
TL0=0xb0;
TR0=1;
con1s++;
if(con1s==20)//con1s的值为20时,定时为1s;
{con1s=0;
timedata[7]++;
if(timedata[7]>=10)
{
timedata[7]=0;
timedata[6]++;
if(timedata[6]>=6)
{
timedata[6]=0;
timedata[4]++;
if(timedata[4]>=10)
{
timedata[4]=0;
timedata[3]++;
if(timedata[3]>=6)
{
timedata[3]=0;
timedata[1]++;
if(timedata[1]>=10)
{
timedata[1]=0;
timedata[0]++;
if(timedata[0]==2)
{
if(timedata[1]==4)
{
timedata[0]=0;
timedata[1]=0;
}
}
}
}
}
}
}
dis[0]=timedata[0];
dis[1]=timedata[1];
dis[3]=timedata[3];
dis[4]=timedata[4];
dis[6]=timedata[6];
dis[7]=timedata[7];
}
ET0=1;
}
voidtime_intt1()interrupt3//调时闪烁中断服务函数
{
EA=0;
TH1=0X3C;
TL1=0XB0;
con03s++;
if(con03s==8)
{
con03s=0x00;
dis[9]=dis[con];
dis[con]=dis[8];
dis[8]=dis[9];
}
EA=1;
}
6.2设计总结
本设计能够很准确的走时,并能够通过硬件对时钟进行时间调整。
◆功能介绍:
1.显示XX:
XX:
XX时间
2.时间可调:
调整键(S1)按下(t>0.5s)分钟位闪亮,此时按下S2键(t<0.5s)该个位数值加1,当加到9时,再按下S2键则该个位显示0,分钟十位加1。
继续按下调整键(S1)(t>0.5s)时钟位闪亮,此时按下S2键(t<0.5s)该个位数值加1,当加到9时再按下加S2键则该个位显示0,时钟十位加1。
继续按下调整键(S2)(t>0.5s),返回到正常显示状态。
3.检测各芯片的电源线和地线是否接触良好,然后焊接器件,接好电源用万用表检测各电源端、地端的状态是否