DS1302驱动程序(平年和闰年天数自动调整)

发布者:polkmm最新更新时间:2016-11-18 来源: eefocus关键字:DS1302  驱动程序  平年  闰年  自动调整 手机看文章 扫描二维码
随时随地手机看文章

 /*********************************************************************************

1.本程序能够显示年,月,日,时,分,
  秒,星期七个参数.
  2.时间和日期可调。可分别完成年,月,日,时,分,
  秒六个参数的调整。支持平年和闰年天数的自动调整。
实验名称:时钟芯片DS12C887演示程序
    
          晶振:内部  8M
 接线方法:
     1.PA0-PA2分别接DS1302的CS,TADA,SLK.

*********************************************************************************/

#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ds1302_PIN             PINA&BIT(PA1) 
#define ds1302_DDR             DDRA
#define ds1302_DDR_OUT         ds1302_DDR|=BIT(PA0)|BIT(PA1)|BIT(PA2)
#define ds1302_DDR_IN          ds1302_DDR&=~(BIT(PA1)|BIT(PA2))
#define ds1302_PORT            PORTA 
#define ds1302_RST_H        ds1302_PORT|= BIT(PA0)  //片选               
#define ds1302_RST_L        ds1302_PORT&= ~BIT(PA0)                                           
#define ds1302_DAT_H        ds1302_PORT|= BIT(PA1)  //数据                            
#define ds1302_DAT_L        ds1302_PORT&= ~BIT(PA1)  
#define ds1302_CLK_H        ds1302_PORT|= BIT(PA2)  //时钟                          
#define ds1302_CLK_L        ds1302_PORT&= ~BIT(PA2) 
const char start_time[]={0x00,0x00,0x00,0x01,0x01,0x07,0x06};   //初始值;
char month_p[13]={0,31,28,31,30,31,30,31,31,30,31,30,31,};//平年
char month_y[13]={0,31,29,31,30,31,30,31,31,30,31,30,31,};//闰年
uchar second=0;
uchar minute=0;
uchar hour=0;
uchar day=1;
uchar month=1;
uchar year=6;
uchar week=7;
uchar month_max=0;//每月最大天数
/****************DS1302子程序***********************/
void ds1302_inputbyte(uchar CD)  //写入一字节数据
{
   uchar i,mid=0;
  for (i=8;i>0;i--)
  {
     mid=CD&0x01;
   if (mid==0)
   ds1302_DAT_L; 
   else
   ds1302_DAT_H ;
   ds1302_CLK_H ;
   ds1302_CLK_L ;
   CD=CD>>1;
 }
}
uchar ds1302_outputbyte(void)  //读取一字节数据
{
    uchar i,mid=0;
   for (i=8;i>0;i--)
   {
       ds1302_DDR_IN;
    mid=mid>>1;
    if ((ds1302_PIN)==0)
    mid&=~BIT(PB7);
    else
    mid|=BIT(PB7);
    ds1302_DDR_OUT;
    ds1302_CLK_H ;
    ds1302_CLK_L ;
   }
   return(mid);
}
void w1302(uchar ucAddr,uchar ucDa)   //写入数据
{
   ds1302_DDR_OUT ;
  ds1302_RST_L;
  ds1302_CLK_L;
  ds1302_RST_H;
  ds1302_inputbyte(ucAddr);
  ds1302_inputbyte(ucDa);
  ds1302_CLK_H ;
  ds1302_RST_L;
}
uchar r1302(uchar ucAddr)        //读取数据
{
    uchar ucDa;
   ds1302_DDR_OUT ;
   ds1302_RST_L;
   ds1302_CLK_L ;
   ds1302_RST_H ;
   ds1302_inputbyte(ucAddr);
   ucDa=ds1302_outputbyte();
   ds1302_CLK_H ;
   ds1302_RST_L;
   return(ucDa);
}
//设置初始时间
//格式:秒,分,时,日,月,星期,年
void set1302()
{
   uchar i;
  uchar ucaddr=0x80;
  w1302(0x8e,0x00);//写允许
  w1302(0x90,0xa6);//打开充电功能
  for (i=0;i<7;i++)
  {
     w1302(ucaddr,start_time[i]);
   ucaddr+=2;
  }
 w1302(0x8e,0x80);//写禁止
}
//读取当前时间
void get1302()
{
   uchar i=0,ucaddr=0x81;
  uchar uctimer[6];
  char sec1,day1,mon1,year1,min1,hour1;
  for (i=0;i<7;i++)
  {
     uctimer[i]=r1302(ucaddr);
   ucaddr+=2;
   }
   sec1=uctimer[0];//十进制到二进制的调整
   second=((sec1&0x70)>>4)*10+(sec1&0x0f);
   min1=uctimer[1];
   minute=((min1&0x70)>>4)*10+(min1&0x0f);
   hour1=uctimer[2];
   hour=((hour1&0x30)>>4)*10+(hour1&0x0f);
   day1=uctimer[3];
   day=((day1&0x30)>>4)*10+(day1&0x0f);
   mon1=uctimer[4];
   month=((mon1&0x10)>>4)*10+(mon1&0x0f);
   week=uctimer[5];
   year1=uctimer[6];
   year=((year1&0x70)>>4)*10+(year1&0x0f);
}
void second_set()   //调秒
{
   w1302(0x8e,0x00);
  w1302(0x80,((second/10)<<4)+(second%10));
  w1302(0x8e,0x80);
}

void minute_set()  //调分
{
   w1302(0x8e,0x00);
  w1302(0x82,((minute/10)<<4)+(minute%10));
  w1302(0x8e,0x80);
}

void hour_set()  //调时
{
   w1302(0x8e,0x00);
  w1302(0x84,((hour/10)<<4)+(hour%10));
  w1302(0x8e,0x80);
}

void year_set()  //调年
{
   year++;
  if (year>69)
  year=6;
  if (year%4==0)
  month_max=month_y[month];
  else
  month_max=month_p[month];
  if (day>month_max)
  day=month_max;
  day_set();
  w1302(0x8e,0x00);
  w1302(0x8c,((year/10)<<4)+(year%10));
  w1302(0x8e,0x80);
}

void month_set()  //调月
{
   month++;
  if (month>12)
  month=1;
  if (year%4==0)
  month_max=month_y[month];
  else
  month_max=month_p[month];
  if (day>month_max)
  day=month_max;
  day_set();
  w1302(0x8e,0x00);
  w1302(0x88,((month/10)<<4)+(month%10));
  w1302(0x8e,0x80);
}

void day_set()  //调日
{
   uchar i=0;
  uchar j=0;
  uchar month_m=0;
  uint day_n=0;
  day_n=0;
  for (i=6;i  {
     if (i   {
     if (i%4==0)
   day_n=day_n+366;
   else
   day_n=day_n+365;
    }
    if (i==year)
    {
       if (month>1)
       {
         for (j=1;j      {
          if (year%4==0)
          month_m=month_y[j];
        else
        month_m=month_p[j];
        day_n=day_n+month_m;
     }
         }
            }
      }
   if (year%4==0)
   month_max=month_y[month];
   else
   month_max=month_p[month];
   if (day>month_max)
   day=1;
   week=(day_n+day-1)%7;
   if (week==0)
   week=7;
   w1302(0x8e,0x00);
   w1302(0x86,((day/10)<<4)+(day%10));
   w1302(0x8a,week);
   w1302(0x8e,0x80);
}


关键字:DS1302  驱动程序  平年  闰年  自动调整 引用地址:DS1302驱动程序(平年和闰年天数自动调整)

上一篇:DS18B20的驱动程序
下一篇:时钟芯片DS12C887驱动程序

推荐阅读最新更新时间:2024-03-16 15:21

DS3231模块配合stc89c52程序与原理图
这一阶段一直在学习宋雪松老师的书,感觉写的很棒,在普中开发板上写了DS1302的时钟(虽然很渣,自带的时钟芯片还有问题),心血来潮买了个时钟模块DS2321,买来不会用 卖家提供的是Arduino的程序,源程序网上很多,但总想自己写,看了半天的DS2321时序图恍然大悟——这不是IIC时序么,赶紧把之前写的IIC文件拿过来,写了个下载进去,时钟不动,检查了一下是器件地址多加了 1,改完走的一溜一溜的,程序名字是DS1302,因为是从1302改过来的,名字懒得改,并不是挂羊头卖狗肉 可以放心食用 实物图 单片机源程序如下: #include reg52.h #include intrins.h typedef unsig
[单片机]
DS3231模块配合stc89c52程序与原理图
STM32开发笔记85: SX1268驱动程序设计(芯片唤醒)
单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片唤醒驱动程序。 一、RxDutyCycle模式 在讲述本篇内容之前,我们先来看一下SX1268的一种模式RxDutyCycle,译为中文为接收占空比模式。其可使用SetRxDutyCycle命令进入RxDutyCycle模式,我们来看一下该命令的详细解释。 该命令具有2个参数,从字面的意思可以看出,1个是指接收周期时间,另1个是指睡眠周期时间。我们可分析出,该命令是在RX模式和SLEEP模式之间自动转换的一种模式,其目的是为了节省芯片功耗。如果在使能外部中断后,则单片机可以进入睡眠态,SX1268大部分时间也是
[单片机]
STM32开发笔记85: SX1268<font color='red'>驱动程序</font>设计(芯片唤醒)
PCI总线语音卡及WDM驱动程序设计
CTI(Computer Telephone Integration)即计算机电话集成技术已经发展了30多年。其中电话语音卡是CTI中的典型应用之一,它作为电脑与公用电话网的接口设备,应用领域已经渗透到社会各个部门。同时,在语音卡的开发中也不断注入了新的技术,软件上有语音合成、语音识别等技术,而硬件上最重要的就是DSP技术和PCI总线技术。研制了基于TMS320VC5410 DSP的PCI语音卡,并设计了相应的WDM设备驱动程序,取得了良好的效果。 1 硬件设计 1.1 PCI总线控制芯片PCI2040 PCI总线是一种不依附于某个具体处理器的局部总线,它支持32位或64位的总线宽度,频率通常是33MHz,目前最快的P
[嵌入式]
基于eCos操作系统的FLASH驱动程序分析与移植
0 引 言     嵌入式系统需要支持的外部设备种类繁多,如何构造运行良好的嵌入式设备的驱动程序,对嵌入式操作系统的实际应用有重要意义。eCos是一种源代码公开的实时嵌人式操作系统,对嵌入式应用具有良好的支持,内核专门设计了便于设备驱动管理和开发的I/O包和DEV包,开发人员可以方便地将自己开发的驱动程序加入其中,与别的系统组件一起进行配置。 1 系统目标板简介     硬件目标板是为无人机系统设计的系统开发板,它是从Arca系统测试板经过功能简化设计而来的满足无人机系统要求的目标板。硬件目标板如图1所示。     GT2000支持SRAM,FLASH,ROM,VLIO(静态段支持可变等待时间I/O设备)和S
[嵌入式]
07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键驱动程序
一、查询方式的按键驱动程序 查询方式的按键驱动程序,与LED驱动程序类似,我们来复习一下上节的写好的字符设备驱动程序框架,改写出查询方式的按键驱动程序。 (1)按键驱动程序如下: Open中配置引脚 Read中返回引脚状态 入口函数:地址映射 虚拟地址 #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include asm/uaccess.h #include asm/irq.h #include asm/io.h #
[单片机]
07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键<font color='red'>驱动程序</font>
STM32开发笔记83: SX1268驱动程序设计(芯片复位)
单片机型号:STM32L053R8T6 本系列开发日志,将详述SX1268驱动程序的整个设计过程,本篇介绍芯片复位驱动程序。 一、数据手册 1、NRESET是芯片第15引脚,低有效。 2、通过15引脚NREST,可以达到完整的芯片复位。复位后,会执行标准的校准程序,先前的内容将丢失。复位最短时间为50us,给100us较为合适。 3、这张图是芯片各个模式的引脚的状态表,可以看到除复位模式外,其余模式NREST引脚的状态都为IN PU,其意思是输入上拉,其上拉值为50K。 二、程序 1、由于其内部上来,我们可以给出低功耗的程序,不将单片机控制NREST的引脚设置为输出,而设置为analog引脚,程序如下: c
[单片机]
STM32开发笔记83: SX1268<font color='red'>驱动程序</font>设计(芯片复位)
基于设备树的led驱动程序
1 #include linux/module.h 2 #include linux/kernel.h 3 #include linux/fs.h 4 #include linux/init.h 5 #include linux/delay.h 6 #include asm/io.h 7 #include linux/cdev.h 8 #include linux/device.h 9 #include linux/bitmap.h 10 #include asm/gpio.h 11 #include linux/platform_device.h 12 #include linux/sla
[单片机]
东芝推出超大裸眼3D电视 自动跟踪人脸调整画面
  电影《阿凡达》使3D技术家喻户晓,不过彼时的3D电影尚需要观众佩戴专属的眼镜。据美国物理学家组织网9月4日报道,日本东芝公司在本周初的2011年柏林国际消费电子展上,展示了55英寸的裸眼3D电视。   东芝公司称,这个超大的液晶显示器超薄电视机,即3D电视55ZL2,是迄今为止最先进的电视,运用了最新的影像技术。它借助高性能的CEVO-ENGINE图像处理器,可以对输入信号进行高精细度的“超解像”处理,以实现最佳的2D和3D显示效果。       东芝公司采用了基于立体原理的成像技术。人以左右眼看同样的对象时,由于两眼所见角度不同,在视网膜上形成的像并不完全相同,这两个成像经过大脑综合后能区分物体的前后、远近,从而产生
[家用电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved