📄 ds1302.c
字号:
#include <reg51.h>
#include "main.h"
#define uchar unsigned char
#define uint unsigned int
///////////////////////////////////////////////////全局变量
//uchar idata calen[8]={0x9d,0x58,0x23,0x31,0x04,0x03,0x06,0x00}; //日历存放地址
//sbit T_CLK=P1^0; //1302的CLK引脚
//sbit T_IO=P1^1; //1302的数据引脚
//sbit T_RST=P1^2; //1302的复位引脚
void SystemInitial(void);
void CalendarInitial(uchar * pcalen); //日历初始化程序
void BurstR1302(uchar *pcalen); // 从1302读多字节,并存入日历数组中
void BurstR1302(uchar *pcalen); // 从1302读多字节,并存入日历数组中
void RTInputByte(uchar udata); //从1302写入一字节的数据
uchar RTOutputByte(void); //从1302读一字节的数据
void Writ1302(uchar uAddr,uchar udata); //写1字节的数据入指定地址
uchar Read1302(uchar uAddr); //从指定地址读出1字节数据
void BurstW1302(uchar * pcalen); //写入多字节的数据
void Set1302(uchar *pClock); //Set1302 Initial
void Delay_us(uchar i);
//sbit ACC0 = ACC^0;
//sbit ACC7 = ACC^7;
void main(void)
{
SP=0x3f;
Delay_us(4);
// uchar * pcalen;
// pcalen=calen;
// uchar calen[8]={52,67,8,5,8,6,6,0};
CalendarInitial(calen); //
while(1)
{
BurstR1302(calen); //读日历,并送到pcalen[]中
}
}
void CalendarInitial(pcalen)//日历初始化程序
uchar pcalen[8];
{
uchar i;
BurstW1302(pcalen); //读日历,并送到pcalen[]中
i=Read1302(0x80);
i=i&0x7f;
while(1)
{ //ch=0
Writ1302(0x80,i); //起震
Delay_us(100);
Writ1302(0x80,i);
}
}
void BurstR1302(pcalen) // 从1302读多字节,并存入日历数组中
uchar pcalen[8];
{
uchar i;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(0xbf); //oxbf 时钟多字节读命令
for(i=0; i<8; i++)
{
*pcalen=RTOutputByte(); //读1BYTE的数据
pcalen++ ;
}
T_CLK=1;
T_RST=0;
}
////////////////////////////////////////////////////////
void RTInputByte(udata) //to1302写入一字节的数据
uchar udata;
{
uchar i;
ACC=udata;
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=1;
T_CLK=0;
ACC=ACC>>1;
}
}
/////////////////////////////////////////////////////
uchar RTOutputByte(void) //从1302读一字节的数据
{
uchar i;
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=T_IO;
T_CLK=1;
T_CLK=0;
}
return(ACC);
}
//////////////////////////////////////////////////////
void Writ1302(uchar uAddr,uchar udata) //写1字节的数据入指定地址
{
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(uAddr); //先输入地址
RTInputByte(udata); //写数据
T_CLK=1;
T_RST=0;
}
//////////////////////////////////////////////////////
uchar Read1302(uchar uAddr) //从指定地址读出1字节数据
{
uchar udata;
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(uAddr); //写入地址
udata=RTOutputByte(); //读出数据
T_CLK=1;
T_RST=0;
return(udata);
}
/////////////////////////////////////////////////////
void BurstW1302(pcalen) //写入多字节的数据
uchar pcalen[8];
{
uchar i;
Writ1302(0x8e,0x00); //WP=0,写操作
T_RST=0;
T_CLK=0;
T_RST=1;
RTInputByte(0xbe); //0xbe ;时钟多字节写命令
for(i=8;i>0;i--)
{
RTInputByte(*pcalen);
pcalen++;
}
T_CLK=1;
T_RST=0;
}
////////////////////////////////////////////////////
/*void Set1302(uchar *pClock) //Set1302 Initial
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); // 控制命令,WP=0,写操作?
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); // 秒 分 时 日 月 星期 年
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); // 控制命令,WP=1,写保护?
}
*///////
void Delay_us(uchar i)
{
uchar d;
for(d=0;d<i;d++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -