>
首 页文章中心单片机论坛电脑援救中心杀毒软件下载电子元件速查集成电路速查客户留言下载中心商品展示频道繁體中文
设为首页
加入收藏
联系我们
您当前的位置:中国单片机网 -> 单片机讲座 -> 文章内容 退出登录 用户管理
栏目导航
· 经典软件 · 单片机讲座
· 配套实验板 · ARM、AVR
· 电源技术 · 称重技术
· 硬件与电路 · 资料下载大全
· 轻松一刻 · 胡老师专栏
· l
热门文章
· 金华广播电视大学(金..
· 金华广播电视大学(金..
· [组图] 三极管s8050管..
· [图文] 324
· [组图] 326
· [组图] 51系列单片机..
· dac0832中文资料引脚..
· 金华电大2008年秋季..
· [组图] 三极管9013管..
· 电动机书下载大全
相关文章
· 实时时钟DS1302程序..
· 实时时钟模块DS1302..
· [组图] 实时时钟电路..
时钟芯片DS1302程序(C语言已调试通过)
作者:本站  来源:www.chinadpj.com  发布时间:2008-5-15 20:57:06  发布人:admin

减小字体 增大字体

时钟芯片DS1302程序(C语言已调试通过)

#ifndef _DS1302_H
#define _DS1302_H

#ifndef __C8051F020_H__
#include <C8051f020.h>
#endif

#ifndef _MACRO_H
#include "macro.h"
#endif

sbit ACC0 = ACC ^ 0;
sbit ACC7 = ACC ^ 7;

sbit DSRST = P2 ^ 7;                                    //时钟复位信号线
sbit DSDIO = P2 ^ 6;                                    //时钟数据线
sbit DSCLK = P2 ^ 5;                                    //时钟时钟线


#define SEC_WRI               0x80
#define SEC_READ              0x81
#define MIN_WRI               0x82
#define MIN_READ              0x83
#define HR_WRI                0x84
#define HR_READ               0x85
#define DATE_WRI              0x86
#define DATE_READ             0x87
#define MON_WRI               0x88
#define MON_READ              0x89
#define WEEK_WRI              0x8A
#define WEEK_READ             0x8B
#define YEAR_WRI              0x8C
#define YEAR_READ             0x8D
#define WRI_PROTECT_WRI       0x8E
#define WRI_PROTECT_READ      0x8F
#define CLOCK_MULTI_BYTE_WRI  0xBE
#define CLOCK_MULTI_BYTE_READ 0xBF
#define RAM_MULTI_BYTE_WRI    0xFE
#define RAM_MULTI_BYTE_READ   0xFF

#define DSRSTLOW()      DSRST = 0; _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_()

#define DSRSTHIGH()     DSRST = 1; _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_()

#define DSCLKLOW()      DSCLK = 0; _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_()
#define DSCLKHIGH()     DSCLK = 1; _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
                        _nop_(); _nop_(); _nop_(); _nop_(); _nop_()

extern uchar xdata dsWriDsI ;
extern uchar xdata dsWriCh  ;

extern uchar xdata dsReadDsK ;
extern uchar xdata dsReadCl  ;

extern uchar xdata ds1302SettimerBuffer[];
extern uchar xdata ds1302GettimerBuffer[];

void WriDs(uchar addr, uchar dat);
uchar ReadDs(uchar addr);

void SetTimer(uchar *pSetTimer);
void GetTimer(uchar *pGetTimer);

void OscEnable();
void Osc24();
void ChargeEnable();
void DsInit();

#endif
#include "DS1302.h"
#include


/********************************************************************
*
* 名称: OscEnable
* 说明:
* 功能: 时钟停止位使能
* call: v_W1302
* in:   no
* return:no
*********************************************************************/
void OscEnable()
{
     WriDs(0x80,0);
}

/********************************************************************
*
* name: Osc24
* state:
* fun:  use 24 hour record
* call: v_W1302
* in:   no
* return:no
*********************************************************************/
void Osc24()
{
     WriDs(0x84,0);
}

/********************************************************************
*
* 名称: ChargeEnable
* state:
* fun : 涓流充电使能
* 调用: v_W1302
* in:  no
* 返回值: 无
*********************************************************************/
void ChargeEnable()
{
     WriDs(0x90,0xa5); /*涓流充电,一个二极管,一个2k的电阻*/
}

/********************************************************************
*
* 名称:   DsInit()
* 说明:
* fun :   时钟芯片初始化
* call:   No
* in:     no
* return: no
*********************************************************************/
void DsInit()
{
     //T_CLK = 0;
     //T_RST = 0;
     //_nop_();
     //T_RST = 1;
     DSCLKLOW();
     DSRSTLOW();
     DSRSTHIGH();
     OscEnable();      /* 时钟停止位使能      */
     WriDs(0x8e,0x0);  /* 允许写入单个数据字节 */
     ChargeEnable();   /* 充电使能            */
     Osc24();
}

/**************************************************
*原型:void WriteDS(uchar addr, uchar dat)
*功能:向ds1302时钟芯片写入数据
*说明:无
*参数:dat 写入数据;addr 写入地址
*返回:无
**************************************************/
void WriDs(uchar addr, uchar dat)
{
    //uchar dsWriDsI;
    //uchar dsWriCh = 0x01;
    dsWriDsI = 0;
    dsWriCh  = 0x01;
    EA = 0;
    DSCLKLOW();
    DSRSTLOW();
    DSRSTHIGH();
    for(dsWriDsI = 0;  dsWriDsI < 8; dsWriDsI ++)
      {
            if(addr & dsWriCh)
            {
                DSDIO = 1;
            }
            else
            {
               DSDIO = 0;
            }
            dsWriCh = dsWriCh << 1;
            DSCLKHIGH();
            DSCLKLOW();
      }
      dsWriCh = 0x01;
      for(dsWriDsI = 0; dsWriDsI < 8; dsWriDsI ++)
      {
            if(dat & dsWriCh)
            {
                DSDIO = 1;
            }
            else
            {
                DSDIO = 0;
            }
            dsWriCh = dsWriCh << 1;
            DSCLKHIGH();
            DSCLKLOW();
      }
    DSRSTLOW();
    EA = 1;
}

/**************************************************
*原型:uchar ReadDS(uchar addr)
*功能:读取ds时钟内容
*说明:无
*参数:内部寄存器地址
*返回:寄存器内容
**************************************************/
uchar ReadDs(uchar addr)
{
    //uchar dsReadDsK;
    //uchar dsReadCl;
    dsReadDsK = 0;
    dsReadCl  = 0;

    DSRSTLOW();
    DSCLKLOW();
    DSRSTHIGH();
    dsReadCl = 0x01;
    for(dsReadDsK = 0; dsReadDsK < 8; dsReadDsK ++)
      {
          if(addr & dsReadCl)
          {
              DSDIO = 1;
          }
          else
          {
              DSDIO = 0;
          }
          dsReadCl = dsReadCl << 1;
          DSCLKHIGH();
          DSCLKLOW();
      }
    dsReadCl = 0;
    for(dsReadDsK = 0; dsReadDsK < 8; dsReadDsK ++)
      {
          dsReadCl = dsReadCl >> 1;
          if(DSDIO)
          {
              dsReadCl = dsReadCl + 0x80;
          }
          DSCLKHIGH();
          DSCLKLOW();
      }
    DSRSTLOW();
    return(dsReadCl);
}

void SetTimer(uchar *pSetTimer)
{
    WriDs(YEAR_WRI, *(pSetTimer + 0));
    WriDs(MON_WRI , *(pSetTimer + 1));
    WriDs(DATE_WRI, *(pSetTimer + 2));
    WriDs(HR_WRI  , *(pSetTimer + 3));
    WriDs(MIN_WRI , *(pSetTimer + 4));
    WriDs(SEC_WRI , *(pSetTimer + 5));
}

void GetTimer(uchar *pGetTimer)
{
    *(pGetTimer + 0) = ReadDs(YEAR_READ);
    *(pGetTimer + 1) = ReadDs(MON_READ);
    *(pGetTimer + 2) = ReadDs(DATE_READ);
    *(pGetTimer + 3) = ReadDs(HR_READ);
    *(pGetTimer + 4) = ReadDs(MIN_READ);
    *(pGetTimer + 5) = ReadDs(SEC_READ);
}</C

<C</C[本站www.chinadpj.com(中国单片机网),摘自:http://www.2008red.com/member_pic_377/files/mcuck/html/article_4511_1.shtml ]

[] [返回上一页] [打 印] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登录
Copyright © 2002-2020 www.chinadpj.com. All Rights Reserved. 浙ICP备06040125号
Powered by:NewAsp SiteManageSystem Version 2.1 SP1 1030