Arduino入门笔记(7):利用1602、1302实现时钟和定时器

简介: 转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604       常常听到老妈在做饭时说“开锅15分钟后叫我一下”,为何不做个定时器,来提醒老妈呢?结合前面学习的知识,再加上1302时间模块,我决定自己做一个。

转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi

欢迎加入讨论群 64770604

      常常听到老妈在做饭时说“开锅15分钟后叫我一下”,为何不做个定时器,来提醒老妈呢?结合前面学习的知识,再加上1302时间模块,我决定自己做一个。

一、本次实验所需器材

1、Arduino UNO板 https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-15820725129.16.AtgoEm&id=545093340395

2、1602液晶板:http://www.cnblogs.com/xiaowuyi/p/3390024.html(或者http://wikicode.net/?p=232)已经介绍过。

3、DS1302实时时钟模块:DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM ,通过简单的串行接口与单片机进行通信。实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时钟操作可通过 AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信,仅需用到三个口线:(1)RST 复位(2)I/O 数据线(3)SCLK串行时钟。

(1)DS1302主要性能指标
实时时钟具有能计算2100 年之前的秒、分、时、日、星期、月、年的能力,还有闰年调整的能力
31 8 位暂存数据存储RAM
串行 I/O 口方式使得管脚数量最少
宽范围工作电压2.0 5.5V
工作电流 2.0V 时,小于300nA
读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式
8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配
简单 3 线接口
与 TTL 兼容Vcc=5V
可选工业级温度范围-40 +85
双电源管用于主电源和备份电源供应
(2)接线方法(以本实验程序为例)

VCC→+5V/3.3V

GND→GND

CLK→5

DAT→3

RST→2

4、按钮开关一个:按钮开关在连接时,需要接一个1KΩ电阻做为下拉电阻。具体关于按钮的使用可参考(http://www.geek-workshop.com/forum.php?mod=viewthread&tid=74)

5、蜂鸣器一个

6、电阻:1KΩ电阻、10KΩ电阻

二、硬件连接方法

    DS1602的连接主要采用四位连接法(http://www.cnblogs.com/xiaowuyi/p/3390024.html),端口为12,11,9,8,7,6。DS1302的连接方法上面已给出,另外按钮开关、蜂鸣器等的连接具体见下图。

1602_bb

三、程序代码

    具体代码如下:

// DS1302:  RST pin    -> Arduino Digital 2
//          DAT pin   -> Arduino Digital 3
//          CLK pin  -> Arduino Digital 5
#include <LiquidCrystal.h>
#include <DS1302.h>
LiquidCrystal lcd(12, 11, 9, 8, 7, 6);
DS1302 rtc(2, 3, 5);
int j=0;//记录定时设定分钟数
int time=0;//remine the last time 
int button=13;//13口控制按钮
boolean onoff= LOW; //记录按钮状态
boolean timefix=LOW;//记时器开关,LOW表示未定时,HIGH表示定时
unsigned long buttonHoldTime = 0;//按钮按下持续时间
int buttonStateOld;//按钮上一时刻状态
int buttonState;//按钮本时刻状态


void ting()//控制蜂鸣器发声
{

    int checkstate = digitalRead(button);
    for(int i=0;i<80;i++)//输出一个频率的声音
    {
      digitalWrite(10,HIGH);//发声音
      delay(1);//延时1ms
      digitalWrite(10,LOW);//不发声音
      delay(1);//延时ms
    }
    for(int i=0;i<100;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
    {
      digitalWrite(10,HIGH);
      delay(2);
      digitalWrite(10,LOW);
      delay(2);
    }
}

void clockdate()//1602显示时间
{
        lcd.clear(); //清屏
        lcd.setCursor(0,0);
        lcd.print(rtc.getDateStr(FORMAT_LONG,FORMAT_BIGENDIAN, '-'));//从1302的库文件可以看出,这里有下面几种格式FORMAT_BIGENDIAN:2010-01-01;FORMAT_LITTLEENDIAN:01-01-2010
        lcd.setCursor(11,0);
        lcd.print(rtc.getDOWStr());
        lcd.setCursor(14,0);
        lcd.print("    ");
        lcd.setCursor(0, 1) ;
        lcd.print(rtc.getTimeStr());
}

void setup()
{
  lcd.begin(16, 2);  //初始化LCD
  pinMode(10,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
  pinMode(button,INPUT);//设置引脚为输入模式
  // 设置时钟初始值
  rtc.halt(false);
  rtc.writeProtect(false);

  rtc.setDOW(SATURDAY);        // 设置星期
  rtc.setTime(22, 56,00);     //设置时间
  rtc.setDate(9, 11, 2013);   // 设置日期2013年11月9日
  rtc.writeProtect(true);
}

void loop()
{ 
  buttonState = digitalRead(button);
  delay(20);
  if (buttonState==HIGH && buttonStateOld==LOW)//按钮状态发生变化
  {
    buttonHoldTime = millis();//用millis()时间函数来记时,该函数最长记录时间为9小时22分,由于本程序最多记录60分钟,所以可以使用
    buttonStateOld =buttonState;

    if (onoff==HIGH)//当进入定时设置状态时
    {

          if (j>59)
          {
              j=0;
              timefix=LOW;
          }
          else
          {
              j=j+1;
              timefix=HIGH;
              
          }
          lcd.setCursor(11,0); 
          lcd.print(j); 
    }
  }
  else if (buttonState ==HIGH && buttonStateOld==HIGH)//判断按钮是否持续按下
  {
     if (millis()-buttonHoldTime>3000)//当按钮持续按下3秒种进入定时状态
     {
        buttonStateOld=LOW;
  
        if (onoff==LOW)//进入
        {
          j=0;
          timefix=LOW;
          lcd.clear(); //清屏
          lcd.setCursor(0,0);
          lcd.print("Fixed Time:");
          lcd.setCursor(11,0); 
          lcd.print(j); 
          lcd.setCursor(13,0);
          lcd.print("min");
          
          onoff=HIGH;
        }
        else//退出
        {
          
          clockdate();
  //        Serial.println(rtc.getTimeStr());
          buttonHoldTime = millis();
          onoff= LOW;
        }
        
     }
     else
     {
       buttonStateOld =buttonState;
     }
  }
  else
  {
    buttonStateOld =buttonState;
  }


   if (onoff==LOW)
   {
     clockdate();
      
   }

    if (timefix==HIGH && j>0 && onoff==LOW)
    {
      unsigned long delaytime=j*60000;//把分钟计算成秒

      if ((millis()-buttonHoldTime)>=delaytime )
      {

          do
          {
            buttonState = digitalRead(button);
            ting();
          }while (buttonState==LOW);//当按下按钮后,停止蜂鸣
          j=0;
      }
      else
      {
        clockdate();
      }
    }

  delay(1000);
  
}

 

    这个代码中,初始时间是设定好的,即2013年11月9日22点56分,因此本程序没有加入时钟时间设定功能,也可以再加上几个按钮,加上时间调节功能。另外在判断按钮按下时间这里,本程序的方法自我感觉有时笨,但也没想出更好的方法,哪位有更好的方法,请给指导一下,谢谢。

四、实现效果

    实现过程中,发现存在两个问题,一个是按钮不是很灵敏,另一个是最后再退出调时状态时,长按3秒,时间会增加1分钟。如原本设定12分钟,退出时长按3秒会依然会变成13分钟。

目录
相关文章
|
IDE 数据可视化 Linux
【matplotlib】plt.show() !真没这么简单!
【matplotlib】plt.show() !真没这么简单!
2793 1
|
3月前
|
人工智能 自然语言处理 数据挖掘
OPC一人公司和个体户的区别:这不是换了个马甲这么简单
2026年浙江发布OPC团体标准,明确OPC(一人公司)非个体户升级版:它是由1名核心自然人主导、以AI为生产力主体、具备法人资格、拥有可复制业务系统的轻量化技术公司。核心差异在于有限责任保护、AI驱动规模化生产及系统化收入模型。(239字)
|
4月前
|
人工智能 自然语言处理 API
购买并部署OpenClaw应用镜像
OpenClaw是一款开源、本地优先的AI智能体平台,支持多模型接入与多端控制,可理解自然语言并自动执行文件管理、邮件收发、代码运行等真实任务,真正实现“聊天即操作”。
|
4月前
|
Web App开发 弹性计算 监控
tk矩阵系统自动化养号实战:Python脚本开发与阿里云部署指南
tk矩阵系统是跨境电商多账号高效管理的核心工具,其自动化养号能力直接决定账号存活率与运营效率。手动管理数十上百个账号不仅耗时耗力,还易因操作规律一致触发平台风控检测。本文基于Python与Selenium技术栈,系统讲解自动化养号脚本的完整开发流程,涵盖多账号隔离、真实行为模拟、设备指纹伪装、异常监控预警及阿里云ECS部署等核心模块,提供1700余行可直接运行的代码。本文仅用于技术学习交流,使用时请严格遵守平台用户协议与相关法律法规。
|
11月前
|
人工智能 UED Windows
Egde卸载教程!edge浏览器卸载工具!EdgeRemover v18.38新版本,单文件便携版!
Edge浏览器虽功能强大,却常因无法彻底卸载让用户体验困扰。本文推荐一款专清工具——Edge Remover,支持一键移除Edge及WebView2运行时,两种模式灵活选择,操作简单,无需专业技能,彻底清理不留残留,释放C盘空间,提升系统纯净度,是Windows用户必备的卸载利器。
10815 2
|
监控 安全 Java
【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
1203 1
|
传感器 存储 安全
【物联网】Arduino 实验合集
【物联网】Arduino 实验合集
1150 2
|
存储 Perl
STM32速成笔记(八)—DMA
本文介绍了DMA的概念,用途。对于STM32F103ZET6的DMA做出了详细地介绍,给出了DMA配置步骤。最后,以配置DMA搬运ADC转换结果为例,给出了DMA的配置和使用方法。
1611 0
STM32速成笔记(八)—DMA
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
1569 0
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)