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

📄 ds1302.c

📁 基于DS1302的51单片机数字时钟的c程序
💻 C
字号:
/************************************/
/*杭州电子&计算机工作室				*/
/*http://www.hificat.com			*/
/*DS1302测试程序					*/
/*目标器件:AT89S51					*/
/*晶振:11.0592MHZ					*/
/*编译环境:Keil 7.50A				*/
/************************************/

/*********************************包含头文件********************************/
#include "reg51.h"
#include <intrins.h>

/*********************************端口定义**********************************/
sbit DS1302_CLK = P1^0;
sbit DS1302_IO  = P1^1;
sbit DS1302_RST = P1^2;

/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

/******************************定义全局变量*********************************/
unsigned char second,minute,hour,week,day,month,year;		//秒、分、时、星期、日、月、年
unsigned char time[]={0x06,0x03,0x14,0x03,0x12,0x30,0x00};	//初始时间数组
/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/
void delay1(void)
{
	int k;
	for(k=0;k<400;k++);
}

/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(void)
{
	P2=0xfe;			
	P0=tab[hour/16];
	delay1();

	P2=0xfd;
	P0=tab[hour%16];
	delay1();

	P2=0xfb;
	P0=0xbf;			//显示"-"
	delay1();

	P2=0xf7;
	P0=tab[minute/16];
	delay1();

	P2=0xef;
	P0=tab[minute%16];
	delay1();

	P2=0xdf;
	P0=0xbf;			//显示"-"
	delay1();

	P2=0xbf;
	P0=tab[second/16];
	delay1();

	P2=0x7f;
	P0=tab[second%16];
	delay1();
}

/*****************************************************************************
函数功能:向DS1302送一字节数据子程序
入口参数:
出口参数:
*****************************************************************************/
void InputByte(unsigned char byte1)
{
	char i;
	for(i=8;i>0;i--)
	{
		DS1302_IO=(bit)(byte1&0x01);
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;
		byte1>>=1;
	}
	return;
}

/*****************************************************************************
函数功能:读DS1302一个字节子程序
入口参数:
出口参数:
*****************************************************************************/
unsigned char outputbyte(void)  
{
	unsigned char i;
	unsigned ucdat=0;
	for(i=8;i>0;i--)
	{
		DS1302_IO=1;
		ucdat>>=1;
		if(DS1302_IO)ucdat|=0x80;
		DS1302_CLK=1;
		_nop_();
		DS1302_CLK=0;
	 }
	 return(ucdat);
}

/*****************************************************************************
函数功能:向DS1302某地址写一字节数据子程序
入口参数:addr,TDat
出口参数:
*****************************************************************************/
void write_ds1302(unsigned char addr,unsigned char TDat)
{
	DS1302_RST=0;
	_nop_();
	DS1302_CLK=0;
	_nop_();
	DS1302_RST=1;
 	InputByte(addr);
	_nop_();
	InputByte(TDat);
	DS1302_CLK=1;
	_nop_();
	DS1302_RST=0;
}

/*****************************************************************************
函数功能:读DS1302地址子程序
入口参数:add
出口参数:timedata
*****************************************************************************/
unsigned char read_ds1302(unsigned char addr)
{
	unsigned char timedata;
	DS1302_RST=0;
	_nop_();
	DS1302_CLK=0;
	_nop_();
	DS1302_RST=1;
	InputByte(addr);
	timedata=OutputByte();
	DS1302_CLK=1;
	_nop_();
	DS1302_RST=0;
	return(timedata);
}

/*****************************************************************************
函数功能:初始化DS1302子程序
入口参数:time[](全局变量)
出口参数:
*****************************************************************************/
void initial_ds1302()
{
	write_ds1302(0x8e,0x00);		//写保护寄存器,在对时钟或RAM写前WP一定要为0
	write_ds1302(0x8c,time[0]);		//年
	write_ds1302(0x88,time[1]);		//月
	write_ds1302(0x86,time[2]);		//日
	write_ds1302(0x8A,time[3]);		//星期
	write_ds1302(0x84,time[4]);		//时
	write_ds1302(0x82,time[5]);		//分
	write_ds1302(0x80,time[6]);		//秒
	write_ds1302(0x8e,0x80);		//写保护寄存器
}

/*****************************************************************************
函数功能:读DS1302时间子程序
入口参数:
出口参数:全局变量(second,minute,hour,week,day,month,year)
*****************************************************************************/
void read_time()
{
	second=read_ds1302(0x81);		//秒寄存器
	minute=read_ds1302(0x83);		//分
	hour=read_ds1302(0x85);			//时
	week=read_ds1302(0x8B);			//星期
	day=read_ds1302(0x87);			//日
	month=read_ds1302(0x89);		//月
	year=read_ds1302(0x8d);			//年
}

/*****************************************************************************
函数功能:主程序
入口参数:
出口参数:
*****************************************************************************/
void main(void)
{
	initial_ds1302();				//初始化DS1302
	while(1)
	{
		read_time();				//读取时间
		display();					//显示时间
	}
}

⌨️ 快捷键说明

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