200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > PCF8563实时时钟模块功能实现

PCF8563实时时钟模块功能实现

时间:2022-11-04 11:23:19

相关推荐

PCF8563实时时钟模块功能实现

1.概述

PCF8563是为低功耗而优化的CMOS实时时钟/日历。提供了可编程时钟输出、中断输出和低电压检测器。所有地址和数据都是通过两路双向IIC总线串行传输的。最大总线速度为400kbits/s。内置的字地址寄存器在每个写入或读取数据字节后自动递增。

2.特点

■ Provides year, month, day, weekday, hours, minutes and seconds based on 32.768 kHz quartz crystal

■ Century flag

■ Wide operating supply voltage range: 1.0 to 5.5 V

■ Low back-up current; typical 0.25 µA at VDD = 3.0 V and Tamb = 25 °C ■ 400 kHz two-wire I2C-bus interface (at VDD = 1.8 to 5.5 V)

■ Programmable clock output for peripheral devices: 32.768 kHz, 1024 Hz,32 Hz and 1 Hz

■ Alarm and timer functions

■ Voltage-low detector

■ Integrated oscillator capacitor

■ Internal power-on reset

■ I2C-bus slave address: read A3H; write A2H

■ Open drain interrupt pin.

3.硬件描述

电路结构框图

引脚排列顺序

4.软件实现

1.启动/关闭闹钟

/********************************************************************************@name:启动、关闭时钟 ***@input:0:关闭时钟;1:启动时钟*****************************************************************************/void start_stop(uint8_t status){if(status == 0){iic_send_add_byte(0x00,0x20);//关闭时钟}else if(status == 1){iic_send_add_byte(0x00,0x00);//开启时钟}}

2.BCD/十进制相互转换

/******************BCD转十进制***************************/uint8_t bcd_dec(uint8_t bat){uint8_t temp1,temp2,tol;temp1=bat&0x0f;temp2=(bat&0xf0)>>4;tol=temp2*10+temp1;return tol; }/******************十进制转BCD***************************/uint8_t dec_bcd(uint8_t bat){return ((bat%10) & 0x0F) | (((bat/10) << 4) & 0xF0);; }/***

3.初始化当前时间

void time_init(uint8_t year,uint8_t moom,uint8_t dat,uint8_t hour,uint8_t min,uint8_t sec){sec = dec_bcd(sec);min = dec_bcd(min);hour = dec_bcd(hour);dat = dec_bcd(dat);moom = dec_bcd(moom);year = dec_bcd(year);iic_send_add_byte(0x02,sec); iic_send_add_byte(0x03,min);iic_send_add_byte(0x04,hour);iic_send_add_byte(0x05,dat); iic_send_add_byte(0x07,moom); iic_send_add_byte(0x08,year); }

4.获取当前时间并转换

void get_time(void){date.sec=0x7f&iic_rec_add_byte(0x02); //读取秒date.min=0x7f&iic_rec_add_byte(0x03); //读取分钟date.hour=0x3f&iic_rec_add_byte(0x04); //读取小时date.dat=0x3f&iic_rec_add_byte(0x05); //读取天数date.moom=0x1f&iic_rec_add_byte(0x07); //读取月date.year=0xff&iic_rec_add_byte(0x08); //读取年date.sec1=bcd_dec(date.sec); //将读取的BCD码秒转换成十进制秒以便运算date.min1=bcd_dec(date.min);date.hour1=bcd_dec(date.hour);date.dat1=bcd_dec(date.dat);date.moom1=bcd_dec(date.moom);date.year1=bcd_dec(date.year);//printf("20%d年%d月%d日%d时%d分%d秒\r\n",date.year1,date.moom1,date.dat1,date.hour1,date.min1,date.sec1);}

5.设置闹钟

void P8563_alarm(uint8_t day,uint8_t hour,uint8_t min){day = dec_bcd(day);hour = dec_bcd(hour);min = dec_bcd(min);iic_send_add_byte(0xc,0x1); //星期报警iic_send_add_byte(0xb,day); /*日期报警*/iic_send_add_byte(0xa,hour); /*小时报警*/iic_send_add_byte(0x9,min); /*分钟报警*/iic_send_add_byte(0x01,0x12); /*报警有效*/ //使能报警器和定时器发出中断请求}

6.清除闹钟中断

/******************清除中断拉高电平***************************/void clear_alarm(void){iic_send_add_byte(0x01,0x02);//清中断标志}/******************关闭闹钟中断***************************/void close_alarm(void){iic_send_add_byte(0x01,0x00);//禁止中断}

5.总结

该模块通过IIC与单片机进行通信,单片机只需往对应的寄存器发送数据即可实现所需要的功能,适合任意一款具备IIC通信外设的8位/32位单片机。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。