📄 ds1302.c
字号:
/********************************************************************
函 数 名:DS1302_Write_Byte
功 能:MCU向DS1302设备发送一个字节
说 明:主机:MCU;数据应在时钟下降沿发生变化,上升沿将数据写入DS1302内部移位寄存器
调用函数:DS1302延时函数:DS1302_Delay
全局变量:无
入口参数:待发送的字节数据 tbData
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Write_Byte(tByte tbData)
{
tByte tbTempSendCount= 0; //临时变量,发送次数
// 一次发送一位数据
for (tbTempSendCount = 0; tbTempSendCount < 8;tbTempSendCount++ )
{
if(tbData&0x01==0x01)
pDs1302Io=1;
else
pDs1302IO=0;
pDs1302Sclk=1;
DS1302_Delay();
pDs1302Sclk=0;//SCLK从高到低地跳变,传送一个字节
tbData=(tbData>>1);
}
}
/********************************************************************
函 数 名:DS1302_Read_Byte
功 能:MCU从DS1302设备读取一个字节
说 明:主机:DS1302;数据应在时钟下降沿发生变化,即数据在下降沿从移位寄存器输出,上升沿IO口成高阻态
调用函数:DS1302延时函数:DS1302_Delay
全局变量:无
入口参数:无
返 回 值:接受的数据:tbTempReadresult
设 计:CP
版本 :1
***********************************************************************/
tByte DS1302_Read_Byte(void)
{
tByte tbTempReadresult=0; // 临时变量,用于返回读取值
tByte tbTempSendCount=0; //临时变量,发送次数
for(tbTempSendCount=0;tbTempSendCount<8;++tbTempSendCount)
{
tbTempReadresult=tbTempReadresult>>1; //把前一次读取的数据右移一位,下次读取的数据保存到第7位
if(pDs1302Io==1) //读取1byte的数据保持到tbTempReadresult中
tbTempReadresult|=0x80;
else
tbTempReadresult&=0x7f;
pDs1302Sclk=1;//SCLK从高到低地跳变,移位脉冲有效,传送一个字节
DS1302_Delay();
pDs1302Sclk=0;
}
return(tbTempReadresult);
}
/********************************************************************
函 数 名:DS1302_Write
功 能:MCU向DS1302一个特定地址tbAddress发送一个数据tbData
说 明:主机:MCU;先写地址,再写数据
调用函数:DS1302写一个字节:DS1302_Write_Byte
全局变量:无
入口参数:待发送的地址 tbData;待发送的字节数据 tbData
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Write(tByte tbAddress,tByte tbData)
{
pDs1302Sclk=0;
pDs1302Rst=1;
DS1302_Write_Byte(tbAddress); //将地址tbAddress写入DS1302,选择与之对应的寄存器;
DS1302_Write_Byte(tbData); //将tbData写入地址为tbAddress的寄存器;
pDs1302Sclk=1;
pDs1302Rst=0;
}
/********************************************************************
函 数 名:DS1302_Read
功 能:MCU从DS1302一个特定地址tbAddress读取一个数据tbData
说 明:主机:DS1302;先写地址,再读数据;只有在SCLK为为低电平时,才能在RST置高电平
调用函数:DS1302读取一个字节:DS1302_Read_Byte;DS1302写一个字节:DS1302_Write_Byte
全局变量:无
入口参数:无
返 回 值:接受的数据:tbTempReadresult
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Read(tByte tbAddress)
{
tByte tbTempReadresult=0; // 临时变量,用于返回读取值
pDs1302Sclk=0;
pDs1302Rst=1;
DS1302_Write_Byte(tbAddress); //将地址tbAddress写入DS1302,选择与之对应的寄存器;
tbTempReadresult=DS1302_Read_Byte(); //从地址为tbAddress的寄存器读取字节;
pDs1302Sclk=1;
pDs1302Rst=0;
}
/********************************************************************
函 数 名:DS1302_Write_Time
功 能:MCU向DS1302发送时间
说 明:主机:MCU;
调用函数:DS1302读:DS1302_Write
全局变量:tbDS1302[];
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Write_Time()
{
DS1302_Write(0x8e,0); //将控制寄存器设置为0,去掉写保护;
DS1302_Write(0x8c,tbDsYear); //设置年;
DS1302_Write(0x88,tbDsMonth);//设置月;
DS1302_Write(0x86,tbDsDay); //设置日
DS1302_Write(0x8a,tbDsWeek); //设置星期几;
DS1302_Write(0x84,tbDsHour); //设置小时;
DS1302_Write(0x82,tbDsMinute); //设置分钟;
DS1302_Write(0x80,tbDsSecond); //设置秒;
DS1302_Write(0x8e,0x80); //将控制寄存器设置为0x80,添加写保护;
}
/********************************************************************
函 数 名:DS1302_Read_Time
功 能:MCU从DS1302读取时间
说 明:主机:DS1302;
调用函数:DS1302写:DS1302_Write
全局变量:tbDS1302[];
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Write_Time()
{
tbDsYear=DS1302_Read(0x8d); //读年;
tbDsMonth=DS1302_Read(0x89);//读月;
tbDsDay=DS1302_Read(0x87,tbDsDay); //读日
tbDsWeek=DS1302_Read(0x8b); //读星期几;
tbDsHour=DS1302_Read(0x85); //读小时;
tbDsMinute=DS1302_Read(0x83); //读分钟;
tbDsSecond=DS1302_Read(0x81); //读秒;
}
/********************************************************************
函 数 名:DS1302_Init
功 能:DS1302初始化
说 明:写入写保护,充电模式
调用函数:DS1302读取一个字节:DS1302_Read_Byte;DS1302写一个字节:DS1302_Write_Byte;延时函数DS1302_Delay
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Init()
{
tByte tbTempData=0; //临时变量 ;
pDs1302Rst=0; //设置DS1302_RST脚为低电平;
DS1302_Delay();
pDs1302Sclk=0;
DS1302_Write(0x8e,0); //将控制寄存器设置为0,去掉写保护;
DS1302_Write(0x90,0xa6); //写入充电模式;
//1010表示使能第10个滴流充电器;
//01表示在VCC1和VCC2之间接入一个二极管;
//10表示在VCC1和VC2之间接入两个并联的电阻;
tbTempData=DS1302_Read(0x81); //读第二个积存器;
if((tbTempData & 0x80)!=0)
DS1302_Write(0x80,0);
DS1302_Write(0x8e,0x80); //将控制寄存器设置为0x80,添加写保护;
}
/********************************************************************
函 数 名:DS1302_Delay
功 能:堰时几微妙
说 明:
调用函数:无
全局变量:无
入口参数:无
返 回 值:无
设 计:CP
版本 :1
***********************************************************************/
void DS1302_Delay(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -