📄 ds1302.c
字号:
#include<reg52.h>
#include<rtx51tny.h>
#include"inc/define.h"
#include"inc/ds1302.h"
sbit rtc_rst=P1^5;
sbit rtc_clk=P1^6;
sbit rtc_io=P1^7;
sbit ACC_0=ACC^0;
sbit ACC_7=ACC^7;
extern vu8 idata for_showh[6];
extern vu8 idata for_showl[6];
extern vu8 idata week_tempert[8];
vu8 nowTime[7][2];
/*********************************************************
*将获取的当前时间、日期设置为待显示数据
*函数名称:setTimeShowData()
*说明:这是一个RTX51任务,os_create_task(2)之后开始运行
*********************************************************/
void setTimeShowData(void ) _task_ 3
{
while(1)
{
getTime(nowTime);
for_showh[0]=nowTime[6][1]; //设置年
for_showh[1]=nowTime[6][0];
for_showh[2]=nowTime[4][1]; //设置月
for_showh[3]=nowTime[4][0];
for_showh[4]=nowTime[3][1]; //设置日
for_showh[5]=nowTime[3][0];
if(!(nowTime[2][1] & 0x08)) //24时制
for_showl[0]=(nowTime[2][1] & 0x03); //设置时
else //12时制
for_showl[0]=(nowTime[2][1] & 0x01); //设置时
for_showl[1]=nowTime[2][0];
for_showl[2]=nowTime[1][1]; //设置分
for_showl[3]=nowTime[1][0];
for_showl[4]=nowTime[0][1]; //设置秒
for_showl[5]=nowTime[0][0];
week_tempert[2]=nowTime[5][0]; //设置周
os_wait(K_TMO,4,0);
}
}
/*********************************************************************
*向DS1302输入一个字节
*函数名称:DS1302_inputByte()
*说明:从低位开始传输
**********************************************************************/
void DS1302_inputByte(u8 byte)
{
u8 i;
ACC=byte;
for(i=8;i>0;i--)
{
rtc_io=ACC_0;
rtc_clk=1; //上升沿写入一位数据
rtc_clk=0;
ACC=ACC>>1;
}
}
/*********************************************************************
*从DS1302读出一个字节
*函数名称:DS1302_output()
*说明:从地位开始传输
**********************************************************************/
u8 DS1302_outputByte()
{
u8 i;
for(i=8;i>0;i--)
{
// rtc_io=1; //P1为准双向口,作为输入前先置高电平
ACC=ACC>>1;
rtc_clk=0; //下降沿读出一位数据
ACC_7=rtc_io; //???读一次读不到,应该是proteus设置的问题
ACC_7=rtc_io;
rtc_clk=1;
}
return ACC;
}
/***************************************************************
*写一个字节的时间数据到DS1302的时间寄存器
*函数名称:wr_1302()
*说明:
****************************************************************/
void wr_1302(u8 cmdw,u8 byte)
{
rtc_rst=0; //复位终止当前数据传输,准备新的数据传输
rtc_clk=0; //SCLK置低为~RST置高做准备
rtc_rst=1; //启动数据传送
DS1302_inputByte(cmdw);
DS1302_inputByte(byte);
rtc_rst=0;
}
/****************************************************************
*从DS1302的时间寄存器读一个字节的时间数据出来
*函数名称:rd_1302()
*说明:
*****************************************************************/
u8 rd_1302(u8 cmdw)
{
u8 byte;
rtc_rst=0; //复位终止当前数据传输,准备新的数据传输
rtc_clk=0; //SCLK置低为~RST置高做准备
rtc_rst=1; //启动数据传送
DS1302_inputByte(cmdw);
byte=DS1302_outputByte();
rtc_rst=0;
return byte;
}
/*****************************************************************
*将给定时间设定为当前时间
*函数名称:setTime()
*说明:
******************************************************************/
void setTime(u8 newTime[7][2])
{
u8 i;
u8 cmdw=0x80; //
u8 sect;
wr_1302(0x8e,0x00); //关闭写保护
for(i=0;i<7;i++)
{
if(i==5) //星期不设置,由芯片自动设置
;
else
{
sect=newTime[i][1]<<4;
sect+=newTime[i][0];
wr_1302(cmdw,sect);
}
cmdw+=2;
}
wr_1302(0x8e,0x80); //开启写保护
}
/****************************************************************
*从DS1302读取当前时间
*函数名称:getTime()
*说明:
*****************************************************************/
void getTime(u8 nowTime[7][2])
{
u8 i;
u8 cmdw=0x81;
u8 sect;
for(i=0;i<7;i++)
{
sect=rd_1302(cmdw);
nowTime[i][0]=sect & 0x0F;
nowTime[i][1]=(sect>>4) & 0x0F;
cmdw+=2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -