基于PCF8563时钟芯片的万年历制作

更新时间:2023-12-05 09:25:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于PCF8563时钟芯片的万年历制作

万年历时钟芯片很多,用途也很广,采用飞利浦公司的PCF8563时钟芯片,LCM1602作显示,可以取得较理想的效果。个人认为比起DS1302来说,PCF8563更好用。而且它是现今流行的万年历时钟芯片之一。硬件电路图如下: +5V U2 R1 RP1C1RP210K*81VSS1010k*8100uF2VDDVO3 VOU1P2.24RSP2.15R/W S1140P2.06P1.0VDDES22397P1.1P0.0DB0 D1S33388P1.2P0.1DB1IN4001S44379P1.3P0.2DB2 53610P1.4P0.3DB363511P1.5P0.4DB473412 P1.6P0.5DB583313P1.7P0.6DB693214 RSTP0.7DB7BT1103115P3.0EA+5VLED-A3.6V113016 P3.1ALE/PROGLED-KR34.7C4U31229P3.2PSENR2PCF85631328 P3.3P2.78.2K10uFW11427VOLCM1602P3.4P2.61526103P3.5P2.5 1625P3.6P2.4+5V1724P3.7P2.3 1823P2.2X0P2.21922P2.1X1P2.1Y1 2021P2.0VSSP2.032.768K12MHz89S51 Y2C315PF C2 15PF PCF8563 是低功耗的CMOS 实时时钟/日历芯片,它提供一个可编程时钟输出,一个 中断输出和掉电检测器,所有的地址和数据通过I2C 总线接口串行传递。最大总线速度为 400Kbits/s,在数据交换时只要按照I2C总线模式进行操作。对时序的要求也不是太高,便于编写程序进行控制。 PCF8563内部寄存器地址与数据格式描述如下:

LCM1602 秒单元 分单元 小时单元 日单元 星期单元 月单元 年单元 分报警单元 时报警单元 日报警单元 星期报警单元 12348765地址 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 报警有效 报警有效 报警有效 报警有效 禁止/有效 数据格式 准确位 无效位 无效位 无效位 世纪位 无效位 无效位 BCD数据,00~99 报警值0~59 报警值0~23 报警值0~31 报警值0~6 无效位 无用 频率11:1HZ输出 BCD数据,1011001代表59秒 BCD数据00~59 BCD数据,00~23 BCD数据,01~3 BCD数据,01~31,二月为29 0~6 BCD数据,01~12 CLKOUT 倒计时单元 TE TD1 TD0

本电路采用89S51作主控MCU;PCF8563产生时钟信息;LCM1602液晶模块作显示。

Y1为32.768KHZ晶振,Y2为12MHZ晶振,BT1作为后备电源,保持时钟数据万年不丢失;RP1和RP2是9脚10K排阻;S1、S2、S3、S4用于调整时间。S2用于进入调整模式;并且每按一次改变调整项目;S1用于退出调整状态;S2,S4用于加1减1操作。

LCM1602的驱动程序如下,可移植。

#define LCM1602_DB0_DB7 P0 // 定义LCM1602的数据总线 sbit LCM1602_RS=P2^6; // 定义LCM1602的RS控制线 sbit LCM1602_RW=P2^5; // 定义LCM1602的RW控制线 sbit LCM1602_E=P2^4; // 定义LCM1602的E控制线 sbit LCM1602_Busy=P0^7; // 定义LCM1602的测忙线 unsigned char code PCF8563[] = {\void LCM1602_Delay(unsigned char count){ unsigned char i; while(--count != 0) {

for(i = 0; i < 125; i++); } }

void LCM1602_TestBusy(void){ do{

LCM1602_DB0_DB7 = 0xff; LCM1602_RS = 0; LCM1602_RW = 1; LCM1602_E = 0; LCM1602_Delay(2); LCM1602_E = 1; }

while(LCM1602_Busy); }

void LCM1602_WriteCMD(unsigned char LCM1602_command) { LCM1602_DB0_DB7 = LCM1602_command; LCM1602_RS = 0; LCM1602_RW = 0; LCM1602_E = 0;

LCM1602_TestBusy(); LCM1602_E = 1; }

void LCM1602_WriteData(unsigned char LCM1602_data){ LCM1602_DB0_DB7 = LCM1602_data; LCM1602_RS = 1; LCM1602_RW = 0; LCM1602_E = 0;

LCM1602_TestBusy(); LCM1602_E = 1; }

void LCM1602_Init(void){

LCM1602_WriteCMD(0x01);// 显示清屏

LCM1602_WriteCMD(0x38);// 显示模式设置:显示2行,每个字符为5*7个像素 LCM1602_WriteCMD(0x06);// 显示光标移动设置:文字不动,光标右移

LCM1602_WriteCMD(0x0c); // 显示开及光标设置:显示开,光标关,闪烁关 }

void print(unsigned char a,unsigned char *str){ LCM1602_WriteCMD(a); while(*str != '\\0'){ LCM1602_WriteData(*str++); } *str = 0; }

void print1(unsigned char a,unsigned char t){ LCM1602_WriteCMD(a); LCM1602_WriteData(t); }

源程序见附件。有兴趣的朋友,可仿制,源程序经调试,运行正常,效果图如下:

本文来源:https://www.bwwdw.com/article/8aat.html

Top