2019-3-9 22:25:11 [显示全部楼层]
3455浏览
查看: 3455|回复: 2

用ATmega 328 板和TM1638数显板和简单代码制作的小电子钟

[复制链接]
小孩参加学校的机器人制作竞赛,剩下了一块Mini 的 ATmega 328 板和TM1638数显板,为了不白白浪费扔垃圾桶,我就拿来自学一下Arduino,好像还有点意思。今天编了一个电子钟小程序,也算是动起来了。找到这里分享一下。
用ATmega 328 板和TM1638数显板和简单代码制作的小电子钟图1

用ATmega 328 板和TM1638数显板和简单代码制作的小电子钟图2


因为学校只提供安装教程,没有讲解这些板子是怎么连接编程的,连板子的参数资料都没有提供,所以资料都是自己上网找的,花了点时间。为了简化程序,我在网上找到了TM1638的一个库文件,所以实际代码只需要几行。也没有安装时钟模块,所以钟走的不太准,而且一拔电得重设时间。所以也把按钮做成了可随时调节时钟。

具体代码如下:(程序文件和TM1638库文件见附件)[mw_shl_code=applescript,true]
#include <InvertedTM1638.h>
#include <TM1638.h>
#include <TM1638QYF.h>
#include <TM1640.h>
#include <TM16XX.h>
#include <TM16XXFonts.h>
//TM1638模块引脚定义
int DIO = 9;
int CLK = 12;
int STB = 13; //这里定义了那三个脚

TM1638 disp(DIO,CLK, STB);  //data,clk,stb

uint16_t  j = 0;
unsigned long TimeNow;

void setup ()
{
  TimeNow = Time2second(9174100);//initialization time day|hour|min|sec
}
void loop()
    {
      unsigned long i;
      ++TimeNow;
      i=disp.getButtons();//time setting
      disp.setLEDs(i);
      switch (i) {
        case 1:    //Reduce day
        case 4:    //Reduce hour
        case 16:   //Reduce minute
        case 64:   //Reduce second
        TimeNow=second2Time(TimeNow);
        i= pow(10,(7-getBaseLog(2,i*2)));
        TimeNow=TimeNow + i;
        TimeNow = Time2second(TimeNow);      
        break;
        case 2:    //Add day
        case 8:    //Plus hour
        case 32:   //Plus minute
        case 128:  //Plus second
        TimeNow=second2Time(TimeNow);
        i= pow(10,(7-getBaseLog(2,i)));
        TimeNow=TimeNow - i;
        TimeNow = Time2second(TimeNow);   
        break;
        default:
        // statements
        break;
}   
      disp.setDisplayToDecNumber(second2Time(TimeNow), 0,false);
      delay(1000);
}

unsigned long second2Time(unsigned long DATA)                //convert second count to a time showing
{
  unsigned long second;
  unsigned long minute;
  unsigned long hour;
  unsigned long day;
  unsigned long result;
  second = DATA % 60;
  DATA = ceil(DATA/60);
  minute = DATA % 60;
  DATA = ceil(DATA/60);
  hour =  DATA % 24;
  DATA = ceil(DATA/24);
  day = DATA % 30;
  result = day * 1000000 + hour * 10000 + minute *100 + second;
  return result;
}

unsigned long Time2second(unsigned long DATA)                //convert a time showing num to second num
{
  unsigned long second;
  unsigned long minute;
  unsigned long hour;
  unsigned long day;
  unsigned long result;
  second = DATA % 100 % 60;
  DATA = ceil(DATA/100);
  minute = DATA % 100 % 60;
  DATA = ceil(DATA/100);
  hour =  DATA % 100 % 24;
  DATA = ceil(DATA/100);
  day = DATA % 100 % 30 ;
  result = day * 86400 + hour * 3600 + minute * 60 + second;
  return result;
}

int getBaseLog(int x, int y) //logx y):
{
    return log(y) / log(x);
}
[/mw_shl_code]

clock.in.rar

912 Bytes, 下载次数: 1153

tm1638-library-master.rar

1.16 MB, 下载次数: 1102

KIKIYA  管理员

发表于 2019-3-10 06:26:19

小朋友能让我们学会很多技能呢
回复

使用道具 举报

rzyzzxw  版主

发表于 2019-3-10 08:49:18

哈哈,很赞啊。继续创下去。
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail