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

📄 ds1302.h

📁 AVR读写1302源程序
💻 H
字号:
#ifndef __ds1302_H_
#define __ds1302_H_

#include "avr/io.h"

//管脚定义
#define		SCLK	2
#define		IO		1
#define		RET		0

//宏定义
#define		SCLK_H		PORTA |= (1<<SCLK);
#define		SCLK_L		PORTA &= ~(1<<SCLK);
#define		IO_H		PORTA |= (1<<IO);
#define		IO_L		PORTA &= ~(1<<IO);
#define		RET_H		PORTA |= (1<<RET);
#define		RET_L		PORTA &= ~(1<<RET);


//全局变量
unsigned char data_1302[8]={0};
unsigned char data_reg[31]={0};
unsigned char Get_data[7]={0};



void delay_us (unsigned int i)
{
	for (;i>0;i--);
}


//---------------------串行写入8位数据----------------
//入口:要发送的8位数据,先发送低位
void Send_Byte8 (unsigned char data)
{
	unsigned char i=0;
	for (i=0;i<8;i++)
		{
			if (data&0x01)
				{	
					IO_H;
				}
			else
				{
					IO_L;
				}
			SCLK_L;
//			delay_us(2);
			data=data>>1;
			SCLK_H;
//			delay_us(2);
		}

}


//----------------------串行读出8位数据--------------------
//出口:读出来的8位数据,先读低位
unsigned char Read_Byte8 (void)
{
	unsigned char i=0;
	unsigned char data=0;
	DDRA &= ~(1<<IO);//设为输入
	PORTA |=(1<<IO);
	for (i=0;i<8;i++)
		{
			SCLK_H;
//			delay_us(2);
			SCLK_L;
//			delay_us(2);
			data=data>>1;
			if (PINA&0X02)
				{
					data |=0x80;
				}
			else
				{
					data &=0x7f;
				}
		}
	DDRA |= (1<<IO);//设为输出
	return (data);
}


//--------------------写数据到ds1302-----------------------
void Write_ds1302 ( unsigned char addr, unsigned char data )
{
	RET_L;
	SCLK_L;
//	delay_us(2);
	RET_H;
//	delay_us(2);
	Send_Byte8 (addr);
	Send_Byte8( data );
	RET_L;
}



//----------------------从1302读数据----------------------
unsigned char Read_ds1302 (unsigned char adr)
{
	unsigned char read_data=0;
	RET_L;
	SCLK_L;
//	delay_us(2);
	RET_H;
//	delay_us(2);
	Send_Byte8 (adr);
	read_data=Read_Byte8();
	RET_L;
	return (read_data);
}



//----------------------写时钟数据进1302(多字节)-------------------
//入口:*data 格式:8位(BCD) 	秒 分 时 日 月 星期 年 控制
//							1B 1B 1B 1B 1B 1B   1B  1B
void W_1302(unsigned *data)
{
	unsigned char i;
	RET_L;
	SCLK_L;
	RET_H;
	Write_ds1302(0x8e,0x00);	//控制命令
	RET_L;
	SCLK_L;
	RET_H;
	Send_Byte8(0xbe);			//多字节控制指令
	for (i=0;i<8;i++)
		{
			Send_Byte8(*data);
			data++;
		}
	RET_L;
}


//-----------------------读1302时钟数据(多字节)---------------
void R_1302(void)
{
	unsigned char i;
	RET_L;
	SCLK_L;
	RET_H;
	Send_Byte8(0xbf);		//多字节读命令
	for (i=0;i<8;i++)
		{
			data_1302[i]=Read_Byte8();
		}
	RET_L;
}


//----------------------写数据到1302寄存器(多字节)-------------------
//
void Write_reg(unsigned char *data)
{
	unsigned char i;
	RET_L;
	SCLK_L;
	RET_H;
	Write_ds1302(0x8e,0x00);
	Send_Byte8(0xfe);
	for (i=31;i>0;i--)
		{
			Send_Byte8(*data);
			data++;
		}
	RET_L;
}


//------------------------读1302寄存器数据(多字节)----------------------
void Read_reg(void)
{
	unsigned char i;
	RET_L;
	SCLK_H;
	RET_H;
	Send_Byte(0xff);
	for (i=31;i>0;i--)
		{
			data_reg[i]=Read_Byte8();
		}
	RET_L;
}


//---------------------1302初始化------------------------
void Set_1302(unsigned char *data)
{
	unsigned char i;
	unsigned char addr=0x8c;
	Write_ds1302(0x8e,0x00);//关保护
	for (i=0;i<7;i++)
		{
			Write_ds1302(addr,*data);
			data++;
			addr-=2;
		}
//	Write_ds1302(0x8e,0x80);//写保护
}


//-------------------得到1302时钟数据------------------
void Get_1302 (void)
{
	unsigned char i;
	unsigned char addr=0x8d;
	for (i=0;i<7;i++)
		{
			Get_data[i]=Read_ds1302(addr);
			addr-=2;
		}	
}


	


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -