找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4127|回复: 1
打印 上一主题 下一主题
收起左侧

这是我根据网上找的资料,做的一个LCD1602+DS1302+DS18B20制作的一个电子时钟

[复制链接]
跳转到指定楼层
楼主
本帖最后由 Plan3t 于 2018-4-30 19:52 编辑

电路引脚:
DS18B20:
VCC——电源正极
GND——地
OUT——D10

DS1302:
VCC——正极
GND——地
CLK——D7
DAT——D6
RST——D5


IIC:
VCC——正极
GND——地  
SDA——A4
SCK——A5      
连接好之后可能会不能显示,需要在LCD1602引脚A0端接一个电位计或者电阻,用来调整显示屏对比度调整时间,在串口监视器连续输入16个数,如2018042801170406,就是2018年4月28日 1点17分4秒 星期6


下面是整个程序,还有需要的库
  1.   //#########################################
  2. /* 接口定义
  3.   CE(DS1302 pin5) ->  D5
  4.   IO(DS1302 pin6) -> D6
  5.   SCLK(DS1302 pin7) -> D7
  6. */
  7. //################################
  8. #include <stdio.h>
  9. #include <string.h>
  10. #include <DS1302.h>
  11. #include <DallasTemperature.h> // DS18B20 库
  12. #include <LiquidCrystal_I2C.h> // I2C 1602
  13. #include <Wire.h> // I2C 库
  14. #include <OneWire.h>
  15. #define ONE_WIRE_BUS 10    // DS18B20 连接arduino D10引脚

  16. // 初始连接在单总线上的单总线设备
  17. OneWire oneWire(ONE_WIRE_BUS);
  18. DallasTemperature sensors(&oneWire);
  19. LiquidCrystal_I2C lcd(0x27,16,2); //设置LCD1602的I2C地址为0x27
  20. uint8_t CE_PIN   = 5;
  21. uint8_t IO_PIN   = 6;
  22. uint8_t SCLK_PIN = 7;

  23. byte nian[8] =
  24. {
  25.         0b01000,
  26.         0b01111,
  27.         0b10010,
  28.         0b01111,
  29.         0b01010,
  30.         0b11111,
  31.         0b00010,
  32.         0b00000
  33. };
  34. byte yue[8] =
  35. {
  36.         0b01111,
  37.         0b01001,
  38.         0b01111,
  39.         0b01001,
  40.         0b01111,
  41.         0b01001,
  42.         0b10011,
  43.         0b00000,
  44. };
  45. byte ri[8] =
  46. {
  47.         0b11111,
  48.         0b10001,
  49.         0b10001,
  50.         0b11111,
  51.         0b10001,
  52.         0b10001,
  53.         0b11111,
  54.         0b00000
  55. };
  56. byte  temp[8]=
  57. {
  58.    0b10000,
  59.     0b01111,
  60.     0b01000,
  61.     0b01000,
  62.     0b01000,
  63.     0b01000,
  64.     0b01111,
  65.     0b00000, //温度标志— —摄氏度
  66. };

  67. // 日期变量缓存
  68. char buf[50];
  69. char day[10];
  70. // 串口数据缓存
  71. String comdata = "" ;
  72. int numdata[7] = {0}, j = 0, mark = 0;
  73. // 创建 DS1302 对象
  74. DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);

  75. Time t;
  76. void print_time()
  77. {
  78.         // 从 DS1302 获取当前时间
  79.         t = rtc.time();
  80.         // 将星期从数字转换为名称
  81.         memset(day, 0, sizeof(day));
  82.         switch (t.day)
  83.         {
  84.         case 7:
  85.                 strcpy(day, "Sunday");
  86.                 break;
  87.         case 1:
  88.                 strcpy(day, "Monday");
  89.                 break;
  90.         case 2:
  91.                 strcpy(day, "Tuesday");
  92.                 break;
  93.         case 3:
  94.                 strcpy(day, "Wednesday");
  95.                 break;
  96.         case 4:
  97.                 strcpy(day, "Thursday");
  98.                 break;
  99.         case 5:
  100.                 strcpy(day, "Friday");
  101.                 break;
  102.         case 6:
  103.                 strcpy(day, "Saturday");
  104.                 break;
  105.         }
  106.         // 将日期代码格式化凑成buf等待输出
  107.         snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
  108.         // 输出日期到串口
  109.         Serial.println(buf);
  110. }


  111. void setup()
  112. {
  113.         Serial.begin(9600);
  114. Serial.println("Temperature Project");

  115.         rtc.write_protect(false);
  116.         rtc.halt(false);
  117.         lcd.init(); // 给LCD的I2C通讯初始化,需要执行两次
  118.         delay(20);
  119.         lcd.init(); // 给LCD的I2C通讯初始化
  120.         delay(20);
  121.         lcd.backlight();//点亮LCD背光灯
  122.         rtc.write_protect(false);
  123.         rtc.halt(false);
  124.         lcd.begin(16, 2);
  125.         lcd.createChar(0, nian);
  126.         lcd.createChar(1, yue);
  127.         lcd.createChar(2, ri);
  128.         lcd.createChar(3, temp);
  129.         
  130. }

  131. void loop()
  132. {

  133.         // 当串口有数据的时候,将数据拼接到变量comdata
  134.        Serial.print("Requesting temperatures..."); // 串口发送字符
  135.        sensors.requestTemperatures(); // 传感器发送命令获取温度
  136.        Serial.println("DONE"); // 串口发送字符并换行
  137.        Serial.print("Temperature for the device 1 (index 0) is: ");
  138.        Serial.println(sensors.getTempCByIndex(0));
  139.         while (Serial.available() > 0)
  140.         {
  141.                 comdata += char(Serial.read());
  142.                 delay(2);
  143.                 mark = 1;
  144.         }
  145.         //以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组
  146.         if (mark == 1)
  147.         {
  148.                 Serial.print("You inputed : ");
  149.                 Serial.println(comdata);
  150.                 t.yr = (comdata[0] - '0') * 1000 + (comdata[1] - '0')*100 + (comdata[2] - '0') * 10 + (comdata[3] - '0'); //year
  151.                 t.mon = (comdata[4] - '0') * 10 + (comdata[5] - '0'); //month
  152.                 t.date = (comdata[6] - '0') * 10 + (comdata[7] - '0'); //date
  153.                 t.hr = (comdata[8] - '0') * 10 + (comdata[9] - '0'); //hour
  154.                 t.min = (comdata[10] - '0') * 10 + (comdata[11] - '0'); //minute
  155.                 t.sec = (comdata[12] - '0') * 10 + (comdata[13] - '0'); //second
  156.                 t.day = (comdata[14] - '0') * 10 + (comdata[15] - '0'); //week
  157.                 // 将转换好的numdata凑成时间格式,写入DS1302

  158.                 rtc.time(t);
  159.                 mark = 0;
  160.                 j = 0;//清空 comdata 变量,以便等待下一次输入
  161.                 comdata = String("");// 清空 numdata
  162.                 for (int i = 0; i < 7 ; i++) numdata = 0;
  163.         }

  164.         //打印当前时间
  165.         print_time();

  166.         lcd.setCursor(0, 0);
  167.         lcd.print(t.yr);
  168.         lcd.write(byte(0));
  169.         lcd.print(t.mon);
  170.         lcd.write(byte(1));
  171.         lcd.print(t.date);
  172.         lcd.write(byte(2));
  173.         lcd.print("  ");

  174.         lcd.setCursor(15, 0);
  175.         lcd.print(t.day);

  176.         lcd.setCursor(0, 1);
  177.         lcd.print(t.hr);
  178.         lcd.print(':');
  179.         lcd.print(t.min);
  180.         lcd.print(':');
  181.         lcd.print(t.sec);
  182.         lcd.print("   ");
  183.         lcd.setCursor(10, 1); // 定位光标到第二行靠中位置
  184.         lcd.print(sensors.getTempCByIndex(0)); // 显示温度值,来源DallasTemperature.h的函数
  185.         lcd.write(byte(3)); // 不定位光标则继续前面语句继续写字符
  186.         delay(1000);
  187. }
复制代码



20180428_011708.jpg (2.81 MB, 下载次数: 169)

20180428_011708.jpg

电子时钟总库.zip

49.25 KB, 下载次数: 29, 下载积分: 黑币 -5

评分

参与人数 2黑币 +55 收起 理由
蔡定银 + 5 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:318038 发表于 2018-4-30 19:23 | 只看该作者
本帖最后由 Plan3t 于 2018-4-30 19:39 编辑

我硬件软件都做出来了 求一个大神根据我的这个东西能否帮我绘制一个原理图和仿真图呢 因为proteus这个软件我目前实在不会用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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