⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563c.c

📁 单片机C语言教程
💻 C
字号:
/*******************************************************************/
/* 这是用C51高级语言编写的pcf8563时钟日历读写程序-没有调用汇编语言,*/
/* 文件名 pcf8563C.C                                                */
/* 功能:本程序主要是读pcf8563的日历时钟值(共7个字节)、置pcf8563  */
/*       的日历时钟值。此外,还有分钟、小时、日和星期报警功能及4种  */
/*       不同频率的方波输出功能。                                   */
/********************************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char

sbit SDA=P1^0;
sbit SCL=P1^1;

uchar g8563_Store[7]; /*全局数组变量声明*/
uchar code c8563_Store[7]={0x00,0x59,0x07,0x00,0x15,0x07,0x07}; 
/*写入时间初值:07-07-15,星期日 07:59:00*/

/********************************************
功能:延时
********************************************/
void Delay()
{
    _nop_();
    _nop_(); /*根据晶振频率确定延时时间*/
}
/********************************************
功能:I2C开始
********************************************/
void Start()
{   
    SDA=1;
    SCL=1;
    Delay();
    SDA=0;
    Delay();
    SCL=0;
}
/********************************************
功能:I2C结束
********************************************/
void Stop()
{
    SDA=0;
    SCL=0;
    Delay();
    SCL=1;
    Delay();
    SDA=1;
    Delay();
}
/*********************************************************
功能:输出ACK,每个字节传输完成,输出ack=0,结束读数据,ack=1;
**********************************************************/
void WriteACK(uchar ack)
{
    SDA=ack;
    Delay();
    SCL=1;
    Delay();
    SCL=0;
}
/********************************************
功能:等待ACK
********************************************/
void WaitACK()
{   uchar errtime=20;
    SDA=1;
    Delay(); /*读ACK*/
    SCL=1;
    Delay();
    while(SDA)
    {   errtime--;
       if(!errtime) Stop();
    }
    SCL=0;
    Delay();
}
/********************************************
功能:写一个字节,入口:wdata=数据
********************************************/
void writebyte(uchar wdata)
{
    uchar i;
    for(i=0;i<8;i++)
    {
        if(wdata&0x80) SDA=1;
        else SDA=0;
        wdata<<=1;
        SCL=1;
        Delay();
        SCL=0;
    }
    WaitACK();  //I2C器件或通讯出错,将会退出I2C通讯
}
/********************************************
功能:读一个字节,出口:bytedata
********************************************/
uchar Readbyte()
{
    uchar i,bytedata;
    SDA=1;
    for(i=0;i<8;i++)
    {
       SCL=1;
       bytedata<<=1;
       bytedata|=SDA;
       SCL=0;
       Delay();
    }
    return(bytedata);
}
/********************************************
功能:输出数据->pcf8563
********************************************/
void writeData(uchar address,uchar mdata)
{
    Start();
    writebyte(0xa2);    /*写命令*/
    writebyte(address); /*写地址*/
    writebyte(mdata);   /*写数据*/
    Stop();
}
/********************************************
功能:输入数据<-pcf8563
********************************************/
uchar ReadData(uchar address) /*单字节*/
{   uchar rdata;
    Start();
    writebyte(0xa2);    /*写命令*/
    writebyte(address); /*写地址*/
    Start();
    writebyte(0xa3);    /*读命令*/
    rdata=Readbyte();
    WriteACK(1);
    Stop();
    return(rdata);
}
/********************************************
功能:输入多个数据<-pcf8563
********************************************/
void ReadData1(uchar address,uchar count,uchar * buff) /*多字节*/
{   uchar i;
    Start();
    writebyte(0xa2);    /*写命令*/
    writebyte(address); /*写地址*/
    Start();
    writebyte(0xa3);    /*读命令*/
    for(i=0;i<count;i++)
    {
         buff[i]=Readbyte();
         if(i<count-1) WriteACK(0);
    }
    WriteACK(1);
    Stop();
}
/********************************************
功能:读入时间到内部缓冲区
********************************************/
void P8563_Read()
{    uchar time[7];
     ReadData1(0x02,0x07,time);
     g8563_Store[0]=time[0]&0x7f; /*秒*/
     g8563_Store[1]=time[1]&0x7f; /*分*/
     g8563_Store[2]=time[2]&0x3f; /*小时*/
     g8563_Store[3]=time[3]&0x3f; /*日*/
     g8563_Store[4]=time[4]&0x07; /*星期*/
     g8563_Store[5]=time[5]&0x1f; /*月*/
     g8563_Store[6]=time[6]&0xff; /*年*/
}
/********************************************
功能:读入时间到内部缓冲区----外部调用
********************************************/
/*void P8563_gettime()
{
     P8563_Read();
     if(g8563_Store[0]==0)
       P8563_Read(); //如果秒为0,为防止时间变化,再读一次
}*/
/********************************************
功能:写时间修改值
********************************************/
void P8563_settime()
{
       uchar i;
       for(i=2;i<=8;i++) { writeData(i,g8563_Store[i-2]); }
}
/********************************************
功能:P8563的初始化
********************************************/
void P8563_init1()      //P8563的初始化
{
     uchar i;
     if((ReadData(0xa)&0x3f)!=0x8) /*检查是否第一次启动,是则初始化时间*/
     {
         for(i=0;i<=6;i++) g8563_Store[i]=c8563_Store[i]; /*初始化时间*/
         P8563_settime();
         writeData(0x0,0x00);
         writeData(0xa,0x8);  /*8:00报警*/
         writeData(0x1,0x12); /*报警有效*/
         writeData(0xd,0xf0);
     }
}
/********************************************
功能:主程序
********************************************/
main() 

{
 	      P8563_init1();   //P8563的初始化
        P8563_Read();    //读出时间
        while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -