找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 816|回复: 1
打印 上一主题 下一主题
收起左侧

时钟芯片PCF2129的单片机读写子程序

[复制链接]
跳转到指定楼层
楼主
时钟芯片PCF2129精度高,论坛没有这个芯片资料,刚好自己用到,找了好久改写调试通过,补充一下论坛资料,其他不多说了。

单片机源程序如下:
  1. #include <C8051F410.h >
  2. #include "C8051F410_SMBUS.h"
  3. #ifndef __PCF2129_H__
  4. #define __PCF2129_H__
  5. #define  PCF2129_SLA    0xA2            //  定义PCF2129的器件地址                                    
  6. #define  s              0x00            //  定义PCF2129的秒寄存器地址     
  7. #define  m              0x01            //  定义PCF2129的分寄存器地址     
  8. #define  h              0x02            //  定义PCF2129的小时寄存器地址   
  9. #define  d              0x03            //  定义PCF2129的天寄存器地址     
  10. #define  wd             0x04            //  定义PCF2129的星期寄存器地址   
  11. #define  mo             0x05            //  定义PCF2129的月寄存器地址     
  12. #define  y              0x06            //  定义PCF2129的年寄存器地址
  13. //extern idata unsigned char        Time[7];
  14. extern xdata unsigned char        Time[7];  //时间寄存器

  15. void PCF2129_W_time(void);
  16. void PCF2129_R_time(void);
  17. void PCF2129_Init(void);

  18. #endif

  19. 由于我使用的是C8051F410芯片的硬件SMBUS(IIC)不具有通用性C文件就不发了,随便找一个模拟IIC子程序改写一下就好
  20. #ifndef __C8051F410_SMBUS_H__
  21. #define __C8051F410_SMBUS_H__
  22. //------------------------------------------------------------------
  23. void SMbus_W(uchar wrda ,uchar dat);//写半个字节(器件码,数据)
  24. //适用与PCF8574iic扩展IO 器件码4e, 8574A器件码7e;
  25. uchar SMbus_ByteR(uchar wrda );  //读半个字节 (器件码)
  26.   //适用与PCF8574iic扩展器件码4e, 8574A器件码7e;           smbus时钟50khz
  27. //=============================================================================
  28. void SMbus_Write(uchar wrda ,uchar dest_addr, uchar dat);               
  29. //         写一个字节 (   器件码  ,   地址          ,   数据         )
  30. uchar SMbus_ByteRead(uchar wrda ,uchar dest_addr);           
  31. //     读一个字节      器件码         地址  
  32. //读流程为 (起始,器件码写,应答,操作地址,应答,停,起始,器件码读,应答,读数据)。
  33. // 适用与EEPROM存储器件        24c02,器件码a0,24c16器件码a0-ae, 时钟PCF2129,取件码a2
  34. //=======================================================================================
  35. void SMbus_WriteArray(uchar wrda , uchar dest_addr, uchar *src_addr, uchar len);
  36. //连续写一串数组        器件码         起始地址        数组             字数
  37. //流程为(起始,器件码写,应答,操作地址,应答,写数据,应答,写N个数据————停)
  38. void SMbus_Write_Array(uchar wrda,uchar dest_addr, uchar *src_addr,uchar len);
  39. //断续写一串数组        器件码         起始地址        数组          字数  
  40. void SMbus_ReadArray (uchar wrda,  uchar src_addr, uchar *dest_addr,  uchar len);
  41. //    读取一串数组      器件码      起始地址            读出存储位置                     字数
  42. //读流程为(起始,器件码写,应答,操作地址,应答,停,起始,器件码读,应答,读数据应答,————读N数据,停)

  43. #endif

  44. //=================================================================
  45. #include "C8051F410.h"
  46. #include "C8051F410_SMBUS.h"
  47. #include "PCF2129.h"
  48. //======================================================================

  49. xdata unsigned char        Time[7];  //时间寄存器


  50. #define BCD_TO_HEX(bcd) ((((bcd)>>4)*10)+((bcd)&0x0F))
  51. #define HEX_TO_BCD(hex) ((((hex)/10)<<4)+((hex)%10))  


  52. void PCF2129_W_time(void)
  53. {   
  54.     xdata unsigned char Time_o[7];
  55.    uchar x = 0;
  56.     for (x=0; x < 7; x++)               //  清空数据缓冲区
  57.         Time_o[x] = 0;
  58.   SMbus_Write( 0xa2,0x00,0X20);         //停止时钟
  59.     Time_o[s]  = (HEX_TO_BCD(Time[s]))&0x7f;  //  秒
  60.         Time_o[m]  = (HEX_TO_BCD(Time[m]))&0x7f;  //  分
  61.         Time_o[h]  = (HEX_TO_BCD(Time[h]))&0x3f;  //  小时
  62.         Time_o[d]  = (HEX_TO_BCD(Time[d]))&0x3f;  //  日
  63.         Time_o[wd] = (HEX_TO_BCD(Time[wd]))&0x07;  //  星期
  64.         Time_o[mo] = (HEX_TO_BCD(Time[mo]))&0x3f;  //  月
  65.         Time_o[y]  = (HEX_TO_BCD(Time[y]));  //  年
  66.         SMbus_WriteArray(0xa2,0x03,Time_o, 7);
  67.   SMbus_Write( 0xa2,0x00,0X00);         //启动时钟
  68. }

  69. void PCF2129_R_time(void)
  70. {   
  71.             xdata unsigned char Time_in[7];
  72.      SMbus_ReadArray (0xa2,  0x02, Time_in, 7);
  73.            Time[s]  = BCD_TO_HEX((Time_in[s]&0x7F)) ;        //  秒
  74.            Time[m]  = BCD_TO_HEX(Time_in[m]) ;        //        分
  75.            Time[h]  = BCD_TO_HEX(Time_in[h]) ;        //        小时
  76.            Time[d]  = BCD_TO_HEX(Time_in[d]) ;        //        日
  77.            Time[wd] = BCD_TO_HEX(Time_in[wd]) ;        //        星期
  78.            Time[mo] = BCD_TO_HEX(Time_in[mo]) ;        //        月
  79.            Time[y]  = BCD_TO_HEX(Time_in[y]) ;        //        年
  80. }

  81. void PCF2129_Init(void)
  82. {
  83.    // u8 x = 0;  
  84.         SMbus_Write( 0xa2,0x00,0X00);         //启动时钟
  85.         SMbus_Write( 0xa2,0x01,0X00);         //启动时钟
  86.         SMbus_Write( 0xa2,0x02,0X00);         //启动时钟

  87. //        SMbus_Write( 0xa2,0x10,0X82);                 //看门狗秒报警控制。
  88.         SMbus_Write( 0xa2,0x0f,0X06);                 //  设置CLKOUT为1Hz
  89.         SMbus_Write( 0xa2,0x19,0X0C);                 //  晶振老化补偿设为-4ppm
  90. }

  91. //================================================================
复制代码

注意重点这个芯片时间寄存器读和写位置是不同的 ,虽然手册给的寄存器序号03开始是秒但是我的2129芯片却是00寄存器只能写不能读,
读的时候自动跳过。也就出现了SMbus_WriteArray(0xa2,0x03,Time_o, 7);    //=====重点 把Time_o数组写入器件A2 从地址0X03开始写,写7个数据。读的时候却是秒从0X02开始SMbus_ReadArray (0xa2,  0x02, Time_in, 7);       //==========重点

附PCF2129手册: pcf2129.pdf (951.52 KB, 下载次数: 12)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:16255 发表于 2022-12-2 11:23 | 只看该作者
这么贵啊……


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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