找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

arduino+DS1302+按键制作可调时钟程序,在写按键更改时间的地方搞不懂

查看数: 5242 | 评论数: 4 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2020-4-11 13:03

正文摘要:

想利用arduino+DS1302制作时钟,按键可以更改时间,并且可以用串口改变时间。在写按键更改时间的地方搞不懂。没有办法把时间写进DS1302中。求助各位大神帮帮忙。。 Arduino源程序如下: #include <stdio.h ...

回复

ID:594925 发表于 2020-4-14 16:05
1334479405 发表于 2020-4-14 13:17
谢谢。。但是我看不怎么懂这个程序。。就是你写的这个程序是直接加到我的程序里还是单独的啊?如果可以的 ...

把这个程序加到你那个程序里面,然后在你这里 if(digitalRead(min_up) == 0){    }这样写
if(digitalRead(min_up) == 0)
{  
      for(n=0;n<7;n++)
  {
    TIME[n]=readData(READ_RTC_ADDR[n]);
  }                          //读取DS1302里当前时间
    TIME[1]=TIME[1]+1; //分钟增加1,秒分时日月周年,分在TIME[1]里 时在TIME[2]

     for(n=0;n<7;n++)
  {
     writeData(WRITE_RTC_ADDR[n],TIME[n]);
  }                          //把更改的时间写入DS1302
}
ID:620438 发表于 2020-4-14 13:17
wudidewrf 发表于 2020-4-14 10:50
下面是从DS1302读取时间和写入时间的程序,编个按键就可以实现 按键更改时间了

char  READ_RTC_ADDR[7]  ...

谢谢。。但是我看不怎么懂这个程序。。就是你写的这个程序是直接加到我的程序里还是单独的啊?如果可以的话可以麻烦你直接在我的程序上面改动一下吗?
ID:160964 发表于 2020-4-11 14:31
建议用DS321,你这个没有温度补偿,时差可能较大
ID:594925 发表于 2020-4-11 13:03
下面是从DS1302读取时间和写入时间的程序,编个按键就可以实现 按键更改时间了

char  READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
char  WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
char TIME[7] = {0};//秒分时日月周年,存储格式是用BCD码

void writeData(unsigned char addr,unsigned char dat){   //向芯片里面写数据,
  pinMode(IO_PIN,OUTPUT);
  digitalWrite(CE_PIN,LOW);   //下拉低,再拉高
  digitalWrite(SCLK_PIN,LOW) ; //SCLK的上升沿, 芯片会读取IO端口
  delayMicroseconds(1);
  digitalWrite(CE_PIN,HIGH);

  int i;
  for(i =0;i<8;i++){
    digitalWrite(SCLK_PIN,LOW);
    digitalWrite(IO_PIN, addr&1);
    addr =addr>>1;
    digitalWrite(SCLK_PIN,HIGH);
    delayMicroseconds(1);
  }

  for(i =0;i<8;i++){
      digitalWrite(SCLK_PIN,LOW);
      digitalWrite(IO_PIN, dat&1);
      dat =dat>>1;
      digitalWrite(SCLK_PIN,HIGH);
      delayMicroseconds(1);
  }
  digitalWrite(CE_PIN,LOW);
}

char readData(char addr){              //从芯片里去读源数据,但是数据还是要经过一定的格式化才行啊
  addr = addr | 1; //读操作最低位置为1     要看懂这些就需要查看芯片的手册才是呀

  pinMode(IO_PIN,OUTPUT);
  digitalWrite(CE_PIN,LOW); //下拉低,再拉高
  digitalWrite(SCLK_PIN,LOW) ; //SCLK的上升沿, 芯片会读取IO端口
  delayMicroseconds(1);
  digitalWrite(CE_PIN,HIGH);

  int i;
  for(i =0;i<8;i++){                //读取命令是先要写一些命令代码,根据代码,芯片会吐出相应的元素.
    digitalWrite(SCLK_PIN,LOW);
    digitalWrite(IO_PIN, addr&1);
    addr =addr>>1;
    digitalWrite(SCLK_PIN,HIGH);
    delayMicroseconds(1);
  }
  pinMode(IO_PIN,INPUT);               //设置io口为向内读入.这样这个引脚就可以读取数据了.

  int dat = 0;
  for(i =0;i<8;i++){
      digitalWrite(SCLK_PIN,LOW);
      delayMicroseconds(10);
      char b = digitalRead(IO_PIN);
      dat = dat >>1; //先向右平移

      dat = dat | (b<<7); //将所得放入最高位
      digitalWrite(SCLK_PIN,HIGH);
      delayMicroseconds(1);
  }
  digitalWrite(CE_PIN,LOW);  
  return dat ;
}

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表