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

📄 ds1302.c

📁 上载的程序可以用于PIC单片机,也可以用于430单片机,本人原创,到至今还没有发现哪位网友想出这种办法,希望站长能多加分.
💻 C
字号:
//本程序算法部分可以用在其它部分,
//2007年6月8日调试已通过; 
//文件名:DS1302.c
#define  XF_MCU    0       //定义用哪一种单片机,1时,用于PIC; 0时,用于MSP430;

#if      XF_MCU==0
//文件名:DS1302.c
#include<msp430x14x.h>
#include "ds1302.h"

#else
#include<PIC.h>
#include "ds1302.h"

uchar pa_out;
uchar pb_out;
uchar pc_out;
uchar pd_out;
uchar pe_out;
#endif 


uchar ds_emp[7];      //时钟数组寄存器;


//========== 往DS1302写入1Byte数据 (内部函数) =============
void w_byte(uchar dat) 
{ 
    uchar i;
    for(i=8; i>0; i--)
    {   
    	  DS13_CLK_L;
        if(!(dat&0x01))
        	 DS13_IO_L;
        else 
        	 DS13_IO_H;
        DS13_CLK_H;
        dat = dat >> 1;
    } 
}

//======== 从DS1302读取1Byte数据 (内部函数) ===================
uchar r_byte(void) 
{ 
    uchar i;
    uchar rb_data;
    DS13_IO_IN;
    for(i=8; i>0; i--)
    {
    	  DS13_CLK_L;
        rb_data =rb_data >> 1;
        rb_data=rb_data&0x7f;
        if(DS13_IO_DA)
        rb_data=rb_data|0x80;   
        DS13_CLK_H;      
    } 
    DS13_IO_OUT;
    return(rb_data); 
}

//========== 指定地址往DS1302写入1Byte数据 (内部函数) =============
void write_byte(uchar addr, uchar dat)
{   DS13_CLK_L;
    DS_RST_L;
    DS_RST_H;
    w_byte(addr);      
    w_byte(dat);       
    DS_RST_L;
} 

//========== 指定地址往DS1302读1Byte数据 (内部函数) =============
uchar read_byte(uchar addr)
{
    uchar ucData;
    DS13_CLK_L;
    DS_RST_L;
    DS_RST_H;
    w_byte(addr);          
    ucData = r_byte();        
    DS_RST_L;
    return(ucData);
}

//============ 设置ds1302日期和时间 =============
void write_ds1302(uchar *p) 
{   
    uchar i;
    uchar addr =0x80; 
    write_byte(0x8e,0x00);     // 控制命令,WP=0,写操作
    for(i =7; i>0; i--)
    { 
        write_byte(addr,*p);  // 秒 分 时 日 月 星期 年  
        p++;
        addr +=2;
    }
    write_byte(0x8e,0x80);   // 控制命令,WP=1,写保护
}

//============ 读ds1302当前日期和时间 =============
void read_ds1302(uchar *p) 
{  
    uchar i;
    uchar addr = 0x81;
#if XF_MCU==0
      DS13_DIR=DS13_CLK+DS13_IO+DS13_RST;       //MSP430
#else
      DS13_TRIS;                                  //PIC
#endif
    for (i=0; i<7; i++)
    {
        *p = read_byte(addr);    //格式为: 秒 分 时 日 月 星期 年 
        addr += 2;
        p++;
    }
}


//################################################################################
void DS1302_INIT(void)                         //DS1302初始化
{    
#if XF_MCU==0
      DS13_DIR=DS13_CLK+DS13_IO+DS13_RST;       //MSP430
#else
      DS13_TRIS;                                  //PIC
#endif
     ds_emp[0]=0x30;                  //;秒寄存器
     ds_emp[1]=0x30;                  //;分寄存器
     ds_emp[2]=0x12;                  //;小时寄存器
     ds_emp[3]=0x08;                  //;日期寄存器.
     ds_emp[4]=0x03;                  //;月份寄存器
     ds_emp[5]=0x04;                  //;星期寄存器
     ds_emp[6]=0x07;                  //;年寄存器位
     write_ds1302(ds_emp);           //设置ds1302日期和时间
     write_byte(0x8e,0x00);     // 控制命令,WP=0,写操作
     write_byte(0x90,0xAB);   // 使能充电,用两个二极管,8K电阻
     write_byte(0x8e,0x80);   // 控制命令,WP=1,写保护
}


void DS1302_DATA(void)                         //设置1302日期;
{   
#if XF_MCU==0
      DS13_DIR=DS13_CLK+DS13_IO+DS13_RST;       //MSP430
#else
      DS13_TRIS;                                  //PIC
#endif
     ds_emp[0]=0x30;                  //;秒寄存器
     ds_emp[1]=0x30;                  //;分寄存器
     ds_emp[2]=0x12;                  //;小时寄存器
     ds_emp[3]=0x08;                  //;日期寄存器.
     ds_emp[4]=0x03;                  //;月份寄存器
     ds_emp[5]=0x04;                  //;星期寄存器
     ds_emp[6]=0x07;                  //;年寄存器位
     write_ds1302(ds_emp);           //设置ds1302日期和时间
}


main()
{    
#if XF_MCU==0 
     WDTCTL = WDTPW + WDTHOLD;       // 停止WDT
#endif
     DS1302_DATA();                         //设置1302日期;
     DS1302_INIT();                         //DS1302初始化
     ds_emp[0]=0;                  //;秒寄存器
     ds_emp[1]=0;                  //;分寄存器
     ds_emp[2]=0;                  //;小时寄存器
     ds_emp[3]=0;                  //;日期寄存器.
     ds_emp[4]=0;                  //;月份寄存器
     ds_emp[5]=0;                  //;星期寄存器
     ds_emp[6]=0;                  //;年寄存器位
     for(;;)
     read_ds1302(ds_emp);
      
}

⌨️ 快捷键说明

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