标题:
时钟芯片PCF2129的单片机读写子程序
[打印本页]
作者:
guobaox1981
时间:
2022-12-1 21:46
标题:
时钟芯片PCF2129的单片机读写子程序
时钟芯片PCF2129精度高,论坛没有这个芯片资料,刚好自己用到,找了好久改写调试通过,补充一下论坛资料,其他不多说了。
单片机源程序如下:
#include <C8051F410.h >
#include "C8051F410_SMBUS.h"
#ifndef __PCF2129_H__
#define __PCF2129_H__
#define PCF2129_SLA 0xA2 // 定义PCF2129的器件地址
#define s 0x00 // 定义PCF2129的秒寄存器地址
#define m 0x01 // 定义PCF2129的分寄存器地址
#define h 0x02 // 定义PCF2129的小时寄存器地址
#define d 0x03 // 定义PCF2129的天寄存器地址
#define wd 0x04 // 定义PCF2129的星期寄存器地址
#define mo 0x05 // 定义PCF2129的月寄存器地址
#define y 0x06 // 定义PCF2129的年寄存器地址
//extern idata unsigned char Time[7];
extern xdata unsigned char Time[7]; //时间寄存器
void PCF2129_W_time(void);
void PCF2129_R_time(void);
void PCF2129_Init(void);
#endif
由于我使用的是C8051F410芯片的硬件SMBUS(IIC)不具有通用性C文件就不发了,随便找一个模拟IIC子程序改写一下就好
#ifndef __C8051F410_SMBUS_H__
#define __C8051F410_SMBUS_H__
//------------------------------------------------------------------
void SMbus_W(uchar wrda ,uchar dat);//写半个字节(器件码,数据)
//适用与PCF8574iic扩展IO 器件码4e, 8574A器件码7e;
uchar SMbus_ByteR(uchar wrda ); //读半个字节 (器件码)
//适用与PCF8574iic扩展器件码4e, 8574A器件码7e; smbus时钟50khz
//=============================================================================
void SMbus_Write(uchar wrda ,uchar dest_addr, uchar dat);
// 写一个字节 ( 器件码 , 地址 , 数据 )
uchar SMbus_ByteRead(uchar wrda ,uchar dest_addr);
// 读一个字节 器件码 地址
//读流程为 (起始,器件码写,应答,操作地址,应答,停,起始,器件码读,应答,读数据)。
// 适用与EEPROM存储器件 24c02,器件码a0,24c16器件码a0-ae, 时钟PCF2129,取件码a2
//=======================================================================================
void SMbus_WriteArray(uchar wrda , uchar dest_addr, uchar *src_addr, uchar len);
//连续写一串数组 器件码 起始地址 数组 字数
//流程为(起始,器件码写,应答,操作地址,应答,写数据,应答,写N个数据————停)
void SMbus_Write_Array(uchar wrda,uchar dest_addr, uchar *src_addr,uchar len);
//断续写一串数组 器件码 起始地址 数组 字数
void SMbus_ReadArray (uchar wrda, uchar src_addr, uchar *dest_addr, uchar len);
// 读取一串数组 器件码 起始地址 读出存储位置 字数
//读流程为(起始,器件码写,应答,操作地址,应答,停,起始,器件码读,应答,读数据应答,————读N数据,停)
#endif
//=================================================================
#include "C8051F410.h"
#include "C8051F410_SMBUS.h"
#include "PCF2129.h"
//======================================================================
xdata unsigned char Time[7]; //时间寄存器
#define BCD_TO_HEX(bcd) ((((bcd)>>4)*10)+((bcd)&0x0F))
#define HEX_TO_BCD(hex) ((((hex)/10)<<4)+((hex)%10))
void PCF2129_W_time(void)
{
xdata unsigned char Time_o[7];
uchar x = 0;
for (x=0; x < 7; x++) // 清空数据缓冲区
Time_o[x] = 0;
SMbus_Write( 0xa2,0x00,0X20); //停止时钟
Time_o[s] = (HEX_TO_BCD(Time[s]))&0x7f; // 秒
Time_o[m] = (HEX_TO_BCD(Time[m]))&0x7f; // 分
Time_o[h] = (HEX_TO_BCD(Time[h]))&0x3f; // 小时
Time_o[d] = (HEX_TO_BCD(Time[d]))&0x3f; // 日
Time_o[wd] = (HEX_TO_BCD(Time[wd]))&0x07; // 星期
Time_o[mo] = (HEX_TO_BCD(Time[mo]))&0x3f; // 月
Time_o[y] = (HEX_TO_BCD(Time[y])); // 年
SMbus_WriteArray(0xa2,0x03,Time_o, 7);
SMbus_Write( 0xa2,0x00,0X00); //启动时钟
}
void PCF2129_R_time(void)
{
xdata unsigned char Time_in[7];
SMbus_ReadArray (0xa2, 0x02, Time_in, 7);
Time[s] = BCD_TO_HEX((Time_in[s]&0x7F)) ; // 秒
Time[m] = BCD_TO_HEX(Time_in[m]) ; // 分
Time[h] = BCD_TO_HEX(Time_in[h]) ; // 小时
Time[d] = BCD_TO_HEX(Time_in[d]) ; // 日
Time[wd] = BCD_TO_HEX(Time_in[wd]) ; // 星期
Time[mo] = BCD_TO_HEX(Time_in[mo]) ; // 月
Time[y] = BCD_TO_HEX(Time_in[y]) ; // 年
}
void PCF2129_Init(void)
{
// u8 x = 0;
SMbus_Write( 0xa2,0x00,0X00); //启动时钟
SMbus_Write( 0xa2,0x01,0X00); //启动时钟
SMbus_Write( 0xa2,0x02,0X00); //启动时钟
// SMbus_Write( 0xa2,0x10,0X82); //看门狗秒报警控制。
SMbus_Write( 0xa2,0x0f,0X06); // 设置CLKOUT为1Hz
SMbus_Write( 0xa2,0x19,0X0C); // 晶振老化补偿设为-4ppm
}
//================================================================
复制代码
注意重点这个芯片时间寄存器读和写位置是不同的 ,虽然手册给的寄存器序号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)
2022-12-1 21:40 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
mengsiu
时间:
2022-12-2 11:23
这么贵啊……
0.png
(168.8 KB, 下载次数: 57)
下载附件
2022-12-2 11:23 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1