DS1302实时时钟模块详细解析充电时钟芯片的区别

实时时钟/日历电路提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。DS1302主要性能指标这个代码中,初始时间是设定好的,即2013年11月9日22点56分,因此本程序没有加入时钟时间设定功能,也可以再加上几个按钮,加上时间调节功能。

1.本实验所需设备

1.Arduino UNO板

2、1602液晶屏

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

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

★ 主备电源双功率管

接线方法(以本实验流程为例)

VCC→+5V/3.3V

接地→接地

时钟→5

数据→3

复位→2

4、一键开关:连接按钮开关时,需要接一个1KΩ的电阻作为下拉电阻。 按钮使用详情请参考()

5.蜂鸣器1个

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

2. 硬件连接方法

DS1602的连接主要采用四位连接方式。 端口为 12、11、9、8、7、6。 上面已经给出了DS1302的连接方法。 另外,按钮开关、蜂鸣器等连接细节如下图所示。

DS1302实时时钟模块详细解析充电时钟芯片的区别

3、程序代码

具体代码如下:

// DS1302: RST pin -> Arduino Digital 2
// DAT pin -> Arduino Digital 3
// CLK pin -> Arduino Digital 5
#include 
#include 
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;i59)
{
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。因此,本程序没有添加时钟时间设置功能。 还可以添加几个按钮,添加时间调整功能。 另外,在判断按钮按下时间的时候,我感觉这个程序的方法有时比较笨,但是我也没有想出更好的方法。 如果有人有更好的方法,请给我一些指导。 谢谢。

4.实现效果

在实施过程中,发现了两个问题。 一是按钮不是很灵敏,二是最后退出时间调整状态时,如果按住3秒,时间会增加1分钟。 如果原来设置为12分钟,退出时按住3秒,仍然会变成13分钟。

单片机

steam教育:供给端Technology火爆到让业内人士震惊

2024-5-4 11:03:30

单片机

如何利用IAR编写程序并烧录到板子上感觉很困扰

2024-5-4 12:04:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索