| 建议使用内置RTC的Ai MCU,不需要外挂RTC芯片 
 测试通过的DS1302程序如下:
 头文件:
 
 子程序:复制代码#define                DS1302_CLK                P30                        //定义DS1302时钟IO口
#define                DS1302_DAT                P31                        //定义DS1302数据IO口
#define                DS1302_RST                P32                        //定义DS1302复位IO口
#define                Protrct_Enable        0x80                //使能写保护
#define                Protect_Disable        0x00                //禁用写保护
#define                Write_Protect        0x8e                //定义写保护寄存器地址
#define                Write_TCS                0x90                //定义写充电寄存器地址
#define                Write_Year                0x8c                //定义写年寄存器地址
#define                Write_Week                0x8a                //定义写星期寄存器地址
#define                Write_Month                0x88                //定义写月寄存器地址
#define                Write_Date                0x86                //定义写日寄存器地址
#define                Write_Hour                0x84                //定义写小时寄存器地址
#define                Write_Minute        0x82                //定义写分钟寄存器地址
#define                Write_Second        0x80                //定义写秒钟寄存器地址
#define                Read_Year                0x8d                //定义读年寄存器地址
#define                Read_Week                0x8b                //定义读星期寄存器地址
#define                Read_Month                0x89                //定义读月寄存器地址
#define                Read_Date                0x87                //定义读日寄存器地址
#define                Read_Hour                0x85                //定义读小时寄存器地址
#define                Read_Minute                0x83                //定义读分钟寄存器地址
#define                Read_Second                0x81                //定义读秒钟寄存器地址
//#define                Init_TCS                0xa0                //设置DS1302充电方式为关闭
//#define                Init_TCS                0xa5                //设置DS1302充电方式为1个二极管,2K电阻
//#define                Init_TCS                0xa6                //设置DS1302充电方式为1个二极管,4K电阻
//#define                Init_TCS                0xa7                //设置DS1302充电方式为1个二极管,8K电阻
//#define                Init_TCS                0xa9                //设置DS1302充电方式为2个二极管,2K电阻
//#define                Init_TCS                0xaa                //设置DS1302充电方式为2个二极管,4K电阻
#define                Init_TCS                0xab                //设置DS1302充电方式为2个二极管,8K电阻
#define                Init_Year                0x25                //初始化年
#define                Init_Week                0x04                //初始化星期
#define                Init_Month                0x09                //初始化月
#define                Init_Date                0x04                //初始化日
#define                Init_Hour                0x12                //初始化小时
#define                Init_Minute                0x00                //初始化分钟
#define                Init_Second                0x00                //初始化秒钟
 
 调用:复制代码/*----------------------------地址、数据发送子程序----------------------------*/
void Write_DS1302 (unsigned char addr,unsigned char dat)
{
        unsigned char i,temp;                                //声明移位次数、临时变量
        DS1302_RST=0;                                                //拉低DS1302_RST,禁止DS1302数据传输
        DS1302_CLK=0;                                                //拉低DS1302_CLK
        DS1302_RST=1;                                                //DS1302_RST为高,使能DS1302数据传输
/*----------------------------发送地址----------------------------*/
        for (i=8;i>0;i--)                                        //循环移位8次
        {
                DS1302_CLK=0;                                        //拉低DS1302_CLK
                temp=addr;                                                //把地址赋值给临时变量
                DS1302_DAT=(bit)(temp&0x01);        //每次传输低字节,数据放到数据端口
                DS1302_CLK=1;                                        //拉高DS1302_CLK,锁存数据
                addr>>=1;                                                //地址右移一位
        }
/*----------------------------发送数据----------------------------*/
        for(i=8;i>0;i--)                                        //循环移位8次
        {
                DS1302_CLK=0;                                        //拉低DS1302_CLK
                temp=dat;                                                //把数据赋值给临时变量
                DS1302_DAT=(bit)(temp&0x01);        //只取最低一位
                DS1302_CLK=1;                                        //拉高DS1302_CLK,锁存数据
                dat>>=1;                                                //右移一位
        }
        DS1302_CLK=0;                                                //拉低DS1302_CLK
        DS1302_RST=0;                                                //拉低DS1302_RST,禁止DS1302数据传输
}
/*----------------------------数据读取子程序----------------------------*/
unsigned char Read_DS1302(unsigned char addr)
{
        unsigned char i,temp,dat,dat1;
        DS1302_RST=0;                                                //拉低DS1302_RST,禁止DS1302数据传输
        DS1302_CLK=0;                                                //拉低DS1302_CLK
        DS1302_RST=1;                                                //DS1302_RST为高,使能DS1302数据传输
/*----------------------------发送地址----------------------------*/
        for(i=8;i>0;i--)                                        //循环移位8次
        {
                DS1302_CLK=0;                                        //拉低DS1302_CLK
                temp=addr;                                                //把地址赋值给临时变量
                DS1302_DAT=(bit)(temp&0x01);        //每次传输低位
                DS1302_CLK=1;                                        //拉高DS1302_CLK,锁存数据
                addr>>=1;                                                //addr右移一位
        }
/*----------------------------读取数据----------------------------*/
        P3M0=P3M0&0x1d;
        for(i=8;i>0;i--)                                        //循环移位8次
        {
                ACC>>=1;                                                //ACC右移一位
                DS1302_CLK=1;                                        //先拉高DS1302_CLK
                DS1302_CLK=0;                                        //拉低DS1302_CLK,准备读取数据
                ACC_7=DS1302_DAT;                                //读取数据,ACC_7为存放数据变量的最高位一位
        }
        P3M0=P3M0|0x02;
        DS1302_CLK=0;                                                //拉低DS1302_CLK
        DS1302_RST=0;                                                //拉低DS1302_RST,禁止DS1302数据传输
        dat=ACC;                                                        //把ACC赋值给dat
        dat1=dat&0xf0;                                                //数据进制转换, 提取高四位
        dat1>>=4;                                                        //移动到低四位,作为十位
        dat=dat&0x0f;                                                //提取低四位,作为个位
        dat=dat+dat1*10;                                        //得到的十进制数
        return dat;                                                        //返回十进制值
}
/*----------------------------初始化DS1302----------------------------*/
void Init_DS1302(void)
{
        Write_DS1302(Write_Protect,Protect_Disable);        //禁用写保护
        Write_DS1302(Write_TCS,Init_TCS);                                //初始化充电方式
        Write_DS1302(Write_Year,Init_Year);                                //初始化年
        Write_DS1302(Write_Week,Init_Week);                                //初始化星期
        Write_DS1302(Write_Month,Init_Month);                        //初始化月
        Write_DS1302(Write_Date,Init_Date);                                //初始化日
        Write_DS1302(Write_Hour,Init_Hour);                                //初始化小时
        Write_DS1302(Write_Minute,Init_Minute);                        //初始化分钟
        Write_DS1302(Write_Second,Init_Second);                        //初始化秒钟
        Write_DS1302(Write_Protect,Protrct_Enable);                //使能写保护
}
 
 复制代码Read_DS1302(Read_Hour)
Read_DS1302(Read_Minute)
Read_DS1302(Read_Second)
 
 
 |