
目前家用的數(shù)字電子鐘,多數(shù)只能顯示小時(shí)、分鐘等信息,功能單一,而且大都采用LED數(shù)碼管作為顯示器件,功耗大,不能令消費(fèi)者滿意。
AM/PM 標(biāo)志位決定時(shí)鐘工作于24小時(shí)或12小時(shí)模式,芯片有一個(gè)內(nèi)置的電源感應(yīng)電路,具有掉電檢測(cè)和電池切換功能。
是一款低功耗,具有56字節(jié)非失性RAM的全BCD碼時(shí)鐘日歷實(shí)時(shí)時(shí)鐘芯片,地址和數(shù)據(jù)通過(guò)兩線雙向的串行總線的傳輸,芯片可以提供秒,分,小時(shí)等信息,每一個(gè)月的天數(shù)能自動(dòng)調(diào)整。并且有閏年補(bǔ)償功能
特點(diǎn):
可對(duì)秒,時(shí),分,每月的天數(shù),月份,每周的天數(shù)進(jìn)行計(jì)數(shù),并具有閏年補(bǔ)償功能。計(jì)年上限2100。
56字節(jié)非失性的RAM
兩線串行接口
可編程方波輸出
自動(dòng)掉電檢測(cè)和切換電路
在電池備份模式下,功耗小于500nA
工業(yè)級(jí)的工作溫度: -40 到80
8腳DIP和SOIC封裝
下面分享一下基于DS1307的簡(jiǎn)易時(shí)鐘顯示程序給大家:
* 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:簡(jiǎn)易時(shí)鐘顯示
* Note:
* 1.DS1307四位固定地址位為1101,三位可編程地址位為000
*/
#include 《STC89C5xRC.h》
#include 《intrins.h》
//#include 《TIme.h》
#define uchar unsigned char
#define uint unsigned int
#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
#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
//#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};
struct tm
{
uchar tm_sec;
uchar tm_min;
uchar tm_hour;
uchar tm_mday;
uchar tm_mon;
uchar tm_year;
uchar tm_wday;
};
void delay_5us(void)
{
_nop_();
}
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();
I2C_SDA = 0;
delay_5us();
}
void I2C_Stop(void)
{
I2C_SDA = 0;
I2C_SCL = 1;
delay_5us();
I2C_SDA = 1;
delay_5us();
}
void I2C_Ack(void)
{
uchar cnt = 0;
I2C_SCL = 0;
delay_5us();
while((I2C_SDA == 1)&&(cnt 《 250))
cnt++;
I2C_SCL = 0;
delay_5us();
}
void I2C_noAck(void)
{
I2C_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