PCF8563在电子时钟设计中的应用.docx
- 文档编号:8654049
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:12
- 大小:298.15KB
PCF8563在电子时钟设计中的应用.docx
《PCF8563在电子时钟设计中的应用.docx》由会员分享,可在线阅读,更多相关《PCF8563在电子时钟设计中的应用.docx(12页珍藏版)》请在冰豆网上搜索。
PCF8563在电子时钟设计中的应用
PCF8563在电子时钟设计中的应用
引言
数字时钟已成为时钟设计的主导方向,广泛应用于实时控制系统。
数字时钟实质是一个对标准频率计数的计数电路,通常由晶体振荡电路、分频电路、时间计数电路、译码驱动电路等组成。
这里提出一种电子时钟系统设计方案,是以avr单片机mega16作为控制核心,采用PCF8563时钟/日历器件以及数码管显示,通过硬件设计及软件编程实现的。
1mega16简介
ATmega16是基于增强的AVRRISC结构的低功耗8位CMOS微控制器。
由于其先进的指令集以及单时钟周期指令执行时间,ATmega16的数据吞吐率高达1MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。
AVR内核具有丰富的指令集和32个通用工作寄存器。
所有的寄存器都直接与算逻单元(ALU)相连接,使得一条指令可以在一个时钟周期内同时访问两个独立的寄存器。
这种结构大大提高了代码效率,并且具有比普通的CISC微控制器最高至10倍的数据吞吐率。
ATmega16有如下特点:
16K字节的系统内可编程Flash(具有同时读写的能力,即RWW),512字节EEPROM,1K字节SRAM,32个通用I/O口线,32个通用工作寄存器,用于边界扫描的JTAG接口,支持片内调试与编程,三个具有比较模式的灵活的定时器/计数器(T/C),片内/外中断,可编程串行USART,有起始条件检测器的通用串行接口,8路10位具有可选差分输入级可编程增益(TQFP封装)的ADC,具有片内振荡器的可编程看门狗定时器,一个SPI串行端口,以及六个可以通过软件进行选择的省电模式。
工作于空闲模式时CPU停止工作,而USART、两线接口、A/D转换器、SRAM、T/C、SPI端口以及中断系统继续工作;掉电模式时晶体振荡器停止振荡,所有功能除了中断和硬件复位之外都停止工作;在省电模式下,异步定时器继续运行,允许用户保持一个时间基准,而其 余功能模块处于休眠状态;ADC噪声抑制模式时终止CPU和除了异步定时器与ADC以外所有I/O模块的工作,以降低ADC转换时的开关噪声;Standby模式下只有晶体或谐振振荡器运行,其余功能模块处于休眠状态,使得器件只消耗极少的电流,同时具有快速启动能力;扩展Standby模式下则允许振荡器和异步定时器继续工作。
本芯片是以Atmel高密度非易失性存储器技术生产的。
片内ISPFlash允许程序存储器通过ISP串行接口,或者通用编程器进行编程,也可以通过运行于AVR内核之中的引导程序进行编程。
引导程序可以使用任意接口将应用程序下载到应用Flash存储区(ApplicationFlashMemory)。
在更新应用Flash存储区时引导Flash区(BootFlashMemory)的程序继续运行,实现了RWW操作。
通过将8位RISCCPU与系统内可编程的Flash集成在一个
芯片内,ATmega16成为一个功能强大的单片机,为许多嵌入式控制应用提供了灵活而低成本的解决方案。
ATmega16具有一整套的编程与系统开发工具,包括:
C语言编译器、宏汇编、程序调试器/软件仿真器、仿真器及评估板。
2PCF8563简介
PCF8563是PHILIPS公司推出的一款带I2C总线,具有极低功耗的多功能时钟/日历芯片PCF8563的多种报警功能。
定时器功能时钟输出功能以及中断输出功能能完成各种复杂的定时服务甚至可为单片机提供看门狗功能内部时钟。
电路内部振荡电路内部低电压检测电路1.0V以及两线制I2C总线通讯方式不但使外围电路及其简洁而且也增加了芯片的可靠性当然作为时钟芯片PCF8563亦解决了2000年问题因而PCF8563是一种性价比极高的时钟芯片。
它广泛应用于电话传便携式仪器以及电池供电的仪器仪表等产品领域。
指标如下:
1.宽电压范围1.0~5.5V复位电压Vlow=1.0V;
2.超低功耗典型值为0.25A;
3.四种报警功能和定时器功能;
4.内部复位电路内部振荡器电路和内部低压检测电路;
5.中断输出和可编程时钟输出功能;
6.400kHzI2C总线
图1为PCF8563内部结构。
PCF8563内部包括16个8位寄存器,可自动增量的地址寄存器,内置32.768Hz的振荡器(带有一个内部集成的电容),分频器(用于给实时时钟RTC提供源时钟),可编程时钟输出,定时器,报警器,掉电检测器和400kHz的I2C总线接口。
所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。
前2个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,其中内存地址02H~08H用于时钟计数器(秒~年计数器),地址09H~0CH用于报警寄存器(定义报警条件),地址ODH控制CLKOUT引脚的输出频率,地址OEH和OFH分别用于定时器控制寄存器和定时器寄存器。
秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以BCD格式编码。
PCF8563的管脚排列及描述如下图及表所示:
3系统硬件设计
硬件电路设计包括PCF8563时钟与mega16单片机的接口电路、数码显示电路以及键盘电路3个部分。
PCF8563采用32.768kHz可编程时钟输出频率,I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
单片机与PCF8563之间双向传送数据,最高传送速率为100Kb/s。
FC总线的优点是简单和有效。
由于接口直接在组件之上,因此,I2C总线占用的空间非常小,减少了电路板的空间和器件引脚的数量,降低了成本。
图2为PCF8563与mega16单片机的接口电路,PCF8563的SCL与单片机的引脚PC0连接;SDA与单片机的引脚PC1连接,实现时间、日期等数据的读取。
PCF8563的外围器件图:
4做好的pcf8563头文件程序:
#include
#include
#include
#defineTWINT7
#defineTWEN2
#defineTWSTA5
#defineTWSTO4
#defineTWEA6
#defineI2C_START()TWCR=(1< #defineI2C_STOP()TWCR=(1< #defineI2C_ACK()TWCR=(1< #defineI2C_NAK()TWCR=(1< #defineI2C_CHECK_STATUS(X){while(! (TWCR&(1< =(X))return0;} #defineI2C_WRITE(X)TWDR=(X) #defineI2C_READ(X)(X)=TWDR //TWSR&0xF8状态码 #defineSTART0x08 #defineRE_START0x10 #defineMT_SLA_ACK0x18 #defineMT_SLA_NAK0x20 #defineMT_DATA_ACK0x28 #defineMT_DATA_NAK0x30 #defineSLA_DATA_FAIL0x38 #defineMR_SLA_ACK0x40 #defineMR_SLA_NAK0x48 #defineMR_DATA_ACK0x50 #defineMR_DATA_NAK0x58 #defineSLA_R_PCF85630xA3 #defineSLA_W_PCF85630xA2 #definePAGE_SIZE_PCF856316 #defineNUM_PAGE_PCF85631 /************************************************************************ I2C主机写N字节数据到从器件 编程: 许工QQ11520389 时间: 2010.03.05 参数说明: SLA_W: 从器件写地址 ADDR: 从器件内部写数据起始地址 N: 写数据字节数 DAT: 源数据起始地址 ************************************************************************/ unsignedchari2c_write_n_bytes(unsignedcharSLA_W,unsignedintADDR, unsignedintN,unsignedchar*DAT) { unsignedinti; I2C_START(); I2C_CHECK_STATUS(START); I2C_WRITE(SLA_W); I2C_NAK(); I2C_CHECK_STATUS(MT_SLA_ACK); if(SLA_W! =SLA_W_PCF8563) { I2C_WRITE((unsignedchar)ADDR>>8); I2C_NAK(); I2C_CHECK_STATUS(MT_DATA_ACK); } I2C_WRITE((unsignedchar)ADDR); I2C_NAK(); I2C_CHECK_STATUS(MT_DATA_ACK); for(i=0;i { I2C_WRITE(DAT[i]); I2C_NAK(); I2C_CHECK_STATUS(MT_DATA_ACK); } I2C_STOP(); return1; } /************************************************************************ I2C主机从从器件读N字节数据 编程: 许工QQ11520389 时间: 2010.03.05 参数说明: SLA_R: 从器件读地址 ADDR: 从器件内部读数据起始地址 N: 读数据字节数 DAT: 目标数据起始地址 ************************************************************************/ unsignedchari2c_read_n_bytes(unsignedcharSLA_R,unsignedintADDR, unsignedintN,unsignedchar*DAT) { unsignedinti; I2C_START(); I2C_CHECK_STATUS(START); I2C_WRITE((SLA_R)-1); I2C_NAK(); I2C_CHECK_STATUS(MT_SLA_ACK); if(SLA_R! =SLA_R_PCF8563) { I2C_WRITE((unsignedchar)ADDR>>8); I2C_NAK(); I2C_CHECK_STATUS(MT_DATA_ACK); } I2C_WRITE((unsignedchar)ADDR); I2C_NAK(); I2C_CHECK_STATUS(MT_DATA_ACK); I2C_START(); I2C_CHECK_STATUS(RE_START); I2C_WRITE(SLA_R); I2C_NAK(); I2C_CHECK_STATUS(MR_SLA_ACK); if(N>1) { for(i=0;i { I2C_ACK(); I2C_CHECK_STATUS(MR_DATA_ACK); I2C_READ(DAT[i]); } } I2C_NAK(); I2C_CHECK_STATUS(MR_DATA_NAK); DAT[N-1]=TWDR; I2C_STOP(); return1; } //PCF8563时钟停止指令 voidPCF8563_stop(void) { unsignedcharstopcode=0x20; i2c_write_n_bytes(SLA_W_PCF8563,0,1,&stopcode); } //PCF8563时钟启动指令 voidPCF8563_start(void) { unsignedcharstartcode=0x00; i2c_write_n_bytes(SLA_W_PCF8563,0,1,&startcode); } /************************************************************************ PCF8563时钟设置 编程: 许工QQ11520389 时间: 2010.03.05 参数说明: (BCD码) yy: 年(0x00到0x99) mm: 月(0x01到0x12) dd: 日(0x01到0x31) hh: 时(0x00到0x23) mi: 分(0x00到0x59) ss: 秒(0x00到0x59) da: 星期(0x01到0x07) ************************************************************************/ voidPCF8563_set(unsignedcharyy,unsignedcharmm,unsignedchardd, unsignedcharda,unsignedcharhh,unsignedcharmi,unsignedcharss) { unsignedchartime[7]; time[6]=yy;//年 time[5]=mm;//月 time[4]=da;//星期 time[3]=dd;//日 time[2]=hh;//时 time[1]=mi;//分 time[0]=ss;//秒 PCF8563_stop(); i2c_write_n_bytes(SLA_W_PCF8563,2,7,time); PCF8563_start(); } /************************************************************************ PCF8563时钟读取 编程: 许工QQ11520389 时间: 2010.03.05 参数说明: (BCD码) time: 存放读出时间的数组名 time[6]: 年(0x00到0x99) time[5]: 月(0x01到0x12) time[3]: 日(0x01到0x31) time[2]: 时(0x00到0x23) time[1]: 分(0x00到0x59) time[0]: 秒(0x00到0x59) time[4]: 星期(0x01到0x07) ************************************************************************/ unsignedcharBCD2Val(unsignedcharx) { return(x>>4)*10+(x&0x0f);//高4位乘以10,再加上低4位,即得到数值 } voidPCF8563_read(unsignedchar*time) { i2c_read_n_bytes(SLA_R_PCF8563,2,7,time); //time[6]//年 time[5]=BCD2Val(time[5]&0x7f);//月 time[4]=BCD2Val(time[4]&0x7f);//星期 time[3]=BCD2Val(time[3]&0x7f);//日 time[2]=BCD2Val(time[2]&0x7f);//时 time[1]=BCD2Val(time[1]&0x7f);//分 time[0]=BCD2Val(time[0]&0x7f);//秒 USART_Send_Char(time[2]/10%10+0x30); USART_Send_Char(time[2]%10+0x30); USART_Send_Str(": "); USART_Send_Char(time[1]/10%10+0x30); USART_Send_Char(time[1]%10+0x30); USART_Send_Str(": "); USART_Send_Char(time[0]/10%10+0x30); USART_Send_Char(time[0]%10+0x30); USART_Send_Str("\n"); } voidmain(void) { unsignedchardat[132]; USART_Init(); PORTC=0x00; DDRC=0x03; PORTD=0x01; DDRD=0x02; TWSR=0x00; TWBR=0x04; TWAR=0x00; TWCR=0x44; PCF8563_set(0x10,0x05,0x01,0x17,0x16,0x20,0x23); while (1) {delay_ms(1000); PCF8563_read(dat); //Placeyourcodehere }; } 5结束语 介绍采用avr单片机为主控器件的电子时钟系统的设计与实现。 设计电子时钟系统时选用PCF8563时钟/日历器件,由3.3V直流电源供电,简化了硬件电路,提高了系统可靠性,通过数码示器能够准确显示时间。 实际应用证明该电子时钟操作简单、准确性高、体积小、功耗低,且具有良好的抗干扰性能。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PCF8563 电子 时钟 设计 中的 应用