STM32对时钟芯片PCF8563的编程_第1页
STM32对时钟芯片PCF8563的编程_第2页
STM32对时钟芯片PCF8563的编程_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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_SLA VE_ADDRESS7 0xA0#define I2C_PageSize256 */SCL PA0/SDA PA1#define SCL_H() GPIO_SetBits(GPIOA, GPIO_Pin_0)#d

3、efine SCL_L() GPIO_ResetBits(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(vo

4、id);void IIC_Start(void);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_APB2PeriphClockC

5、md (RCC_APB2Periph_GPIOA, ENABLE);GPIO_InitStructure.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, &GPIO_InitStructure);SCL_H(); / 拉高SDA_H();void IIC_Start(void)

6、/* SDA_H();SCL_H(); delay_nus(20);SDA_L(); delay_nus(20);*/SDA_H();SCL_H(); delay_nus(20);SDA_L();delay_nus(20);SDA_L(); delay_nus(20);void IIC_Stop(void)SCL_L(); /1 delay_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

7、_L();SDA_H(); delay_nus(20);SCL_H();k = 0;while(Read_SDA()!= 0) && (k < 60000)k+; delay_nus(20);SCL_L(); delay_nus(20);void IIC_WriteByte(u8 byte)u8 i = 0;for(i = 0; i < 8; i+) SCL_L(); delay_nus(20); if(byte & 0x80) SDA_H();elseSDA_L(); delay_nus(20); SCL_H(); delay_nus(20); byte&

8、lt;<=1;SCL_L(); delay_nus(20);u8 IIC_ReadByte(void)u8 i,ReadByte;SDA_H();for(i = 0; i < 8; i+)ReadByte <<= 1;SCL_L(); delay_nus(20);SCL_H(); delay_nus(20); if(Read_SDA()ReadByte |= 0x01;elseReadByte &= (0x01);return ReadByte;void I2C_Ack(void)SCL_L(); delay_nus(20);SDA_L(); delay_nus

9、(20);SCL_H(); delay_nus(20);SCL_L(); delay_nus(20);void I2C_NoAck(void)SCL_L(); delay_nus(20); SDA_H(); delay_nus(20); SCL_H(); delay_nus(20); SCL_L(); delay_nus(20); PCF8563.h:#ifndef _PCF8563_H_#define _PCF8563_H_#include "IIC.h"#define ReadCode 0xa3#define WriteCode 0xa2 void PCF8563_In

10、it(void);u8 PCF8563_ReaDAdress(u8 Adress);void PCF8563_WriteAdress(u8 Adress, u8 DataTX);/取回 7 个字节的数据 :秒,分,时,天,星期,月份,年份。 /全局变量extern u8 PCF8563_Time7; void PCF8563_ReadTimes(void);/在 CLKOUT 上定时 1S 输出一个下降沿脉冲 void PCF8563_CLKOUT_1s(void);#endifPCF8563.c:#include "PCF8563.h"/全局变量 ,程序初始的值就是要初始

11、化的时间, /用途: 1:初始化时间。 2:读取返回时间 / 秒,分,时,天,星期,月份,年份。u8 PCF8563_Time7 = 50, 59, 23, 31, 6, 12, 12; void PCF8563_Init(void)IIC_Init();/十进制码转换成 BCD 码PCF8563_Time0 =PCF8563_Time1 =PCF8563_Time2 =PCF8563_Time3 = / PCF8563_Time4 = 期不用转换(PCF8563_Time0/10) << 4) | (PCF8563_Time0%10); (PCF8563_Time1/10) &l

12、t;< 4) | (PCF8563_Time1%10); (PCF8563_Time2/10) << 4) | (PCF8563_Time2%10); (PCF8563_Time3/10) << 4) | (PCF8563_Time3%10); (PCF8563_Time4/10 << 4) | (PCF8563_Time4%10);/ 星PCF8563_Time5 =(PCF8563_Time5/10 << 4) | (PCF8563_Time5%10);PCF8563_Time6 =(PCF8563_Time6/10 <<

13、4) | (PCF8563_Time6%10);PCF8563_CLKOUT_1s();PCF8563_WriteAdress(0x00, 0x20); / 禁止 RTC source clock /初始化 PCF8563 的时间PCF8563_WriteAdress(0x02, PCF8563_Time0);PCF8563_WriteAdress(0x03, PCF8563_Time1);PCF8563_WriteAdress(0x04, PCF8563_Time2);PCF8563_WriteAdress(0x05, PCF8563_Time3);PCF8563_WriteAdress(0

14、x06, PCF8563_Time4);PCF8563_WriteAdress(0x07, PCF8563_Time5);PCF8563_WriteAdress(0x08, PCF8563_Time6);PCF8563_WriteAdress(0x00, 0x00);/Enable RTC sorce clocku8 PCF8563_ReaDAdress(u8 Adress) u8 ReadData;IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(Adress);IIC_WaitAck();IIC_Start();IIC_

15、WriteByte(0xa3);IIC_WaitAck();ReadData = IIC_ReadByte();IIC_Stop();return ReadData;void PCF8563_WriteAdress(u8 Adress,u8 DataTX)IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(Adress);IIC_WaitAck();IIC_WriteByte(DataTX);IIC_WaitAck();IIC_Stop();/取回八个字节的数据 : 秒,分,时,天,星期,月份,年份。void PCF8563_

16、ReadTimes(void)IIC_Start();IIC_WriteByte(0xa2);IIC_WaitAck();IIC_WriteByte(0x02);IIC_WaitAck();IIC_Start();IIC_WriteByte(0xa3);IIC_WaitAck();PCF8563_Time0 = IIC_ReadByte()&0x7f;I2C_Ack();PCF8563_Time1 = IIC_ReadByte()&0x7f;I2C_Ack();PCF8563_Time2 = IIC_ReadByte()&0x3f;I2C_Ack();PCF8563_T

17、ime3 = IIC_ReadByte()&0x3f;I2C_Ack();PCF8563_Time4 = IIC_ReadByte()&0x07;I2C_Ack();PCF8563_Time5 = IIC_ReadByte()&0x1f;I2C_Ack();PCF8563_Time6 = IIC_ReadByte();I2C_NoAck();IIC_Stop();PCF8563_Time0 = (PCF8563_Time0&0xf0)>>4)*10 + (PCF8563_Time0&0x0f);PCF8563_Time1 = (PCF8563

18、_Time1&0xf0)>>4)*10 + (PCF8563_Time1&0x0f);PCF8563_Time2 = (PCF8563_Time2&0xf0)>>4)*10 + (PCF8563_Time2&0x0f);PCF8563_Time3 = (PCF8563_Time3&0xf0)>>4)*10 + (PCF8563_Time3&0x0f);PCF8563_Time4 = (PCF8563_Time4&0xf0)>>4)*10 + (PCF8563_Time4&0x0f);PCF8563_Time5 = (PCF8563_Time5&0xf0)>>4)*10 + (PCF8563_Time5&0x0f);PCF8563_Time6 = (PCF8563_Time6&0xf0)>>4)*10 +

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论