建议使用内置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)
复制代码
|