Arduino入门笔记(7):利用1602、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的连接方法上面已给出,另外按钮开关、蜂鸣器等的连接具体见下图。

三、程序代码
具体代码如下:
// DS1302: RST pin -> Arduino Digital 2
// DAT pin -> Arduino Digital 3
// CLK pin -> Arduino Digital 5
#include <LiquidCrystal.h>
#include <DS1302.h>
LiquidCrystal lcd(, , , , , );
DS1302 rtc(, , );
int j=;//记录定时设定分钟数
int time=;//remine the last time
int button=;//13口控制按钮
boolean onoff= LOW; //记录按钮状态
boolean timefix=LOW;//记时器开关,LOW表示未定时,HIGH表示定时
unsigned long buttonHoldTime = ;//按钮按下持续时间
int buttonStateOld;//按钮上一时刻状态
int buttonState;//按钮本时刻状态 void ting()//控制蜂鸣器发声
{ int checkstate = digitalRead(button);
for(int i=;i<;i++)//输出一个频率的声音
{
digitalWrite(,HIGH);//发声音
delay();//延时1ms
digitalWrite(,LOW);//不发声音
delay();//延时ms
}
for(int i=;i<;i++)//输出另一个频率的声音,这里的100与前面的80一样,用来控制频率,可以自己调节
{
digitalWrite(,HIGH);
delay();
digitalWrite(,LOW);
delay();
}
} void clockdate()//1602显示时间
{
lcd.clear(); //清屏
lcd.setCursor(,);
lcd.print(rtc.getDateStr(FORMAT_LONG,FORMAT_BIGENDIAN, '-'));//从1302的库文件可以看出,这里有下面几种格式FORMAT_BIGENDIAN:2010-01-01;FORMAT_LITTLEENDIAN:01-01-2010
lcd.setCursor(,);
lcd.print(rtc.getDOWStr());
lcd.setCursor(,);
lcd.print(" ");
lcd.setCursor(, ) ;
lcd.print(rtc.getTimeStr());
} void setup()
{
lcd.begin(, ); //初始化LCD
pinMode(,OUTPUT);//设置数字IO脚模式,OUTPUT为输出
pinMode(button,INPUT);//设置引脚为输入模式
// 设置时钟初始值
rtc.halt(false);
rtc.writeProtect(false); rtc.setDOW(SATURDAY); // 设置星期
rtc.setTime(, ,); //设置时间
rtc.setDate(, , ); // 设置日期2013年11月9日
rtc.writeProtect(true);
} void loop()
{
buttonState = digitalRead(button);
delay();
if (buttonState==HIGH && buttonStateOld==LOW)//按钮状态发生变化
{
buttonHoldTime = millis();//用millis()时间函数来记时,该函数最长记录时间为9小时22分,由于本程序最多记录60分钟,所以可以使用
buttonStateOld =buttonState; if (onoff==HIGH)//当进入定时设置状态时
{ if (j>)
{
j=;
timefix=LOW;
}
else
{
j=j+;
timefix=HIGH; }
lcd.setCursor(,);
lcd.print(j);
}
}
else if (buttonState ==HIGH && buttonStateOld==HIGH)//判断按钮是否持续按下
{
if (millis()-buttonHoldTime>)//当按钮持续按下3秒种进入定时状态
{
buttonStateOld=LOW; if (onoff==LOW)//进入
{
j=;
timefix=LOW;
lcd.clear(); //清屏
lcd.setCursor(,);
lcd.print("Fixed Time:");
lcd.setCursor(,);
lcd.print(j);
lcd.setCursor(,);
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> && onoff==LOW)
{
unsigned long delaytime=j*;//把分钟计算成秒 if ((millis()-buttonHoldTime)>=delaytime )
{ do
{
buttonState = digitalRead(button);
ting();
}while (buttonState==LOW);//当按下按钮后,停止蜂鸣
j=;
}
else
{
clockdate();
}
} delay(); }
这个代码中,初始时间是设定好的,即2013年11月9日22点56分,因此本程序没有加入时钟时间设定功能,也可以再加上几个按钮,加上时间调节功能。另外在判断按钮按下时间这里,本程序的方法自我感觉有时笨,但也没想出更好的方法,哪位有更好的方法,请给指导一下,谢谢。
四、实现效果
实现过程中,发现存在两个问题,一个是按钮不是很灵敏,另一个是最后再退出调时状态时,长按3秒,时间会增加1分钟。如原本设定12分钟,退出时长按3秒会依然会变成13分钟。
Arduino入门笔记(7):利用1602、1302实现时钟和定时器的更多相关文章
- Arduino入门笔记(4):用蜂鸣器演奏音乐并配有LED闪烁
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...
- Arduino入门笔记(5):1602液晶实验(实现时钟)
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 https://item.taoba ...
- Arduino入门笔记(8):利用12864和ADXL345学习重力感应控制
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...
- Arduino入门笔记(6):温度传感器及感温杯实验
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino板 :https://item.taob ...
- Arduino入门笔记(3):单LED闪烁
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 在搭建好arduino开发环境(http://www.cnblogs.com/xi ...
- Arduino入门笔记(1):认识Arduino
转载请注明:@小五义http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 各种网站论坛里经常看到网友DIY各种遥控小车.机器人什么的,一直很好奇,很想学习一 ...
- Arduino入门笔记(2):Arduino的开发和virtualbreadboard仿真环境
欢迎加入讨论群 64770604 1.开发环境 (1)下载开发环境 Arduino的开发环境从http://arduino.cc/en/Main/Software官网下载即可,分为windows版本. ...
- Arduino入门笔记【1】
刚刚接触这个东西只知道这是类似于单片机的开发板,可以做一些单片机实现或者不能实现的东西,但是比单片机要简单得多. Arduino到底是什么? 维基百科上的描述是:Arduino是一块开发板的微控制器和 ...
- Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 欢迎加入讨论群 64770604 一.本次实验所需器材 1.Arduino UNO板 https://item.t ...
随机推荐
- 常用,好用的js代码
记录看到或者用到的js代码,长期更新! 判断是否是正整数 (number-0)|0 !== number-0 解析: number-0 转换成数字,再通过位移运算(|)判断是否跟原数字相等 安全检查j ...
- SSM 实训笔记 -11- 使用 Spring MVC + JDBC Template 实现筛选、检索功能(maven)
SSM 实训笔记 -11- 使用 Spring MVC + JDBC Template 实现筛选.检索功能(maven) 本篇是新建的一个数据库,新建的一个完整项目. 本篇内容: (1)使用 Spri ...
- Expo大作战(一)--什么是expo,如何安装expo clinet和xde,xde如何使用
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
- 基于localStorge开发登录模块的记住密码与自动登录
前沿||我是乐于分享,善于交流的鸟窝 先做写一篇关于登录模块中记住密码与自动登录的模块.鸟窝微信:jkxx123321 关于这个模块功能模块的由来,这是鸟大大的处女秀,为什么这么说呢?一天在群里,一个 ...
- 学习git踩坑之路
第一次使用git: 1.使用CentOS Linux release 7.3.1611 (Core),内核版本3.10.0-514.el7.x86_64 2.安装git: root权限运行:yum ...
- mysql 建立索引的原则(转)
索引查询是数据库中重要的记录查询方法,要不要进入索引以及在那些字段上建立索引都要和实际数据库系统的查询要求结合来考虑,下面给出实际中的一些通用的原则: 1. 在经常用作过滤器的字段上建立索引: 2. ...
- 适用于 Windows 的自定义脚本扩展
自定义脚本扩展在 Azure 虚拟机上下载并执行脚本. 此扩展适用于部署后配置.软件安装或其他任何配置/管理任务. 可以从 Azure 存储或 GitHub 下载脚本,或者在扩展运行时将脚本提供给 A ...
- Oracle EBS INV更新保留
CREATE or REPPLACE PROCEDURE UpdateReservation AS -- Common Declarations l_api_version NUMBER := 1.0 ...
- 解决web网站被挂马清除方法
案例:某公司一个lamp的服务器网站站点目录下所有文件均被植入了广告脚本如下内容: <script language=javascriptsrc=http://%4%66E%78%72%67%2 ...
- 在Word2007,2010,2016中分栏但不换页的方法
解决方法: word2007:界面左上角的按钮->选择word选项->依次点击“高级”->“版式选项”->点开加号,“按word6.x/95/97的方式排放脚注”. Word2 ...