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

📄 ds1302.c

📁 8051单片机访问外围器件的代码
💻 C
字号:
#define DS1302_GLOBALS
#include <AG1F1.h>
#include "DS1302.h"
/*
#define	DS1302_IO	P0_7
#define	DS1302_DIR	P0_4
#define	DS1302_CLK	P0_5
#define	DS1302_CE	P0_6
//*/
unsigned char xdata DS1302_CE _at_ 0xC00A;
unsigned char xdata DS1302_IO _at_ 0xC00B;
unsigned char xdata DS1302_CLK _at_ 0xC00C;
unsigned char xdata DS1302_DIR _at_ 0xC00D;

void	DS1302_delay(uint times)
{
	while((times--)>0);
}

void	DS1302_WR(uchar wrdata)
{
	uchar ucTmp;
	DS1302_DIR=1;//output
	for(ucTmp=0;ucTmp<8;ucTmp++)
	{
		DS1302_delay(1);
		DS1302_IO=wrdata&1;
		wrdata>>=1;
		DS1302_delay(2);
		DS1302_CLK=1;
		DS1302_delay(3);
		DS1302_CLK=0;
	}
}

uchar	DS1302_RD(void)
{
	uchar rddata=0;
	uchar ucTmp;
	uchar ucTmp1;
	DS1302_DIR=0;//input
	for(ucTmp=0;ucTmp<8;ucTmp++)
	{
		DS1302_delay(1);
		rddata>>=1;
		ucTmp1=DS1302_IO;
		if((ucTmp1&0x1)==0x1)
			rddata|=0x80;
		DS1302_delay(2);
		DS1302_CLK=1;
		DS1302_delay(3);
		DS1302_CLK=0;
	}
	return rddata;
}

void	set_clk(void)
{
	DS1302_CLK=0;
	DS1302_CE=1;
	DS1302_WR(0xBE);
	DS1302_WR(clk_second);
	DS1302_WR(clk_minute);
	DS1302_WR(clk_hour);
	DS1302_WR(clk_day);
	DS1302_WR(clk_month);
	DS1302_WR(clk_weekday);
	DS1302_WR(clk_year);
	DS1302_WR(clk_wrprotect);
	DS1302_CE=0;
}

void	get_clk(void)
{
	DS1302_CLK=0;
	DS1302_CE=1;
	DS1302_WR(0xBF);
	clk_second=DS1302_RD();
	clk_minute=DS1302_RD();
	clk_hour=DS1302_RD();
	clk_day=DS1302_RD();
	clk_month=DS1302_RD();
	clk_weekday=DS1302_RD();
	clk_year=DS1302_RD();
	clk_wrprotect=DS1302_RD();
	DS1302_CE=0;
}

void	write_clk(uchar wr_addr, uchar wr_data)
{
	DS1302_CLK=0;
	DS1302_CE=1;
	wr_addr&=0x1f;
	wr_addr<<=1;
	wr_addr|=0x80;
	DS1302_WR(wr_addr);
	DS1302_WR(wr_data);
	DS1302_CE=0;
}

uchar	read_clk(uchar rd_addr)
{
	uchar rd_data=0;
	DS1302_CLK=0;
	DS1302_CE=1;
	rd_addr&=0x1f;
	rd_addr<<=1;
	rd_addr|=0x81;
	DS1302_WR(rd_addr);
	rd_data=DS1302_RD();
	DS1302_CE=0;
	return rd_data;
}

void	set_clk_wrprotect(void)
{
	DS1302_CLK=0;
	DS1302_CE=1;
	DS1302_WR(0x8E);
	DS1302_WR(clk_wrprotect);
	DS1302_CE=0;
}

void	set_clk_charge(uchar charge_enable, uchar diode_number, uchar res_select)
{
	uchar clk_charge=0;
	if(charge_enable&1==1)
	{
		clk_charge=0xA0;
		diode_number&=0x3;
		diode_number<<=2;
		clk_charge&=diode_number;
		res_select&=0x3;
		clk_charge&=res_select;
	}
	DS1302_CLK=0;
	DS1302_CE=1;
	DS1302_WR(0x90);
	DS1302_WR(clk_charge);
	DS1302_CE=0;
	
}

⌨️ 快捷键说明

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