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

QQ登錄

只需一步,快速開(kāi)始

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

arduino控制lcd1602+DS1302,顯示時(shí)間

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:169810 發(fā)表于 2017-3-20 22:30 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
   arduino控制,lcd1602顯示時(shí)間(來(lái)自DS1302),用串口,可以修改時(shí)間(串口輸入格式:年,月,日,時(shí),分,秒,星期),僅供新手練習(xí)、學(xué)習(xí)。  
  需要庫(kù)及程序的,可以留言。



  1. /*
  2. Arduino 連接 DS1302
  3. 代碼來(lái)源:quadpoint點(diǎn)org/projects/arduino-ds1302
  4. 增加了串口調(diào)整時(shí)間代碼
  5. */
  6. #include <LiquidCrystal.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <DS1302.h>
  10. LiquidCrystal lcd(12, 11, 10, 9, 6, 5);
  11. int i;

  12. /* 接口定義
  13. CE(DS1302 pin5) -> Arduino D5
  14. IO(DS1302 pin6) -> Arduino D6
  15. SCLK(DS1302 pin7) -> Arduino D7
  16. */
  17. uint8_t CE_PIN   = 2;
  18. uint8_t SCLK_PIN = 3;
  19. uint8_t IO_PIN   = 4;
  20. /* 日期變量緩存 */[flash][/flash]
  21. char buf[50];
  22. char day[10];
  23. /* 串口數(shù)據(jù)緩存 */
  24. String comdata = "";
  25. int numdata[7] ={0}, j = 0, mark = 0;
  26. /* 創(chuàng)建 DS1302 對(duì)象 */
  27. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  28. void print_time()
  29. {
  30.     /* 從 DS1302 獲取當(dāng)前時(shí)間 */
  31.     Time t = rtc.time();
  32.     /* 將星期從數(shù)字轉(zhuǎn)換為名稱 */
  33.     memset(day, 0, sizeof(day));
  34.     switch (t.day)
  35.     {
  36.     case 1: strcpy(day, "Sunday"); break;
  37.     case 2: strcpy(day, "Monday"); break;
  38.     case 3: strcpy(day, "Tuesday"); break;
  39.     case 4: strcpy(day, "Wednesday"); break;
  40.     case 5: strcpy(day, "Thursday"); break;
  41.     case 6: strcpy(day, "Friday"); break;
  42.     case 7: strcpy(day, "Saturday"); break;
  43.     }
  44.     /* 將日期代碼格式化湊成buf等待輸出 */
  45.     snprintf(buf, sizeof(buf),"%s%04d-%02d-%02d %02d:%02d %02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  46.     /* 輸出日期到串口 */
  47.     Serial.println(buf);
  48. }

  49. void setup()
  50. {
  51.     lcd.begin(16, 2);
  52. //   lcd.setCursor(0, 0);
  53.    
  54.     Serial.begin(9600);
  55.     rtc.write_protect(false);
  56.     rtc.halt(false);
  57. }
  58. void loop()
  59. {
  60.     /* 當(dāng)串口有數(shù)據(jù)的時(shí)候,將數(shù)據(jù)拼接到變量comdata */
  61.     while (Serial.available() > 0)
  62.     {
  63.         comdata += char(Serial.read());
  64.         delay(2);
  65.         mark = 1;
  66.     }
  67.     /* 以逗號(hào)分隔分解comdata的字符串,分解結(jié)果變成轉(zhuǎn)換成數(shù)字到numdata[]數(shù)組 */
  68.     if(mark == 1)
  69.     {
  70.         Serial.print("You inputed : ");
  71.         Serial.println(comdata);
  72.         for(int i = 0; i < comdata.length() ; i++)
  73.         {
  74.             if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  75.             {
  76.                 j++;
  77.             }
  78.             else
  79.             {
  80.                 numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  81.             }
  82.         }
  83.         /* 將轉(zhuǎn)換好的numdata湊成時(shí)間格式,寫入DS1302 */
  84.         Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  85.         rtc.time(t);
  86.         mark = 0;j=0;
  87.         /* 清空 comdata 變量,以便等待下一次輸入 */
  88.         comdata = String("");
  89.         /* 清空 numdata */
  90.         for(int i = 0; i < 7 ; i++) numdata[i]=0;
  91.     }
  92.    
  93.     /* 打印當(dāng)前時(shí)間 */
  94.     print_time();
  95.    lcd.setCursor(0, 0);   //顯示星期
  96.    for(i=0;i<6;i++)               
  97.   {
  98.     lcd.print(buf[i]);
  99.   }
  100.   delay(100);
  101.   
  102.   lcd.setCursor(0, 1);  
  103.   for(i=6;i<22;i++)        //年 月 日 時(shí) 分 秒
  104.   {
  105.     lcd.print(buf[i]);
  106.   }
  107.   lcd.setCursor(13, 0);  
  108.   for(i=22;i<25;i++)        // 秒
  109.   {
  110.     lcd.print(buf[i]);
  111.   }
  112.   
  113.   
  114.     delay(1000);
  115. }
復(fù)制代碼

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:177116 發(fā)表于 2017-3-21 15:58 | 只看該作者
樓主,好棒
回復(fù)

使用道具 舉報(bào)

板凳
ID:177116 發(fā)表于 2017-3-21 15:58 | 只看該作者
發(fā)幾個(gè)庫(kù)文件,謝謝
回復(fù)

使用道具 舉報(bào)

地板
ID:177116 發(fā)表于 2017-3-21 15:59 | 只看該作者
發(fā)幾個(gè)庫(kù)文件
回復(fù)

使用道具 舉報(bào)

5#
ID:169810 發(fā)表于 2017-3-21 19:17 | 只看該作者
1302庫(kù),1602的沒(méi)有了,可以自己去下載

DS1302 1.0.rar

5.93 KB, 下載次數(shù): 159, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:169810 發(fā)表于 2017-3-22 09:46 | 只看該作者
不知道有發(fā)現(xiàn)問(wèn)題的伙伴沒(méi)有,程序有點(diǎn)問(wèn)題。問(wèn)題1:
回復(fù)

使用道具 舉報(bào)

7#
ID:169810 發(fā)表于 2017-3-22 09:56 | 只看該作者
有發(fā)現(xiàn)問(wèn)題的伙伴嗎?
問(wèn)題:星期變化,顯示就亂了。
原因:ds1302讀取來(lái)的信息儲(chǔ)存在char buf[50];中,每個(gè)星期長(zhǎng)短不同,從而存儲(chǔ)位數(shù)不同,而下面for語(yǔ)句讀取的位數(shù)固定,導(dǎo)致星期變化,顯示就亂。
辦法:修改void print_time()函數(shù)中case語(yǔ)句和后面的讀取語(yǔ)句for語(yǔ)句,解決問(wèn)題。
回復(fù)

使用道具 舉報(bào)

8#
ID:169810 發(fā)表于 2017-3-22 09:57 | 只看該作者

  1. /*
  2. Arduino 連接 DS1302
  3. 代碼來(lái)源:quadpoint點(diǎn)org/projects/arduino-ds1302
  4. 增加了串口調(diào)整時(shí)間代碼
  5. */
  6. #include <LiquidCrystal.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <DS1302.h>
  10. LiquidCrystal lcd(12, 11, 10, 9, 6, 5);
  11. int i,c;


  12. /* 接口定義
  13. CE(DS1302 pin5) -> Arduino D5
  14. IO(DS1302 pin6) -> Arduino D6
  15. SCLK(DS1302 pin7) -> Arduino D7
  16. */
  17. uint8_t CE_PIN   = 2;
  18. uint8_t SCLK_PIN = 3;
  19. uint8_t IO_PIN   = 4;

  20. /* 日期變量緩存 */
  21. char buf[50];
  22. char buf1[20];
  23. char day[10];
  24. /* 串口數(shù)據(jù)緩存 */
  25. String comdata = "";
  26. int numdata[7] ={0}, j = 0, mark = 0;
  27. /* 創(chuàng)建 DS1302 對(duì)象 */
  28. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


  29. void print_time()
  30. {
  31.     /* 從 DS1302 獲取當(dāng)前時(shí)間 */
  32.     Time t = rtc.time();
  33.     /* 將星期從數(shù)字轉(zhuǎn)換為名稱 */
  34.     memset(day, 0, sizeof(day));
  35.     switch (t.day)
  36.     {
  37.     case 1: strcpy(day, "Sunday"),c=6; break;
  38.     case 2: strcpy(day, "Monday"),c=6; break;
  39.     case 3: strcpy(day, "Tuesday"),c=7; break;
  40.     case 4: strcpy(day, "Wednesday"),c=9; break;
  41.     case 5: strcpy(day, "Thursday"),c=8; break;
  42.     case 6: strcpy(day, "Friday"),c=6; break;
  43.     case 7: strcpy(day, "Saturday"),c=8; break;
  44.     }
  45.     /* 將日期代碼格式化湊成buf等待輸出 */
  46.     snprintf(buf, sizeof(buf),"%s%04d-%02d-%02d %02d:%02d %02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  47.     /* 輸出日期到串口 */
  48.     Serial.println(buf);
  49. }


  50. void setup()
  51. {
  52.     lcd.begin(16, 2);
  53. //   lcd.setCursor(0, 0);
  54.    
  55.     Serial.begin(9600);
  56.     rtc.write_protect(false);
  57.     rtc.halt(false);
  58. }

  59. void loop()
  60. {
  61.     /* 當(dāng)串口有數(shù)據(jù)的時(shí)候,將數(shù)據(jù)拼接到變量comdata */
  62.     while (Serial.available() > 0)
  63.     {
  64.         comdata += char(Serial.read());
  65.         delay(2);
  66.         mark = 1;
  67.     }
  68.     /* 以逗號(hào)分隔分解comdata的字符串,分解結(jié)果變成轉(zhuǎn)換成數(shù)字到numdata[]數(shù)組 */
  69.     if(mark == 1)
  70.     {
  71.         Serial.print("You inputed : ");
  72.         Serial.println(comdata);
  73.         for(int i = 0; i < comdata.length() ; i++)
  74.         {
  75.             if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
  76.             {
  77.                 j++;
  78.             }
  79.             else
  80.             {
  81.                 numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
  82.             }
  83.         }
  84.         /* 將轉(zhuǎn)換好的numdata湊成時(shí)間格式,寫入DS1302 */
  85.         Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
  86.         rtc.time(t);
  87.         mark = 0;j=0;
  88.         /* 清空 comdata 變量,以便等待下一次輸入 */
  89.         comdata = String("");
  90.         /* 清空 numdata */
  91.         for(int i = 0; i < 7 ; i++) numdata[i]=0;
  92.     }
  93.    
  94.     /* 打印當(dāng)前時(shí)間 */
  95.     print_time();
  96.    lcd.setCursor(0, 0);   //顯示星期
  97.    lcd.clear();                           
  98.    for(i=0;i<c;i++)               
  99.   {
  100.     lcd.print(buf[i]);
  101.   }
  102. //  delay(100);
  103.   
  104.   lcd.setCursor(0, 1);  
  105.   for(i=c;i<c+16;i++)        //年 月 日 時(shí) 分
  106.   {
  107.     lcd.print(buf[i]);
  108.   }

  109.   lcd.setCursor(13, 0);  
  110.   for(i=c+16;i<c+19;i++)        // 秒
  111.   {
  112.     lcd.print(buf[i]);
  113.   }
  114.   
  115.   
  116.     delay(1000);
  117. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

9#
ID:199578 發(fā)表于 2017-5-11 15:48 | 只看該作者
發(fā)一下庫(kù)文件可以嗎
回復(fù)

使用道具 舉報(bào)

10#
ID:253037 發(fā)表于 2017-11-24 14:02 | 只看該作者
求庫(kù)文件
回復(fù)

使用道具 舉報(bào)

11#
ID:257414 發(fā)表于 2017-12-4 21:52 | 只看該作者
求庫(kù)文件
回復(fù)

使用道具 舉報(bào)

12#
ID:252587 發(fā)表于 2017-12-8 12:54 | 只看該作者
怎么一直顯示  2165-25-45 27:165:85
回復(fù)

使用道具 舉報(bào)

13#
ID:267253 發(fā)表于 2018-1-2 19:12 | 只看該作者
WJD917108 發(fā)表于 2017-3-21 19:17
1302庫(kù),1602的沒(méi)有了,可以自己去下載

1602庫(kù)都能用
回復(fù)

使用道具 舉報(bào)

14#
ID:110588 發(fā)表于 2018-6-28 22:54 | 只看該作者
樓主,好棒,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

15#
ID:382476 發(fā)表于 2018-8-4 09:58 | 只看該作者
支持 樓主
回復(fù)

使用道具 舉報(bào)

16#
ID:449921 發(fā)表于 2018-12-19 16:11 | 只看該作者
要什么開(kāi)發(fā)板嗎,我的一直顯示“為開(kāi)發(fā)板 Arduino 編譯時(shí)出錯(cuò)!
回復(fù)

使用道具 舉報(bào)

17#
ID:444771 發(fā)表于 2018-12-28 18:20 | 只看該作者
#include <stdio.h> #include <string.h> 這兩個(gè)庫(kù)也要自己添加嗎
回復(fù)

使用道具 舉報(bào)

18#
ID:458497 發(fā)表于 2018-12-30 12:26 | 只看該作者
為什么時(shí)間顯示一直都是2000:00:00啊
回復(fù)

使用道具 舉報(bào)

19#
ID:480931 發(fā)表于 2019-3-21 11:37 來(lái)自手機(jī) | 只看該作者
求庫(kù)文件,實(shí)物圖
回復(fù)

使用道具 舉報(bào)

20#
ID:469510 發(fā)表于 2019-5-6 13:31 | 只看該作者
樓主,好棒
回復(fù)

使用道具 舉報(bào)

21#
ID:574730 發(fā)表于 2019-6-29 19:45 | 只看該作者
請(qǐng)教,驗(yàn)證出現(xiàn)錯(cuò)誤如下

C:\Arduino\sketch_jun29a\sketch_jun29a.ino: In function 'void setup()':

sketch_jun29a:50:9: error: 'class DS1302' has no member named 'write_protect'

     rtc.write_protect(false);

         ^

C:\Arduino\sketch_jun29a\sketch_jun29a.ino: In function 'void loop()':

C:\Arduino\sketch_jun29a\sketch_jun29a.ino:80:97: warning: invalid conversion from 'int' to 'Time::Day' [-fpermissive]

         Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);

                                                                                                 ^

In file included from C:\Arduino\sketch_jun29a\sketch_jun29a.ino:3:0:

C:\Arduino\libraries\arduino-ds1302-master/DS1302.h:35:3: note:   initializing argument 7 of 'Time::Time(uint16_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, Time::Day)'

   Time(uint16_t yr, uint8_t mon, uint8_t date,

   ^

"LiquidCrystal.h" 對(duì)應(yīng)多個(gè)庫(kù)
已使用: C:\Arduino\libraries\LiquidCrystal
未使用:C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.21.0_x86__mdqgnx93n4wtt\libraries\LiquidCrystal
exit status 1
'class DS1302' has no member named 'write_protect'
回復(fù)

使用道具 舉報(bào)

22#
ID:355312 發(fā)表于 2019-7-10 09:38 | 只看該作者
板子是什么型號(hào)
回復(fù)

使用道具 舉報(bào)

23#
ID:600618 發(fā)表于 2019-9-24 13:15 | 只看該作者
你的程序,都寫入項(xiàng)目文件夾了嗎?
回復(fù)

使用道具 舉報(bào)

24#
ID:600618 發(fā)表于 2019-9-24 13:22 | 只看該作者
你的顯示時(shí)間的程序,在項(xiàng)目文件夾嗎
回復(fù)

使用道具 舉報(bào)

25#
ID:615689 發(fā)表于 2019-9-24 15:14 | 只看該作者
不錯(cuò),學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

26#
ID:265874 發(fā)表于 2019-9-24 17:02 | 只看該作者
太容易了
回復(fù)

使用道具 舉報(bào)

27#
ID:654204 發(fā)表于 2019-12-6 12:01 | 只看該作者

95行編譯的時(shí)候出錯(cuò)
回復(fù)

使用道具 舉報(bào)

28#
ID:658105 發(fā)表于 2019-12-7 12:27 | 只看該作者

程序編譯不成功是為什么
回復(fù)

使用道具 舉報(bào)

29#
ID:658105 發(fā)表于 2019-12-7 12:33 | 只看該作者
為什么編譯會(huì)有錯(cuò)?95行怎么出錯(cuò)l
回復(fù)

使用道具 舉報(bào)

30#
ID:658105 發(fā)表于 2019-12-7 12:35 | 只看該作者
你的問(wèn)題解決了嗎
回復(fù)

使用道具 舉報(bào)

31#
ID:654794 發(fā)表于 2019-12-16 17:24 | 只看該作者
好厲害,學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

32#
ID:792743 發(fā)表于 2020-6-29 14:07 | 只看該作者
C:\Users\admin\Desktop為什么顯示2000——0-0
回復(fù)

使用道具 舉報(bào)

33#
ID:792743 發(fā)表于 2020-6-29 15:34 | 只看該作者
為什么顯示這個(gè),大佬們

51hei圖片_20200629140609.jpg (107.77 KB, 下載次數(shù): 209)

51hei圖片_20200629140609.jpg
回復(fù)

使用道具 舉報(bào)

34#
ID:794756 發(fā)表于 2020-7-1 14:11 | 只看該作者
如何獲取這個(gè)代碼和庫(kù)文件?
回復(fù)

使用道具 舉報(bào)

35#
ID:794756 發(fā)表于 2020-7-1 14:12 | 只看該作者
需要庫(kù)和程序
回復(fù)

使用道具 舉報(bào)

36#
ID:593148 發(fā)表于 2020-7-18 17:30 | 只看該作者

您好,我這邊用的Mixly軟件編寫,出現(xiàn)的問(wèn)題是當(dāng)斷電后,不知道怎么讀取ds1302中的程序,斷電以后會(huì)重新初始化的時(shí)間設(shè)定,您知道怎么解決嗎?
回復(fù)

使用道具 舉報(bào)

37#
ID:829318 發(fā)表于 2020-10-13 14:57 | 只看該作者
Oumuamua01 發(fā)表于 2019-6-29 19:45
請(qǐng)教,驗(yàn)證出現(xiàn)錯(cuò)誤如下

C:\Arduino\sketch_jun29a\sketch_jun29a.ino: In function 'void setup()':

你好,我也是出現(xiàn)這個(gè)錯(cuò)誤。請(qǐng)問(wèn)你解決了這個(gè)問(wèn)題了嗎,可以告知一下嗎
回復(fù)

使用道具 舉報(bào)

38#
ID:878521 發(fā)表于 2021-1-31 15:34 | 只看該作者
時(shí)間改不了呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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