新闻  |   论坛  |   博客  |   在线研讨会
DS1302
飞阳 | 2010-04-30 20:01:46    阅读:801   发布文章

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit CLK=P3^5;//1302时钟信号线
sbit IO=P3^6;//1302的I/O数据线
sbit RST=P3^7;//1302的RST复位线
void InputByte(uchar);//输入1Byte
uchar OutputByte(uchar);//输出1Byte
void W1302(uchar,uchar);
uchar R1302(uchar);
uchar tab[6];
uchar a[7]={0x40,0x59,0x11,0x11,0x02,0x06,0x06};
uchar code table[10]={0x88,0Xbe,0Xc4,0X94,0Xb2,0X91,0X81,0Xbc,0X80,0X90};
//延时1ms
void delay(uint z)
{
 uint x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}
//往1302写入1Byte d为写入的数据入口参数
void InputByte(uchar date)
{
 uchar i;
 ACC=date;
 for(i=8;i>0;i--)
 {
  IO=ACC0;//相当于汇编中的RRC
  CLK=1;
  CLK=0;
  ACC=ACC>>1;
 }
}
//从1302读取1Byte数据返回值ACC
uchar OutputByte(void)
{
 uchar i;
 for(i=8;i>0;i--)
 {
  ACC=ACC>>1;
  ACC7=IO;
  CLK=1;
  CLK=0;
 }
 return(ACC);
}
//往1302写入数据先写地址后写数据 ucADD ucDA是入口参数
void W1302(uchar addr,uchar date)
{
 RST=0;
 CLK=0;
 RST=1;
 InputByte(addr);//写地址
 InputByte(date);//写1Byte数据
 CLK=1;
 RST=0;

//读取1302某地址的数据 先写地址 后读数据 ucAddr入口地址 ucDa是返回值
uchar R1302(uchar addr)
{
 uchar date;
 RST=0;
 CLK=0;
 RST=1;
 InputByte(addr);//写地址
 date=OutputByte();//读1Byte数据
 CLK=1;
 RST=0;
 return(date);
}
void main()
{
 uchar miao,fen,shi;
 uchar Curtime[7];
 uchar i1;
 uchar addr=0x80;
 W1302(0x8e,0x00);//控制命令字节WP=0 写操作
 for(i1=0;i1<7;i1++)
 {
  W1302(addr,a[i1]);//秒分时日月星期年
  addr+=2;
 }
 W1302(0x8e,0x80);//控制命令字节WP=1写保护
 while(1)
 {
  uchar i,i2;
  uchar addr=0x81;
  for(i2=0;i2<7;i2++)
  {
   Curtime[i2]=R1302(addr);//格式秒分时日月星期年
   addr+=2;
  }
  miao=Curtime[0];
  fen=Curtime[1];
  shi=Curtime[2];
  tab[5]=miao%16;
  tab[4]=miao/16;
  tab[3]=fen%16;
  tab[2]=fen/16;
  tab[1]=shi%16;
  tab[0]=shi/16;
  
  SCON=0;
  for(i=0;i<6;i++)
  {
   SBUF=table[tab[i]];
   while(!TI);
   TI=0;
  }
  delay(50);
 }
}

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
DS18B20
2010-04-30 20:03:34
DS1302
2010-04-30 20:01:46
推荐文章
最近访客