51单片机DS1302实时时钟驱动程序

ds1302引脚及功能 ds1302是由美国dallas公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
图1示出ds1302的引脚排列,其中vcc1为后备电源,vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302由vcc1或vcc2两者中的较大者供电。当vcc2大于vcc1+0.2v时,vcc2给ds1302供电。当vcc2小于vcc1时,ds1302由vcc1供电。x1和x2是振荡源,外接32.768khz晶振。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能rfbln2012090a1t:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器smbj70a-tr;其次,rst提供终止单字节或多字节数据的传送手段。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中rst置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电运行时,在vcc≥2.5v之前,rst必须保持低电平。只有在sclk为低电平时,才能将rst置为高电平。i/o为串行数据输入输出端(双向),后面有详细说明。sclk始终是输入端。
ds1302的控制字节 ds1302的控制字如图2所示。控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取ram数据grm1886t1h1r0cd01c;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。
ds1302电路图
scl,sda,rst_d连接单片机,vcc电压不清楚,只是有个接口。vcc是连接的atmega64.
vcc=3.3v
ds1302与cpu的连接需要三条线,即sclk(7)、i/o(6)、rst(5)。图3示出ds1302与89c2051的连接图,其中,时钟的显示用lcd。
51单片机ds1302实时时钟驱动程序 #include《reg51.h》
#include《intrins.h》
#define uchar unsigned char
#define uint unsigned int
sbit io=p3^4; //数据输入输出线
sbit rst=p3^5; //复位信号线
sbit sclk=p3^6; //时钟信号线
uchar code write_addr[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //写的地址
uchar code read_addr[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读的地址 //---存储顺序是秒分时日月周年,存储格式是用bcd码---//
uchar time[7]={0,0,0x12,0x12,0x12,0x20,0x15}; //初始化的时间为2015年12月12日12:00
1、初始化
void ds1302_init()
{
uchar k;
write(0x8e,0x00); //禁止写保护,即允许数据写入
for(k=0;k《7;k++) //写入7个字节的时钟信号:分秒时日月周年
{
write(write_addr[k],time[k]);
}
write(0x8e,0x80); //打开写保护
}
2、写字节
void write(uchar addr,uchar dat)
{
uchar i,j;
sclk=0;
_nop_();
rst=0;
_nop_();
rst=1; //拉高,准备写地址写数据
_nop_();
_nop_();
for(i=0;i《8;i++) //传送8位地址,往哪里写
{
sclk=0; //再置为低,以便实现上升沿
_nop_();
io=addr&0x01; //先传送最低位
addr》》=1; //向右移位,把8位数据依次写入
sclk=1; //数据在上升沿时,写入数据
_nop_();
}
for(j=0;j《8;j++) //写入8位数据
{
sclk=0; //置为低,以便实现上升沿
_nop_(); io=dat&0x01; //先传送最低位
dat》》=1; //向右移位,把8位数据依次写入
sclk=1; //数据在上升沿时,写入数据
_nop_();
}
rst=0; //释放
_nop_();
}
3、读字节
uchar read(uchar addr)
{
uchar i,dat=0;
sclk=0;
_nop_();
rst=0;
_nop_();
rst=1; //拉高,准备写地址读数据
_nop_();
_nop_();
for(i=0;i《8;i++) //传送8位地址,从哪里读
{
sclk=0; //置为低,以便实现上升沿
_nop_();
io=addr&0x01; //先传送最低位
addr》》=1; //向右移位,把8位数据依次写入
sclk=1; //数据在上升沿时,写入数据
_nop_();
}
_nop_();
for(i=0;i《8;i++) //读出8位数据
{
sclk=1; //置为低,以便实现下降沿
_nop_();
dat》》=1; //向右移位,把8位数据依次读出
if(io==1)
dat=dat|0x80;
sclk=0; //读数据时,下降沿有效
_nop_();
}
rst=0; //复位
_nop_();
sclk = 1;
_nop_();
io = 0;
_nop_();
io = 1;
_nop_();
return dat; //返回读到的数据 }
4、读时间
void read_time()
{
uchar n;
for(n=0;n《7;n++)
time[n]=read(read_addr[n]); //读取分秒时日月周年
}

基于视频解码芯片与CPLD的实时图像采集系统的设计
构建一个音频反应台灯
Xilinx宣布收购 Solarflare
惊喜权益来了!华为P40系列用户专属礼包不容错过
世界物联网500强出炉,中国企业入选过半
51单片机DS1302实时时钟驱动程序
利用EOAT工具和机器人完成工业自动化的挑战
因铜铝金属热膨胀系数不同,铝电缆接头部位容易起火——起火概率约为铜电缆的10倍
经纬度时控开关与时控开关区别?
第十四届蓝桥杯物联网设计与开发项目 决赛 客观题
如何解决图像降噪问题?
华为mate9怎么样?华为mate9手机发热好吗?华为mate9评测
苹果共同创始人史蒂夫·沃兹尼亚克谈在苹果公司拥有Siri之前和之后
平头哥发布RISC-V处理器玄铁910 芯片成本降低一半
是什么阻碍了物联网行业的发展?
电动汽车自燃背后的车企良知
微机电系统(MEMS)主要分类
1月7日CES开展 五大话题最热
中国电信“医疗云专区”方案发布,标志底座能力进一步夯实
泰克公司推出TLA6400系列便携式逻辑分析仪