参考DS1302数据手册,尽管数据手册是英文,但是很有帮助,再结合网上众多的代码写出了下面这个例子,除了涓流充电(trickle charger)功能没使用外,内部的RAM和寄存器功能都使用到了,包括多字节方式(burst mode)。自认为我写的比网上大多数程序清晰,当然已经硬件测试过了。

 #include <reg52.h>

 /*DS1302部分*/

 //全部为写入地址,读取地址需要+1
#define YEAR 0x8c
#define MON 0x88
#define DATE 0x86
#define DAY 0x8a
#define HOUR 0x84
#define MIN 0x82
#define SEC 0x80
#define WP 0x8e
#define RAM(n) (0xc0+2*(n))
#define CLBT 0xbe
#define RAMBT 0xfe //3个通信引脚
sbit SCLK=P2^;
sbit IO=P2^;
sbit RST=P2^; //有的使能端叫CE unsigned char readbyte(void);
void writebyte(unsigned char dat);
void write1302(unsigned char addr,unsigned char dat);
unsigned char read1302(unsigned char addr); /*数码管部分,6位共阴接在P0*/
sbit we=P2^;
sbit du=P2^;
void show(void);
void delayms(unsigned time); unsigned char code table[] = {
0x3f , 0x06 , 0x5b , 0x4f,
0x66 , 0x6d , 0x7d , 0x07,
0x7f , 0x6f , 0x77 , 0x7c,
0x39 , 0x5e , 0x79 , 0x71,
0x00 }; unsigned char num[]={}; //用作数码管显示的数组 /*键盘部分,4个独立键盘接在P3.4-P3.7*/
void keyscan(void);
bit showdate=;
bit showday=; void main(void)
{
unsigned char temp; write1302(WP,0x00); //允许写入,关闭写保护 //clock burst 方式赋初值
RST=;
SCLK=;
RST=;
writebyte(CLBT); writebyte(0x30);//秒分时
writebyte(0x59);
writebyte(0x23); writebyte(0x28);//日月
writebyte(0x02); writebyte(0x02);//星期 writebyte(0x32);//年 writebyte(0x00);
writebyte(0x00);
RST=; // 另一种赋初值方法
// write1302(HOUR,0x23);
// write1302(MIN,0x59);
// write1302(SEC,0x30); while()
{
keyscan();
if(showdate)
{
temp=read1302(YEAR+);
num[]=temp>>;
num[]=temp&0x0f;
temp=read1302(MON+);
num[]=temp>>;
num[]=temp&0x0f;
temp=showday?read1302(DAY+):read1302(DATE+);
num[]=temp>>;
num[]=temp&0x0f;
}
else
{
temp=read1302(HOUR+);
num[]=temp>>;
num[]=temp&0x0f;
temp=read1302(MIN+);
num[]=temp>>;
num[]=temp&0x0f;
temp=read1302(SEC+);
num[]=temp>>;
num[]=temp&0x0f;
}
show();
} } unsigned char readbyte(void)
{
unsigned char i,ret;
for(i=;i<;i++)
{
ret>>=;
SCLK=;
SCLK=;
ret|=IO?0x80:0x00;
}
return ret;
} void writebyte(unsigned char dat)
{
unsigned char i;
for(i=;i<;i++)
{
IO=dat&;
SCLK=;
SCLK=;
dat>>=;
}
} void write1302(unsigned char addr,unsigned char dat)
{
RST=;
SCLK=;
RST=;
writebyte(addr);
writebyte(dat);
RST=;
} unsigned char read1302(unsigned char addr)
{
unsigned char ret;
RST=;
SCLK=;
RST=;
writebyte(addr);
ret=readbyte();
RST=;
return ret;
} void show(void)
{
unsigned char i; for(i=;i<;i++)
{
P0=0xff;
we=;
we=; P0=table[num[i]];
du=;
du=; P0=~(0x20>>i);
we=;
we=; delayms();
}
} void delayms(unsigned time)
{
unsigned i,j; for(i=time;i>;i--)
for(j=;j>;j--)
;
} void keyscan(void)
{
unsigned char temp;
unsigned char reg[]; if((P3|0x0f)!=0xff)
{
delayms();
if((temp=P3|0x0f)!=0xff)
{
while((P3|0x0f)!=0xff);
switch(temp)
{
case 0xef: //显示时间还是日期
showdate=~showdate;
break;
case 0xdf: //日期最后两位显示日还是星期
showday=~showday;
break;
case 0xbf: //将时钟寄存器保存到RAM
RST=;
SCLK=;
RST=;
writebyte(CLBT+);
for(temp=;temp<;temp++)
reg[temp]=readbyte();
RST=; //从20号RAM开始存入,起始RAM号随意,只要不超过范围即可
for(temp=;temp<;temp++)
write1302(RAM(+temp),reg[temp]); /* 也可以用 RAM burst 写入
RST=0;
SCLK=0;
RST=1;
writebyte(RAMBT);
for(temp=0;temp<9;temp++)
writebyte(reg[temp]);
RST=0;
*/ break;
case 0x7f: //从RAM恢复到时钟寄存器
/* 对应的 RAM burst 读取
RST=0;
SCLK=0;
RST=1;
writebyte(RAMBT+1);
for(temp=0;temp<9;temp++)
reg[temp]=readbyte();
RST=0;
*/ for(temp=;temp<;temp++)
reg[temp]=read1302(RAM(+temp)+); RST=;
SCLK=;
RST=;
writebyte(CLBT);
for(temp=;temp<;temp++)
writebyte(reg[temp]);
RST=;
break;
}
}
}
}

DS1302.c

DS1302-演示代码的更多相关文章

  1. delphi 一个线程和主界面的交互的演示代码

    求一个线程和主界面的交互的演示代码求一个线程和主界面的交互的演示代码.线程和主界面处于两个Unit.线程中的user中不能引用主窗口.我只是想学习一下,线程和主界面交互的方法.去网上查了好几天资料,能 ...

  2. 从jsTree演示代码中提取的在线文件查看

    从jsTree演示代码中提取的在线文件查看 jsTree 请参考:https://www.jstree.com/ 效果如下: 代码下载:http://files.cnblogs.com/files/z ...

  3. DotNet,PHP,Java的数据库连接代码大全(带演示代码)

    C#数据库连接字符串 Web.config文件 <connectionStrings> <!--SQLServer数据库连接--> <add name="con ...

  4. 009. C#中的WebBrowser控件的属性、方法及操作演示代码(转)

    本文转自 http://www.open-open.com/code/view/1430559996802 0.常用方法 Navigate(string urlString):浏览urlString表 ...

  5. c++虚表的使用 通过虚表调用虚函数的演示代码

    //演示一下c++如何找到虚表地址vptr以及如何通过虚表调用虚函数 //zhangpeng@myhexin.com 20130811 #include <iostream> using ...

  6. jQuery-ui datepicker的使用演示代码

    这两天使用jquery做一个web端展示的工具,遇到了不少问题也学到了不少知识.其中有一个就是在页面中显示日期选择器的功能,通过百度直接使用的是jquery datepicker 看到一篇使用说明很不 ...

  7. Motion Detection Algorithms视频中运动检测算法源代码及演示代码

    原文地址:http://www.codesoso.com/code/Motion_Detection.aspx 本文实现了在连续视频数据流中几种不同的运动检测算法,他们都是基于当前帧图像和前一帧图像的 ...

  8. 委托和事件C#演示代码

    class Cat { private string _name; public Cat(string name) { _name = name; } public void Shout() { Co ...

  9. html 基础演示代码

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. 你不知道的JavaScript演示代码Github地址

    你不知道的JavaScript博文相关代码托管至Github,每次写完博客会把代码提交上去. 代码地址:https://github.com/rongbo-j/you-dont-know-js 点击D ...

随机推荐

  1. 不能正确获得上次构建以来的Commit

    不能正确获得上次构建以来的Commit 如何解决?

  2. 【python】元组的插入

    >>> temp=(1,2,3,4,5)>>> temp=temp[:2]+(8,)+temp[2:]>>> temp(1, 2, 8, 3, 4 ...

  3. MYSQL数据库备份与恢复【转】

    mysqldump -h主机名  -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql  在window上需要通过CMD进入mysql安装目录下的bin目录下执行 ...

  4. web服务编码设置

    response设置编码. <%@ page contentType="text/html;charset=UTF-8" %> 是服务器端java程序运行时的输出编码, ...

  5. 通过本地加载ga.js文件提高Google Anlytics性能

    Google Anlytics 分析代码是异步加载的,一般来讲不会影响网页性能,但是技术部的网页性能报告里老是提到ga.js的状态为Aborted,说明ga虽然是异步跟踪,但某些情况下对网页性能与加载 ...

  6. [Leetcode] Validate BST

    给一个Binary Tree,检查是不是Binary Search Tree. 即是否满足对每个节点,左子树的中的所有节点的值 < 当前节点的值 < 右子树所有节点的值. Solution ...

  7. 【Uvalive 5834】 Genghis Khan the Conqueror (生成树,最优替代边)

    [题意] 一个N个点的无向图,先生成一棵最小生成树,然后给你Q次询问,每次询问都是x,y,z的形式, 表示的意思是在原图中将x,y之间的边增大(一定是变大的)到z时,此时最小生成数的值是多少.最后求Q ...

  8. 使用API网关构建微服务

    使用传统的异步回调方法编写API组合代码会让你迅速坠入回调地狱.代码会变得混乱.难以理解且容易出错.一个更好的方法是使用响应式方法以一种声明式样式编写API网关代码.响应式抽象概念的例子有Scala中 ...

  9. js常用操作代码

    页面前进后退<input type=button value=刷新 onclick="window.location.reload()"><input type= ...

  10. Boostrap 模态框 水平垂直居中问题

            var editorB = new UE.ui.Editor({ initialFrameHeight: 350, initialFrameWidth: 600 });         ...