PCF8563 读数不对

      今天对于rtc重新进行验证,突然发现之前写的OK的rtc驱动出现了问题,在不断电的情况下,rtc时间是准确的,断电时间超多10s后时间读出来就有了问题,让我纳闷了半个小时,最后突然发现是电池的问题,换了个电池万事大吉啦

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个基于51单片机的PCF8563实时时钟程序 #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit SDA=P2^0; //定义SDA sbit SCL=P2^1; //定义SCL unsigned char second=0,minute=0,hour=0,day=0,date=0,month=0,year=0; unsigned char bcd_to_decimal(unsigned char bcd); //BCD码转换为十进制数 unsigned char decimal_to_bcd(unsigned char decimal); //十进制数转换为BCD码 void i2c_start(void); //I2C起始信号 void i2c_stop(void); //I2C停止信号 void i2c_ack(void); //I2C应答信号 void i2c_no_ack(void); //I2C非应答信号 void i2c_write_byte(unsigned char dat); //I2C写一个字节 unsigned char i2c_read_byte(void); //I2C读一个字节 void write_rtc(unsigned char addr,unsigned char dat); //写入RTC数据 unsigned char read_rtc(unsigned char addr); //读取RTC数据 void set_rtc(void); //设置RTC void get_rtc(void); //读取RTC void main() { set_rtc(); while(1) { get_rtc(); } } unsigned char bcd_to_decimal(unsigned char bcd) { return ((bcd/16*10)+(bcd%16)); } unsigned char decimal_to_bcd(unsigned char decimal) { return ((decimal/10*16)+(decimal%10)); } void i2c_start(void) { SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); } void i2c_stop(void) { SDA=0; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); } void i2c_ack(void) { SDA=0; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); } void i2c_no_ack(void) { SDA=1; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); } void i2c_write_byte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { SDA=(dat&0x80)>>7; SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); dat<<=1; } i2c_ack(); } unsigned char i2c_read_byte(void) { unsigned char i,dat=0; for(i=0;i<8;i++) { SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); dat<<=1; dat|=SDA; SCL=0; _nop_(); _nop_(); _nop_(); _nop_(); } return dat; } void write_rtc(unsigned char addr,unsigned char dat) { i2c_start(); i2c_write_byte(0xa2); i2c_write_byte(addr); i2c_write_byte(dat); i2c_stop(); } unsigned char read_rtc(unsigned char addr) { unsigned char dat; i2c_start(); i2c_write_byte(0xa2); i2c_write_byte(addr); i2c_start(); i2c_write_byte(0xa3); dat=i2c_read_byte(); i2c_no_ack(); i2c_stop(); return dat; } void set_rtc(void) { write_rtc(0x00,decimal_to_bcd(0x00)); //秒 write_rtc(0x01,decimal_to_bcd(0x59)); //分 write_rtc(0x02,decimal_to_bcd(0x23)); //时 write_rtc(0x03,decimal_to_bcd(0x01)); //星期 write_rtc(0x04,decimal_to_bcd(0x23)); //日 write_rtc(0x05,decimal_to_bcd(0x05)); //月 write_rtc(0x06,decimal_to_bcd(0x21)); //年 } void get_rtc(void) { second=bcd_to_decimal(read_rtc(0x00)); minute=bcd_to_decimal(read_rtc(0x01)); hour=bcd_to_decimal(read_rtc(0x02)); day=bcd_to_decimal(read_rtc(0x03)); date=bcd_to_decimal(read_rtc(0x04)); month=bcd_to_decimal(read_rtc(0x05)); year=bcd_to_decimal(read_rtc(0x06)); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值