原创 DS1302时钟芯片

2011-5-17 23:18 2012 8 8 分类: MCU/ 嵌入式

#include<reg51.h>
#include <intrins.h>
#define seg_c P2
#define bit_c P0
sbit  T_RST = P1^0;
sbit  T_IO  = P1^1;
sbit  T_CLK = P1^2;

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

unsigned char  code  seg[11]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xfd};

unsigned char  num[8]={9,8,7,6,5,4,3,2};

#define uchar unsigned char

#define uint  unsigned int

//秒 分 时 日 月 星期 年 控制
uchar set_clk[8]={0x32,0x40,0x18};

uchar get_clk[8];

void RTInputByte(uchar d)
{
  uchar i=0;
  ACC=d;
  for(i=8;i>0;i--)
  {
    T_IO=ACC0;
 T_CLK=1;
 T_CLK=0;
 ACC=ACC>>1;
  }
}
/*
void RTInputByte(uchar d)
{
  uchar i=0;
  ACC=d;
  for(i=0;i<8;i++)
  {
    T_IO=ACC0;
 T_CLK=1;
 T_CLK=0;
 ACC=ACC>>1;
  }
}

*/

uchar RTOutputByte(void)
{
   uchar i=0;
   for(i=0;i<8;i++)
   {
     ACC=ACC>>1;
     ACC7=T_IO;
  T_CLK=1;
  T_CLK=0;
 }
 return(ACC);
}

void W1302(uchar ucAddr, uchar ucDa)
{
  T_RST=0;
  T_CLK=0;
  T_RST=1;
  RTInputByte(ucAddr);
  RTInputByte(ucDa);
  T_CLK=1;
  T_RST=0;

}

uchar R1302(uchar ucAddr)
{
  uchar R_DATA=0;
  T_RST=0;
  T_CLK=0;
  T_RST=1;
  RTInputByte(ucAddr);
  R_DATA=RTOutputByte();
  T_CLK=1;
  T_RST=0;
  return R_DATA;
}

void BurstW1302T(uchar *pWClock)//取出pWClock地址上装的内容即数组里面的数据
{
  uchar i=0;
  W1302(0x8e,0x00);//清楚保护,允许写
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  RTInputByte(0xbe);//循环写入
  for(i=0;i<8;i++)
  {
    RTInputByte(*pWClock);
 pWClock++;
  }
  T_CLK=1;
  T_RST=0;
}

void BurstR1302T(uchar *pRClock)
{
  uchar i=0;
  T_RST = 0;
  T_CLK = 0;
  T_RST = 1;
  RTInputByte(0xbf);
  for(i=0;i<8;i++)
  {
    *pRClock=RTOutputByte();
  pRClock++;
  }
  T_CLK=1;
  T_RST=0;
}

 

void delay(unsigned char ms)
{
  unsigned int a=0;
   while(ms--)
   {
     for(a=0;a<10;a++);
   }
}

void display()
{
             unsigned char loop=0;
             num[0]=get_clk[2]>>4;
          num[1]=get_clk[2]&0X0F;
             num[2]=10;
          num[3]=get_clk[1]>>4;           //得到要显示数据的万位
          num[4]=get_clk[1]&0X0F;
             num[5]=10;
          num[6]=get_clk[0]>>4;         //得到要显示数据的十位
          num[7]=get_clk[0]&0X0F;             //得到要显示数据的个位
   for(loop=0;loop<8;loop++)
            {
              bit_c=~(0x01<<loop);
              seg_c=seg[num[loop]];
           delay(3);
     seg_c=0XFF;
            }
}

main()
{

 BurstW1302T(set_clk);     //初始化  年月日 时分秒    设置时间
 while(1)
 {
  display();       //将时间  显示
  BurstR1302T(get_clk);     //将时间  读出
 }

}

 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条