1、这是用 STM32 对 PCF8563 编程的程序、模拟 IIC,经验证可用 移植用到的文件:IIC.h IIC.c PCF8563.h PCF8563.c ,我把它们全都复制到了这个 Word文档里。使用要初始化的函数:void PCF8563_Init(void). 就唯一这个。全局变量: u8 PCF8563_Time7; 程序初始的值是给 PCF8563 设置的时间,程序中读取返回的值是 PCF8563 当时的时间。我这里使用的 IIC 的 SCL,SDA 的引脚分别为 PA.0 PA.1, 具体看 IIC.h 和 IIC.C。 只要修改好两个引脚的初始化配套你手上的板子这,就能成功移
2、植Delay_nus(20):这是一个延迟 20us 的函数。IIC.h:#ifndef _IIC_H_#define _IIC_H_#include “stm32f10x.h“/* Private typedef -*/* Private define -*/*#define I2C_Speed 100000#define I2C1_SLAVE_ADDRESS7 0xA0#define I2C_PageSize 256 */SCL PA0/SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#define SCL_L() GPIO_Re
3、setBits(GPIOA, GPIO_Pin_0)#define SDA_H() GPIO_SetBits(GPIOA, GPIO_Pin_1)#define SDA_L() GPIO_ResetBits(GPIOA, GPIO_Pin_1)/返回 0,和 1#define Read_SDA() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)u8 IIC_ReadByte(void);void IIC_WriteByte(u8 byte);void IIC_WaitAck(void);void IIC_Stop(void);void IIC_Start(vo
4、id);void IIC_Init(void);void I2C_Ack(void);void I2C_NoAck(void);/取回八个字节的数据:秒,分,时,天,星期,月份,年份。#endifIIC.c:#include “IIC.h“#include “delay.h“/*/void IIC_Init(void)GPIO_InitTypeDef GPIO_InitStructure;/* Configure I2C1 pins: SCL and SDA */RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitSt
5、ructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; /开漏输出,可以在不用改变成输入的情况下读取 IO 的电平GPIO_Init(GPIOA, SCL_H(); /拉高SDA_H();void IIC_Start(void)/* SDA_H();SCL_H();delay_nus(20);SDA_L();delay_nus(20);*/SDA_H();SCL_H();
6、delay_nus(20);SDA_L();delay_nus(20);SDA_L();delay_nus(20);void IIC_Stop(void)SCL_L(); /1delay_nus(20);/ 2SDA_L(); / 3. 1,2,3 这三行不可缺少delay_nus(20);SCL_H();delay_nus(20);SDA_H();delay_nus(20);void IIC_WaitAck(void)u16 k;SCL_L();SDA_H();delay_nus(20);SCL_H();k = 0;while(Read_SDA()!= 0) PCF8563_Time1 =
7、(PCF8563_Time1PCF8563_Time2 = (PCF8563_Time2PCF8563_Time3 = (PCF8563_Time3PCF8563_Time4 = (PCF8563_Time4PCF8563_Time5 = (PCF8563_Time5PCF8563_Time6 = (PCF8563_Time6/在 CLKOUT 上定时 1S 输出一个下降沿脉冲,经过验证,可以设置 STM32 的 GPIO 上拉输入,设置成下降沿中断,单片机每过 1S 产生一次中断void PCF8563_CLKOUT_1s(void)PCF8563_WriteAdress(0x01, 0); /禁止定时器输出,闹铃输出PCF8563_WriteAdress(0x0e, 0); /关闭定时器等等/ PCF8563_WriteAdress(0x0e, 0); /写入 1 PCF8563_WriteAdress(0x0d, 0x83); /打开输出脉冲