基于51的数字时钟.docx
《基于51的数字时钟.docx》由会员分享,可在线阅读,更多相关《基于51的数字时钟.docx(36页珍藏版)》请在冰豆网上搜索。
基于51的数字时钟
目录
1基本要求··········································1页
2方案选择··········································1页
3系统硬件设计······································3页
4软件设计··········································8页
5总结·············································10页
6附件············································11页
1基本要求:
(1)可用内部RTC,也可使用外部日历时钟(如PCF8583);
(2)能进行年、月、日的计时以及独立的时间显示电路;
(3)能进行星期的显示;
(4)快速校时。
发挥部分举例:
(1)可以进行某年某月某日的备忘预置,到达备忘日期后,该日期可以闪动提示;
(2)可以进行某年某月某日的备忘预置,到达备忘日期后,报警灯闪动;
(3)其他如阴历显示。
2.1单片机选择
方案:
采用51系列单片机,片内全部采用FlashROM,能以3V的超低压工作,该芯片内部为8Kbrom,有89C51的功能,且具有在线编程可察除技术,当对电路进行调试时,由于对程序程序的错误修改或者对程序的新增加的功能进行烧写时,不需要对芯片多次插拔,所以不会对芯片造成损害。
所以选择51系类单片机。
2.2显示选择
方案:
由于电子万年历需要显示年月日以及时分秒以及星期,一块1602显示屏刚好够显示,所以选择1602液晶显示屏。
2.3时钟芯片选择
方案:
采用PCF8583,PCF8583是一块低功耗,且自动读取年月日,时分秒以及星期的I2C时钟芯片,用2.5V—5V的电压能驱动该芯片,且可以自动补偿误差。
2.4最终方案
终上所诉,采用AT89S52作为主控芯片,1602作为显示,以及采用PCF8583作为时钟芯片。
3系统的硬件设计以及实现
3.1电路设计框图
3.2系统硬件概述
本电路有51系列单片机为主控芯片,具有在线编程功能,功耗低等优点,能在3V-5V电压之间工作;时钟芯片为PCF8583,PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。
PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。
由于要显示年月日,时分秒以及星期。
所以采用1602液晶显示屏刚好能够把这些全部显示完全,并且接口相对较少,操作简单方便。
3.3主要单元电路设计
3.3.1主控电路设计
51系列单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3,每一个I/O口都能独立的输出或者输入。
这里我们采用的是51单片机开发板。
单片机最小系统入下图所示:
3.3.2时钟电路
PCF8563有16个位寄存器:
一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容)一个分频器(用于给实时时钟RTC提供源时钟)一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHzI2C总线接口。
所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。
前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H~08H用于时钟计数器(秒~年计数器),地址09H~0CH用于报警寄存器(定义报警条件),地址0DH控制CLKOUT管脚的输出频率,地址0EH和0FH分别用于定时器控制寄存器和定时器寄存器。
秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以BCD格式编码。
当一个RTC寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟日历芯片的错读。
管脚图如图所示:
PCF8583引脚连接:
3.3.3显示模块
1602连接图:
3.3.4键盘
3.3.5总电路
4软件设计
4.1主程序流程图
4.2时钟调整
5设计总结
在调试过程中遇到的问题:
读出来的时间显示不正确。
方法:
把其他的程序暂时先屏蔽掉,单独调试显示程序。
按键不能正确控制时间的加减。
通过这次实践,我们小组能够对平时的编程技术理解更加的透彻,也使我们进一步理解了51单片机的强大,让我们对单片机的兴趣越来越浓厚。
通过这次实践,我们能够更好的实现硬件与软件的结合,也使得我们的配合越来越默契。
程序附件
I2C程序:
/******************************************************************************/
/**
/**模块名:
-------------------IIC.C--------------------------------------
/**-----------------PCF8583实时时钟模块-------------------------*/
/**功能描述:
/**
/**创建人:
日期:
*/
/**修改人:
日期:
*/
/**其他说明:
/******************************************************************************/
#include"Includes.h"//文件包含
/*************************************************
模块级变量申明
*************************************************/
//…………模块级变量申明在这
staticvoidIIC_Start(void);
staticvoidIIC_Stop(void);
staticvoidIIC_TxByte(int8utx_byte);
staticint8uIIC_RxByte(void);
staticboolIIC_WaitAck(void);
staticvoidIIC_SendAck(void);
staticvoidIIC_SendNoAck(void);
/*************************************************
子函数定义
*************************************************/
/*******************************************************************************
***函数名:
staticvoidIIC_Start(void)
***功能描述:
***全局变量:
NO!
***输入:
NO!
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
StartIIC.
/******************************************************************************/
staticvoidIIC_Start(void)
{
EA=0;//关中断;
SDA=1;//初始化总线;
SCL=1;
NOP();
SDA=0;//启动总线;
NOP();
SCL=0;//准备数据发送,启动IIC之后传输线全部置0;
}
/*******************************************************************************
***函数名:
staticvoidIIC_TxByte(int8utx_byte)
***功能描述:
发送一个字节;
***全局变量:
NO!
***输入:
tx_byte
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
操作完成后保证SCL为0;
/******************************************************************************/
staticvoidIIC_TxByte(int8utx_byte)
{//SDA:
0;SCL:
0.
int8ui;
for(i=0;i<8;i++)
{
if(tx_byte&0x80)
SDA=1;//因为Start函数中以把SCL拉低,数据直接发送;
else
SDA=0;
tx_byte<<=1;//因为发送顺序:
由Msb——>Lsb;
SCL=1;
NOP();//延时;
SCL=0;
}
}
/*******************************************************************************
***函数名:
staticboolIIC_WaitAck(void)
***功能描述:
发送一个字节;
***全局变量:
NO!
***输入:
tx_byte
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
操作完成后保证SCL为0;
/******************************************************************************/
staticboolIIC_WaitAck(void)
{//SDA:
U;SCL:
0.
int8uwaitTime=0xff;//设置Ack信号超时数;
SDA=1;//将数据线拉高;
SCL=1;//启动Ack脉冲;
NOP();
while(SDA)
{
waitTime--;
if(!
waitTime)
{
SCL=0;//SCL=0;
IIC_Stop();
returnFALSE;
}
}
SCL=0;//操作完成后确认SCL为0,此时SDA=0;
returnTRUE;
}
/*******************************************************************************
***函数名:
staticint8uIIC_RxByte(void)
***功能描述:
接收一个字节;
***全局变量:
NO!
***输入:
NO!
***输出:
接收字节:
tmp
***创建人:
日期:
***修改人:
日期:
***函数说明:
操作完成后保证SCL为0;
/******************************************************************************/
staticint8uIIC_RxByte(void)
{//SDA:
0;SCL:
0;
int8utmp=0;
int8ui;
for(i=0;i<8;i++)
{
SCL=0;
SDA=1;//向I/O口写1后准备读入;
NOP();
SCL=1;
NOP();
tmp<<=1;
if(SDA)
{
tmp|=0x01;
}
}
SCL=0;//SCL=0;
returntmp;
}
/*******************************************************************************
***函数名:
staticvoidIIC_SendAck(void)
***功能描述:
发送应答信号;
***全局变量:
NO!
***输入:
NO!
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
操作完成后保证SCL为0;
/******************************************************************************/
staticvoidIIC_SendAck(void)
{
SDA=0;
NOP();
SCL=1;
NOP();
SCL=0;
}
/*******************************************************************************
***函数名:
staticvoidIIC_SendNoAck(void)
***功能描述:
发送非应答信号;
***全局变量:
NO!
***输入:
NO!
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
操作完成后保证SCL为0;
/******************************************************************************/
staticvoidIIC_SendNoAck(void)
{
SDA=1;
NOP();
SCL=1;
NOP();
SCL=0;
}
/*******************************************************************************
***函数名:
staticvoidIIC_Stop(void)
***功能描述:
终止IIC传输;
***全局变量:
NO!
***输入:
NO!
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
操作完成后保证SCL为1,同时打开中断;
/******************************************************************************/
staticvoidIIC_Stop(void)
{
SDA=0;//tostopIIC;
SCL=0;
NOP();
SCL=1;
NOP();
SDA=1;//IICStoped!
!
结束IIC之后传输线全部置1;
EA=1;//SetEA.
}
/*******************************************************************************
***函数名:
externvoidPCF8583_ReadDat(int8uaddrInter,int8unum,int8u*buff)
***功能描述:
对PCF8583读;
***全局变量:
NO!
***输入:
addrInter:
内部寻址;num:
数据长度;buff:
数据缓存;
***输出:
buff数据缓存;
***创建人:
日期:
***修改人:
日期:
***函数说明:
IICStart至Stop间传输的字节数不限;
PCF8583内部寄存器地址附自增功能;
/******************************************************************************/
externvoidPCF8583_ReadDat(int8uaddrInter,int8unum,int8u*buff)
{
int8ui;
IIC_Start();//启动IICBus;
IIC_TxByte(0xa0);//PCF8583设备寻址;命令:
写;
IIC_WaitAck();//等待Ack信号;
IIC_TxByte(addrInter);//发送内部寄存器地址;
IIC_WaitAck();//等待Ack信号;
IIC_Start();//参考PCF读ReadMode时序;
IIC_TxByte(0xa1);//PCF8583设备寻址,命令:
读;
IIC_WaitAck();
for(i=0;i{
buff[i]=IIC_RxByte();//读一个字节;
IIC_SendAck();//发送应答信号;
}
buff[num-1]=IIC_RxByte();
IIC_SendNoAck();//最后一个字节发送非应答信号;
IIC_Stop();//终止本次传输,IICBus空闲;
}
/*******************************************************************************
***函数名:
externvoidPCF8583_WriteDat(int8uaddrInter,int8unum,int8u*buff)
***功能描述:
对PCF8583写;
***全局变量:
NO!
***输入:
addrInter:
内部寻址;num:
数据长度;buff:
数据缓存;
***输出:
NO!
***创建人:
日期:
***修改人:
日期:
***函数说明:
IICStart至Stop间传输的字节数不限;
PCF8583内部寄存器地址附自增功能;
/******************************************************************************/
externvoidPCF8583_WriteDat(int8uaddrInter,int8unum,int8u*buff)
{
int8ui;
IIC_Start();
IIC_TxByte(0xa0);
IIC_WaitAck();
IIC_TxByte(addrInter);
IIC_WaitAck();
for(i=0;i{
IIC_TxByte(buff[i]);
IIC_WaitAck();
}
IIC_Stop();
}
/*******************************************************************************
***函数名:
externvoidPCF8583_WriteByte(int8uaddrInter,int8uval)
***功能描述:
对PCF8583写一个字节;
***全局变量:
NO!
***输入:
addrInter:
内部寻址;val:
待写字节数据;
***输出:
NO!
***创建人:
huangtiexiong日期:
2006-11-28
***修改人:
日期:
2006-11-28
***函数说明:
参照PCF8583读时序;
/******************************************************************************/
externvoidPCF8583_WriteByte(int8uaddrInter,int8uval)
{
IIC_Start();
IIC_TxByte(0xa0);
IIC_WaitAck();
IIC_TxByte(addrInter);
IIC_WaitAck();
IIC_TxByte(val);
IIC_WaitAck();
IIC_Stop();
}
externvoidPCF8583_Init(void)
{
PCF8583_WriteByte(0x00,0x00);//Controlreg.Alarmdisabled。
}
/*******************************************************************************
****EndOfFile
*******************************************************************************/
4.3.2LCD驱动程序
/******************************************************************************/
/**
/**模块名:
-------------------Virtual_UART.C-----------------------------
/**-----------------虚拟串口调试------------------------------*/
/**功能描述:
/**
/**创建人:
日期:
*/
/**修改人:
日期:
*/
/**其他说明:
/******************************************************************************/
#include"Includes.h"
/*************************************************
模块级变量申明
*******************