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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4643|回復: 0
收起左側

Arduino MEGA2560 DS1302 實時時鐘(protues+程序)使用教程 可用串口、按鍵修改

[復制鏈接]
ID:582869 發表于 2020-4-17 15:42 | 顯示全部樓層 |閱讀模式
教程如下:

  • 實現功能:(代碼見底部)
  • 串口和1602 顯示實時時間
  • 串口和按鍵修改時間
  • 實時時鐘:
1.png
  • 按鍵修改時間:一共5個按鍵,分別修改分鐘、小時、天數、月份、年份。
分鐘滿60歸1,小時進1。小時24進制。 天數按照公歷閏平年來計算某年某月是多少進制。如2020年2月是閏二月,一共29天,那這個天數就是29進制。 包括星期幾也計算在內。已經驗證準確無誤。 (只是每次按鍵都是加一)
2.PNG
  • 串口修改時間:格式如:2019,11,17,12,25,36,5
                                     年,月,日,時,分,秒,星期
通過Arduino編譯器的串口調試器發送。(確保串口發送的日期跟星期幾是對應的,按鍵是在正確對應的情況下計算才會準確)
3.PNG
  • 虛擬 串口安裝如下:VSPD串口軟件的文件夾里找到vspd ,點擊ok,I agree ,next,finish
4.PNG
  • 打開軟件:直接點擊ok 5.PNG
  • 然后點擊Add Pair:
6.PNG
  • 在Arduino編譯器上找到串口調試器,設置波特率(一般是9600)當然只要仿真里的虛擬串口COMPIM跟Arduino是一對,并且波特率一樣就行了。
  • 好貼代碼:(需要找到對應的庫文件才行,懶得的話 直接點我的博客或者鏈接去下載吧)


  1. #include <FlexiTimer2.h>  
  2. #include <LiquidCrystal.h>
  3. /*
  4. Arduino 連接 DS1302
  5. 增加了串口調整時間代碼
  6. 2019,11,17,11,22,40,5
  7. */
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include "DS1302.h"
  11. // 初始化針腳
  12. const int rs = 30, en = 31 , d4 = 32, d5 = 33, d6 = 34,d7 = 35;
  13. LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
  14. /* 接口定義
  15. CE(DS1302 pin5) -> Arduino D5
  16. IO(DS1302 pin6) -> Arduino D6
  17. SCLK(DS1302 pin7) -> Arduino D7
  18. */
  19. uint8_t CE_PIN   = 24;
  20. uint8_t IO_PIN   = 26;
  21. uint8_t SCLK_PIN = 25;
  22. /* 日期變量緩存 */
  23. char buf[50];
  24. char buflcd1[30],buflcd2[30],buflcd3[30];
  25. char day[10];
  26. /* 串口數據緩存 */
  27. String comdate = "";
  28. int numdate[7] ={0}, j = 0, mark = 0;
  29. /* 創建 DS1302 對象 */
  30. DS1302 rtc (CE_PIN, IO_PIN, SCLK_PIN);

  31. void print_time()
  32. {
  33.     /* 從 DS1302 獲取當前時間 */
  34.     Time t = rtc.time();
  35.     /* 將星期從數字轉換為名稱 */
  36.     memset(day, 0, sizeof(day));
  37.     switch (t.day)
  38.     { case 0: strcpy(day, "Saturday "); break;
  39.       case 1: strcpy(day, "Sunday   "); break;
  40.       case 2: strcpy(day, "Monday   "); break;
  41.       case 3: strcpy(day, "Tuesday  "); break;
  42.       case 4: strcpy(day, "Wednesday"); break;
  43.       case 5: strcpy(day, "Thursday "); break;
  44.       case 6: strcpy(day, "Friday   "); break;
  45.       case 7: strcpy(day, "Saturday "); break;
  46.     }
  47.     /* 將日期代碼格式化湊成buf等待輸出 */
  48.     snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  49.     /* 輸出日期到串口 */
  50.     Serial.println(buf);
  51. }
  52. int w=0;
  53. void setup()
  54. {   
  55.     Serial.begin(9600);
  56.     rtc.write_protect(false);
  57.     rtc.halt(false);
  58.     attachInterrupt(1,minutes, FALLING);//引腳號是3 分鐘加一
  59.     attachInterrupt(5,hours, FALLING);//引腳號是18  小時加一
  60.     attachInterrupt(4,days, FALLING);//引腳號是19  天數加一
  61.     attachInterrupt(3,monthes, FALLING);//引腳號是20 月份加一
  62.     attachInterrupt(2,years, FALLING);//引腳號是21  年份加一
  63.     lcd.begin(16, 2);lcd.setCursor(1, 0);
  64.     lcd.print("17dianziyiban ");//17電子一班
  65.     lcd.setCursor(1, 1);   
  66.     lcd.print(" shichengshi");  //施成師
  67.     delay(1000);
  68.     lcd.clear() ;  
  69.     FlexiTimer2::set(500,1.0/1000,LCD);
  70.     FlexiTimer2::start();  
  71. }
  72. void LCD()
  73. {
  74.    Time t = rtc.time();                                       //LCD的屏幕會有顯示“殘留”
  75.    snprintf(buflcd1, sizeof(buflcd1), "%04d  %s",t.yr, day );//為了減少清屏帶來的閃爍
  76.    lcd.setCursor(0, 0);lcd.print(buflcd1);                   //LCD顯示字符的排版 比較奇特
  77.    snprintf(buflcd2, sizeof(buflcd2), "%02d-%02d",t.mon ,t.date);
  78.    lcd.setCursor(0, 1);lcd.print(buflcd2);
  79.    snprintf(buflcd3, sizeof(buflcd3), "%02d:%02d:%02d",  t.hr, t.min, t.sec);
  80.    lcd.setCursor(6, 1);lcd.print(buflcd3);  
  81. }
  82. void minutes()
  83. {
  84.   Time t = rtc.time();  
  85.   t.min++;if(t.min>60)t.min=1,t.hr++;
  86.   Time p( t.yr, t.mon, t.date, t.hr, t.min,t.sec,t.day);
  87.   rtc.time(p);
  88. }
  89. void hours()
  90. {
  91.   Time t = rtc.time();  
  92.   t.hr++;
  93.   if(t.hr>24)
  94.   {t.hr=1;t.day++;t.date++;
  95.    t.day=t.day%7;
  96.   }Time p( t.yr, t.mon, t.date, t.hr, t.min,t.sec,t.day);
  97.   rtc.time(p);
  98. }
  99. void days()
  100. {
  101.   Time t = rtc.time();  
  102.   t.date++;  
  103.    switch(t.mon)
  104.      {case 1: if(t.date>31)t.date=1,t.mon++;break;
  105.      case 2: if(t.date>28)t.date=1,t.mon++;break;
  106.      case 3: if(t.date>31)t.date=1,t.mon++;break;
  107.      case 4: if(t.date>30)t.date=1,t.mon++;break;
  108.      case 5: if(t.date>31)t.date=1,t.mon++;break;
  109.      case 6: if(t.date>30)t.date=1,t.mon++;break;
  110.      case 7: if(t.date>31)t.date=1,t.mon++;break;
  111.      case 8: if(t.date>31)t.date=1,t.mon++;break;
  112.      case 9: if(t.date>30)t.date=1,t.mon++;break;
  113.      case 10: if(t.date>31)t.date=1,t.mon++;break;
  114.      case 11: if(t.date>30)t.date=1,t.mon++;break;
  115.      case 12: if(t.date>31)t.date=1,t.mon++;break;
  116.      }
  117.   t.day++;t.day=t.day%7;
  118.   Time p( t.yr, t.mon, t.date, t.hr, t.min,t.sec,t.day);
  119.   rtc.time(p);
  120. }
  121. void monthes()
  122. {
  123.   Time t = rtc.time();  
  124.   t.mon++; if(t.mon>12)t.mon=1,t.yr++;
  125.   switch(t.mon)
  126.      {case 1: t.day+=3;t.day=t.day%7;break;
  127.      case 2: t.day+=3;t.day=t.day%7;break;
  128.      case 3:   if(t.yr%4==0)t.day+=1;else t.day+=0;t.day=t.day%7;break;
  129.      case 4:   t.day+=3;t.day=t.day%7;break;
  130.      case 5:   t.day+=2;t.day=t.day%7;break;
  131.      case 6:   t.day+=3;t.day=t.day%7;break;
  132.      case 7:  t.day+=2;t.day=t.day%7;break;
  133.      case 8:  t.day+=3;t.day=t.day%7; break;
  134.      case 9:   t.day+=3;t.day=t.day%7;break;
  135.      case 10:  t.day+=2;t.day=t.day%7;break;
  136.      case 11:   t.day+=3;t.day=t.day%7;break;
  137.      case 12: t.day+=2;t.day=t.day%7;break;
  138.      }
  139.   Time p( t.yr, t.mon, t.date, t.hr, t.min,t.sec,t.day);
  140.   rtc.time(p);
  141. }
  142. void years()
  143. {
  144.   Time t = rtc.time();  
  145.   t.yr++;
  146.   switch((t.yr-1)%4)
  147.   {case 0:if(t.mon<3)t.day+=2;else t.day+=1;break;
  148.   default: t.day+=1;
  149.   }
  150.   Time p( t.yr, t.mon, t.date, t.hr, t.min,t.sec,t.day);
  151.   rtc.time(p);
  152. }

  153. void loop()
  154. {
  155.    /* 當串口有數據的時候,將數據拼接到變量comdate */
  156.     while (Serial.available() > 0)
  157.     {
  158.         comdate += char(Serial.read());
  159.         delay(2);
  160.         mark = 1;
  161.     }
  162.     /* 以逗號分隔分解comdate的字符串,分解結果變成轉換成數字到numdate[]數組 */
  163.     if(mark == 1)
  164.     {
  165.         //Serial.print("You inputed : ");
  166.         //Serial.println(comdate);
  167.         for(int i = 0; i < comdate.length() ; i++)
  168.         {
  169.             if(comdate[i] == ',' || comdate[i] == 0x10 || comdate[i] == 0x13)
  170.             {
  171.                 j++;
  172.             }
  173.             else
  174.             {
  175.                 numdate[j] = numdate[j] * 10 + (comdate[i] - '0');
  176.             }
  177.         }
  178.         /* 將轉換好的numdate湊成時間格式,寫入DS1302 */
  179.         Time t(numdate[0], numdate[1], numdate[2], numdate[3], numdate[4], numdate[5], numdate[6]);
  180.         rtc.time(t);
  181.         mark = 0;j=0;
  182.         /* 清空 comdate 變量,以便等待下一次輸入 */
  183.         comdate = String("");
  184.         /* 清空 numdate */
  185.         for(int i = 0; i < 7 ; i++) numdate[i]=0;
  186.     }
  187.    
  188.     /* 打印當前時間 */
  189.     print_time();
  190.     delay(1000);
  191. }
復制代碼

全部資料51hei下載地址:
基于 Arduino MEGA2560的 DS1302 實時時鐘和修改( protues仿真+程序+虛擬串口軟件+.zip (5.62 MB, 下載次數: 44)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久av资源网| 亚洲精品一区在线观看 | 国产精品美女久久久av超清 | 久久在线看 | 亚洲国产专区 | 欧洲一级毛片 | 中文字幕99| 日日操视频 | 国产高清久久 | 91久久久久久久久 | 四虎免费视频 | a视频在线观看 | 精品1区2区 | 在线第一页 | 日韩av最新网址 | 毛片在线看片 | 欧美日韩久久久 | 久在线观看 | www.日韩 | 久久成人一区 | 日本精品国产 | 欧美一级在线免费观看 | 国产日韩欧美一区 | 2019天天操 | 亚洲男人网 | 久久精品一区二区 | 男女羞羞视频在线看 | 91亚洲精品国偷拍自产在线观看 | 亚洲一区二区三区四区五区中文 | 久久综合影院 | 日韩欧美一级片 | 伊人伊成久久人综合网站 | 日韩精品一区二区三区在线播放 | 99精品视频在线观看 | 国产精品自拍av | 最新国产精品精品视频 | 欧美在线a | 一区二区三区在线播放 | 日本在线一区二区 | 午夜精品91| 中文字幕视频在线 |