微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 基于ds1302的电子日历系统

基于ds1302的电子日历系统

时间:09-19 来源:互联网 点击:

0x0e);

  break; case 5:ri--;

  if(ri==0)

  ri=31;

  write_nyr(9,ri);

  temp=(ri)/10*16+(ri)%10;

  write_1302(0x8e,0x00);

  write_1302(0x86,temp);

  write_1302(0x8e,0x80);

  write_1602com(yh+10);

  break; case 6:yue--;

  if(yue==0)

  yue=12;

  write_nyr(6,yue);

  temp=(yue)/10*16+(yue)%10;

  write_1302(0x8e,0x00);

  write_1302(0x88,temp);

  write_1302(0x8e,0x80);

  write_1602com(yh+7);

  break;

  case 7:nian--;

  if(nian==-1) nian=99;

  write_nyr(3,nian);

  temp=(nian)/10*16+(nian)%10;

  write_1302(0x8e,0x00);

  write_1302(0x8c,temp);

  write_1302(0x8e,0x80);

  write_1602com(yh+4);

  break;

  }

  }

  }

  }

  }

  //定时器、计数器设置函数

  void init()

  {

  TMOD=0x11;

  TH0=0;

  TL0=0;

  EA=1;

  ET0=1;

  TR0=1;

  }

  /******************************* 延时函数 ********************************

  * 功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs

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

  void DS18_delay(int useconds)

  {

  int s;

  for (s=0; s《useconds;s++);

  }

  /******************************* 复位函数 *******************************

  * 功能:完成单总线的复位操作

  * 复位时间为480μs,因此延时时间为(480-24)/16 = 28.5,取29μs。

  * 经过70μs之后检测存在脉冲,因此延时时间为(70-24)/16 = 2.875,取3μs。

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

  unsigned char ow_reset(void)

  {

  unsigned char presence;

  DQ = 0;

  DS18_delay(29);

  DQ = 1;

  DS18_delay(3);

  presence = DQ;

  DS18_delay(25);

  return(presence);

  }

  /****************************** 位写入函数 *******************************

  * 功能:向单总线写入1位值:bitval

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

  void write_bit(char bitval) { DQ = 0;

  if(bitval==1) DQ =1;

  DS18_delay(5);

  DQ = 1;

  }

  /**************************** 字节写入函数 *******************************

  * 功能:向单总线写入一个字节值:val

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

  void ds18write_byte(char val)

  {

  unsigned char i;

  unsigned char temp;

  for (i=0; i《8; i++) {

  temp = val》》i;

  temp &= 0x01;

  write_bit(temp);

  }

  DS18_delay(5);

  }

  /**************************** 位读取函数 ********************************

  * 功能:从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义 * 的DS18_delay()函数,而采用一个for()循环来实现延时。 *

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

  unsigned char read_bit(void)

  {

  unsigned char i;

  DQ = 0;

  DQ = 1;

  for (i=0; i《3; i++);

  return(DQ);

  }

  /**************************** 字节读取函数 *******************************

  *功能:从单总线读取一个字节的值*

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

  unsigned char DSread_byte(void)

  {

  unsigned char i; unsigned char value = 0; for (i=0;i《8;i++)

  {

  if(read_bit()) value|=0x01《《i;

  DS18_delay(6);

  }

  return(value);

  }

  //*******************主函数**************************

  void main() { lcd_init();

  ds1302_init();

  init();

  delay(80);

  while(1)

  {

  keyscan();

  }

  }

  //取得并显示日历和时间

  void TImer0() interrupt 1

  {

  miao = BCD_Decimal(read_1302(0x81));

  fen = BCD_Decimal(read_1302(0x83));

  shi = BCD_Decimal(read_1302(0x85));

  ri = BCD_Decimal(read_1302(0x87));

  yue = BCD_Decimal(read_1302(0x89));

  nian=BCD_Decimal(read_1302(0x8d));

week=BCD_Decimal(r

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top