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

📄 1302.h

📁 本资料为基于单片机89C55+LCD12864的万年历
💻 H
字号:
#ifndef _DS1302_H__			 //防止重载
#define _DS1302_H__
#define uchar unsigned char
#define uint unsigned int
#define ds1302_second 0x80
#define ds1302_minute 0x82
#define ds1302_hour 0x84
#define ds1302_day 0x86
#define ds1302_week 0x8a
#define ds1302_month 0x88
#define ds1302_year 0x8c
/**端口定义**/
sbit  IO=P1^6;
sbit CLK=P1^7;
sbit RST=P1^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;

uchar datastring[13];         ////存放时间的数组1302.h

/***********主函数*************/
sbit ringout=P3^7;	   //闹钟信号输出端,0为关闭
uchar idata datatemp[96];//数据暂存
uchar idata ringtime[5]={1,1,1,1,0};
uint ringdelay=0; //闹钟时长
bit ringflag=0,ringoff=0; //正在闹钟标志、闹钟关闭标志
/*********1802.h****************/
sbit DQ=P3^0;
uchar temp[2];
uchar flag1820=0;
/************12864**************/
sbit E=P1^2;  //使能端
sbit RW=P1^1;  //读写端 
sbit RS=P1^0;  //数据命令端口
sbit CS1=P1^3;
sbit CS2=P1^4;
/*****************************/

void ds1302_write(uchar dat)
{
  uchar i,j;
  j=dat;
  for(i=0;i<8;i++)		//这里有一个让我郁闷了几天的问题,如果把j都改为ACC这句改为
   {					//for(i=0;i<8;i++)仿真就会不成功,高手指点下!!
     IO=j&0x01;			
	 CLK=1;
	 CLK=0;
	 j>>=1;
   }
}
/**实时时钟读出一个字节**/
uchar ds1302_read()
{
  uchar i;
  for(i=0;i<8;i++)
    {
	  ACC=ACC>>1;	
	  ACC7=IO;
	  CLK=1;
	  CLK=0;
	}
  return(ACC);
}
/**写入数据**/
void dat_write(uchar addr,uchar dat)   //addr为要写数据的地址,dat为要写的数据
{
  RST=0;
  CLK=0;
  RST=1;
  ds1302_write(addr);
  ds1302_write(dat);
  CLK=1;
  RST=0;
}	
/**读出数据**/
uchar dat_read(uchar addr)
{
  uchar dat;
  RST=0;
  CLK=0;
  RST=1;
  ds1302_write(addr|0x01);
  dat=ds1302_read();
  CLK=1;
  RST=0;
  return(dat);
}
/**是否写保护**/
void ds1302_protect(bit flag)
{
  if(flag)
    dat_write(0x8e,0x10);			 //禁止写
  else
    dat_write(0x8e,0x00);			 //允许写
}
/**时间设置**/
void settime(uchar addr,uchar value)
{
  ds1302_protect(0);
  dat_write(addr,value);
  ds1302_protect(1);
}
/**时间增减设置**
void set(uchar adr,bit flag)
{
  uchar dat;
  dat=dat_read(adr);
  if(flag)
    dat_write(adr,dat+1);
  else
    dat_write(adr,dat-1);
}
/**12/24小时时间设置**/
void day_set(bit flag)				 //flag为1为12时制,为0则为24小时制
{ 
  uchar hour;
  hour=(dat_read(0x85)&0x7f);		 //保留小时寄存器中原有的时间值
  ds1302_protect(0)	;
  if(flag)
    {
	  dat_write(0x84,0x80|hour);
	}
  else
    {
	  dat_write(0x84,0x00|hour);
	}
  ds1302_protect(1);
} 
/**取时间**/
void gettime() 
{
  uchar readvalue;
  readvalue=dat_read(ds1302_second);
  datastring[10]=((readvalue&0x70)>>4); //取秒:高4位的低3位为十位,低4位为个位
  datastring[11]=readvalue&0x0f;	
   readvalue=dat_read(ds1302_minute);
  datastring[8]=((readvalue&0x70)>>4);  	//取分:高4位的低3位为十位,低4位为个位
  datastring[9]=(readvalue&0x0f);
  readvalue=dat_read(ds1302_hour);						 	
  datastring[6]=((readvalue&0x30)>>4);	   //取时:高4位的低2位为十位,低4位为个位
  datastring[7]=readvalue&0x0f;
  readvalue=dat_read(ds1302_day);
  datastring[4]=((readvalue&0x30)>>4);	 	  //取日:高4位的低2位为十位,低4位为个位
  datastring[5]=readvalue&0x0f;
  readvalue=dat_read(ds1302_week);
  datastring[12]=(readvalue&0x07);								 //取星期:低3位
   readvalue=dat_read(ds1302_month);
  datastring[2]=((readvalue&0x10)>>4);	 //取月: 高4位的低1位为十位,低4位为个位
  datastring[3]=readvalue&0x0f;
  readvalue=dat_read(ds1302_year);
  datastring[0]=((readvalue&0xf0)>>4);		  //取年:高4位为十位,低4位为个位
  datastring[1]=readvalue&0x0f;
}
   /**初始时间设置为2008-08-08 08时08分08秒**/
void init_time(void)
{
  day_set(0);
  settime(ds1302_second,0x08);
  settime(ds1302_minute,0x08);
  settime(ds1302_hour,0x18);
  settime(ds1302_day,0x10);
  settime(ds1302_month,0x12);
  settime(ds1302_year,0x08);
  settime(ds1302_week,0x05);
  }
   /**DS1302初始化**/
void init_ds1302(void)
{
  uchar second=dat_read(ds1302_second);
  if(second&0x80)
    settime(ds1302_second,0);
}

#endif

⌨️ 快捷键说明

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