求用PCF8563做个实时时钟的C源程序和电路图!? Word 文档

合集下载

PCF8563时钟实验

PCF8563时钟实验

;*******************************************************; PCF8563时钟实验说明;实验目的: 1.掌握时钟芯片的使用; 2.掌握使用液晶显示器显示时间;实验内容: 1.读写PCF8563中的时间数据; 2.将时间显示在12864M液晶显示器上;连线说明:;PCF8563: E4区:SDA-->A3区:P1.0,数据线; E4区:SCL-->A3区:P1.1,时钟;液晶12864M: A1区:E-->A3区:CS1(0F000H),片选; A1区:RW-->A3区:A0,读/写控制端; A1区:RS-->A3区:A1,数据/指令控制端; A1区:PSB-->C1区:VCC,并行接口;*******************************************************NAME MAIN ;演示主程序EXTRN DATA(TIME)EXTRNCODE(PCF8563_INIT,Write,Read,Read_Sequence,Time_Write,Time_Read,Alarm_Read,Al arm_Stop,Sec_Read)EXTRN CODE(KeyRead)EXTRN CODE(LCD_INIT, Disp_LineR, Close_Cursor, Set_Cursor)MAIN_CODE SEGMENT CODEMAIN_DATA SEGMENT DATASTACK SEGMENT IDATAMAIN_BIT SEGMENT BITRSEG MAIN_BITbKEY: DBIT 1 ;按键标志RSEG MAIN_DA TASEC: DS 1 ;保存秒数据,用于检测秒变化buffer: DS 17 ;液晶使用的缓冲区KpTime: DS 7 ;保存当前时间nSetTime: DS 1RSEG STACKDS 20H ;32 Bytes StackCSEG AT 0000H ;定位0LJMP STARTCSEG AT 0003H ;定位1,按键中断LJMP KEYINT0;按键中断处理KEYINT0: SETB bKEY ;KEY=1表示有键按下RETIRSEG MAIN_CODE ;开始程序段START: MOV SP,#STACK-1CLR b KEY ;清按键标志LCALL MainINIT ;主程序初始化MAIN: JNB bKEY,MAIN_1 ;KEY=1,有键按下LCALL KeyScan ;键扫描CJNE A,#3,MAIN_1LCALL TimeSet ;进入时间设置MAIN_1: LCALL Sec_Change ;检测秒变化,给出判断标志位CY,1-有变化JNC MAINLCALL Time_Read ;读取时间MOV SEC,TIME ;保存秒数据,用于检测秒变化LCALL Time_Display ;显示时间JMP MAIN ;循环进行实验内容介绍与PCF8563测试;主程序初始化MainINIT: LCALL LCD_INIT ;初始化液晶显示LCALL PCF8563_INIT ;PCF8563初始化LCALL Time_Read ;读取时间,读取的时间数据存放在TIME中MOV SEC,TIME ;保存秒数据,用于检测秒变化LCALL Time_Display ;显示时间SETB IT0 ;跳沿触发SETB EX0 ;开中断0SETB EA ;开按键中断RETTime_Display: C ALL DispTime1CALL DispTime2RET;********************************;时间显示;********************************;检测秒变化,给出判断标志F0,1-秒有变化;0-秒无变化Sec_Change: LCALL Sec_Read ;读取秒CJNE A,SEC,Sec_Change_1 ;与前一次读取的秒比较,判断秒是否有变化CLR CRETSec_Change_1: SETB CRET;********************************;时间显示子程序;********************************BcdToAscii: PUSH ACCSWAP AANL A,#0FHORL A,#30HMOV @R0,AINC R0POP ACCANL A,#0FHORL A,#30HMOV @R0,AINC R0RET;显示时间第一行;时间显示,时间数据在TIME缓冲区中DispTime1: MOV R0,#buffer ;写入时间缓存区MOV A,TIME+6LCALL BcdToAsciiMOV A,#0C4H ;年C4EAMOV @R0,AINC R0MOV A,#0EAHMOV @R0,AINC R0MOV A,TIME+5LCALL BcdToAscii ;BCD转ASCIIMOV A,#0D4H ;月D4C2MOV @R0,AINC R0MOV A,#0C2HMOV @R0,AINC R0MOV A,TIME+3LCALL BcdToAsciiMOV A,#0C8H ;日C8D5MOV @R0,AINC R0MOV A,#0D5HMOV @R0,AINC R0MOV A,#' ' ;星期MOV @R0,AINC R0MOV A,TIME+4DEC ARL ARL AMOV DPTR,#DAYCHA ;星期转换ADD A,DPLMOV DPL,AJNC DispTime11INC DPHDispTime11: CLR AMOVC A,@A+DPTRMOV @R0,AINC R0INC DPTRJNZ DispTime11MOV A,#88HMOV R0,#bufferCALL Disp_LineRRETDAYCHA: DB 'MON',00H,'TUE',00H,'WED',00H DB 'THU',00H,'FRI',00H,'SAT',00HDB 'SUN',00H;显示时间第二行;时间显示,时间数据在TIME缓冲区中DispTime2: MOV R0,#bufferMOV A,TIME+2 ;小时LCALL BcdToAsciiMOV A,#':' ;显示“:”MOV @R0,AINC R0MOV A,TIME+1 ;分LCALL BcdToAsciiMOV A,#':'MOV @R0,AINC R0MOV A,TIME ;秒LCALL BcdToAsciiCLR AMOV @R0,AMOV A,#92HMOV R0,#bufferCALL Disp_LineRRET;按键处理;读取键值,0-时间+1,1-时间-1,2-改变设置;16键盘:以左上角按键键值为1,从左→右,从上→下,键值增加,右下角按键键值为0FH KeyScan: CLR b KEY ;清按键标志LCALL KeyRead ;读取键值INC ACJNE A,#4,$+3 ;判断输入键值是否超过3JNC KeyScan_2 ;超过3则视为无效输入RETKeyScan_2: CLR A;A=0,说明按键无效RET;设置时间时,设置光标位置tSet_Cursor: MOV DPTR,#wSetTimeCursorMOV A,nSetTimeMOVC A,@A+DPTRCALL Set_CursorRETwSetTimeCursor: DB 92H,93H,95H,88H,8AH,8CH,8FH ;根据nSetTime设置光标位置TimeSet: MOV nSetTime,#0 ;设置时间位置标志,用于光标定位在所要调整的时间下LCALL KpTimeFun ;保存当前时间到时间暂存区KEY1_0: LCALL tSet_Cursor ;设置光标到当前所调整时间下KEY1_1: JNB bKEY,KEY1_1LCALL KeyScan ;按键扫描JZ KEY1_1DEC AMOV DPTR,#TimeSet_TMOV B,ARL AADD A,BJMP @A+DPTRTimeSet_T: LJMP TimeInc ;1号键,时间+1LJMP TimeDec ;2号键,时间-1LJMP TimeCursor ;按下3号键,更改光标位置;保存当前时间KpTimeFun: MOV R7,#7 ;读出当前时间,写入调整暂存区,共有7个时间数据MOV R0,#TIME ;从秒开始读取MOV R1,#KpTime ;拷入时间调整暂存区KpTimeFun1: MOV A,@R0MOV @R1,AINC R0INC R1DJNZ R7,KpTimeFun1RET;时间调整后,比较是否修改了分秒,没有修改则保持原有时间不变CmpTime: MOV R7,#7MOV R0,#TIMEMOV R1,#KpTimeCmpTime1: MOV A,@R0XRL A,@R1JNZ CmpTime2INC R0INC R1DJNZ R7,CmpTime1CLR C;时间调整无改动,C=0RETCmpTime2: SETB C ;时间调整有改动,C=1RETTimeCursor: INC nSetTime ;+1时间设置标志,指向下一个欲调整时间MOV A,nSetTimeCJNE A,#07H,TimeCursor1CALL Close_Cursor ;关光标LCALL CmpTime ;比较看是否有变化JNC TimeCursor2 ;C为判断位,1为有变动,0为无变动LCALL Time_Write ;写入修改后的时间TimeCursor2: RETTimeCursor1: CALL tSet_Cursor ;调用将光标移至所设时间下SJMP KEY1_0;时间加1子程序TimeInc: MOV B,#1 ;B中存放加数KEY1_2_1: MOV DPTR,#K1_2T ;2号键处理程序MOV A,nSetTime ;根据时间设置标志,跳到相应处理子程序RL AJMP @A+DPTR;减1子程序TimeDec: M OV B,#99H ;B中存放减数AJMP KEY1_2_1K1_2T: AJMP K1_24 ;nSetTime=4,跳到小时±1程序AJMP K1_25 ;nSetTime=5,跳到分钟±1程序AJMP K1_26 ;nSetTime=6,跳到秒±1程序AJMP K1_21 ;nSetTime=0,跳到年±1程序AJMP K1_22 ;nSetTime=1,跳到月±1程序AJMP K1_23 ;nSetTime=2,跳到日±1程序AJMP K1_20 ;nSetTime=3,跳到加星期±1程序K1_21: MOV A,B ;年±1ADD A,TIME+6DA AMOV TIME+6,ACALL DispTime1LJMP KEY1_0K1_22: MOV A,B ;月±1ADD A,TIME+5DA AJZ K1_22_2CJNE A,#13H,$+3JC K1_22_1MOV A,#1K1_22_1: MOV TIME+5,ACALL DispTime1LJMP KEY1_0K1_22_2: MOV A,#12HSJMP K1_22_1K1_23: MOV A,B ;日±1ADD A,TIME+3DA AJZ K1_232CJNE A,#32H,$+3JC K1_231MOV A,#1K1_231: MOV TIME+3,ACALL DispTime1LJMP KEY1_0K1_232: MOV A,#31HSJMP K1_231K1_20: MOV A,BADD A,TIME+4 ;星期±1DA AJZ K1_202CJNE A,#8H,K1_201 ;判断是否为周六,是就改为周日MOV A,#01HK1_201: MOV TIME+4,ACALL DispTime1LJMP KEY1_0K1_202: MOV A,#7SJMP K1_201K1_24: MOV A,B ;小时±1ADD A,TIME+2DA ACJNE A,#99H,K1_242MOV A,#23HSJMP K1_241K1_242: CJNE A,#24H,$+3JC K1_241CLR AK1_241: MOV TIME+2,ACALL DispTime2LJMP KEY1_0K1_25: MOV A,B ;分钟±1ADD A,TIME+1DA ACJNE A,#99H,K1_252MOV A,#59HSJMP K1_251K1_252: CJNE A,#60H,$+3JC K1_251CLR AK1_251: MOV TIME+1,ACALL DispTime2LJMP KEY1_0K1_26: MOV A,B ;秒±1ADD A,TIMEDA ACJNE A,#99H,K1_262MOV A,#59HSJMP K1_261K1_262: CJNE A,#60H,K1_261JC $+3CLR AK1_261: MOV TIME,ACALL DispTime2LJMP KEY1_0END;*******************************************************; PCF8563时钟芯片;PCF8563: 1.实时时钟芯片,可计时时间1900-2099年; 2.数据传输采用IIC总线,固定片选地址; 3.闹铃中断,可编程频率输出;*******************************************************NAME PCF8563PUBLIC TIME,Sec_ReadPUBLICPCF8563_INIT,Write,Read,Read_Sequence,Time_INIT,Time_Write,Time_Read,Alarm_Rea d,Alarm_StopSDA BIT P1.0 ;数据传输口SCL BIT P1.1 ;时钟INT BIT P3.2 ;闹钟/定时中断输出PCF8563_DATA SEGMENT DATARSEG PCF8563_DATATime: DS 7 ;数据缓冲区;内部寄存器地址CS1 EQU 00H ;控制/状态寄存器1CS2 EQU 01H ;控制/状态寄存器2Second EQU 02H ;秒寄存器Minute EQU 03H ;分寄存器Hour EQU 04H ;时寄存器Day EQU 05H ;天寄存器Weekday EQU 06H ;周寄存器Mouth EQU 07H ;月寄存器Year EQU 08H ;年寄存器MinuteA EQU 09H ;分闹铃寄存器HourA EQU 0AH ;时闹铃寄存器DayA EQU 0BH ;天闹铃寄存器WeekdayA EQU 0CH ;周闹铃寄存器CO EQU 0DH ;时钟输出控制寄存器TimerCtrl E QU 0EH ;定时控制寄存器Timer EQU 0FH ;定时设置寄存器;PCF8563的片选地址:001HPCF8563_WRITE EQU 0A2H ;写指令。

PCF8563芯片时序程序

PCF8563芯片时序程序

PCF8563芯片时序程序实时时钟,日历芯片 PCF8563 的驱动方实时时钟,日历芯片 PCF8563 的驱动方法PCF8563是低功耗的CMOS 实时时钟,日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C 总线接口串行传递。

最大总线速度为 400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动产生增量。

它在实际的开发中有着广泛的应用,如移动电话、便携仪器、传真机、电池电源产品等。

其特性如下:1、低工作电流:典型值为0.25μA(VDD=3.0V,Tamb=25?时)。

2、世纪标志3、大工作电压范围:1.0,5.54、低休眠电流;典型值为0.25μA(VDD=3.0V,Tamb=25?)5、 400KHz 的I2C 总线接口(VDD=1.8,5.5V 时)。

6、可编程时钟输出频率为:32.768KHz,1024Hz,32Hz,1Hz。

7、报警和定时器。

8、掉电检测器。

9、内部集成的振荡器电容。

10、片内电源复位功能。

11、I2C 总线从地址:读,0A3H;写,0A2H。

12、开漏中断引脚。

PCF8563的引脚配置图:引脚功能详述如下:名称引脚编号功能描述OSCI 1 振荡器输入OSCO 2 振荡器输出/INT 3 中断输出(开漏;低电平有效)VSS 4 地SDA 5 串行数据I/OSCL 6 串行时钟输入CLKOUT 7 时钟输出 (开漏)VDD 8 正电源PCF8563的功能框图:功能描述:PCF8563有16 个,位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC 提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。

所有16 个寄存器设计成可寻址的8 位并行寄存器,但不是所有位都有用。

前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H,08H 用于时钟计数器(秒~年计数器),地址09H,0CH 用于报警寄存器(定义报警条件),地址0DH 控制CLKOUT 管脚的输出频率,地址0EH 和0FH 分别用于定时器控制寄存器和定时器寄存器。

实时时钟,日历芯片-BM8563,兼容PCF8563,参考源代码

实时时钟,日历芯片-BM8563,兼容PCF8563,参考源代码

_nop_(); _nop_(); }
/******************************************************************** 函 数 名:Stop_I2C(void) 功 能:停止 I2C 总线的传输 说 明: 调 用: 入口参数:无 返 回 值:无 ***********************************************************************/ void Stop_I2C(void) { SCL=0; _nop_(); SCL=1; SomeNOP(); SDA=1; SomeNOP(); }
/******************************************************************** 函 数 名: GetBM8563(void) 功 能:从 BM8563 的内部寄存器(时间、状态、报警等寄存器)读取数据 说 明:该程序函数用来读取 BM8563 的内部寄存器,譬如时间,报警,状态等寄存器 采用页写的方式,设置数据的个数为 no,no 参数设置为 1 就是单字节方式 调 用:Start_I2C(),SendByte(),RcvByte(),Ack_I2C(),Stop_I2C() 入口参数:sla(BM8563 从地址) , suba(BM8563 内部寄存器地址) *s(设置读取数据存储的指针) , no(传输数据的个数) 返 回 值:有,返回布尔量(bit)用来鉴定传输成功否 ***********************************************************************/ bit GetBM8563(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; Start_I2C(); SendByte(sla); if(ack==0)return(0); SendByte(suba); if(ack==0)return(0); Start_I2C(); SendByte(sla+1); if(ack==0)return(0); for (i=0;i<no-1;i++) { *s=RcvByte(); Ack_I2C(0); s++; } *s=RcvByte(); Ack_I2C(1); Stop_I2C();//除最后一个字节外,其他都要从 MASTER 发应答。 return(1); }

基于PCF8563时钟芯片的电子时钟概要设计报告

基于PCF8563时钟芯片的电子时钟概要设计报告

基于PCF8563时钟芯片的电子时钟概要设计报告一、引言1、编写目的为了能更好地进行后面的详细设计,为整个电子时钟的设计做好必要的先决条件。

2、编写背景任务提出者:本次实习管理老师开发者:本人3、参考资料Keil软件学习资料;PCF8563时钟芯片PDF中文资料;SST89V516RD2单片机PDF资料;SHT11温湿度采集传感器PDF资料;育松点在QC12864B使用说明;百度百科;二、设计概述1、电子时钟设计元器件清单2、时钟显示界面T:表示温度,r:表示空气湿度3、总体设计流程图:三、总体设计此电子时钟ST89V516RD2、PCF8563时钟芯片和SHT11温湿度传感器共同设计完成。

3.1、设计与运行环境电子时钟及温湿度显示的程序设计和调试均在Keil uVision2环境下完成的,设计并完成的程序下载至STC89C52单片机后,即可初始化时钟芯片PCF8563从而开始计时,系统开始正常运行。

3.2、硬件功能描述电子时钟能够完成年、月、日及24小时制计时,计时初始化为2011年07月10日00:00:00,用户可以通过按键调整时钟的初值实现校时功能,初次之外,还可以实时显示空气的温度和湿度。

三、电子时钟及温湿度显示软件和硬件设计3.1、硬件电路设计电子时钟及温湿度显示的电路主要有按键模块、显示模块、复位模块、时钟芯片模块、主控芯片SST89V516RD2及温湿度传感器模块。

3.1.1独立按键模块系统有四个独立按键,独立按键K1、K2、K3和K4分别接到P4、P3、P2 和P1。

3.1.2 显示模块本系统显示模块由12864液晶显示屏来显示,液晶显示与单片机连接共同完成显示。

3.1.3复位模块复位电路主要的功能是整个系统初始化,在每次上电系统自动初始化,如果在程序运行的过程中程序没有响应或者需要进行一次初始化,这是可以通过按复位开关来实现需要的有效操作。

3.1.4、时钟芯片模块PCF8563时钟芯片是本系统实现高精度计时的关键,利用PCF8563时钟芯片独立于单片机计时,在提高计时进度的同时也提高整个系统的抗干扰能力。

I2C实践(二)-PCF8563T实时时钟

I2C实践(二)-PCF8563T实时时钟

实验五、I2C实践(二)-PCF8563T实时时钟实验目的:在这一课里,我们继续复习I2C驱动的编写,并通过FPGA/CPLD来驱动PCF8563T实时时钟,读出时间信息。

实验原理:(1)PCF8563T实时时钟简介PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接口功能的具有极低功耗的多功能时钟/日历芯片PCF8563 的多种报警功能、定时器功能、时钟输出功能、以及中断输出功能能完成各种复杂的定时服务甚至可为单片机提供看门狗功能;内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V) 以及两线制I2C总线通讯方式不但使外围电路极其简洁而且也增加了芯片的可靠性。

同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。

当然作为时钟芯片PCF8563 亦解决了2000 年问题因而PCF8563 是一款性价比极高的时钟芯片它已被广泛用于电表、水表、气表、电话传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

特性●宽电压范围1.0-5.5V 复位电压标准值Vlow=0.9V●超低功耗典型值为0.25 A VDD=3.0V,Tamb=25●可编程时钟输出频率为32.768KHz 1024Hz 32Hz 1Hz●四种报警功能和定时器功能●内含复位电路振荡器电容和掉电检测电路●开漏中断输出●400kHz I2C 总线(VDD=1.8 5.5V) 其从地址读0A3H;写0A2H(2)PCF8563T实时时钟管脚与硬件接口PCF8563 的管脚排列及描述如图及表所示PCF8563与FPGA的接口电路如图所示,由于SDA,SCL与INT,CLKOUT为开漏输出,必须加上拉电阻,由于主要掌握器件配置的原理,所以未安装电池,直接采用核心板3.3V供电。

(3)PCF8563T实时时钟寄存器PCF8563 有16 个8位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz 的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC 提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C总线接口。

PCF8563日历时钟芯片原理及应用设计

PCF8563日历时钟芯片原理及应用设计

PCF8563日历时钟芯片原理及应用设计PCF8563是一款实时时钟芯片,用于保存日期、时间和闹钟功能,并在需要时提供准确的时间。

它集成有时钟芯片、电历寄存器和电压降器,可以通过I2C总线进行控制和通信。

下面将详细介绍PCF8563的原理以及应用设计。

一、PCF8563的工作原理二、PCF8563的应用设计1.实时时钟系统:PCF8563广泛应用于各种实时时钟系统,例如电子钟、温度计、保险柜等。

它可以提供准确的时间,并可以进行一定的时钟校准,以确保时间的准确性。

2.日历显示:PCF8563可以与液晶显示器或LED显示器等进行连接,实现日期和时间的显示。

通过读取芯片中的日期和时间寄存器,可以将日期和时间信息显示在屏幕上。

3.闹钟功能:PCF8563内置有闹钟功能,可以设置闹钟时间和日期,并在闹钟触发时发出中断信号。

通过与外部蜂鸣器或报警器等连接,可以实现闹铃功能。

4.计时器功能:PCF8563可以用作计时器,例如测量一些过程的时间。

通过读取和记录时钟寄存器中的时间值,可以实现计时功能,并根据需要进行时钟校准。

5.电池电量监测:PCF8563可以监测电池电量,并在电池电量低于一定阈值时发出警告信号。

这对于需要长时间运行的系统非常有用,可以在电池电量低时及时更换电池。

三、总结PCF8563是一款功能强大的实时时钟芯片,可以提供准确的日期和时间,并具有闹钟和计时功能等。

它可以与各种外部设备进行通信,实现多种应用设计。

无论是日历显示系统还是闹钟功能系统,PCF8563都能够提供稳定和准确的时间支持。

PCF8563在电子时钟设计中的应用

PCF8563在电子时钟设计中的应用

PCF8563在电子时钟设计中的应用时间:2009-07-31 11:36:30 来源:国外电子元器件作者:王瑜西安航空技术高等专科学校引言数字时钟已成为时钟设计的主导方向,广泛应用于实时控制系统。

数字时钟实质是一个对标准频率计数的计数电路,通常由晶体振荡电路、分频电路、时间计数电路、译码驱动电路等组成。

这里提出一种电子时钟系统设计方案,是以AT89S52单片机作为控制核心,采用PCF8563时钟/日历器件以及HS12864液晶显示器,通过硬件设计及软件编程实现的。

2 PCF8563简介图1为PCF8563内部结构。

PCF8563内部包括16个8位寄存器,可自动增量的地址寄存器,内置32.768Hz的振荡器(带有一个内部集成的电容),分频器(用于给实时时钟RTC 提供源时钟),可编程时钟输出,定时器,报警器,掉电检测器和400 kHz的I2C总线接口。

所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。

前2个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,其中内存地址02H~08H用于时钟计数器(秒~年计数器),地址09H~0CH用于报警寄存器(定义报警条件),地址ODH 控制CLKOUT引脚的输出频率,地址OEH和OFH分别用于定时器控制寄存器和定时器寄存器。

秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以BCD格式编码。

3 系统硬件设计硬件电路设计包括PCF8563时钟,日历器件与AT89S52单片机的接口电路、HS12864液晶显示电路以及键盘电路3个部分。

AT89S52是一种低功耗、高性能CMOS 8位微控制器,具有8 KB在系统可编程Flash存储器;使用高密度非易失存储器技术制造,与T业80C51产品指令和引脚完全兼容:片上Flash允许程序存储器在系统可编程,亦适用于常规编程器。

具有灵巧的8位CPU和在系统可编程Flash,使其为众多嵌入式控制应用系统提供高灵活、超高效的解决方案。

时钟芯片PCF8563可用程序

时钟芯片PCF8563可用程序
DB 10100100B ;5
DB 00100100B ;6
DB 11101010B ;7
DB 00100000B ;8
DB 10100000B ;9
DB 01100000B ;A
DB 00100101B ;b
DB 00111100B ;C
DB 00100011B ;d
;******拆分子程序 结束***********
;******显示子程序***********
DISPLAY:
MOV DPTR,#TAB
MOV A,LED0
MOVC A,@A+DPTR
setb p2.7
ACALL SHIFT
MOV A,LED1
MOVC A,@A+DPTR
setb p2.4
ACALL SHIFT1
;MOV A,#0FFH
;ACALL SHIFT2
MOV A,LED2
MOVC A,@A+DPTR
setb p2.5
ACALL SHIFT2
MOV A,LED3
MOVC A,@A+DPTR
setb p2.6
ACALL SHIFT3
;SDA BIT P0.2 ;164的数据线
LED0 EQU 40H ;保存秒个位数据
LED1 EQU 41H ;保存秒十位数据
LED2 EQU 42H ;保存分个位数据
LED3 EQU 43H ;保存分十位数据
LED4 EQU 44H ;保存时个位数据
;*********延时子程序********
DELAY:
MOV R1,#03FH

PCF8563的C51程序设计

PCF8563的C51程序设计

P C F8563的C51程序设计-CAL-FENGHAI.-(YICAI)-Company One1PCF8563的C51程序设计作者:来源于:发布时间:2007-3-30 21:45:00PCF8563是一款低功耗的CMOS实时时钟/日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递。

最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动增加。

特性低工作电流:典型值为μA(VDD=,Tamb=25 ℃时);世纪标志;大工作电压范围:~;低休眠电流;典型值为μA (VDD= Tamb=25 ℃);400KHz 的I2C总线接口(VDD=~时);可编程时钟输出频率为:,1024Hz,32Hz,1Hz;报警和定时器;掉电检测器;内部集成的振荡器电容;片内电源复位功能;I2C 总线从地址:读:0A3H;写:0A2H;开漏中断引脚。

应用移动电话;便携仪器;传真机;电池供电产品。

/**————————————————————〖说明〗I2C总线驱动程序(用两个普通IO模拟I2C总线)包括100Khz(T=10us)的标准模式(慢速模式)选择,和400Khz(T=的快速模式选择,默认的晶振。

—————————————————————*/#ifndef SDA#define SDA P0_0#define SCL P0_1#endifextern uchar SystemError;#define uchar unsigned char#define uint unsigned int#define Byte unsigned char#define Word unsigned int#define bool bit#define true 1#define false 0#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();/**------------------------------------------------------------------调用方式:void I2CStart(void) 函数说明:私有函数,I2C专用---------------------------------------------------------------------*/void I2CStart(void){EA=0;SDA=1; SCL=1; SomeNOP();//INISDA=0; SomeNOP(); //STARTSCL=0;}/*-------------------------------------------------------------------------------- 调用方式:void I2CStop(void) ﹫2001/07/0 4函数说明:私有函数,I2C专用---------------------------------------------------------------------------------*/ void I2CStop(void){SCL=0; SDA=0; SomeNOP(); //INISCL=1; SomeNOP(); SDA=1; //STOPEA=1;}/*-------------------------------------------------------------------------------- 调用方式:bit I2CAck(void) ﹫2001/07/0 4函数说明:私有函数,I2C专用,等待从器件接收方的应答---------------------------------------------------------------------------------*/ bool WaitAck(void){uchar errtime=255;//因故障接收方无ACK,超时值为255。

PCF8563 日历时钟芯片原理及应用设计

PCF8563 日历时钟芯片原理及应用设计

地址 寄存器名称 Bit7 Bit6
02h 秒
VL
03h 分钟
04h 小时
05h 日
06h 星期
07h 月/世纪
C
08h 年
09h 分钟报警
AE
0Ah 小时报警
AE
0BH 日报警
AE
0CH 星期报警
AE
注:标明
的位无效
Bit5 Bit4 Bit3
Bit2 Bit1 Bit0
00 59BCD 码格式数
0
1
0
00
九月
0
1
0
01
十月
1
0
0
00
十一月 1
0
0
01
十二月 1
0
0
10
表 16 年寄存器位描述 地址 08H
Bit
符号


70
<年> 代表 BCD 格式的当前年数值 值为 00 99
-5-
广州周立功单片机发展有限公司 Tel (020)38730976 38730977 Fax 38730925
6,4,2,1,0 0
缺省值置逻辑 0
2 控制/状态寄存器
表 5 控制/状态寄存器 位描述 地址 01H
Bit
符号
描述
7,6,5
0
缺省值置逻辑 0
TI/TP=0:当 TF 有效时 INT 有效 (取决于 TIE 的状态) TI/TP=1:INT
4
TI/TP 脉冲有效,参见表 6 (取决于 TIE 的状态) 注意 若 AF 和 AIE 都
wwwzlgmcucom报警功能模式一个或多个报警寄存器msbaealarmenable报警使能位相应的报警条件有效这样一个报警将在每分钟至每星期范围内产生一次设置报警标志位af控制状态寄存器用于产生中断af只可以用软件清除定时器位的倒计数器地址0fh由定时器控制寄存器地址0eh参见表23控制定时器控制寄存器用于设定定时器的频率409664或160hz以及设定定时器有效或无效定时器从软件设置的位二进制数倒计数每次倒计数结束定时器设置标志位tf参见表5定时器标志位tf只可以用软件清除tf用于产生一个中断int每个倒计数周期产生一个脉冲作为中断信号titp参见表控制中断产生的条件当读定时器时返回当前倒计数的数值clkout输出管脚clkout可以输出可编程的方波clkout频率寄存器地址0dh参见表21决定方波的频率clkout可以输出32768khz缺省值1024321hz的方波clkout为开漏输出管脚时输出有效无效时输出为高阻抗复位pcf8563包含一个片内复位电路当振荡器停止工作时复位电路开始工作在复位状态下线初始化寄存器tfvltd1td0testcae被置逻辑其它的寄存器和地址指针被清掉电检测器和时钟监控pcf8563内嵌掉电检测器如图2所示dd低于vlvoltagelow秒寄存器的位7用于指明可能产生不准确的时钟日历信息vl标志位只可以用软件清除dd慢速降低如以电池供电达到vlow标志位vl被设置这时可能会产生中断pcf8563内部寄存器pcf8563共有16个寄存器其中00h01h为控制方式寄存器09h0ch为报警功能寄存器0dh为时钟输出寄存器0eh和0fh为定时器功能寄存器02h08h年时间寄存器各寄存器的位描述如表2及314所示二进制格式寄存器概况地址寄存器名称bit7bit6bit5bit4bit3bit2bit1bit000h控制状态寄存器1test101h控制状态寄存器2titpaftfaietie0dhclkout输出寄存器fefd1fd00eh定时器控制寄存器tetd1td00fh定时器倒计数数值寄存器定时器倒计数数值二进制广州周立功单片机发展有限公司tel0203873097638730977fax38730925http

PCF8563做时钟的C程序

PCF8563做时钟的C程序

用PCF8563做实时时钟的C源程序#include<reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit pcf8563_scl=P0^4;sbit pcf8563_sda=P0^3;ucharnum[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0 x37,0x38,0x39}; //数字表sbit clk=P2^0;sbit dio=P2^1;sbit cfd=P2^2; //充放电开关,sbit en=P2^3;sbit rw=P2^4;sbit rs=P2^5;sbit deng=P2^6; //测试灯sbit adcs=P2^7;bit busy=0;uchar sg;uchar sd;uchar fg;uchar fd;uchar mg;uchar md;uchar hou=0;uchar min=0;uchar sec=0;uchar subadd;uchar dat;uchar number;void start_pcf8563();void send_pcf8563_byte();void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void display0(void);void display1(void);void stop_pcf8563();void receive_pcf8563_byte();void spit_time();void LcdIni()//初始化LCD{WrOp(0x01);WrOp(0x38);WrOp(0x0c);WrOp(0x06);} void WrOp(uchar dat)//写LCD显示地址{P1 =dat;rs=0;rw=0;en=0;ChkBusy();en=1;}void WrDat(uchar dat)//写LCD显示数据{P1=dat;rs=1;rw=0;en=0;ChkBusy();en=1;}void ChkBusy() //检查LCD是否忙{P1=0xff;rs=0;rw=1;en=0;_nop_();en=1;while(P1&0x80);}void display0() //显示必要的背景{WrOp(0x80);WrDat('T');WrOp(0x81);WrDat(':');WrOp(0x84);WrDat(':');WrOp(0x87);WrDat(':');}void spit_time(){sg=(int)hou/10;sd=(int)hou%10;fg=(int)min/10;fd=(int)min%10;mg=(int)sec/10;md=(int)sec%10;}void display1()//显示时间六位{uchar temp6;uchar temp5;uchar temp4;uchar teMP3;uchar temp2;uchar temp1;WrOp(0x82);temp6=num[sg];WrDat(temp6);WrOp(0x83);temp5=num[sd];WrDat(temp5);WrOp(0x85);temp4=num[fg];WrDat(temp4);WrOp(0x86);teMP3=num[fd];WrDat(teMP3);WrOp(0x88);temp2=num[mg];WrDat(temp2);WrOp(0x89);temp1=num[md];WrDat(temp1);}void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节{uchar aa;pcf8563_scl=0;for(aa=0;aa<8;aa++){if((bb&0x80)==0x80){pcf8563_sda=1;}else{pcf8563_sda=0;}pcf8563_scl=1;pcf8563_scl=0;bb=bb<<1;}_nop_();_nop_();pcf8563_sda=1;pcf8563_scl=1;busy=0;if(pcf8563_sda){busy=1;}else{_nop_();_nop_();pcf8563_scl=0;busy=0;}}void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(subadd);if(!busy){Send_pcf8563_byte(dat);}}stop_pcf8563();}void read_pcf8563() //读当时的时,分,钞{start_pcf8563();Send_pcf8563_byte(0xa2);if(!busy){Send_pcf8563_byte(0x02);if(!busy){start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();sec=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();min=number&0x7f;start_pcf8563();Send_pcf8563_byte(0xa3);receive_pcf8563_byte();hou=number&0x3f;}}stop_pcf8563();}void receive_pcf8563_byte() //从PCF8563接受一个字节{uchar CC;pcf8563_sda=1;number=0;for(CC=0;cc<8;cc++){number<<=1;pcf8563_scl=0;pcf8563_scl=1;_nop_();_nop_();number= number|pcf8563_sda;}pcf8563_scl=0;_nop_();_nop_();}void start_pcf8563() //开启PCF8563IIC {pcf8563_sda=1;pcf8563_scl=1;pcf8563_sda=0;//SCL为低,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void stop_pcf8563() //关闭PCF8563IIC {pcf8563_sda=0;pcf8563_scl=1;pcf8563_sda=1;//SCL为高,SDA执行一个上跳pcf8563_scl=0;//SCL为低,嵌住数据线}void main(void){LcdIni(); //初始化屏display0(); //显示必要的背影write_pcf8563(0x02,sec); //写钞write_pcf8563(0x03,min); //写分write_pcf8563(0x04,hou); //写时while(1){read_pcf8563();//读当前时间spit_time(); //切害时间,为显示做准备display1(); //显示当前时间}}。

PCF8563 实时时钟日历芯片详细资料(中文版——权威)

PCF8563 实时时钟日历芯片详细资料(中文版——权威)
所有16个寄存器被设计成可寻址的8位并行寄存器,虽然不是所有的位都有效。前两个寄存器(内存地址00H和01H),用于控制与/或状态寄存器。内存地址02H至08H是时钟功能的计数器,用于(秒、分、时、日、月、年计数器)。内存地址09H至0CH包含定义报警的条件的报警寄存器。内存地址0DH控制CLKOUT的输出频率。0EH和0FH分别是定时控制器和定时器。
位VL用于检测在电池供电情况下,VDD慢慢降低到Vlow的情况。在VDD低于Vlow之前应该把VDD从新拉高。这种情况下,时间可能被损坏。
8.6 寄存器结构
表4 寄存器概述
位标记‘–’无效;‘0’标记的,应始终与写入逻辑0。
表5BCD编码格式寄存器概述
位标记‘–’无效;[1]不是BCD编码格式。
8.6.1Control/Status 1寄存器(内存地址00H)
4.设置时间寄存器(Seconds,Minutes,Hours,Days,Weekdays,Months/Century,Years)期望值;
5.向CLOCKOUT提供32个时钟脉冲;
6.读取时间寄存器,看第一次变化;
7.向CLOCKOUT提供64个时钟脉冲;
8.读取时间寄存器,看Second寄存器变化;
PCF8563的包括内部复位电路,振荡器停止时,复位电路激活。在复位状态下,I2C总线初始化,所有寄存器和地址指针被清零,VL、TD1、TD0、TESTC和AE被设置为逻辑1。
8.5低电压检测器和时钟监视器
PCF8563芯片的低电压探测器。当VDD低于Vlow,VL位(秒寄存器第7位)设置表明可靠的时钟/日历信息将不再保证。VL标志只能由软件清零。
2
TF
1
AIE
当AF或TF被置位,AIE和TIE有效或无效,产生中断。中断是两种情况的逻辑或,因此AIE和TIE都要置位。

9.2 第9章 PCF8563时钟程序

9.2 第9章 PCF8563时钟程序

;============================================================================;工程名称:时钟显示程序;建立日期:2005-12-21(建立);修改日期:2007-11-30(修改);作者:sujiande;===============================================================================;硬件连线说明:开发板(第二版);pcf8563数据线p0.7时钟线p0.6;74HC164数据线p0.2时钟线p0.3;================================================================================ sda_pcf8563bit p0.0;预定义时钟芯片pcf8563与AT89S51单片机硬件连线scl_pcf8563bit p0.1;sda_74HC164bit p0.2;预定义数码管显示74HC164与AT89S51单片机硬件连线scl_74HC164bit p0.3;led0equ40h;预定义数码管显示数据保存单元led1equ41hled2equ42hled3equ43hled4equ44hled5equ45hled6equ46hled7equ47hsecond equ48h;预定义年、月、日、时、分、秒、星期数据保存单元minute equ49hhour equ4ahday equ4bhmonth equ4chyear equ4dhweek equ4ehack bit30h;================================================================================== ;主程序开始;================================================================================== org0000hajmp mainorg0100hmain:call read_pcf8563;读时钟芯片的时钟数据call separate_1;时分秒数据拆分为十位与个位数据,以便于显示call display_1;调显示子程序call delay;调延时子程序ajmp main;主程序循环;================================================================================= ;主程序结束;=================================================================================;*********************************************************************************** ;读时钟芯片子程序;*********************************************************************************** read_pcf8563:call start;启动总线mov a,#0a2h;写操作器件地址call write_byte;写入器件地址mov a,#02h;选择单元地址call write_byte;写入单元地址call start;重新启动总线mov a,#0a3h;读操作器件地址call write_byte;写入器件地址call read_byte;读一个字节数据:秒数据anl a,#7fh;屏蔽无效位mov second,a;送秒单元保存call read_byte;读下一个字节数据:分数据anl a,#7fh;屏蔽无效位mov minute,a;送分单元保存call read_byte;读下一个字节数据:小时数据anl a,#3fh;屏蔽无效位mov hour,a;送小时单元保存call stop;结束总线ret;===============================;启动总线子程序开始;=============================== start:clr scl_pcf8563setb sda_pcf8563setb scl_pcf8563clr sda_pcf8563clr scl_pcf8563;钳住总线ret;===============================;启动总线子程序结束;===============================;===============================;关闭总线子程序开始;=============================== stop:clr sda_pcf8563setb scl_pcf8563setb sda_pcf8563clr scl_pcf8563ret;===============================;关闭总线子程序结束;===============================;===============================;写一个字节子程序开始;===============================write_byte:mov r7,#8clr scl_pcf8563lwr:rlc amov sda_pcf8563,csetb scl_pcf8563clr scl_pcf8563djnz r7,lwrsetb sda_pcf8563setb scl_pcf8563mov ack,sda_pcf8563clr scl_pcf8563ret;===============================;写一个字节子程序结束;===============================;===============================;读一个字节子程序开始;===============================read_byte:mov r7,#8setb sda_pcf8563clr scl_pcf8563lread:setb scl_pcf8563mov c,sda_pcf8563rlc aclr scl_pcf8563djnz r7,lreadclr sda_pcf8563setb scl_pcf8563clr scl_pcf8563ret;===============================;写一个字节子程序结束;===============================;*********************************************************************************** ;读时钟芯片子程序结束;***********************************************************************************;(时分秒数据拆分为十位与个位数据)拆分子程序开始;*********************************************************************************** separate_1:mov a,second;拆秒的个位anl a,#0fhmov led0,amov a,second;拆秒的十位anl a,#0f0hswap amov led1,amov a,minute;拆分的个位anl a,#0fhmov led3,amov a,minute;拆分的十位anl a,#0f0hswap amov led4,amov a,hour;拆小时的个位anl a,#0fhmov led6,amov a,hour;拆小时的十位anl a,#0f0hswap amov led7,aret;*********************************************************************************** ;(时分秒数据拆分为十位与个位数据)拆分子程序结束;***********************************************************************************;显示子程序开始;*********************************************************************************** DISPLAY_1:MOV DPTR,#TAB;设置显示代码数据首地址LP1:MOV A,LED0;要显示的数字放入A中MOVC A,@A+DPTR;查表,得到显示代码ACALL SHIFT;要显示代码数据,通过移位子程序送出MOV A,LED1MOVC A,@A+DPTRACALL SHIFTMOV A,LED2MOVC A,@A+DPTRACALL SHIFTMOV A,LED3MOVC A,@A+DPTRACALL SHIFTMOV A,LED4MOVC A,@A+DPTRACALL SHIFTMOV A,LED5MOVC A,@A+DPTRACALL SHIFTMOV A,LED6MOVC A,@A+DPTRACALL SHIFTMOV A,LED7MOVC A,@A+DPTRACALL SHIFTRET;-------------------------------------;显示代码数据;---------------------------------------TAB:DB11H,0D7H,32H,92H,0D4H,98H,DB18H,0D3H,10H,90H,50H,1CH,DB39H,16H,38H,78H,0FFH;=======================================;移位子程序开始;=======================================SHIFT:push aMOV R2,#8CLR CDL:CLR SCL_74hc164RLC AMOV SDA_74hc164,CSETB SCL_74hc164DJNZ R2,DLpop aRET;=======================================;移位子程序结束;=======================================;*********************************************************************************** ;显示子程序结束;*********************************************************************************** ;*********************************************************************************** ;延时子程序开始;*********************************************************************************** DELAY:MOV R7,#100LOOP7:MOV R6,#100LOOP6:mov r5,#100djnz r5,$DJNZ R6,LOOP6DJNZ R7,LOOP7RET;*********************************************************************************** ;显示子程序结束;*********************************************************************************** end。

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动详解1概述PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。

PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。

内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。

同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。

当然作为时钟芯片,PCF8563亦解决了2000年问题。

因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

2原理图3 8563源代码//******************************************************//define//*****************************************************#define PCF8563_ADDR0xa2// PCF8563设备地址#define PCF8563_ENABLE0x00// 设置#define PCF8563_SUBADDR0x02// 时间地址#define PCF8563_NUMB0x07// 时间个数#define PCF8563_LOOPTIME0x02// 循环次数#define PCF8563_SECMASK 0x7f// second#define PCF8563_MINMASK 0x7f// minute#define PCF8563_HRMASK 0x3f// hour#define PCF8563_DAYMASK 0x3f// day#define PCF8563_WKMASK 0x07// week#define PCF8563_MOMASK 0x1f// month#define PCF8563_YRMASK 0xff// year/*void DELAY_US(Uint16 i){Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<5;n++){_nop_();}}}*//******************************************************** ** 函数名称: void DELAY_MS(Uint16 i)** 功能描述: 延时函数** 输入:延时毫秒数** 输出:无********************************************************///延时函数单位msvoid DELAY_MS(Uint16 i){Uint16 m,n;for(m=0;m<i;m++){for(n=0;n<1000;n++){_nop_();}}}/******************************************************** ** 函数名称: InitCrt()** 功能描述: SD2405的初始化** 输入:无** 输出:无********************************************************/ void InitCrt(){//设备地址I2cDeviceAdd = PCF8563_ADDR;}/******************************************************** ** 函数名称: CrtGetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 读取时间** 说明:将从PCF8563中读取的时间放入Time指向的结构中** 输入:无** 输出:无********************************************************/ void CrtGetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;SM_Receive (PCF8563_SUBADDR , buf, PCF8563_NUMB);Time->time.ucSecond = buf[0];//秒Time->time.ucMinute = buf[1];//分Time->time.ucHour = buf[2];//时屏蔽最高位Time->date.ucDay = buf[3];//日Time->Week = buf[4];//星期Time->date.ucMonth = buf[5];//月Time->date.ucYear = buf[6];//年}/******************************************************** ** 函数名称: CrtSetDateTime(struct SYSTEM_TIME *Time)** 功能描述: 设置时间** 说明:将Time指向的结构中日期时间参数设置到sd24.5中** 输入:无** 输出:无********************************************************/ void CrtSetDateTime(struct SYSTEM_TIME *Time){Uint8 buf[8];//设备地址I2cDeviceAdd = PCF8563_ADDR;//写入设置(时钟工作、关闭复位、关闭测试模式)buf[0] = PCF8563_ENABLE;SM_Send (0, buf, 0);//写入日期时间buf[0] = Time->time.ucSecond;//秒buf[1] = Time->time.ucMinute;//分buf[2] = Time->time.ucHour|0x80;//时置为24小时格式buf[3] = Time->date.ucDay;//日buf[4] = Time->Week;//星期buf[5] = Time->date.ucMonth;//月buf[6] = Time->date.ucYear;//年SM_Send (PCF8563_SUBADDR, buf, PCF8563_NUMB);}4 新华龙C8051F022的IIC驱动程序//-----------------------------------------------------------------------------// Includes//-----------------------------------------------------------------------------#include <c8051f020.h> // SFR declarations#include <stdio.h>#include <king.h>#include <DYSJ.h>#include <I2C.H>#define SMB_FREQUENCY 10000L // Target SCL clock rate/****************************************************************************** ** 函数名称:void SPI0_Init()** 功能描述:I2C初始化程序** 说明:1. 置下降沿有效2. 置工作时钟2MHz3.** 输入:无** 输出:无******************************************************************************* /void I2C_Init(){SMB0CN = 0x44;// Enable SMBus with ACKs on acknowledge cycle SMB0CR = -80; //257 - (SYSCLK / (2 * SMB_FREQUENCY));EIE1 |= 2;// SMBus interrupt enable//EA = 1;// Global interrupt enableI2cSM_BUSY = 0;// Free SMBus for first transfer.}/****************************************************************************** ** 函数名称:void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count)** 功能描述:I2C写入程序** 说明:1. 等待空闲2. 写入数据3. 等待结束** 输入:地址byte_address、写入数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Send (Uint8 byte_address,Uint8 *SendBuf,Uint8 count){ET0 = 0;//禁止中断ET2 = 0;//禁止中断while (I2cSM_BUSY);// 等待空闲I2cSM_BUSY = 1;// 置忙SMB0CN = 0x44;// SMBus enabled, ACK on acknowledge cycleI2cSendCount = count;// 置写入数量I2cRecCount = 0;// 读出数量清零I2cSendDPTR = SendBuf;// SMBus enabled, ACK on acknowledge cycleI2CWRITE;// Chip select + WRITEI2cMemAdd = byte_address;STO = 0;STA = 1;// 启动传输FeedWatchdog();while (I2cSM_BUSY);// 等待空闲ET0 = 1;//允许中断ET2 = 1;//允许中断}/****************************************************************************** ** 函数名称:void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count)** 功能描述:I2C读取程序** 说明:1. 等待空闲2. 置地址3. 读取数据3. 等待结束** 输入:地址byte_address、读取数据缓冲区*SendBuf、数量count** 输出:无******************************************************************************* /void SM_Receive (Uint8 byte_address,Uint8 *ReadBuf,Uint8 count){ET0 = 0;//禁止中断ET2 = 0;//禁止中断while (I2cSM_BUSY);// 等待空闲I2cSM_BUSY = 1;// 置忙SMB0CN = 0x44;// SMBus enabled, ACK on acknowledge cycleI2cSendCount = 0;// 置写入数量I2CWRITE;// Chip select + WRITEI2cMemAdd = byte_address;//值地址偏移I2cRecCount = count;//要接收的数据个数I2cRecDPTR = ReadBuf;//指向要接收的数据区STO = 0;STA = 1;// Start transferFeedWatchdog();while (I2cSM_BUSY);// 等待空闲ET0 = 1;//允许中断ET2 = 1;//允许中断}/****************************************************************************** ** 函数名称:void SMBUS_ISR (void) interrupt 7** 功能描述:I2C中断服务程序** 说明:1. 选择器件地址2. 置读写地址3. 读取或写入数据3. 置结束标志** 输入:无** 输出:无*******************************************************************************/void SMBUS_ISR (void) interrupt 7{switch (SMB0STA) // Status code for the SMBus (SMB0STA register){// 主发送器/接收器:起始条件已发送// 在该状态发送的COMMAND 字的R/W 位总是为0(W),// 因为对于读和写操作来说都必须先写存储器地址。

基于PCF8563的单片机数字时钟

基于PCF8563的单片机数字时钟

//---库函数声明及相关定义---//#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit SDA=P2^1;//数据sbit SCL=P2^0;//时钟#define Databus P1 /*液晶数据总线*/bit Reverse_Display=0;//是否反相显示(白底黑字/黑底白字)sbit RS=P3^3; /*数据\指令选择*/sbit RW=P3^4; /*读\写选择*/sbit EN=P3^2; /*读\写使能*/sbit cs1=P3^6; /*片选1*/sbit cs2=P3^7; /*片选2*/uchar g8563_Store[8]; /*时间交换区,全局变量声明*/uchar code c8563_Store[8]={0x50,0x59,0x23,0x31,0x06,0x12,0x00,0x19}; /*写入时间初值:世纪,09年7月星期一13日07:59:00*/sbit DQ=P0^2;//ds18b20与单片机连接口float f_temp;//浮点型温度值unsigned int tvalue;//温度值unsigned char tflag;unsigned int temp=0;unsigned char SegBuf_DS18B20[4]={0};sbit menu=P0^3;//菜单sbit add=P0^4;//加一sbit dec=P0^5;//减一uchar second,minute,hour,day,month,year,week,count=0;/********************************//* 定义中文字库*//********************************/uchar code Hzk[]={0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,//年//00x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月//10x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日//20x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星//30x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期//40x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//时//50x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分//60x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒//70x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,//天//80x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,//一//90x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,//二//100x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三//110x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四//120x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五//130x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六//140x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,0x00,0x40,0x42,0x44,0x4C,0x40,0x40,0x7F,0x40,0x40,0x48,0x44,0xE6,0x40,0x00,0x00,0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,//当//150x08,0x08,0xE8,0x29,0x2A,0x2E,0xE8,0x08,0x08,0xCC,0x0A,0x0B,0xE8,0x0C,0x08,0x00,0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00,//前//160x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,//温//170x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,//度//180x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,0x49,0x49,0x7F,0x00,0x00,0x80,0x00,0x00,0x01,0x81,0x41,0x21,0x1D,0x21,0x41,0x7F,0x89,0x89,0x8D,0x89,0x81,0xC1,0x41,0x00,//是//190x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x7B,0x7B,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//://200x40,0x40,0x42,0xCC,0x00,0x40,0xA0,0x9F,0x81,0x81,0x81,0x9F,0xA0,0x20,0x20,0x00,0x00,0x00,0x00,0x7F,0xA0,0x90,0x40,0x43,0x2C,0x10,0x28,0x26,0x41,0xC0,0x40,0x00,//设//210x00,0x10,0x17,0xD5,0x55,0x57,0x55,0x7D,0x55,0x57,0x55,0xD5,0x17,0x10,0x00,0x00,0x40,0x40,0x40,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x40,0x60,0x40,0x00,//置//220x40,0x42,0x44,0xCC,0x00,0x20,0x22,0x22,0xE2,0x22,0x22,0x23,0x32,0x20,0x00,0x00,0x00,0x40,0x20,0x1F,0x20,0x48,0x4C,0x4B,0x48,0x48,0x4A,0x4C,0x58,0x60,0x20,0x00,//运//230x00,0x10,0x88,0xC4,0x23,0x40,0x42,0x42,0x42,0x42,0x42,0xC2,0x43,0x62,0x40,0x00,0x02,0x01,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,//行//240x00,0xF8,0x08,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0x08,0xFC,0x08,0x00,0x00,0x03,0x01,0x01,0x01,0x01,0x01,0xFF,0x01,0x01,0x01,0x01,0x01,0x03,0x00,0x00,//中//250x00,0x06,0x09,0x09,0xE6,0xF0,0x18,0x08,0x08,0x08,0x18,0x30,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0F,0x18,0x30,0x20,0x20,0x20,0x10,0x08,0x00,0x00,0x00,//℃//260x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 空格//270x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/****************************************//* 定义ASCII字库8列*16行*//****************************************/uchar code Ezk[]={/*此字体下对应的点阵为:宽x高=8x16 --*//*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //00x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00, //1 0x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, // 20x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3 0x00,0x00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4 0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5 0x00,0xC0,0xE0,0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6 0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7 0x00,0x70,0xF8,0xC8,0x88,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8 0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//90x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -//100x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0xE0,0xE0,0x80,0x80,0x00, // -+-//110x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, // ---//120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -.-//130x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00};/*状态检查,LCD是否忙*/void CheckState(){uchar dat; /*状态信息,判断是否忙*/RS=0; /*数据\指令选择,D/I(RS)=“L”,表示DB7∽DB0 为显示指令数据*/RW=1; /*R/W=“H”,E=“H”数据被读到DB7∽DB0*/do{Databus=0x00;EN=1; /*EN下降源*/_nop_(); /*一个时钟延时*/dat=Databus;EN=0;dat=0x80 & dat;/*仅当第7位为0时才可操作(判别busy信号)*/}while(!(dat==0x00));}/*写命令到LCD中*/SendCommandToLCD(uchar com){CheckState();/*状态检查,LCD是否忙*/RS=0; /*向LCD发送命令。

#PCF8563C语言可调时钟日历

#PCF8563C语言可调时钟日历
void write_8563(uchar w_miao,uchar w_fen,uchar w_shi,uchar w_day,uchar w_week,uchar w_month,uchar w_year>
{ p8563init(>。
start(>。
write_add(0x00,0x00>。
write_add(0x01,0x00>。
miao=((miao&0xf0>>>4&0x0f>*10+(miao&0x0f>。//BCD码转换成10进制数
//if(miao>=60>{miao=0。}
fen=read_add(0x03>&0x7f。//获取分钟
fen=((fen&0xf0>>>4&0x0f>*10+(fen&0x0f>。//BCD码转换成10进制数
#define KEY_CONTINUE_PERIOD 10
uchar KeyScan(> //按键扫描函数
{
if(key1==0> return KEY_1。
if(key2==0> return KEY_2。
if(key3==0> return KEY_3。
if(key4==0> return KEY_4。
//if(fen>=60>{fen=0。}
shi=read_add(0x04>&0x3f。//获取小时
shi=((shi&0xf0>>>4&0x0f>*10+(shi&0x0f>。//BCD码转换成10进制数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include<reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit pcf8563_scl=P0^4;
sbit pcf8563_sda=P0^3;
uchar
num[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; //数字表
sbit clk=P2^0;
sbit dio=P2^1;
sbit cfd=P2^2; //充放电开关,
sbit en=P2^3;
sbit rw=P2^4;
sbit rs=P2^5;
sbit deng=P2^6; //测试灯
sbit adcs=P2^7;
bit busy=0;
uchar sg;
uchar sd;
uchar fg;
uchar fd;
uchar mg;
uchar md;
uchar hou=0;
uchar min=0;
uchar sec=0;
uchar subadd; uchar dat;
uchar number;
void start_pcf8563();
void send_pcf8563_byte();
void LcdIni(void);
void WrOp(uchar dat);
void WrDat(uchar dat);
void ChkBusy(void);
void display0(void);
void display1(void);
void stop_pcf8563();
void receive_pcf8563_byte(); void spit_time();
void LcdIni()//初始化LCD {WrOp(0x01);
WrOp(0x38);
WrOp(0x0c);
WrOp(0x06);
}
void WrOp(uchar dat)//写LCD显示地址{
P1 =dat;
rs=0;
rw=0;
en=0;
ChkBusy();
en=1;
}
void WrDat(uchar dat)//写LCD显示数据{ P1=dat;
rs=1;
rw=0;
en=0;
ChkBusy();
en=1;
}
void ChkBusy() //检查LCD是否忙{
P1=0xff;
rs=0;
rw=1;
en=0;
_nop_();
en=1;
while(P1&0x80);
}
void display0() //显示必要的背景{
WrOp(0x80);
WrDat('T');
WrOp(0x81);
WrDat(':');
WrOp(0x84);
WrDat(':');
WrOp(0x87);
WrDat(':');
}
void spit_time()
{
sg=(int)hou/10;
sd=(int)hou%10;
fg=(int)min/10;
fd=(int)min%10;
mg=(int)sec/10;
md=(int)sec%10;
}
void display1()//显示时间六位{
uchar temp6;
uchar temp5; uchar temp4; uchar temp3; uchar temp2; uchar temp1;
WrOp(0x82); temp6=num[sg]; WrDat(temp6);
WrOp(0x83); temp5=num[sd]; WrDat(temp5);
WrOp(0x85); temp4=num[fg]; WrDat(temp4);
WrOp(0x86); temp3=num[fd]; WrDat(temp3);
WrOp(0x88);
temp2=num[mg];
WrDat(temp2);
WrOp(0x89);
temp1=num[md];
WrDat(temp1);
}
void Send_pcf8563_byte(uchar bb) //向PCF8563发送一个字节{
uchar aa;
pcf8563_scl=0;
for(aa=0;aa<8;aa++)
{
if((bb&0x80)==0x80)
{
pcf8563_sda=1;
}
else
{
pcf8563_sda=0;
}
pcf8563_scl=1;
pcf8563_scl=0;
bb=bb<<1;
}
_nop_();
_nop_();
pcf8563_sda=1;
pcf8563_scl=1;
busy=0;
if(pcf8563_sda)
{
busy=1;
}
else
{
_nop_();
_nop_();
pcf8563_scl=0;
busy=0;
}
}
void write_pcf8563(uchar subadd,uchar dat)// 向PCF8563对应地址写数据
{
start_pcf8563();
Send_pcf8563_byte(0xa2);
if(!busy)
{
Send_pcf8563_byte(subadd);
if(!busy)
{
Send_pcf8563_byte(dat);
}
}
stop_pcf8563();
}
void read_pcf8563() //读当时的时,分,钞{
start_pcf8563();
Send_pcf8563_byte(0xa2);
if(!busy)
{
Send_pcf8563_byte(0x02);
if(!busy)
{
start_pcf8563();
Send_pcf8563_byte(0xa3);
receive_pcf8563_byte();
sec=number&0x7f;
start_pcf8563();
Send_pcf8563_byte(0xa3);
receive_pcf8563_byte();
min=number&0x7f;
start_pcf8563();
Send_pcf8563_byte(0xa3);
receive_pcf8563_byte();
hou=number&0x3f;
}
}
stop_pcf8563();
}
void receive_pcf8563_byte() //从PCF8563接受一个字节{uchar cc;
pcf8563_sda=1;
number=0;
for(cc=0;cc<8;cc++)
{
number<<=1;
pcf8563_scl=0;
pcf8563_scl=1;
_nop_();
_nop_();
number= number|pcf8563_sda;
}
pcf8563_scl=0;
_nop_();
_nop_();
}
void start_pcf8563() //开启PCF8563IIC
{
pcf8563_sda=1;
pcf8563_scl=1;
pcf8563_sda=0;//SCL为低,SDA执行一个上跳
pcf8563_scl=0;//SCL为低,嵌住数据线
}
void stop_pcf8563() //关闭PCF8563IIC
{
pcf8563_sda=0;
pcf8563_scl=1;
pcf8563_sda=1;//SCL为高,SDA执行一个上跳
pcf8563_scl=0;//SCL为低,嵌住数据线
}
void main(void)
{
LcdIni(); //初始化屏
display0(); //显示必要的背影
write_pcf8563(0x02,sec); //写钞
write_pcf8563(0x03,min); //写分
write_pcf8563(0x04,hou); //写时
while(1)
{
read_pcf8563();//读当前时间
spit_time(); //切害时间,为显示做准备display1(); //显示当前时间
} }。

相关文档
最新文档