久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4630|回復: 4
收起左側

arduino+DS1302+按鍵制作可調時鐘程序,在寫按鍵更改時間的地方搞不懂

[復制鏈接]
ID:620438 發表于 2020-4-11 13:03 | 顯示全部樓層 |閱讀模式
40黑幣
想利用arduino+DS1302制作時鐘,按鍵可以更改時間,并且可以用串口改變時間。在寫按鍵更改時間的地方搞不懂。沒有辦法把時間寫進DS1302中。求助各位大神幫幫忙。。
51hei.png

Arduino源程序如下:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "DS1302.h"

  4. uint8_t CE_PIN   = 5;
  5. uint8_t IO_PIN   = 6;
  6. uint8_t SCLK_PIN = 7;
  7. int stopped = A5;
  8. int min_up = A4;
  9. int min_down = A3;
  10. int hour_up = A2;
  11. int hour_down = A1;
  12. int flag = 1;


  13. /* 日期變量緩存 */
  14. char buf[50];
  15. char day[10];
  16. /* 串口數據緩存 */
  17. String comdata = "";
  18. int numdata[7] = {0}, j = 0, mark = 0;
  19. /* 創建 DS1302 對象 */
  20. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
  21. void print_time()
  22. {
  23.   /* 從 DS1302 獲取當前時間 */
  24.   Time t = rtc.time();
  25.   /* 將星期從數字轉換為名稱 */
  26.   memset(day, 0, sizeof(day));
  27.   switch (t.day)
  28.   {
  29.     case 1: strcpy(day, "Sunday"); break;
  30.     case 2: strcpy(day, "Monday"); break;
  31.     case 3: strcpy(day, "Tuesday"); break;
  32.     case 4: strcpy(day, "Wednesday"); break;
  33.     case 5: strcpy(day, "Thursday"); break;
  34.     case 6: strcpy(day, "Friday"); break;
  35.     case 7: strcpy(day, "Saturday"); break;
  36.   }
  37.   /* 將日期代碼格式化湊成buf等待輸出 */
  38.   snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  39.   /* 輸出日期到串口 */
  40.   Serial.println(buf);
  41. }


  42. void setup()
  43. {
  44.   Serial.begin(9600);
  45.   rtc.write_protect(false);
  46.   rtc.halt(false);
  47.   pinMode(stopped, INPUT_PULLUP);
  48.   pinMode(min_up, INPUT_PULLUP);
  49.   pinMode(min_down, INPUT_PULLUP);
  50.   pinMode(hour_up, INPUT_PULLUP);
  51.   pinMode(hour_down, INPUT_PULLUP);
  52. }

  53. void loop()
  54. {
  55.    if (digitalRead(stopped) == 0) {
  56.     flag = !flag;
  57.     if (flag == 0) {
  58.       Serial.end();
  59.     }
  60.     if (flag == 1) {
  61.       Serial.begin(9600);
  62.     }
  63.   }
  64.   if(digitalRead(min_up) == 0){
  65.    
  66.   }
  67.   /* 當串口有數據的時候,將數據拼接到變量comdata */
  68.   while (Serial.available() > 0)
  69.   {
  70.     comdata += char(Serial.read());
  71.     delay(2);
  72.     mark = 1;
  73.   }
  74.   /* 以逗號分隔分解comdata的字符串,分解結果變成轉換成數字到numdata[]數組 */
  75.   if (mark == 1)
  76.   {
  77.     Serial.print("You inputed : ");
  78.     Serial.println(comdata);
  79.     for (int i = 0; i < comdata.length() ; i++)
  80.     {
  81.       if (comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  82.       {
  83.         j++;
  84.       }
  85.       else
  86.       {
  87.         numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  88.       }
  89.     }
  90.     /* 將轉換好的numdata湊成時間格式,寫入DS1302 */
  91.     Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  92.     rtc.time(t);
  93.     mark = 0; j = 0;
  94.     /* 清空 comdata 變量,以便等待下一次輸入 */
  95.     comdata = String("");
  96.     /* 清空 numdata */
  97.     for (int i = 0; i < 7 ; i++) numdata[i] = 0;
  98.   }

  99.   /* 打印當前時間 */
  100.   print_time();
  101.   delay(1000);
  102. }

復制代碼



最佳答案

查看完整內容

下面是從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_PI ...
回復

使用道具 舉報

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 ;
}
回復

使用道具 舉報

ID:160964 發表于 2020-4-11 14:31 | 顯示全部樓層
建議用DS321,你這個沒有溫度補償,時差可能較大
回復

使用道具 舉報

ID:620438 發表于 2020-4-14 13:17 | 顯示全部樓層
wudidewrf 發表于 2020-4-14 10:50
下面是從DS1302讀取時間和寫入時間的程序,編個按鍵就可以實現 按鍵更改時間了

char  READ_RTC_ADDR[7]  ...

謝謝。。但是我看不怎么懂這個程序。。就是你寫的這個程序是直接加到我的程序里還是單獨的?如果可以的話可以麻煩你直接在我的程序上面改動一下嗎?
回復

使用道具 舉報

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
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久免费精品 | 亚洲人的av| 午夜精品久久久 | www.亚洲精品| 五月花丁香婷婷 | 欧美日韩在线免费观看 | 日韩精品一区二区三区视频播放 | 久久久91精品国产一区二区三区 | 国产在线观看 | 精品99在线 | 亚洲伊人久久综合 | 久久国产一区二区三区 | 欧美 日韩 国产 一区 | 国产.com | 亚洲精品久久久 | 国产欧美视频一区二区 | 国产在线视频99 | 午夜精品久久久久99蜜 | 国产欧美精品一区二区色综合朱莉 | av在线成人| 九九九精品视频 | 国产免费一区二区三区最新6 | 久久毛片 | 高清视频一区二区三区 | 国产日韩一区二区 | 99国产精品久久久久久久 | xxx国产精品视频 | 久久国产一区 | 成人免费小视频 | 精品国产免费人成在线观看 | 欧美日韩国产一区二区三区 | 午夜视频在线免费观看 | 欧美日韩黄色一级片 | 国外成人在线视频网站 | 求个av网址 | 中国一级毛片免费 | 国产精品免费一区二区三区四区 | 久久综合久久久 | 久久久在线视频 | 亚洲风情在线观看 | 夜夜草|