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

📄 ds1302.c

📁 12864液晶显示万年历的51单片机仿真和程序 程序是C语言写的。仿真用的proteus
💻 C
字号:
//亦木明
//哪天写的忘了。^_^
#include <reg52.h>
//#include "ds1302.h"

#define uchar unsigned char
#define uint  unsigned int

#define SECOND 0x80		//秒
#define MINUTE 0x82		//分鍾
#define HOUR   0x84		//小時
#define DAY	   0x86		//天
#define MONTH  0x88		//月
#define WEEK   0x8a		//星期
#define YEAR   0x8c		//年

sbit DS1302_RST=P3^0;
sbit DS1302_SCLK=P3^1;
sbit DS1302_IO=P3^2;
	
typedef struct systime
{
	uchar 	cYear;
	uchar	cMon;
	uchar	cDay;
	uchar	cHour;
	uchar	cMin;
	uchar	cSec;
	uchar	cWeek;
}SYSTIME;
		 
void DS1302_Write(uchar D)
{
	uchar i;	
	for(i=0;i<8;i++)
	{	
		DS1302_IO=D&0x01;
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		D=D>>1;				
	}	
}

uchar DS1302_Read()
{
	uchar TempDat=0,i;
	for(i=0;i<8;i++)
	{	
		TempDat>>=1; 	
		if(DS1302_IO) TempDat=TempDat|0x80;
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		
	}	
    return TempDat;
}

void WDS1302(uchar ucAddr, uchar ucDat)	
{
    DS1302_RST = 0;
    DS1302_SCLK = 0;
    DS1302_RST = 1;
    DS1302_Write(ucAddr);       	// 地址,命令 
    DS1302_Write(ucDat);       	// 写1Byte数据
    DS1302_SCLK = 1;
    DS1302_RST = 0;
} 

uchar RDS1302(uchar ucAddr)
{
    uchar ucDat;
    DS1302_RST = 0;
    DS1302_SCLK = 0;
    DS1302_RST = 1;
    DS1302_Write(ucAddr);       	// 地址,命令 
    ucDat=DS1302_Read();       
    DS1302_SCLK = 1;
    DS1302_RST = 0;
	return ucDat;
}

void SetTime(SYSTIME sys)
{

    WDS1302(YEAR,sys.cYear); 
	WDS1302(MONTH,sys.cMon&0x1f);
	WDS1302(DAY,sys.cDay&0x3f);
	WDS1302(HOUR,sys.cHour&0xbf);
	WDS1302(MINUTE,sys.cMin&0x7f);
	WDS1302(SECOND,sys.cSec&0x7f);	
	WDS1302(WEEK,sys.cWeek&0x07);

}

void GetTime(SYSTIME *sys)
{
	uchar uiTempDat;
	uiTempDat=RDS1302(YEAR|0x01);			  
	(*sys).cYear=(uiTempDat>>4)*10+(uiTempDat&0x0f);

//	uiTempDat=RDS1302(0x88|0x01);
//	(*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);
	uiTempDat=RDS1302(0x88|0x01);
	(*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);	

	uiTempDat=RDS1302(DAY|0x01);
	(*sys).cDay=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);

	uiTempDat=RDS1302(HOUR|0x01);
	(*sys).cHour=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);

	uiTempDat=RDS1302(MINUTE|0x01);
	sys->cMin=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);

	uiTempDat=RDS1302(SECOND|0x01);
	sys->cSec=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);

	uiTempDat=RDS1302(MONTH|0x01);
	(*sys).cMon=uiTempDat&0x17;

	uiTempDat=RDS1302(WEEK|0x01);
	sys->cWeek=uiTempDat&0x07;
}

⌨️ 快捷键说明

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