历史上的今天
今天是:2025年01月27日(星期一)
2018年01月27日 | 基于DS1307的简易时钟显示程序分享
2018-01-27 来源:互联网
目前家用的数字电子钟,多数只能显示小时、分钟等信息,功能单一,而且大都采用LED数码管作为显示器件,功耗大,不能令消费者满意。
DS1307简介
AM/PM 标志位决定时钟工作于24小时或12小时模式,芯片有一个内置的电源感应电路,具有掉电检测和电池切换功能。
是一款低功耗,具有56字节非失性RAM的全BCD码时钟日历实时时钟芯片,地址和数据通过两线双向的串行总线的传输,芯片可以提供秒,分,小时等信息,每一个月的天数能自动调整。并且有闰年补偿功能
特点:
可对秒,时,分,每月的天数,月份,每周的天数进行计数,并具有闰年补偿功能。计年上限2100。
56字节非失性的RAM
两线串行接口
可编程方波输出
自动掉电检测和切换电路
在电池备份模式下,功耗小于500nA
工业级的工作温度: -40 到80
8脚DIP和SOIC封装
下面分享一下基于DS1307的简易时钟显示程序给大家:
* Coder:NUIST_XKFYT
* E-mail:weilun_fong@nuist.edu.cn(Welcome to get help info about this program)
* Date:2016-7-17
*
* Device:STC89C54RD,DS1307Z+
* FuncTIon:简易时钟显示
* Note:
* 1.DS1307四位固定地址位为1101,三位可编程地址位为000
*/
#include 《STC89C5xRC.h》 /* 可更换为《reg52.h》或《AT89x52.h》 */
#include 《intrins.h》
//#include 《TIme.h》 /* Keil v4中无法调用该标准库函数 */
#define uchar unsigned char
#define uint unsigned int
/* DS1307操作指令 */
#define DS1307_WRITE 0xD0
#define DS1307_READ 0xD1
#define DS1307_DISABLE 0x80
#define DS1307_ENABLE 0x7F
#define DS1307_12HOUR_MODE 0x20
#define DS1307_24HOUR_MODE 0xDF
/* DS1307内部寄存器地址 */
#define ADDR_SEC 0x00
#define ADDR_MIN 0x01
#define ADDR_HOUR 0x02
#define ADDR_DAY 0x03
#define ADDR_DATE 0x04
#define ADDR_MONTH 0x05
#define ADDR_YEAR 0x06
#define ADDR_COR 0x07
/* 模块自带AT24C02》》预留接口 */
//#define AT24C02_WRITE 0xA0
//#define AT24C02_READ 0xA1
sbit I2C_SCL = P1^0;
sbit I2C_SDA = P1^1;
uchar min = 0;
uchar sec = 0;
uchar code tab[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/* 重新自定义《TIme.h》中的tm结构体 */
struct tm
{
uchar tm_sec; /* 秒 – 取值区间为[0,59] */
uchar tm_min; /* 分 - 取值区间为[0,59] */
uchar tm_hour; /* 时 - 取值区间为[0,23] */
uchar tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */
uchar tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[1,12] */
uchar tm_year; /* 年份 */
uchar tm_wday; /* 星期 – 取值区间为[1,7] */
};
/* delay 5us */
void delay_5us(void)
{
_nop_();
}
/* delay par*1ms */
void delay_ms(uint par)
{
uchar cnt = 0;
while(par--)
for(cnt = 120;cnt 》 0;cnt--);
}
void I2C_Start(void)
{
I2C_SDA = 1;
I2C_SCL = 1;
delay_5us(); /* 实际延时4.7us即可 */
I2C_SDA = 0; /* SCL为高电平时,SDA为下降沿表示起始信号 */
delay_5us();
}
void I2C_Stop(void)
{
I2C_SDA = 0;
I2C_SCL = 1;
delay_5us();
I2C_SDA = 1; /* SCL为高电平时,SDA为上升沿表示结束信号 */
delay_5us();
}
void I2C_Ack(void)
{
uchar cnt = 0;
I2C_SCL = 0; /* 在SCL为高电平期间等待应答 */
delay_5us();
while((I2C_SDA == 1)&&(cnt 《 250)) /* 若为应答0即退出,从机向主机发送应答信号 */
cnt++; /* 等待一段时间 */
I2C_SCL = 0;
delay_5us();
}
void I2C_noAck(void)
{
I2C_SCL = 1; /* 在scl为高电平期间,由主机向从机发送一个1,非应答信号 */
delay_5us();
I2C_SDA = 1;
I2C_SCL = 0;
delay_5us();
}
void I2C_sendByte(uchar dat)
{
uchar cnt = 0;
uchar dat_buf = 0;
dat_buf = dat;
for(cnt = 0;cnt 《 8;cnt++)
{
dat_b
史海拾趣
|
1.介绍: wSR-841是一个混合集成型IGBT驱动保护集成电路.它内部由信号隔离传输器、功率驱动器、负压分配器和短路保护电路四大部分组成.信号隔离传输器采用了进口高速光耦,具有高的共模抑制比和隔离电压.功率驱动器部分采用具有高负载驱动能力的推 ...… 查看全部问答> |
|
请教各位,我目前有个X86下的BSP安装包,安装后sysgen发现产生了一个too many errors 的错误 后来又得到了一个BSP的原文件,但是没有CEC文件 请问我怎么能把这个BSP的原文件添加到PB中,可以制订NK工程?? 注:WINCE50下!… 查看全部问答> |
|
这个是我把100MHZ的分成10MHZ的程序 我想把修改下 能把2MHZ的分成1HZ的 望各位指教 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; use ieee.std_logic_unsigned.all; entity df is port (rese ...… 查看全部问答> |
|
现在要做一个项目,开发工具是EVC,PDA系统是WCE.NET 5.0,PDA上有CDMA无线通讯模块,我想实现PDA远程访问ACCESS数据库,请问前辈们具体要哪些数据库开发工具和步骤。有开发过的同志指点一二,在此不盛感谢。sqlce可以访问access数据库吗?… 查看全部问答> |
|
大家好!我们现在正在开发一套会员管理系统,需要使用射频读写器读写非接触式ic卡,多个卡机并联联网,现在想要一些产品的接口函数、范例、演示程序,关键是想知道如何实现多机联网的应用(数据发送时如何根据机号接受),有产品能满足要求吗?接口 ...… 查看全部问答> |
|
同样一个C语言式子,只是一个采用16进制,一个采用10进制,为何反汇编代码不同? 各位前辈们是否有遇到这种问题?是什么原因呢。 for example: void a(void) { unsigned int MAX_C, MIN_C; &n ...… 查看全部问答> |
|
前段时间工作上的事情确实有点多,拿到板子有一段时间了!确实是玩玩的时候了! 先发个贴子,占个位子,督促一下自己,慢慢更新 常用的软件与资料地址: http://software-dl.ti.com/tiva-c/SW-TM4C/latest/index_FDS.html [ 本帖最后由 wuyanyan ...… 查看全部问答> |




