DS1302时钟芯片

DS1302时钟芯片

一、引脚图

Vcc2备用电源
SCLK:时钟线

二、时序图


三、代码
#include <reg52.h>
#include "LCD1602.h"
#include "delay.h"

sbit SCK = P2^0;
sbit SDA = P2^1;
sbit RST = P2^2;

#define ds1302_sec_add              0x80        
#define ds1302_min_add              0x82        
#define ds1302_hr_add                0x84        
#define ds1302_date_add              0x86        
#define ds1302_month_add          0x88        
#define ds1302_day_add              0x8a        
#define ds1302_year_add              0x8c        
#define ds1302_control_add        0x8e    

unsigned char timebuf[6] = {12,21,24,16,4,25};
unsigned char readtimebuf[6];

void ds_write_byte(unsigned char addr,unsigned char dat)
{
      unsigned char i;

      SCK = 0;
      SDA = 0;
      RST = 0;

      RST = 1;

      for(i = 0; i < 8; i++)
      {
              SDA = addr & 0x01;
              SCK = 0;
              SCK = 1;
        addr >>= 1;            
        }

        for(i = 0; i < 8; i++)
      {
              SDA = dat & 0x01;
              SCK = 0;
              SCK = 1;
        dat >>= 1;            
        }

        RST = 0;
}

unsigned char ds_read_byte(unsigned char addr)
{
      unsigned char i;
      unsigned char temp;  
      addr += 0x01;

      SCK = 0;
      SDA = 0;
      RST = 0;

      RST = 1;

      for(i = 0; i < 8; i++)
      {
              SDA = addr & 0x01;
              SCK = 0;
              SCK = 1;
        addr >>= 1;            
        }

        for(i = 0; i < 8; i++)
      {
              SCK = 1;
              SCK = 0;

              temp >>= 1;

              if(SDA)
                {
                      temp += 0x80;
                }
    }            

        RST = 0;

        return temp;

}

void ds_write_time()
{
    unsigned char i;
      unsigned char temp;

      for(i = 0; i < 6; i++)
      {
              temp = timebuf[i] / 10;
              timebuf[i] = timebuf[i] % 10;
              timebuf[i] = (temp<<4) + timebuf[i];
        }

        ds_write_byte(ds1302_control_add,0x0);
        ds_write_byte(ds1302_hr_add,timebuf[0]);
        ds_write_byte(ds1302_min_add,timebuf[1]);
        ds_write_byte(ds1302_sec_add,timebuf[2]);
        ds_write_byte(ds1302_year_add,timebuf[3]);
        ds_write_byte(ds1302_month_add,timebuf[4]);
        ds_write_byte(ds1302_date_add,timebuf[5]);
        ds_write_byte(ds1302_control_add,0x80);

}

void ds_read_time()
{
    unsigned char i;
      unsigned char temp;

      readtimebuf[0] = ds_read_byte(ds1302_hr_add);
      readtimebuf[1] = ds_read_byte(ds1302_min_add);
      readtimebuf[2] = ds_read_byte(ds1302_sec_add);
      readtimebuf[3] = ds_read_byte(ds1302_year_add);
      readtimebuf[4] = ds_read_byte(ds1302_month_add);
      readtimebuf[5] = ds_read_byte(ds1302_date_add);

      for(i = 0; i < 6; i++)
      {
              temp = readtimebuf[i] >> 4;//与写时间操作相对比,写时间操作是将redatimebuf左移,而此为右移
              readtimebuf[i] = readtimebuf[i] & 0x0f;
              timebuf[i] = temp * 10 + readtimebuf[i];
        }      
}

void display_time()
{
    unsigned char time[8] = {0};
      unsigned char day[10] = {0};//此处必须为十个元素,否则溢出

      time[0] = timebuf[0] / 10 + 0x30;
    time[1] = timebuf[0] % 10 + 0x30;
    time[2] = ':';    
      time[3] = timebuf[1] / 10 + 0x30;
      time[4] = timebuf[1] % 10 + 0x30;
    time[5] = ':';    
      time[6] = timebuf[2] / 10 + 0x30;
      time[7] = timebuf[2] % 10 + 0x30;

      lcd_dis_str(3,0,time);

      day[0] = timebuf[3] / 10 + 0x30;
    day[1] = timebuf[3] % 10 + 0x30;
    day[2] = '-';    
      day[3] = timebuf[4] / 10 + 0x30;
      day[4] = timebuf[4] % 10 + 0x30;
    day[5] = '-';    
      day[6] = timebuf[5] / 10 + 0x30;
      day[7] = timebuf[5] % 10 + 0x30;

        lcd_dis_str(3,1,day);   
}

void main()
{
      lcd_init();
      ds_write_time();

      while(1)
        {
              ds_read_time();
              display_time();
        }
}

















  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值