⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1302.c

📁 一个基于51单片机的报警系统。包含有电路图
💻 C
字号:
#include <reg51.h>
//#include "main.h"


#define uchar unsigned char
#define uint unsigned int

///////////////////////////////////////////////////全局变量
uchar data calen[8]={0x30,0x58,0x23,0x31,0x04,0x03,0x06,0x00};		//日历存放地址
			//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);






void main(void)
{
	SP=0x3f;
        Delay_us(4);

	while(1)
		{
                CalendarInitial(calen);
                Delay_us(100);
		BurstR1302(calen);		//读日历,并送到pcalen[]中
		}
}

void CalendarInitial(pcalen)//日历初始化程序
uchar pcalen[8];
{
	uchar i;
	BurstW1302(pcalen);		//读日历,并送到pcalen[]中
	i=Read1302(0x80);
	i=i&0x7f;				//ch=0
	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 + -