单片机数字电子钟设计.docx
- 文档编号:24462523
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:49
- 大小:1.16MB
单片机数字电子钟设计.docx
《单片机数字电子钟设计.docx》由会员分享,可在线阅读,更多相关《单片机数字电子钟设计.docx(49页珍藏版)》请在冰豆网上搜索。
单片机数字电子钟设计
单片机数字电子钟设计
前言
随着生活水平的提高,人们越来越追求人性化的事物,传统的时钟已不能满足人们的需求。
现代的数字钟不仅需要模拟电子技术,而且需要数字电路技术和单片机技术,增加了数字显示等的功能。
单片机电子钟表电路可以由单片机模块、实时时钟电路模块、人机接口模块、报警模块等部分组成,硬件电路简单稳定,并可以利用软件编程减小电磁干扰和其他环境干扰的影响,减小因元器件精度不够引起的误差等优点,与机械式时钟相比具有更高的准确性和直观性,电路简单,使用寿命长,应用范围广,被广泛用于个人家庭、车站、码头、办公室等公共场所,成为人们日常生活中不可少的必需品。
由于数字集成电路的发展和石英晶体振荡器的广泛应用,数字钟表的精度远远超过老式机械钟表,给人们生产生活带来了极大的方便。
另一方面,由于单片机技术的使用,大大扩展了钟表原先的功能,可以提供定时自动报警、按时自动打铃、时间程序自动控制及各种定时电气的自动启用功能等。
因此,研究数字钟表及扩大其应用,有着非常现实的意义。
本设计主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机STC89C52芯片,DS1302和LED数码管为核心,辅以必要的电路,构成了一个单片机电子时钟。
1.系统总体设计思路方案
1、采用STC89C52单片机作为主控芯片,实现数字钟表主控功能。
2、采用液晶屏显示当前年、月、日、时、分、秒,闹铃时间及状态等信息。
3、采用六键键盘设定时间初始值,具体方法是按时间设定键依次进入年、月、日、时、分、秒设定状态,然后通过向上、向下键修改设定值。
正在设定的变量以闪烁状态突出显示。
4、采用六键键盘设定闹铃时间,具体方法是按闹铃设定键依次进入时、分设定状态,然后通过向上、向下键修改设定值。
正在设定的变量以闪烁状态突出显示。
5、采用DS1302实时时钟芯片完成后台计时功能,要求具有后备电源,即使主电源掉电时间仍然保持运行。
6、可设定闹铃使能,具体方法是按闹铃使能键,按一次打开,再按一次关闭。
闹铃使能关闭时不报警。
7、当闹铃使能打开,且当前时间到达闹铃设置时间,则蜂鸣器和LED红灯同时报警,如不按取消键,报警时间为1分钟。
报警状态可以通过按取消键退出。
8、系统通过USB电源供电,单片机程序也可通过USB线串行下载。
2.硬件实现及单元电路设计
单片机数字闹钟硬件框图如图1-1所示。
图1-1硬件框图
其中DS1302完成计时功能,单片机主控芯片读取DS1302的时间数据,在液晶屏上显示出来。
用户可以通过按键设定时间初始值、闹铃初始值等。
主电源和备份电源给各芯片供电。
2.1.相关基础介绍
2.1.1.DS1302芯片
2.1.1.1.DS1302的性能特性
实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;
用于高速数据暂存的31×8位RAM;
最少引脚的串行I/O;
2.5~5.5V电压工作范围;
2.5V时耗电小于300nA;
用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;
简单的3线接口;
可选的慢速充电(至Vcc1)的能力。
DS1302时钟芯片包括实时时钟/日历和31字节的静态RAM。
它经过一个简单的串行接口与微处理器通信。
实时时钟/日历提供秒、分、时、日、周、月和年等信息。
对于小于31天的月和月末的日期自动进行调整,还包括闰年校正的功能。
时钟的运行可以采用24h或带AM(上午)/PM(下午)的12h格式。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302有主电源/后备电源双电源引脚:
Vcc1在单电源与电池供电的系统中提供电源,并提供低功率的电池备份;Vcc2在双电源系统中提供主电源,在这种运用方式中Vcc1连接到备份电,以便在没有主电源的情况下能保存时间信息以及数据。
DS1302由Vcc1或Vcc2中较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电;当Vcc2小于Vcc1时,DS1302由Vcc1供电。
2.1.1.2.DS1302数据操作原理
DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输出。
无论是读周期还是写周期,开始8位指定40存器中哪个将被访问到。
在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的始终周期在读操作时输出数据,在写操作时写入数据。
时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字数。
如果在传送过程中置RST脚为低电平,则会中止本次数据传送,并且I/O引脚变为高阻态。
上电运行时,在Vcc≧2.5V之前,RST脚必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
DS1302的引脚及内部结构图如图2-1所示。
图2-1DS1302引脚图及内部结构
DS1302的引脚功能如表2-1所示。
表2-1DS1302引脚功能
引脚号
引脚名称
功能
1
Vcc2
主电源
2,3
X1,X2
震荡源,外接32.768kHz晶振
4
GND
地线
5
RST
复位/片选线
6
I/O
串行数据输入/输出端(双向)
7
SCLK
串行数据输入端
8
Vcc1
后备电源
DS1302的控制字如图2-2所示。
控制字节的最高有效位(位7)必须是逻辑1;如果它为0。
则不能把数据写入到DS1302中。
位6如果为0则表示存取日历时钟数据;为1表示存取RAM数据。
位5~1(A4~A0)指示操作单元的地址。
最低有效位(位0)如为0,表示要进行写操作;为1表示进行读操作。
控制字节总是从最低位开始输入/输出。
图2-2DS1302的控制字
DS1302的读写时序如图4所示。
为了提高对32个地址的寻址能力(地址/命令位1~5=逻辑1),可以把时钟/日历或RAM寄存器规定为多字节(burst)方式。
位6规定时钟或RAM,而位0规定读或写。
在时钟/日历寄存器中的地址9~31或RAM寄存器中的地址31不能存储数据。
在多字节方式中,读或写从地址0的位0开始。
必须按数据传送的次序写最先的8个寄存器。
但是,当以多字节方式写RAM时,为了传送数据不必写所有31字节,不管是否写了全部31字节,所写的每一字都将传送至RAM。
图2-3DS1302数据读/写时序
DS1302共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。
其日历、时间寄存器及其控制字见表2-5,其中奇数为读操作,偶数为写操作。
表2-2内部寄存器地址和内容
寄存器名
命令字节
取值范围
寄存器内容
写
读
7
6
5
4
3
2
1
0
秒寄存器
80H
81H
00~59
CH
10s
SEC
分寄存器
82H
83H
00~59
0
10min
MIN
[小]时寄存器
84H
85H
00~23或01~12
12/24
0
10A/P
HR
HR
日期寄存器
86H
87H
01~28,29,30,31
0
0
10DATE
DATE
月份寄存器
88H
89H
01~12
0
0
0
10M
MONTH
周寄存器
8AH
8BH
01~07
0
0
0
0
0
DAY
年寄存器
8CH
8DH
00~99
10YEAR
YEAR
时钟暂停:
秒寄存器的位7定义位时钟暂停位。
当它为1时,DS1302停止振荡,进入低功耗的备份方式。
通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。
当它为0时,时钟将开始启动。
AM-PM/12-24小时方式:
小时寄存器的位7定义为12或24小时方式选择位。
它为高电平时,选择12小时方式。
在此方式下,位5是AM/PM位,此位是高电平时表示PM,低电平表示AM。
在24小时方式下,位5为第二个10小时位(20~23h)。
DS1302的晶振选用32.768kHz,电容推荐值为6pF,因为振荡频率较低,也可以不接电容,对记时精度影响不大。
2.2.STC89C52单片机
2.2.1.STC89C52单片机概述
STC89C52系列单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍,内部集成MAX810专用复位电路。
2.2.2.STC89C52单片机特点
工作电压:
5.5V-3.5V(5V单片机);
增强型8051CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051;
工作频率范围:
0~40MHz,相当于普通8051的0~80MHz;
用户应用程序空间4K//8K/16k/32K/64K字节;
片上集成1280字节RAM;
通用I/O口(32/36个),复位后为准双向口/弱上拉(普通8051传统I/O口);
ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器/仿真器。
每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过120mA;
可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片;
有EEPROM功能;
看门狗;
内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地);
时钟源:
外部高精度晶体/时钟,内部R/C振荡器;
用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟;
常温下内部R/C振荡器频率为:
5.0V单片机为:
11MHz~17MHz;
共4个16位定时器,两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器做串行通讯的波特率发生器,再加上2路PCA模块可再实现2个16位定时器;
外部中断I/O口4路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,PowerDown模式可由外部中断唤醒;
通用全双工异步串行口(UART);
工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级);
封装:
PDIP-40,PLCC-44。
2.2.3.STC89C52单片机管脚及封装
STC89C52单片机有多种封装形式,本设计中选用40DIP封装,其管脚定义如图2-4所示。
图2-4STC89C52管脚图
2.3.硬件电路设计
2.3.1.单片机电路
如图2-5所示,单片机采用STC89C52芯片,电路采用11.0592MHz外部无源晶体,振荡电容采用20pF。
复位电路采用10uF(C1)电容和10K(R2)组成的阻容复位电路。
图2-5单片机电路
单片机管脚连接标号中,P00—P07为液晶屏数据线,P25—P27为液晶屏控制线。
标号RXD和TXD是单片机的异步串行通信引脚,用于单片机程序的ISP下载。
2.3.2.DS1302时钟电路
DS1302时钟电路如图2-6所示,其中BT1是后备电池,以保证在主电源掉电时时钟依然运行。
Y2是时钟晶振,因为频率较低,故可以不加电容。
R10—R12为上拉电阻。
DS1302通过SCLK、I/O和RST管脚和单片机相连。
图2-6DS1302时钟电路
2.3.3.液晶屏显示电路
显示部分采用SMC1602液晶屏进行数据显示,其主要技术参数为:
表2-3液晶屏技术指标
接口信号说明如表2-4所示。
表2-4液晶屏接口信号说明
与单片机接口电路如图2-7所示。
图2-7LCD与单片机接口电路
2.3.4.按键电路
U盘驱动芯片CH375不仅提供了与USB设备的硬件连接,还内置了文件系统底层程序,使得读、写U盘中的文件变得容易。
图中CH375使用12MHz外部晶体,振荡电容为20pF。
管脚连接标号D0—D7是与单片机并口进行数据传输的数据线,CH375INT为单片机提供中断信号,CH375CS、CH375A0、CH375WR和CH375RD是控制信号线。
CH375通过RU2和RU3两个电阻与U盘的UD+和UD-数据线连接,同时通过LU发光管输出U盘状态。
2.3.5.键盘驱动电路
键盘驱动电路如图2-8所示。
图2-8键盘驱动程序
电路使用与单片机管脚直接相连的按键实现键盘。
当按键按下时管脚为低电平,无按键时为高电平。
单片机采用查询方式获取按键信息。
2.3.6.闹铃电路
图2-9闹铃电路
闹铃电路由单片机管脚驱动蜂鸣器和报警灯实现,当闹铃时间到时,蜂鸣器鸣响,红灯报警。
2.3.7.电源电路
本设计采用USB接口供电,电源电压5V。
同时,USB接口通过内含PL2303芯片的转换电路对单片机进行程序编写。
其电路原理如图2-10所示。
图2-10供电及程序下载电路
2.3.8.总电路图
经上所述,画出总电路图,图2-11
图2-11总电路图
3.软件设计
3.1.软件流程图
本设计软件流程如图3-1所示。
图3-1软件流程图
3.2.时间调整程序设计
调整时间用4个调整按纽,1个作为移位、控制用,另外2个作为加个减用,分别定义为时间设置按纽、加按纽、减按纽。
在调整时间过程中,要调整的位与别的位应该有区别,所以增加了闪烁功能,即调整的位一直在闪烁,直到调整下一位。
闪烁原理就是,让要调整的一位每隔一定时间熄灭一次,比如说50ms。
利用定时器记时,当到达50ms溢出时,就送给该位熄灭符,在下一次溢出时,再送正常显示的值,不断交替,直到调整该位结束。
此时送正常显示值给该位,再进入下一位调整闪烁程序。
3.3.主程序
下面介绍main.c主程序编写。
3.3.1.头文件和一些宏定义
#include
#include
#include"1602.h"
#include"DS1302.h"
#defineAMHOURADDR0xC0//存闹铃时的地址
#defineAMMINUTEADDR0xC2//存闹铃分的地址
#defineAMENADDR0xC4//存闹钟使能标志的地址
3.3.2.管脚、常量、变量定义
//定义管脚
sbitLed_Alarm=P2^1;//报警灯
sbitBeep_Alarm=P2^0;//蜂鸣器
sbitKey_TMSet=P3^2;//时间设置
sbitKey_AMSet=P3^3;//闹铃设置
sbitKey_Up=P3^4;//上调
sbitKey_Down=P3^5;//下调
sbitKey_AMEn=P3^6;//闹铃开关
sbitKey_Review=P3^7;//查看
//定义标识
volatilebitFlagKeyPress=0;//有键按下标志
volatilebitFlagShow=0;//显示标志
volatilebitFlagTMSet=0;//时间设置状态标志
volatilebitFlagAMSet=0;//闹铃设置状态标志
volatilebitFlagAMEn=0;//闹铃使能标志,0为闹铃不使能,1为闹铃使能
volatilebitFlagAlarm=0;//闹铃状态标志
//按键响应用变量
ucharkeyvalue,keyTMSet,keyAMSet,keyUp,keyDown,keySet,keyAMEn,keyReview;
//DS1302时钟用变量
SYSTEMTIMECurrentTime;
ucharyear,month,day,hour,minute,second;
ucharAMhour,AMminute,AMStart;
//报警及存储用变量
//char*pSave;
//字符串显示用变量
ucharstr1[6]="000000";
ucharDate[9]="00-00-00",Time[9]="00:
00:
00";
ucharhide,SetNum;
uintCounter;
3.3.3.函数声明
//函数声明
voidint2str(intx,char*str);
voidDelay1ms(unsignedintcount);
voidData_Init();
voidTimer0_Init();
voidTimer0_ISR();
voidKeyProcess(uintnum);
3.3.4.各子程序
//整型转字符串的函数,转换范围0--65536
voidint2str(intx,char*str)
{
inti=1;
inttmp=10;
while(x/tmp!
=0)
{
i++;
tmp*=10;
}
tmp=x;
str[i]='\0';
while(i>1)
{
str[--i]='0'+(tmp%10);
tmp/=10;
}
str[0]=tmp+'0';
}
voidDelay1ms(unsignedintcount)
{
unsignedinti,j;
for(i=0;i for(j=0;j<120;j++); } //数据初始化 voidData_Init() { Beep_Alarm=1; Led_Alarm=1; AMStart=0; keyvalue=0; keyTMSet=1; keyAMSet=1; keyUp=1; keyDown=1; keyAMEn=1; keyReview=1; hide=0; Counter=0; SetNum=0; } //定时器0初始化 voidTimer0_Init() { ET0=1;//允许定时器0中断 TMOD=1;//定时器工作方式选择 TL0=0x06; TH0=0xf8;//定时器赋予初值 TR0=1;//启动定时器 } //定时器0中断 voidTimer0_ISR(void)interrupt1using0 { TL0=0x06; TH0=0xf8;//定时器赋予初值 //每1秒钟刷新显示一次时间值 Counter++; if(Counter>=450) { FlagShow=1; Counter=0; //设定闪烁标志 if(hide==1)hide=0; elsehide=1; } } voidKeyProcess(uintnum) { switch(num) { case1: //TMSet键被按下。 SetNum=0-管设置;1-年;2-月;3-日;4-时;5-分;6-秒,按一下SetNum加1。 if(FlagAMSet==1)//从闹铃时间设置进入当前时间设置 { FlagAMSet=0; FlagTMSet=1; SetNum=1; } elseif(FlagTMSet==0)//从正常状态进入当前时间设置 { FlagTMSet=1; SetNum=1; } else//已经在时间设置状态 { SetNum++; } if(SetNum>=7)//已经设定完毕,则存盘退出 { SetNum=0; FlagTMSet=0; } break; case2: //AMSet键被按下。 SetNum=0-关设置;1-时;2-分,按一下SetNum加1。 if(FlagTMSet==1)//从当前时间设置进入闹铃时间设置 { FlagTMSet=0; FlagAMSet=1; SetNum=1; //清屏 L1602_string(1,1,""); L1602_string(2,1,""); //读出当前闹铃时间并显示 int2str(AMhour,str1); L1602_string(2,1,str1); int2str(AMminute,str1); L1602_string(2,4,str1); } elseif(FlagAMSet==0)//从正常状态进入闹铃时间设置 { FlagAMSet=1; SetNum=1; //清屏 L1602_string(1,1,""); L1602_string(2,1,""); //读出当前闹铃时间并显示 int2str(AMhour,str1); L1602_string(2,1,str1); int2str(AMminute,str1); L1602_string(2,4,str1); } else//已经在闹铃时间设置状态 { SetNum++; } if(SetNum>=3)//已经设定完毕,则存盘退出并返回正常显示界面 { //存入闹铃时间 Write1302(0x8e,0x00);//写入允许 Write1302(AMHOURADDR,AMhour); Delay1ms(500); Write1302(AMMINUTEADDR,AMminute); Delay1ms(500); Write1302(0x8e,0x80);//写入禁止 AMhour=Read1302(AMHOURADDR); AMminute=Read1302(AMMINUTEADDR); SetNum=0; FlagAMSet=0; } break; case3: //Up键被按下 if(FlagTMSet==1)//如果在当前时间设置状态 { switch(SetNum) { case0: case1: //年 if(year<99)year++; Write1302(0x8e,0x00);//写入允许 DS1302_SetTime(DS1302_YEAR,year); Write1302(0x8e,0x80);//禁止写入 break; case2: //月 if(month<12)month++; Write1302(0x8e,0x00);//写入允许 DS1302_SetTime(DS1302_MON
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 数字 电子钟 设计