注意:如果您键入ds1703实时时钟 要查找此页面,您可能会拼写芯片类型。
无论如何,您可以找到DS1307(RTC) 实时时钟 IC项目和信息 this page.
注意:此RTC项目已更新 更容易使用软件即,软件加载到PIC中(注意 编译器是免费的<2K和当前代码使用大约1550字节)。 还有两种用于信息的其他模式和一个 debugging:
按下第一种新模式 键3将显示当前显示器显示的指示 (有时候只需查看数字即可难以解决这个问题!)。这 其次是按下键4,该键4将通过所有RA0-RA7输出循环 引脚并显示LED在7段显示器上点亮。这意味着它更容易 弄清楚当你加入时的RA0-RA7连接是否正确(注意RA5 不使用它只能是输入 - 见下面的详细信息)。该项目有 还更新以使用最新的Mikroc编译器。
虽然PIC16F88具有32kHz的振荡器内置振荡器 Watch Crystal A DS1307更容易在面包板上使用。这是因为你 可以更容易地控制电路的布局。
RTC还使软件更容易,因为它照顾所有 日历功能;闰年的会计。
DS1307(RTC)实时时钟IC(I2C RTC)是8针 device using an I2C 界面(虽然 数据表未提及I2C以避免版税支付!)。它有8个 读/写寄存器存储以下信息:
地址 | 注册功能 |
0 | 秒0-59. |
1 | 分钟0-59 |
2 | 小时0-24,1-12 |
3 | 第1-7天 |
4 | 日期1-31. |
5 | 月1-12 |
6 | 0-99年 |
7 | 控制 |
注意:地址0x08至0xF3是用户RAM,如果您使用a 备用电池这些是非挥发性RAM i.E.他们会保存他们的 电源关闭后的内容 - 所以您有一个额外的56个字节的RAM播放 和!少于用于存储年高位数的人 在 0x20 - 您可以更改此操作以不使用RAM,但它也被用作 初始化检查 - 请参阅代码。
注意:此项目中使用地址3F作为检查 如果时钟需要初始化并存储较高年度数字(更容易 coding).
最后一个地址0x08是控制地址,它确定 在SQW / OUT PIN处生成的内容。您可以直接通过控制级别 I2C或将其设置为1Hz,4096Hz,8192Hz,或32768kHz。在这个软件中,它被设置 到1Hz并用于驱动可用作背光的LED 4x7段模块(如果您通过模块发光'll see the two 左右组之间的中心孔(如结肠字符) 两个7段。这通常用于闪烁秒,使LED放置 背后这将实现这一运作。
以与您需要添加拉动的I2C引脚相同 V +在SQW / OUT引脚处,以查看任何输出信号,因为它是一个开路输出! 或如在该电路中,LED和470R电阻串联连接到 + 5V电源。另一端进入DS1307的SWQ / OUT引脚。
准确性 | 手表 水晶规格通常为20ppm |
编译器 | mikroelectronika mikroc编译器 自由! |
目标 | 16F88 (重新瞄准具有模拟输入AN0)的其他照片)。 |
软件级别 | 中等的。 |
软件说明 | 交换 between i/p &o / p读取模拟/驱动器显示。使用I2C. routines. |
硬件级别 | 简单。 |
硬件笔记 | 特别的 必须在放置DS1307和晶体时注意。 |
项目版本 | 1.02 |
项目文件 | 进入
你的细节得到了 下载 Link 并获得微控制器通讯: (注意:您的电子邮件安全它永远不会
be sold or rented). |
有两种特定的'gotcha'嵌入的类型控件 使用该芯片稍微复杂的地址。
最重要的是时钟停止位(CH),这是第7位的 地址0.这是控制的寄存器'seconds'并且ch位必须 否则芯片停止时钟。写入零点 重置CH位,使时钟运行。
注意:您必须将CH位重置为零,以使芯片 operate!
警告:默认状态
DS1307 is undefined
因此,您必须清除CH位以启动振荡器。
一般来说,您应该将此位置于零,只有设置它 你必须。该位包含在注册零内,这也是如此 "minutes" and "seconds"登记。通常,除非您,否则将此位保持零 正在更新寄存器的秒数(您't want the seconds 在编辑它们时更改)。
第二是24/12小时控制,它是地址的第6位 2.它设置为12小时模式,24小时模式为4小时。在这个项目中它 设置为低24小时模式。
这两个比特的问题是你必须保留 在读取时访问寄存器时,它们会在编写数据时忽略它们 显示的值。它不是一个大问题,你可以看到它的方式's done 查看代码(请参阅函数Edit_DS1307()和第1个案例 地址0(CH)和2(12H / 24H)的陈述)。
令人惊讶的是,准确的32khz振荡器是一个困难的 任务(远远超过高速振荡器,即MHz晶体振荡器)。 这是因为低速振荡器驱动器设计用于低功耗 手术。这意味着高阻抗,因此是低电流 司机对噪音非常敏感(或任何可以的附近的信号 电容性地耦合到晶体线)。
使用DS1307让您将水晶放入最少的噪音中 一部分的董事会。此外,它设置了晶体负载电容 在完全32kHz的情况下使晶体振荡至关重要 - 控制其 初始错误i.e.对于指定的PPM误差值,负载电容必须 be exact.
注意:校准晶体的常用方式(不在此 项目)是晶体拉伸或改变一个水晶销的电容 相对于其他 - 所以负载电容至关重要。
DS1307用12.7pf加载晶体,所以您需要购买一个 定义为使用该负载电容的晶体。电路布局也 影响水晶引脚处的电容,因此必须将晶体保持为 尽可能靠近芯片,并且必须将来自晶体到芯片的轨道必须是 short.
确保水晶正常振荡您必须确保 :
如果您正在进行董事会布局,请在图片中有很好的建议 16F88数据表(定时器1段)上的水晶PCB保护环。达拉斯推荐 应用笔记58尚未阅读。
DS1307如果输入电压(VCC),则检测电源故障 低于(VBAT)并自动切换到VBAT电源输入(您 应该在这里使用锂3V电池作为备用电池)。它还抑制了 I2C控制信号,直到VCC为1.25 x VBAT,所以您赢了't be able to put bad 电源失败时,数据进入芯片!
为了保存微控制器引脚,有四个输入键 全部连接到单个模拟输入引脚。该引脚也驱使其中一个 七个段显示LED,因此必须在输入之间切换(读取 模拟电压)和输出(驱动LED)。
注意:这是因为模拟输入切换到 仅接收模拟仅限(150us大约)有100us延迟让 输入定居(只是猜测,可以降低 - 但它并不重要 这个应用程序)。然后读取输入信号。因为坚持不懈 视觉(整个显示方法取决于您的眼睛)无法看到 这个缺少的光脉冲所以它看起来像显示器完全稳定!
每个键将模拟输入拉到不同的电压电平
您可以使用ADC(RA0)轻松读取。
显示器由内置的四个7个段组成 方便的块,所有8个LED驱动线连接在一起。你 可以加入单个7段来实现相同的结果,但这样做 焊接面包板是一种痛苦。该街区只需为您节省努力(以及错误 接线)。因此,这导致8个数据线和4位选择线。
最初我用RA0到RA7作为数据线驱动程序 RB2,5,6,7。然后我意识到RA5只是允许是一个输入,因为它 也与RESET PIN MCLR复用。因为它已经有线了 最简单的解决方案是消除ra5,但你怎么做的 更改所有驱动器数据定义?
当消除RA5时,我将RA6和RA7移动到位B5和B6 因此,这使得LED驱动器为小数点未连接,但可以 由于我们不使用7段显示的那部分。
因此,解决方案是使用映射位的帮助函数 在将数据输出到7段LED总线之前,6,7比特5,6位 该函数有一个明显的名称:
move_b6_b7_to_b5_b6(byte num)
数字选择线由晶体管开关驱动 如果需要,可以允许更多电流(注意我没有测量确切 当前电流取决于显示屏的刷新率)。
是的,没有!即RA总线和LED驱动器之间 没有极限的电阻。
为什么?
在所有其他电路中,您可以看到它们。我选择不使用它们
由于显示器仅在刷新模式下驱动。如果它被驱动
直接LED会爆炸。这种技术的商业用途是 MAX7219.
如果您对此感到不舒服,那么在330r或330r中添加8 470R电阻使每个LED的最大电流限制(例如,如果被驱动 在测试期间永久地)从每个驱动器RA总线到4x7段 display.
它有效的原因与产生的热量有关 - 如 电流流动在LED中,交界处加热,如果你推动太多 电流然后它熔化内线 - 这是最大的位置。当前的 limit comes from.
在刷新模式下驱动显示模式,显示屏保持开启 与它被保存的时间相比很短的时间,这定义了一个 在每个LED的当前限制范围内的平均电流。
嘿..不要'敲了它......它可以很好......承诺。
笔记: 这个想法来自芯片 设备绘制的电流取决于切换速度的设计 系统由于FETS的uplue和dower绘制了最大电流 开关中的FET在I.在从当前水平到下一个转换期间 i.e. when switching.
当系统为向上电时,将检查RAM位置0x3F的值0x20。
如果存在这一点则意味着备用电池已保存内容
因此,已初始化RAM和所有寄存器。所以软件
跳过初始化序列。
如果找不到0x20,则初始化实时时钟IC 到以下值:
地址 | 初始化值 |
0秒 | 0x59(第7位清除)。 |
1分钟 | 0x59 |
2小时 | 0x24(第6位清除)。 |
3 Day | 0x07 |
4 Date | 0x31 |
5个月 | 0x12 |
6 Year | 0x99(低位数) |
3F一年 | 0x20(高 digits) |
这些是实时编码的二进制编码十进制数 时钟IC适用。请注意,已选择初始化值 您可以轻松理解显示显示的显示,但从v1.02这是 不像你可以击中键3的那么重要 伪文本 上 what is displayed.
然而,在重新访问项目时,它就证明它是一个 困难的任务(究竟是究竟在显示器上究竟是什么 2014年8.20pm即,所有数字都是相同的)这就是为什么按键3 (当未编辑值时)以闪烁(慢速)速率闪烁显示屏 指示您使用以下7段输出所关注的内容。
模式 | 7段代码 | 意义 |
模式_hrs_mins. | Hrnn. | 小时和分钟 |
模式_mins_secs. | NNSE. | 分钟和秒 |
模式_day_mon. | Dann. | 天和月份 |
模式_year. | 年 | 年 |
模式_init. | 在里面 | 初始化 |
按下模式按钮循环显示显示不同数据的显示 每个按钮按下。遵循以下显示序列:
要更改值,必须按下编辑按钮(key2)。什么时候
它是,左手两位数字闪烁。现在向上按钮(key3)和
向下按钮(key4)让您编辑值。
再次击中编辑闪烁 两个右侧数字,您可以像以前一样更改值。击中编辑 按钮或模式按钮再次退出编辑模式。
编辑分钟/秒时,才会停止时钟 在编辑序列的末尾或模式按钮时显示并重新启动 被命中(例程check_start_ds1307不会改变状态或写入 振荡器寄存器如果时钟已在运行i.e.时钟 振荡器仅在前停止时启动)。这让您设置了 秒准确,但不会打扰其他模式的时钟。
注意我不确定为什么,但它可能是DS1307如何工作 必须在期望的转换时间之前设置1秒的时间。
说时钟目前读了1328 13分钟和28秒 设置时间相当好编辑时间到13 45然后点击编辑键时 你试图同步到的时钟是在1344。这似乎得到了 秒随源时钟同时变化。这可能是由于 DS1307中的双寄存器仅在特定时间更新。
"右点击这里"下载真实的原理图 时钟。右键单击并选择“另存为”或单击以在浏览器中打开 (如果您已启用PDF Reader插件)。
您可以使用具有ADC和足够的任何PIC微控制器 存储器以保持程序和足够的引脚用于显示多路复用。
您可以通过电路中的PIC编程 ICSP. 即使程序运行也是即使在运行的情况下也是连接器 由于没有I2C通信,因此将保持正确的时间 DS1307未更新。
除了放置之外,该项目还没有什么真正困难的 DS1307远离噪声源并如前所述解耦。
编译器项目文件
6.4.0有很多更多(请参阅下载文件)。
C源文件。
16f88_rtc_ds1307.c
I2C.c
标题文件。
Bit.h - 位操作宏
I2C.H - I2C操作的定义。
输出文件
16f88_rtc_ds1307.hex.
16f88_rtc_ds1307.c
这包含主程序和支持功能
控制DS1307。
I2C.c
这包含I2C的软件实现(时钟拉伸未通过
测试)。更改端口/引脚在开始时更改#define语句
I2C.c
上述功能都是自我解释的。下面需要一些解释的人。
将数字转换为Porta的所需输出值以驱动
七个段显示。内部阵列Ret []保存7段值 -
这些是纯8位值,好像为7段的所有数据线都是如此
连接的。常规:
...在字节中移动位,以解释未使用RA5的事实。
此例程将模拟级别解码为特定键 按。它返回1-4表示键1-4的值。在逻辑界面上 是PB1,应该位于顶部的板上。
此调用decode_ana_keys()以确定按下的键。
在此例程中,模拟输入已打开,延迟 使用100us,然后解码密钥,然后返回模拟输入 digital output.
注意这是如何使用RA0引脚作为模拟输入 引脚和数字输出引脚。
这有用两个原因:
注意:如果这是中断驱动的代码POLTA(LED驱动器) 写入中断将需要读取模拟端口,以便引脚 在读取中没有改变方向,您将使用该中断 例程由于它将知道何时可以安全地阅读模拟值。
因为它不是中断驱动代码始终关注 因此,设定的操作顺序永远不会将端口转回输出 读取模拟引脚。
当端口是时,你的眼睛看不到100us的差异 读取 - 它真的只需100us将LED关闭延伸。
这是一个简单的范围检测,返回按下的键 模拟值落在特定范围内。
这是用来的"main"例程允许升级/下调当前 DS1307寄存器值。它需要输入DS1307地址和方向 期望和递增或减少寄存器值,具体取决于dir和 还限制了更新的值,以将其保留在有效范围内。
注意它是如何管理的'problem'包含ch和的地址 12/24小时位以及所需的值。
还请注意'one'例程使用不同的上限和 下限控制控制单个寄存器的操作I.。 根据寄存器使用,值将限制为特定限制。
该功能提供了主要的显示能力 系统和它与传统代码略有不同。这段代码是 旨在重新参加,每次调用它时都会做不同的工作 实际上是一个具有静态变量存储状态的状态机 'digit'.
每次被称为数字递增和 这选择了PortB上的下一个段驱动器引脚。
由于该功能也需要两个二进制编码 值作为参数(一个用于左两个7段数字和一个用于的 右两个7段数字)。它可以每次显示不同的数字 函数被调用。因此,通过将功能拨打足够快的4x7段 由于视力持久性,显示器似乎不断开启。
本例程中的复杂性是为了选择性地消隐 或右对的数字,以便可以打开和关闭它们。其他 复杂性在Addresses 0x00和0x02处保留控制位。
数组IDX []保存两个值,该值是DS1307的地址
时钟地址空间。 IDX [0]保存允许在左侧显示的地址
两个7段,而IDX [1]保存用于显示数据的地址
正确的两个7段。
通过更改IDX值,DS1307中的特定寄存器值可以是
显示。例如,选择小时和分钟的代码
displayed is :
这使得显示程序使用DS1307地址2为左位和
DS1307地址1为右位。如果你看看地址映射
DS1307地址2用于在使用地址1时保持小时信息
持有分钟信息。
常规
...用于使用此信息更新显示。
变量'edit'用作标志,以指示编辑的标志
进度和作为IDX数组的索引,以指定哪两个数组
值正在递增或递减。如果'edit' has the value
完成_EDIT(= -1),然后编辑未发生或刚刚完成
(在右手数字集后,通过用户按下键两个
edited.
您可以看到这两个案例陈述案例3的工作方式:和案例:4
分别上下一个值。如果没有编辑然后测试()
代替函数或display_mode()函数。
通过控制末尾的BlankIdx值来执行闪烁数字集
主要()函数。如果它是-1,则使用该值不会显示任何值
函数clock_display()。实际定时由变量控制
'flash'递增每次循环时递增。'flash' is kept to
简单的值60和30和一半的时间(最多30个数字亮起
休息了另一半)。
在主键中被检测到一个
值返回1-4的范围
关键行动:
钥匙 | 关键功能 | 关键行动 |
1 | 改变 mode | 选择显示的数据。小时分钟, year etc. |
2 | 输入编辑 mode | 输入当前数据显示的编辑模式 and edit left. |
2 | 如果在编辑模式下 | 移动到下一个数字或退出模式。 |
3 | 如果在编辑模式下 | 增加所选择的数字值。 |
3 | 不在编辑模式下 | 显示伪文本,指示显示屏上的内容。 |
4 | 如果在编辑模式下 | 减少所选择的数字值。 |
4 | 不在编辑模式下 | 输入测试模式(每次按下移动到显示差异。LED) |
笔记"Not in edit mode" are extra features.
您可以使用此操作来检查7个段显示是否正确连接。
不在编辑模式下执行此例程,并按下键4。
在每个按键的key4时,不同的LED点亮(每个相同的LED 单个7段)。
注意:显示以低速闪烁以指示测试模式。
订单是:
此例程类似于测试,除了它采用模式值 在主常规中使用的那个。它在显示屏上显示伪文本 表示当前显示器显示的内容。
当不在编辑模式下执行此例程,按下键3。
看 伪文本
Display 以上用于4x7段上显示的伪文本。
显然,编制者自动包含一些的常见做法
简单的功能,我不久前使用它们,无法弄清楚他们是如何
链接到代码,因为没有包括以下内容
functions:
由于它们的定义不一致,这些是令人恼火的 'To' and '2'在中间。然而,他们很有用,完成了工作。你 可以在线搜索并找到其他人如果您愿意的情况。为了 他们的操作和原型定义的定义在中搜索 MikroC help system.
更新速率在Clock_display()中控制
在该例程中延迟函数调用delay_ms(1),它只打开
显示为1ms,但这是一个数字。例程clock_display()是
有效地是一个再参赛者状态机和每个呼叫服务的不同
7段数字。因此,有效地整个周期的总延迟(
4个呼叫有4位数)是4ms。
在8MHz时,惯例做了很多,并且您需要20ms刷新率才能实现
稳定的愿景持久性,所以系统的其余部分必须发生
16ms(未测量),因为输出似乎足够稳定。这意味着
不是 a lot of room to do 'other'
stuff.
这是因为我们正在使用8MHz的内部时钟。你 使用外部水晶可以更快地走得更快,但如果你只需要这样做 你真的有。如果您确实需要更快的操作,您可能会用完引脚, 由于两者将用于驱动XTAL振荡器,这就是为什么在其他方面 网站上的项目,例如7段频率计数器,辅助芯片是 使用 - 在这种情况下,它是4017(约翰逊柜台 - 走路)。你可以 还使用串行到并行芯片等 595 to save pins.
但是对于任务来说,它需要执行此操作 works just fine.
注意:使用RA0引脚作为A的有趣方式 数字输出和模拟输入。看 以上讨论 on this.
然后's it - enjoy.
您可能想要做的简单练习是添加警报 功能 - 目前闪光灯1552个字节的闪光灯用完了留下空间 许多额外的代码2k -1552 =剩余空间。添加警报功能将 只是添加其他定义的问题:
例如mode_alarm.
...并使用一些DS1307 RAM来存储警报设置 (由于电源故障时,它被电池备份保存)。
您需要更改模式设置的代码 更新和伪文本代码。在主循环中,你会阅读 当前小时,分钟设置,直到它匹配存储的值,然后生成 an alarm.
对于输出,有一个备用引脚RB3 - 有一个10K下拉 但如果零件已被取出LVP模式,则这无用 使用ICSP程序员编程它 - 所以它可以免费附上一个 压电盘(取出电阻 - 探测器。无论如何都没有真正需要!)。
跳跃 实时时钟 design to
主页。
使用ADS1115精度16位ADC进行教程进行低功耗。
arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。
了解DigitalWrite()的工作原理......现在使用17倍宏宏!
如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。
使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。
HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。
新的! Comments
让你说到你刚刚阅读的东西!留下下面的框中的评论。