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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4907|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

arduino+DS1302+按鍵制作可調(diào)時(shí)鐘程序,在寫按鍵更改時(shí)間的地方搞不懂

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
40黑幣
想利用arduino+DS1302制作時(shí)鐘,按鍵可以更改時(shí)間,并且可以用串口改變時(shí)間。在寫按鍵更改時(shí)間的地方搞不懂。沒有辦法把時(shí)間寫進(jìn)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. /* 串口數(shù)據(jù)緩存 */
  17. String comdata = "";
  18. int numdata[7] = {0}, j = 0, mark = 0;
  19. /* 創(chuàng)建 DS1302 對(duì)象 */
  20. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
  21. void print_time()
  22. {
  23.   /* 從 DS1302 獲取當(dāng)前時(shí)間 */
  24.   Time t = rtc.time();
  25.   /* 將星期從數(shù)字轉(zhuǎn)換為名稱 */
  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.   /* 當(dāng)串口有數(shù)據(jù)的時(shí)候,將數(shù)據(jù)拼接到變量comdata */
  68.   while (Serial.available() > 0)
  69.   {
  70.     comdata += char(Serial.read());
  71.     delay(2);
  72.     mark = 1;
  73.   }
  74.   /* 以逗號(hào)分隔分解comdata的字符串,分解結(jié)果變成轉(zhuǎn)換成數(shù)字到numdata[]數(shù)組 */
  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.     /* 將轉(zhuǎn)換好的numdata湊成時(shí)間格式,寫入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.   /* 打印當(dāng)前時(shí)間 */
  100.   print_time();
  101.   delay(1000);
  102. }

復(fù)制代碼



最佳答案

查看完整內(nèi)容

下面是從DS1302讀取時(shí)間和寫入時(shí)間的程序,編個(gè)按鍵就可以實(shí)現(xiàn) 按鍵更改時(shí)間了 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};//秒分時(shí)日月周年,存儲(chǔ)格式是用BCD碼 void writeData(unsigned char addr,unsigned char dat){ //向芯片里面寫數(shù)據(jù), pinMode(IO_PIN,OUTPUT); digitalWrite(CE_PI ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:594925 發(fā)表于 2020-4-11 13:03 | 只看該作者
下面是從DS1302讀取時(shí)間和寫入時(shí)間的程序,編個(gè)按鍵就可以實(shí)現(xiàn) 按鍵更改時(shí)間了

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};//秒分時(shí)日月周年,存儲(chǔ)格式是用BCD碼

void writeData(unsigned char addr,unsigned char dat){   //向芯片里面寫數(shù)據(jù),
  pinMode(IO_PIN,OUTPUT);
  digitalWrite(CE_PIN,LOW);   //下拉低,再拉高
  digitalWrite(SCLK_PIN,LOW) ; //SCLK的上升沿, 芯片會(huì)讀取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){              //從芯片里去讀源數(shù)據(jù),但是數(shù)據(jù)還是要經(jīng)過一定的格式化才行啊
  addr = addr | 1; //讀操作最低位置為1     要看懂這些就需要查看芯片的手冊(cè)才是呀

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

  int i;
  for(i =0;i<8;i++){                //讀取命令是先要寫一些命令代碼,根據(jù)代碼,芯片會(huì)吐出相應(yīng)的元素.
    digitalWrite(SCLK_PIN,LOW);
    digitalWrite(IO_PIN, addr&1);
    addr =addr>>1;
    digitalWrite(SCLK_PIN,HIGH);
    delayMicroseconds(1);
  }
  pinMode(IO_PIN,INPUT);               //設(shè)置io口為向內(nèi)讀入.這樣這個(gè)引腳就可以讀取數(shù)據(jù)了.

  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 ;
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:160964 發(fā)表于 2020-4-11 14:31 | 只看該作者
建議用DS321,你這個(gè)沒有溫度補(bǔ)償,時(shí)差可能較大
回復(fù)

使用道具 舉報(bào)

地板
ID:620438 發(fā)表于 2020-4-14 13:17 | 只看該作者
wudidewrf 發(fā)表于 2020-4-14 10:50
下面是從DS1302讀取時(shí)間和寫入時(shí)間的程序,編個(gè)按鍵就可以實(shí)現(xiàn) 按鍵更改時(shí)間了

char  READ_RTC_ADDR[7]  ...

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

使用道具 舉報(bào)

5#
ID:594925 發(fā)表于 2020-4-14 16:05 | 只看該作者
1334479405 發(fā)表于 2020-4-14 13:17
謝謝。。但是我看不怎么懂這個(gè)程序。。就是你寫的這個(gè)程序是直接加到我的程序里還是單獨(dú)的啊?如果可以的 ...

把這個(gè)程序加到你那個(gè)程序里面,然后在你這里 if(digitalRead(min_up) == 0){    }這樣寫
if(digitalRead(min_up) == 0)
{  
      for(n=0;n<7;n++)
  {
    TIME[n]=readData(READ_RTC_ADDR[n]);
  }                          //讀取DS1302里當(dāng)前時(shí)間
    TIME[1]=TIME[1]+1; //分鐘增加1,秒分時(shí)日月周年,分在TIME[1]里 時(shí)在TIME[2]

     for(n=0;n<7;n++)
  {
     writeData(WRITE_RTC_ADDR[n],TIME[n]);
  }                          //把更改的時(shí)間寫入DS1302
}
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表