找回密码
 立即注册
查看: 142|回复: 1

小白学单片机记录之软件模拟IIC读写PCF8563时钟RTC数据

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2025-2-16 18:34:15 | 显示全部楼层 |阅读模式
对于面向复制粘贴编程的我来说可真不容易,折腾了整整一上午才搞定。
试了多家的代码才测试成功。MCU为STC8H3K32S2,PCF8563T为马宝2.11大洋买的:

4358c118df6f24b9ca79ded51fc37526.jpg

9469600113c41e18fe70f22c94023745.jpg

QQ图片20250216180318.jpg

13点设置好RTC数据时差不到一秒,17点再看时,已经差了2秒了,
这时钟模块也不靠谱啊:

一点校准2025-02-16_130045.jpg

下午17点.jpg

寄存器里面是BCD码格式,往里面写、读出来显示的时候都要做转换,
一开始直接读、写十进制发现咋整都不对,后面才改正过来。
粘上代码备查备用:

  1. #include "bsp_pcf8563.h"
  2. unsigned char timeBuffer[7];
  3. void IIC_Delay()
  4. {
  5.         _nop_(); _nop_();        _nop_();        _nop_();        _nop_();        _nop_();
  6.         _nop_(); _nop_(); _nop_();        _nop_();        _nop_();        _nop_();
  7.         _nop_(); _nop_(); _nop_();
  8. }
  9. void IIC_Start(void)
  10. {
  11.         IIC_SDA = 1;        //为SDA下降启动做准备
  12.         IIC_SCL = 1;        //在SCL高电平时,SDA为下降沿时候总线启动
  13.         IIC_Delay();
  14.         IIC_SDA = 0;        //突变,总线启动
  15.         IIC_Delay();
  16.         IIC_SCL = 0;
  17.         IIC_Delay();
  18. }
  19. void IIC_Stop(void)
  20. {
  21.         IIC_SDA = 0;        //为SDA上升做准备
  22.         IIC_Delay();
  23.         IIC_SCL = 1;        //在SCL高电平时,SDA为上升沿时候总线停止
  24.         IIC_Delay();
  25.         IIC_SDA = 1;        //突变,总线停止
  26.         IIC_Delay();
  27. }
  28. void IIC_Ack(unsigned char a)
  29. {
  30.         if(a)        IIC_SDA = 1;        //放上应答信号电平
  31.         else        IIC_SDA = 0;
  32.         IIC_Delay();
  33.         IIC_SCL = 1;        //为SCL下降做准备
  34.         IIC_Delay();
  35.         IIC_SCL = 0;        //突变,将应答信号发送过去
  36.         IIC_Delay();
  37. }unsigned char IIC_Write_Byte(unsigned char dat)
  38. {
  39.         unsigned char i;
  40.         unsigned char iic_ack=0;        //iic应答标志
  41.         for(i = 0;i < 8;i++)
  42.         {
  43.                 if(dat & 0x80)        IIC_SDA = 1;        //判断发送位,先发送高位
  44.                 else        IIC_SDA = 0;
  45.                 IIC_Delay();
  46.                 IIC_SCL = 1;        //为SCL下降做准备
  47.                 IIC_Delay();
  48.                 IIC_SCL = 0;        //突变,将数据位发送过去
  49.                 dat<<=1;        //数据左移一位
  50.         }        //字节发送完成,开始接收应答信号
  51.         IIC_SDA = 1;        //释放数据线
  52.         IIC_Delay();
  53.         IIC_SCL = 1;        //为SCL下降做准备
  54.         IIC_Delay();
  55.         //字节发送完成,开始接收应答信号
  56.         iic_ack |= IIC_SDA;        //读入应答位
  57.         IIC_SCL = 0;
  58.         return iic_ack;        //返回应答信号
  59. }
复制代码
读到数据后串口发送出来即可:

  1. void main(void)
  2. {
  3.         sTime timeNow;
  4.         char timeString[50];
  5.         EAXSFR();                /* 扩展寄存器访问使能 */
  6.         //开启中断0:INT0
  7.         IT0 = 1;//0为上升下降沿触发;1为低电平触发;
  8.         EX0 = 1;
  9.         GPIO_config();        
  10.         Uart1Init();
  11.         ES = 1;
  12.         EA = 1;
  13.         Timer0_Init();
  14.         timeNow.year=25;
  15.         timeNow.mon=2;
  16.         timeNow.week = 0;
  17.         timeNow.day=16;
  18.         timeNow.hour=13;
  19.         timeNow.min=0;
  20.         timeNow.sec = 0;
  21. Bsp_Pcf8563_Init();
  22.         while(1)
  23.         {
  24.                 KeyTask();
  25.                 if(test1000ms == 1000)
  26.                 {
  27.                         P54 = !P54;
  28.                         test1000ms = 0;
  29.                         MyGetTime(&timeNow);
  30.                         sprintf(timeString, "  20%02d-%02d-%02d %02d:%02d:%02d",(int)timeNow.year,(int)timeNow.mon,(int)timeNow.day,(int)timeNow.hour,(int)timeNow.min,(int)timeNow.sec);
  31.                         Uart1SendStr(timeString);
  32.                 }        
  33.         }
  34. }        
复制代码
完整工程“Clock-STC8H3K32S2点灯+串口+按键+定时器+iic读PCF8563.rar”:
Clock-STC8H3K32S2点灯 串口 按键 定时器 iic读PCF8563.rar (106.05 KB, 下载次数: 4)








回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:76
  • 最近打卡:2025-05-02 08:31:34
已绑定手机

3

主题

18

回帖

389

积分

中级会员

积分
389
发表于 2025-2-17 07:48:32 | 显示全部楼层
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:16 , Processed in 0.137728 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表