欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: arduino+DS1302+按鍵制作可調時鐘程序,在寫按鍵更改時間的地方搞不懂 [打印本頁]

作者: 1334479405    時間: 2020-4-11 13:03
標題: arduino+DS1302+按鍵制作可調時鐘程序,在寫按鍵更改時間的地方搞不懂
想利用arduino+DS1302制作時鐘,按鍵可以更改時間,并且可以用串口改變時間。在寫按鍵更改時間的地方搞不懂。沒有辦法把時間寫進DS1302中。求助各位大神幫幫忙。。


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. }

復制代碼




作者: wudidewrf    時間: 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 ;
}
作者: 1412333938    時間: 2020-4-11 14:31
建議用DS321,你這個沒有溫度補償,時差可能較大
作者: 1334479405    時間: 2020-4-14 13:17
wudidewrf 發表于 2020-4-14 10:50
下面是從DS1302讀取時間和寫入時間的程序,編個按鍵就可以實現 按鍵更改時間了

char  READ_RTC_ADDR[7]  ...

謝謝。。但是我看不怎么懂這個程序。。就是你寫的這個程序是直接加到我的程序里還是單獨的啊?如果可以的話可以麻煩你直接在我的程序上面改動一下嗎?
作者: wudidewrf    時間: 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
}





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1