×
单片机 > 单片机程序设计 > 详情

ds1302的51子程序

发布时间:2020-06-19 发布时间:
|
void wr1302(unsigned char dat)    //向1302写1个字节
{
  unsigned char i;
  for(i=0;i<8;i++)  //从最低位开始发送
  {
    ACC=dat;
    DATA1302=BIT0;//位传送至数据总线
    ;
    SCLK1302=0; //清时钟总线
    ;
    SCLK1302=1; //时钟上升沿,发送数据有效
    dat=dat>>1; //数据右移
    ;
  }
}
unsigned char rd1302(void) //从1302读1个字节
{
  unsigned char i;
  for(i=0;i<8;i++)  //从最低位开始接收
  {
    ACC=ACC>>1;
    DATA1302=1; //读数据之前,P1口输出1
    SCLK1302=1;//时钟置高电平
    ;
    SCLK1302=0;//时钟下降沿,接收数据有效
    ;
    BIT7=DATA1302;//接收1位数据
    ;
  }
  return ACC;
}
void v_wr1302(unsigned char add,unsigned char dat)//先写地址,后写1字节数据
{            //      地址或命令             数据 
  RST1302=0;//复位引脚低电平,所有数据传送终止
  ;
  SCLK1302=0;//清时钟总线
  ;
  RST1302=1;//复位引脚高电平,控制逻辑有效
  ;
  wr1302(add);   //写地址或命令
  ;
  wr1302(dat);   //写1个数据
  ;
  SCLK1302=1;
  RST1302=0;
}
unsigned char v_rd1302(unsigned char add) //先写地址,后读1字节命令或数据
{                     //         地址
  unsigned char i;
  RST1302=0;//复位引脚低电平,所有数据传送终止
  ;
  SCLK1302=0;//清时钟总线
  ;
  RST1302=1;//复位引脚高电平,控制逻辑有效
  ;
  wr1302(add);   //写地址或命令
  ;
  i=rd1302();
  SCLK1302=1;
  RST1302=0;
  return i;  //返回读取的数据
}
/********************************************************************
* 名称: send_byte1302
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: wr1302();v_wr1302();
* 输入: *p: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void send_byte1302(unsigned char *p)
{
  unsigned char i;
  v_wr1302(0x8e,0x00); // 控制命令,WP=0,写操作
  RST1302=0;//复位引脚低电平,所有数据传送终止
  ;
  SCLK1302=0;//清时钟总线
  ;
  RST1302=1;//复位引脚高电平,控制逻辑有效
  ;
  wr1302(0xbe); //0xbe:时钟多字节写命令
  for(i=0;i<8;i++)//发送数据8字节
  {
    wr1302(*p);
    p++;
  }
  SCLK1302=1;
  RST1302=0;
}
/********************************************************************
* 名称: rcv_byte1302
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: wr1302() , rd1302()
* 输入: *p1: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
unsigned char rcv_byte1302(unsigned char *p1)
{
  unsigned char i;
  RST1302=0;//复位引脚低电平,所有数据传送终止
  ;
  SCLK1302=0;//清时钟总线
  ;
  RST1302=1;//复位引脚高电平,控制逻辑有效
  ;
  wr1302(0xbf);// 0xbf:时钟多字节读命令
  for(i=0;i<8;i++)//接收数据8字节
  {
    *p1=rd1302();
    p1++;
  }
  SCLK1302=1;
  RST1302=0;
}
/********************************************************************
* 名称: v_set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_wr1302()
* 输入: *p2: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_set1302(unsigned char *p2)
{
  unsigned char i;
  unsigned char addr=0x80;
  v_wr1302(0x8e,0x00); //控制命令,WP=0,允许写
  for(i=0;i<7;i++)
  {
    v_wr1302(addr,*p2); /* 秒 分 时 日 月 星期 年 */
    p2++;
    addr=addr+2;
  }
  v_wr1302(0x8e,0x80); // 控制命令,WP=1,写保护
}
/********************************************************************
* 名称: v_get1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: v_rd1302()
* 输入: time: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_get1302(void)
{
  unsigned char i;
  unsigned char addr=0x81;
  for(i=0;i<7;i++)
  {
     time[i]=v_rd1302(addr);  //格式为: 秒 分 时 日 月 星期 年
     addr=addr+2;
  }
}
关键字:ds1302  51子程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析