原创 ds1302程序

2007-8-11 16:53 5909 13 16 分类: MCU/ 嵌入式

#ifndef DS1302_H
#define DS1302_H


#include


sbit T_CLK= P1^2; /*实时时钟时钟线引脚 */
sbit T_IO = P1^3; /*实时时钟数据线引脚 */
sbit T_RST= P1^4; /*实时时钟复位线引脚 */


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


//unsigned char gettime[8]={0};
unsigned char settime[7]={0x00,0x1f,0x14,0x16,0x07,0x07,0x07};



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


计时模块1302:


1 实时时钟模块 时钟芯片型号:DS1302
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
**********************************************************/
/*
void v_RTInputByte(unsigned char d)
{
    unsigned char i;
    ACC="d";              //将8位数据写入ACC
    for(i=8;i>0;i--)    //循环8次将ACC8位数据从低位到高位写入1302
    {  
        T_IO=ACC0;     //将ACC的最低位转送到IO口
        T_CLK=1;         //上升沿写入1位数据
        T_CLK=0;
        ACC="ACC">>1;     //将ACC次低位变为最低位
    }
}
*/
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC=ucDa;
for(i=8;i>0;i--)
{
 T_IO=ACC0; //相当于汇编中的 RRC //
 T_CLK=1;
 T_CLK=0;
 ACC=ACC>>1;
}
}
/********************************************************************
*
* 名称: unsigned char uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
/*
unsigned char uc_RTOutputByte(void)
{
    unsigned char i;
    for(i=8;i>0;i--)
    {
        ACC="ACC">>1;
        ACC7=T_IO;
        T_CLK=1; //时钟下降沿读1位数据
        T_CLK=0;
       
    }
    return (ACC);
}
*/
unsigned char uc_RTOutputByte(void)
{
 unsigned char i;
 for(i=8;i>0;i--)
 {
  ACC=ACC>>1; //相当于汇编中的 RRC //
  ACC7=T_IO;
  T_CLK=1;
  T_CLK=0;
 }
 return(ACC);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
/*
void v_W1302(unsigned char add,unsigned char d)
{
    T_RST= 0;
    T_CLK=0;
    T_RST= 1;
    v_RTInputByte(add); //将1302的指针移到add处
    v_RTInputByte(d);     //往add处写入数据
    T_CLK=1;
    T_RST=0;              //停止写数据
}
*/
void v_W1302(unsigned char ucAddr, unsigned char ucDa)
{
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(ucAddr); // 地址,命令 //
 v_RTInputByte(ucDa); // 写1Byte数据//
 T_CLK=1;
 T_RST=0;
}
/********************************************************************
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
/*
unsigned char uc_R1302(unsigned char add)
{
    unsigned char d;
    T_RST=0;
    T_CLK=0;
    T_RST=1;
    v_RTInputByte(add);
    d="uc"_RTOutputByte();
    T_CLK=1;
    T_RST=0;
    return (d);
}
*/
unsigned char uc_R1302(unsigned char ucAddr)
{
 unsigned char ucDa;
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(ucAddr); // 地址,命令 //
 ucDa=uc_RTOutputByte(); // 读1Byte数据//
 T_CLK=1;
 T_RST=0;
 return(ucDa);
}



/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*
void v_Set1302(unsigned char *time)
{
    unsigned char i;
    v_W1302(0x8e,0x00);  //令WP=0,进行写操作
    T_RST=0;
    T_CLK=0;
    T_RST=1;
    v_RTInputByte(0xbe);  //时钟多字节写命令
    for(i=8;i>0;i--)
    {
        v_RTInputByte(*time); //写入1byte数据
        time++;
    }
    T_CLK=1;
    T_RST=0;
}
*/
void v_Set1302(unsigned char *pSecDa)
{
 unsigned char i,ten,sin;
 v_W1302(0x8e,0x00); // 控制命令,WP=0,写操作?//
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(0xbe);
 for(i=8;i>0;i--)
 {
  sin=(*pSecDa)%10;
  ten=(*pSecDa/10)*0x10;
  *pSecDa=ten+sin;
  v_RTInputByte(*pSecDa); // 秒 分 时 日 月 星期 年 //
  pSecDa++;
 }
 T_CLK=1;
 T_RST=0;
}
/********************************************************************
*
* 名称: v_Get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: uc_R1302()
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*
void v_Get1302(unsigned char *time)
{
    unsigned char i;
    bdata unsigned char l,h;
    T_RST=0;
    T_CLK=0;
    T_RST=1;
    v_RTInputByte(0xbf);  //时钟多字节方式读取命令
    for(i=8;i>0;i--)
    {
        *time=uc_RTOutputByte(); //读1字节数据
        l=(*time)&0x0f;         //l存放time的低4位,即个位
        h=(*time>>4)&0x0f;      //h存放time的高4位,即十位
        *time=h*10+l;           //时间数据以十进制形式放进time
        time++;
    }
    T_CLK=1;
    T_RST=0;
}
*/
void v_Get1302()
{
 unsigned char i,ten,sin;
 T_RST=0;
 T_CLK=0;
 T_RST=1;
 v_RTInputByte(0xbf);
 for(i=0;i<7;i++)
 {
  ten=uc_RTOutputByte();//格式为: 秒 分 时 日 月 星期 年 //
  sin=ten&0x0f;
  ten=ten>>4;
  settime=ten*10+sin;
 }
 T_CLK=1;
 T_RST=0;
}


#endif

PARTNER CONTENT

文章评论3条评论)

登录后参与讨论

用户434290 2013-4-6 14:25

上面明明写的是7字节BCD码, 而你的程序中却循环了8次, 能说明下吗? 谢谢.

用户1431092 2007-8-15 10:20

这个51的肯定是可以的 调过了 朋友整理的  我的是用CVAVR写的 如果有兴趣可以加我Q517531404

用户52661 2007-8-14 08:08

 你自己调试过了没?

相关推荐阅读
用户1431092 2008-05-13 23:30
USB转串口(CH340)原理图及PCB
(CH340)原理图及PCBCH340,CH341,CH375中文资料有兴趣的下啊!共同分享!...
用户1431092 2008-05-12 12:51
C++ 串行通信控件
(串行通信控件代码)在C++ builder中做一个串行通信控件,实现与单片机的串行通信,希望对你有用,共同分享下。附在C++ builder中生成exe文件并释放后可在没安装C++ builder的...
用户1431092 2008-05-12 12:40
超声波测距电路及测试程序
超声波测距程序超声波测距电路...
用户1431092 2008-04-10 23:53
红外脉搏测量电路(附输出波形图)
 自己调试过的一个红外脉搏测量电路,红外型号是TIR2001对管 共同分享下...
用户1431092 2008-03-22 16:18
一些电子基础知识
学过了,温习下...
用户1431092 2008-03-22 16:14
C与汇编混合编程
C51与汇编混合编程详解 来源:全民业务网 作者:不详C51和汇编混合编程(1)-C语言中嵌入汇编 1、在 C 文件中要嵌入汇编代码片以如下方式加入汇编代码:#pragma ASM; Assemble...
我要评论
3
13
关闭 站长推荐上一条 /1 下一条