基于51的数字时钟.docx

上传人:b****7 文档编号:26657191 上传时间:2023-06-21 格式:DOCX 页数:36 大小:398.11KB
下载 相关 举报
基于51的数字时钟.docx_第1页
第1页 / 共36页
基于51的数字时钟.docx_第2页
第2页 / 共36页
基于51的数字时钟.docx_第3页
第3页 / 共36页
基于51的数字时钟.docx_第4页
第4页 / 共36页
基于51的数字时钟.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

基于51的数字时钟.docx

《基于51的数字时钟.docx》由会员分享,可在线阅读,更多相关《基于51的数字时钟.docx(36页珍藏版)》请在冰豆网上搜索。

基于51的数字时钟.docx

基于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"

 

/*************************************************

模块级变量申明

*******************

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1