原创 CEPARK 51实验板DS1302应用

2009-4-17 15:56 2122 6 6 分类: MCU/ 嵌入式
板子上的DS1302以前烧sunhm版主的那个测试程序,显示问号。。!!

 

     就一直没有弄。。!!!

 

今天,突然很想把它写好。。!!

 

    在网上就找了个DATASHEET,还有蒋建军的一个头文件。。!!!

 

今天,是头一次认真的好好的看一个完全英文的文件。。一边用金山词霸

 

       发现也真的不有那么难。。。。。。!!发现这样的文档比中文全的多。。

 

自己的DS1302是外接的。原理图看这个贴子。


----------------------------------------------------------------------------------

今天,发现自己还是太懒了。。!!

        不行,小雨要好好的努力。。不要怕。。!!!

---------------------------------------------------------------------------------------

下面是源程序,试用于CEPARK 51开发板。

 

/*************************************************
功能:利用DS1302做时钟,用数码管显示。一个按键调节(18B20右边的第一个键)。初始化显示时:分,
   按一下按键显示分:秒。
  
   这个只能看时分秒,也只用了一个按键,比较简单。将不定时升级,优化。

作者:小雨

QQ:151334856

版本:V1.0

时间:2009/04/01
*************************************************/

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar reg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar dis[6] = {0};

/*定义数码管位控端*/
sbit c1 = P1^0;    //位码控制
sbit c2 = P1^1;
sbit c3 = P1^2;
sbit c4 = P1^3;

/*定义DS1302控制脚*/
sbit DS1302_CLK = P3^4;
sbit DS1302_RST = P3^5;
sbit DS1302_IO = P3^3;

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

sbit Key = P2^0;
sbit Keyend = P2^4;
uchar Flag = 0;

uchar TempHour,TempMinute,TempSecond,Hour=12,Minute=59,Second=0;

#define DS1302_SECOND 0x80
#define DS1302_MINUTE 0x82
#define DS1302_HOUR  0x84
#define DS1302_WRITE 0x8E
#define DS1302_POWER 0x90
#define Time_24_Hour 0x00 //24时制控制 

#define BCD2DEC(X) (((X&0x70)>>4)*10 + (X&0x0F)) //用于将BCD码转成十进制的宏
#define DEC2BCD(X) ((X/10)<<4 | (X%10))   //用于将十进制转成BCD码的宏

//实时时钟写入一字节(内部函数)
void DS1302InputByte(uchar d)
{
    uchar i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        DS1302_IO = ACC0;    //相当于汇编中的 RRC
        DS1302_CLK = 1;
        DS1302_CLK = 0;
        ACC = ACC >> 1;
    }
}

//实时时钟读取一字节(内部函数)
uchar DS1302OutputByte()
{
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;     //相当于汇编中的 RRC
        ACC7 = DS1302_IO;
        DS1302_CLK = 1;
        DS1302_CLK = 0;
    }
    return(ACC);
}

//写DS1302,ucAddr: DS1302地址, ucData: 要写的数据
void Write1302(uchar ucAddr, uchar ucDa)
{
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr);        // 地址,命令
    DS1302InputByte(ucDa);        // 写1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
}

//读取DS1302某地址的数据
uchar Read1302(uchar ucAddr)
{
    uchar ucData;
    DS1302_RST = 0;
    DS1302_CLK = 0;
    DS1302_RST = 1;
    DS1302InputByte(ucAddr|0x01);        // 地址,命令
    ucData = DS1302OutputByte();         // 读1Byte数据
    DS1302_CLK = 1;
    DS1302_RST = 0;
    return(ucData);
}


void delay(uchar i)     //延时
{  
for(;i>0;i--)
    {
  uchar j="244";while(--j);
 }
}

void Display()     //动态扫描显示
{

  P1=0xff;
  if(Flag==0)
   {
  P0=reg[dis[0]];
  c1=0;
  delay(5);
  c1=1;
 
 
  P0=reg[dis[1]]&0x7f;
  c2=0;
  delay(5);
  c2=1;
 
 
  P0=reg[dis[2]];
  c3=0;
  delay(5);
  c3=1;
 
  P0=reg[dis[3]];
  c4=0;
  delay(5);
  c4=1;
  }
  else {
    P0=reg[dis[2]];
   c1=0;
   delay(5);
   c1=1;
  
  
   P0=reg[dis[3]]&0x7f;
   c2=0;
   delay(5);
   c2=1;
  
  
   P0=reg[dis[4]];
   c3=0;
   delay(5);
   c3=1;
  
   P0=reg[dis[5]];
   c4=0;
   delay(5);
   c4=1;
  }
   
 

}

//读取时间函数
void DS1302_GetTime()
{
 uchar ReadValue;

    ReadValue = Read1302(DS1302_SECOND);
 TempSecond = BCD2DEC(ReadValue&0x7F);
 ReadValue = Read1302(DS1302_MINUTE);
 TempMinute = BCD2DEC(ReadValue);
 ReadValue = Read1302(DS1302_HOUR);
 TempHour = BCD2DEC(ReadValue&0x7F);
 
}

//设置时间函数
void DS1302_SetTime()
{
 Write1302(DS1302_WRITE,0x00);  //关闭写保护

 Write1302(DS1302_HOUR,DEC2BCD(Hour)|Time_24_Hour);
 Write1302(DS1302_MINUTE,DEC2BCD(Minute));
 Write1302(DS1302_SECOND,DEC2BCD(Second));

 Write1302(DS1302_WRITE,0x80);  //打开写保护 
}

void OscCtrl(bit CtrlDat)
{
 if(CtrlDat) Write1302(0x80,0x00);
 else Write1302(0x80,0x80);
}
void Hex2Bcd()
{
 dis[0] = TempHour/10;
 dis[1] = TempHour%10;
 dis[2] = TempMinute/10;
 dis[3] = TempMinute%10;
 dis[4] = TempSecond/10;
 dis[5] = TempSecond%10; 
}

void KeyCtrl()
{
 if(Key==0)
  {
   delay(1000); 
    if(Key==0)
     {
      Flag++;
      if(Flag>1) Flag = 0;
     }
  }  
}
void main()
{
 OscCtrl(1); 
 DS1302_SetTime();
 Keyend = 0;

 while(1)
  {
   KeyCtrl();
   DS1302_GetTime();
   Hex2Bcd();
   Display();
  }
  
}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条