导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→C51编程:请教斑竹DS1302的C51源程序[aeast5]

 *第3679篇: C51编程:请教斑竹DS1302的C51源程序

  
楼 主:aeast5 2002年6月11日16:14
 C51编程:请教斑竹DS1302的C51源程序
各位高手:
    我想请教一下大家有关DS1302用C51任何编程,我编了好多,都没有成功,不知道是什
么原因。期盼哪位斑竹不吝赐教。
  
2楼:dalenliu 2002年6月20日09:31
 请问时钟???
对了,我正在酝酿用DS1302时钟呢,可是我看了DATASHEET,想问几个问题:
该时钟启动后从什么时刻开始计时啊?
是不是要我们用程序对其设定初始值啊,那岂不时每次启动都要给其赋初值?如果和51通
信,那51是不是一定要留几个脚给用户来设定初值啊。?
谢谢。
  
3楼:huangyan 2002年6月20日13:57
 我的成功代码
void ds1302_open()
{
  DS1302_SCLK=0;
  DS1302_RST=1;
}

void ds1302_close()
{
  DS1302_RST=0;
  DS1302_SCLK=0;
}

/********
void ds1302_twbyte(uchar c)
{
  uchar i;
  for(i=0;i<8;i++)
  {
    DS1302_IO=(bit)(c & 0x01);
    c=c>>1;
    DS1302_SCLK=0;
    DS1302_SCLK=1;
  }
}
*************/
void ds1302_twbyte(uchar c)
{
  uchar i;
  for(i=0;i<8;i++)
  {
    DS1302_IO=0;
    if(c & 0x01 !=0)  DS1302_IO=1;
    c=c >>1;
    DS1302_SCLK=0;
    DS1302_SCLK=1;
  }
}

uchar ds1302_trbyte()
{
  uchar i,ret;
  DS1302_IO=1;
  ret=0;
  for(i=0;i<8;i++)
  {
    DS1302_SCLK=0;
    ret=ret>>1;
    if(DS1302_IO==1) ret=ret | 0x80;
    DS1302_SCLK=1;
  }
  return ret;
}

void ds1302_init()
{
  ds1302_close();
  ds1302_open();
  ds1302_twbyte(0xbe);      /* write all */
  rtc.second=rtc.second &0x7f;
  ds1302_twbyte(rtc.second);
  ds1302_twbyte(rtc.minute);
  ds1302_twbyte(rtc.hour);
  ds1302_twbyte(rtc.date);
  ds1302_twbyte(rtc.month);
  ds1302_twbyte(rtc.week);
  ds1302_twbyte(rtc.year);
  ds1302_twbyte(0x00);     /* control */
  ds1302_twbyte(0xa5);    /* charge mode */
  ds1302_close();
}

void read_rtc()
{
  ds1302_close();
  ds1302_open();
  ds1302_twbyte(0xbf);
  rtc.second=ds1302_trbyte();
  rtc.minute=ds1302_trbyte();
  rtc.hour=ds1302_trbyte();
  rtc.date=ds1302_trbyte();
  rtc.month=ds1302_trbyte();
  rtc.week=ds1302_trbyte();
  rtc.year=ds1302_trbyte();
  ds1302_close();
}

void write_rtc()
{
  ds1302_close();
  ds1302_open();
  ds1302_twbyte(0xbe);    /* write all */
  ds1302_twbyte(rtc.second);
  ds1302_twbyte(rtc.minute);
  ds1302_twbyte(rtc.hour);
  ds1302_twbyte(rtc.date);
  ds1302_twbyte(rtc.month);
  ds1302_twbyte(rtc.week);
  ds1302_twbyte(rtc.year);
  ds1302_close();
}

uchar get_ds1302_ram(uchar address_ds1302)  /*地址范围: 00--30 */
{
  uchar c;
  address_ds1302=address_ds1302<<1;
  address_ds1302=address_ds1302 | 0x0c1;
  ds1302_open();
  ds1302_twbyte(address_ds1302);
  c=ds1302_trbyte();
  ds1302_close();
  return c;
}

void put_ds1302_ram(uchar address_ds1302, uchar value)   /*地址范围: 00--30 */
{
  address_ds1302=address_ds1302<<1;
  address_ds1302=address_ds1302 | 0x0c0;
  ds1302_open();
  ds1302_twbyte(address_ds1302);
  ds1302_twbyte(value);
  ds1302_close();
}


>>>>>>对该主题发表你的看法

本主题贴数3,分页: [第1页]


[上一篇主题]:初学者:购买何种计算机

[下一篇主题]:初学者:LCD如何显示汉字