1948|1

10

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求大神看看解释一下这个程序 [复制链接]

这个是ds1337时钟芯片的程序, 有没有用到中断(是不是每秒钟rtc向430发送一次中断??)
怎么初始化时间  怎么使用?
c文件:
#include        "Main_Proc.h"

/*------------------------------------------------*/
//        时间数组: 秒,分,时,星期,日,月,年

unsigned char    DS1337_RTC_Time[7];                    //时间结构体
//               [0]-秒十六进制 [6:4]-十位, [3:0]-个位
//               [1]-分十六进制 [6:4]-十位, [3:0]-个位
//               [2]-时十六进制 [6]-12/24小时, [5:4]-十位, [3:0]-个位
//               [3]-星期 [2:0]-星期,范围1~7
//               [4]-日期十六进制 [5:4]-十位, [3:0]-个位
//               [5]-月份十六进制 [4]-十位, [3:0]-个位
//               [6]-年份十六进制 [7:4]-十位, [3:0]-个位,从2000年开始,即,实际年份为2000+[6]的值

/**************************************************/
//        函数功能: I2C延时,实际延时由外部的EPLD实现
//            I2C总线速度小于CPU的主频,需要延时操作
//  输入参数: 无
//  输出参数: 无
/*------------------------------------------------*/

void    DS1337_I2C_Delay( void )
{
    unsigned char i;

    i=10;
    while(i--)
        _NOP();
}

/**************************************************/
//        函数功能: DS1337 I2C 时序启动子函数
//  输入参数: 无
//  输出参数: 无
/*------------------------------------------------*/

void   DS1337_I2C_Start( void )
{
    PIN_DS1337_SDA_0;                    //启动信号
    DS1337_I2C_Delay();
    PIN_DS1337_SCK_0;
    DS1337_I2C_Delay();
}

/**************************************************/
//        函数功能: DS1337 I2C 时序结束子函数
//  输入参数: 无
//  输出参数: 无
/*------------------------------------------------*/

void   DS1337_I2C_Stop( void )
{
    PIN_DS1337_SCK_1;
    DS1337_I2C_Delay();
    PIN_DS1337_SDA_1;
    DS1337_I2C_Delay();
}

/**************************************************/
//        函数功能: DS1337 I2C ACK结束子函数
//  输入参数: Master=1,表示主设备产生ACK信号,将数据拉低
//  输出参数: 无
/*------------------------------------------------*/

void   DS1337_I2C_ACK( void )
{
    PIN_DS1337_SDA_0;
    DS1337_I2C_Delay();
    PIN_DS1337_SCK_1;
    DS1337_I2C_Delay();
    PIN_DS1337_SCK_0;
    DS1337_I2C_Delay();
}

/**************************************************/
//        函数功能: DS1337 I2C 读取1个字节子函数
//  输入参数: 无
//  输出参数: 读取字节的结果数据
/*------------------------------------------------*/

unsigned char   DS1337_I2C_Read( void )
{
    unsigned char ReadByte, i;

    PIN_DS1337_SDA_1;                       //释放总线,方便读取
    PIN_DS1337_SDA_IN_Init;
    DS1337_I2C_Delay();

    for ( i=0;i<8;i++ )
    {
        ReadByte <<= 1;
        if ( PIN_DS1337_SDA_IN )
            ReadByte += 1;

        PIN_DS1337_SCK_1;
        DS1337_I2C_Delay();
        PIN_DS1337_SCK_0;
        DS1337_I2C_Delay();
    }
    PIN_DS1337_SDA_OUT_Init;
    return( ReadByte );
}

/**************************************************/
//        函数功能: DS1337 I2C 发送1个字节子函数
//  输入参数: 待发送的字节数据
//  输出参数: 无
/*------------------------------------------------*/

void   DS1337_I2C_Send( unsigned char SendData )
{
    unsigned char SendByte, i;

    SendByte = SendData;

    for ( i=0;i<8;i++ )
    {
        if ( SendByte & 0x80 )
            PIN_DS1337_SDA_1;
        else
            PIN_DS1337_SDA_0;

        SendByte <<= 1;

        DS1337_I2C_Delay();
        PIN_DS1337_SCK_1;
        DS1337_I2C_Delay();
        PIN_DS1337_SCK_0;
        DS1337_I2C_Delay();
    }
}

/**************************************************/
//        函数功能: 读取DS1337寄存器
//  输入参数: 地址
//  输出参数: 读取的数据字节,保存在DS1337_RTC_Time中
/*------------------------------------------------*/

void   DS1337_Read( unsigned char Addr, unsigned char Number )
{
    unsigned char i;

    //A.写地址
    DS1337_I2C_Start();
    DS1337_I2C_Send( 0xD0 );
    DS1337_I2C_ACK();
    DS1337_I2C_Send( Addr );
    DS1337_I2C_ACK();
    DS1337_I2C_Stop();

    //A.读数据
    DS1337_I2C_Start();
    DS1337_I2C_Send( 0xD1 );
    DS1337_I2C_ACK();
    for(i=0;i     {
        DS1337_RTC_Time[i] = DS1337_I2C_Read();
        DS1337_I2C_ACK();
    }
    DS1337_I2C_Stop();
}

/**************************************************/
//        函数功能: 写入DS1337寄存器
//  输入参数: 地址,数据
//  输出参数: 无
/*------------------------------------------------*/

void   DS1337_Write( unsigned char Addr, unsigned char Data )
{
    DS1337_I2C_Start();
    DS1337_I2C_Send( 0xD0 );
    DS1337_I2C_ACK();
    DS1337_I2C_Send( Addr );
    DS1337_I2C_ACK();
    DS1337_I2C_Send( Data );
    DS1337_I2C_ACK();
    DS1337_I2C_Stop();
}

/**************************************************/
//        函数功能: DS1337初始化,
//            如果原寄存器数据正常,则不重新写入
//  输入参数: 无
//  输出参数: 无
/*------------------------------------------------*/

void    DS1337_RTC_Init( void )
{
    //  I2C总线初始化,软件模拟
    PIN_DS1337_SDA_1;
    PIN_DS1337_SCK_1;
    PIN_DS1337_SDA_OUT_Init;
    PIN_DS1337_SCK_OUT_Init;
    PIN_DS1337_SQW_IN_Init;

    //  检测OSC是否震荡
    DS1337_Read( 0x0E, 1 );                    //读取小时信息,判断是否为24小时制式

    if ( DS1337_RTC_Time[0] != 0 )
        DS1337_Write( 0x0E, 0 );
}

/**************************************************/
//        函数功能: 读取RTC时间信息
//  输入参数: 无
//  输出参数: 无,内容传递到DS1337_RTC_Time数组中
/*------------------------------------------------*/

void    Print_RTC_Time( void )                      //打印显示时间
{
    const char  WEEK_TABLE[][3] = { "", "一", "二", "三", "四", "五", "六", "日" };

    //  读取时间
    DS1337_Read(0, 7);

    //  打印时间
    S_Printf("20%1d%1d年", (DS1337_RTC_Time[6]>>4)&0x0F, DS1337_RTC_Time[6]&0x0F);
    S_Printf("%1d%1d月", (DS1337_RTC_Time[5]>>4)&0x01, DS1337_RTC_Time[5]&0x0F);
    S_Printf("%1d%1d日, ", (DS1337_RTC_Time[4]>>4)&0x03, DS1337_RTC_Time[4]&0x0F);
    S_Printf("%1d%1d:", (DS1337_RTC_Time[2]>>4)&0x03, DS1337_RTC_Time[2]&0x0F);
    S_Printf("%1d%1d:", (DS1337_RTC_Time[1]>>4)&0x07, DS1337_RTC_Time[1]&0x0F);
    S_Printf("%1d%1d, 星期", (DS1337_RTC_Time[0]>>4)&0x07, DS1337_RTC_Time[0]&0x0F);
    S_Printf("%s\r\n", WEEK_TABLE[DS1337_RTC_Time[3]&0x07]);
}


h文件:
#ifndef         __DS1337_RTC_H__
#define         __DS1337_RTC_H__

//  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  DS1337 I2C

#define         PIN_DS1337_SDA          BIT5                                    //  P3.5
#define         PIN_DS1337_SDA_OUT_Init P3DIR |=  PIN_DS1337_SDA                //  设置为输出
#define         PIN_DS1337_SDA_IN_Init  P3DIR &= ~PIN_DS1337_SDA                //  设置为输入
#define         PIN_DS1337_SDA_0        P3OUT &= ~PIN_DS1337_SDA                //  低电平
#define         PIN_DS1337_SDA_1        P3OUT |=  PIN_DS1337_SDA                //  高电平
#define         PIN_DS1337_SDA_IN       P3IN  &   PIN_DS1337_SDA                //  输入

#define         PIN_DS1337_SCK          BIT6                                    //  P3.6
#define         PIN_DS1337_SCK_OUT_Init P3DIR |=  PIN_DS1337_SCK                //  设置为输出
#define         PIN_DS1337_SCK_0        P3OUT &= ~PIN_DS1337_SCK                //  低电平
#define         PIN_DS1337_SCK_1        P3OUT |=  PIN_DS1337_SCK                //  高电平

#define         PIN_DS1337_SQW          BIT7                                    //  P3.7
#define         PIN_DS1337_SQW_IN_Init  P3DIR &= ~PIN_DS1337_SQW                //  设置为输入
#define         PIN_DS1337_SQW_IN       P3IN  &   PIN_DS1337_SQW                //  输入

//  =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  函数声明

void            DS1337_RTC_Init( void );                                        //  DS1337初始化,如果原寄存器数据正常,则不重新写入
void            Print_RTC_Time( void );                                         //  打印显示时间
void            DS1337_Write( unsigned char Addr, unsigned char Data );         //  写入DS1337寄存器

#endif

最新回复

看不懂。 帮你顶一下。。。。。  详情 回复 发表于 2014-5-19 17:17
 
点赞 关注

回复
举报

14

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
看不懂。

帮你顶一下。。。。。
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表