找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26664|回复: 37
收起左侧

arduino控制lcd1602+DS1302,显示时间

  [复制链接]
ID:169810 发表于 2017-3-20 22:30 | 显示全部楼层 |阅读模式
   arduino控制,lcd1602显示时间(来自DS1302),用串口,可以修改时间(串口输入格式:年,月,日,时,分,秒,星期),仅供新手练习、学习。  
  需要库及程序的,可以留言。
IMG_20170320_220834_HDR.jpg IMG_20170320_221057_HDR.jpg


  1. /*
  2. Arduino 连接 DS1302
  3. 代码来源:quadpoint点org/projects/arduino-ds1302
  4. 增加了串口调整时间代码
  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. /* 串口数据缓存 */
  24. String comdata = "";
  25. int numdata[7] ={0}, j = 0, mark = 0;
  26. /* 创建 DS1302 对象 */
  27. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  28. void print_time()
  29. {
  30.     /* 从 DS1302 获取当前时间 */
  31.     Time t = rtc.time();
  32.     /* 将星期从数字转换为名称 */
  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.     /* 当串口有数据的时候,将数据拼接到变量comdata */
  61.     while (Serial.available() > 0)
  62.     {
  63.         comdata += char(Serial.read());
  64.         delay(2);
  65.         mark = 1;
  66.     }
  67.     /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
  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.         /* 将转换好的numdata凑成时间格式,写入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.     /* 打印当前时间 */
  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++)        //年 月 日 时 分 秒
  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. }
复制代码

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:177116 发表于 2017-3-21 15:58 | 显示全部楼层
楼主,好棒
回复

使用道具 举报

ID:177116 发表于 2017-3-21 15:58 | 显示全部楼层
发几个库文件,谢谢
回复

使用道具 举报

ID:177116 发表于 2017-3-21 15:59 | 显示全部楼层
发几个库文件
回复

使用道具 举报

ID:169810 发表于 2017-3-21 19:17 | 显示全部楼层
1302库,1602的没有了,可以自己去下载

DS1302 1.0.rar

5.93 KB, 下载次数: 159, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:169810 发表于 2017-3-22 09:46 | 显示全部楼层
不知道有发现问题的伙伴没有,程序有点问题。问题1:
回复

使用道具 举报

ID:169810 发表于 2017-3-22 09:56 | 显示全部楼层
有发现问题的伙伴吗?
问题:星期变化,显示就乱了。
原因:ds1302读取来的信息储存在char buf[50];中,每个星期长短不同,从而存储位数不同,而下面for语句读取的位数固定,导致星期变化,显示就乱。
办法:修改void print_time()函数中case语句和后面的读取语句for语句,解决问题。
回复

使用道具 举报

ID:169810 发表于 2017-3-22 09:57 | 显示全部楼层

  1. /*
  2. Arduino 连接 DS1302
  3. 代码来源:quadpoint点org/projects/arduino-ds1302
  4. 增加了串口调整时间代码
  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. /* 串口数据缓存 */
  25. String comdata = "";
  26. int numdata[7] ={0}, j = 0, mark = 0;
  27. /* 创建 DS1302 对象 */
  28. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);


  29. void print_time()
  30. {
  31.     /* 从 DS1302 获取当前时间 */
  32.     Time t = rtc.time();
  33.     /* 将星期从数字转换为名称 */
  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.     /* 当串口有数据的时候,将数据拼接到变量comdata */
  62.     while (Serial.available() > 0)
  63.     {
  64.         comdata += char(Serial.read());
  65.         delay(2);
  66.         mark = 1;
  67.     }
  68.     /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
  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.         /* 将转换好的numdata凑成时间格式,写入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.     /* 打印当前时间 */
  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++)        //年 月 日 时 分
  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. }
复制代码
回复

使用道具 举报

ID:199578 发表于 2017-5-11 15:48 | 显示全部楼层
发一下库文件可以吗
回复

使用道具 举报

ID:253037 发表于 2017-11-24 14:02 | 显示全部楼层
求库文件
回复

使用道具 举报

ID:257414 发表于 2017-12-4 21:52 | 显示全部楼层
求库文件
回复

使用道具 举报

ID:252587 发表于 2017-12-8 12:54 | 显示全部楼层
怎么一直显示  2165-25-45 27:165:85
回复

使用道具 举报

ID:267253 发表于 2018-1-2 19:12 | 显示全部楼层
WJD917108 发表于 2017-3-21 19:17
1302库,1602的没有了,可以自己去下载

1602库都能用
回复

使用道具 举报

ID:110588 发表于 2018-6-28 22:54 | 显示全部楼层
楼主,好棒,学习学习
回复

使用道具 举报

ID:382476 发表于 2018-8-4 09:58 | 显示全部楼层
支持 楼主
回复

使用道具 举报

ID:449921 发表于 2018-12-19 16:11 | 显示全部楼层
要什么开发板吗,我的一直显示“为开发板 Arduino 编译时出错。”
回复

使用道具 举报

ID:444771 发表于 2018-12-28 18:20 | 显示全部楼层
#include <stdio.h> #include <string.h> 这两个库也要自己添加吗
回复

使用道具 举报

ID:458497 发表于 2018-12-30 12:26 | 显示全部楼层
为什么时间显示一直都是2000:00:00啊
回复

使用道具 举报

ID:480931 发表于 2019-3-21 11:37 来自手机 | 显示全部楼层
求库文件,实物图
回复

使用道具 举报

ID:469510 发表于 2019-5-6 13:31 | 显示全部楼层
楼主,好棒
回复

使用道具 举报

ID:574730 发表于 2019-6-29 19:45 | 显示全部楼层
请教,验证出现错误如下

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" 对应多个库
已使用: 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'
回复

使用道具 举报

ID:355312 发表于 2019-7-10 09:38 | 显示全部楼层
板子是什么型号
回复

使用道具 举报

ID:600618 发表于 2019-9-24 13:15 | 显示全部楼层
你的程序,都写入项目文件夹了吗?
回复

使用道具 举报

ID:600618 发表于 2019-9-24 13:22 | 显示全部楼层
你的显示时间的程序,在项目文件夹吗
回复

使用道具 举报

ID:615689 发表于 2019-9-24 15:14 | 显示全部楼层
不错,学习了
回复

使用道具 举报

ID:265874 发表于 2019-9-24 17:02 | 显示全部楼层
太容易了
回复

使用道具 举报

ID:654204 发表于 2019-12-6 12:01 | 显示全部楼层

95行编译的时候出错
回复

使用道具 举报

ID:658105 发表于 2019-12-7 12:27 | 显示全部楼层

程序编译不成功是为什么
回复

使用道具 举报

ID:658105 发表于 2019-12-7 12:33 | 显示全部楼层
为什么编译会有错?95行怎么出错l
回复

使用道具 举报

ID:658105 发表于 2019-12-7 12:35 | 显示全部楼层
你的问题解决了吗
回复

使用道具 举报

ID:654794 发表于 2019-12-16 17:24 | 显示全部楼层
好厉害,学习一下
回复

使用道具 举报

ID:792743 发表于 2020-6-29 14:07 | 显示全部楼层
C:\Users\admin\Desktop为什么显示2000——0-0
回复

使用道具 举报

ID:792743 发表于 2020-6-29 15:34 | 显示全部楼层
为什么显示这个,大佬们
51hei图片_20200629140609.jpg
回复

使用道具 举报

ID:794756 发表于 2020-7-1 14:11 | 显示全部楼层
如何获取这个代码和库文件?
回复

使用道具 举报

ID:794756 发表于 2020-7-1 14:12 | 显示全部楼层
需要库和程序
回复

使用道具 举报

ID:593148 发表于 2020-7-18 17:30 | 显示全部楼层

您好,我这边用的Mixly软件编写,出现的问题是当断电后,不知道怎么读取ds1302中的程序,断电以后会重新初始化的时间设定,您知道怎么解决吗?
回复

使用道具 举报

ID:829318 发表于 2020-10-13 14:57 | 显示全部楼层
Oumuamua01 发表于 2019-6-29 19:45
请教,验证出现错误如下

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

你好,我也是出现这个错误。请问你解决了这个问题了吗,可以告知一下吗
回复

使用道具 举报

ID:878521 发表于 2021-1-31 15:34 | 显示全部楼层
时间改不了呀
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表