参考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. docker私有仓库

    1.docker pull registry 2.sudo docker run -d -p 5000:5000 registry 默认情况下,会将仓库存放于容器内的/tmp/registry目录下, ...

  2. ubuntu ll命令

    用过 Redhat 的朋友应该很熟悉 ll 这个命令,就相当于 ls -l,但在 Ubuntu 中就不行了.严格来说 ll 不是一个命令,只是命令的别名而已.很多 Linux 用户都使用 bash s ...

  3. 泛型集合List<T> Dictionary<K,V>

    List<T>类似于ArrayList,ArrayList的升级版. 各种方法:Sort().Max().Min().Sum()…   Dictionary<K,V>类似于Ha ...

  4. Activity的测量(Measure)、布局(Layout)和绘制(Draw)过程分析

    一个Android应用程序窗口里面包含了很多UI元素,这些UI元素是以树形结构来组织的,即它们存在着父子关系,其中,子UI元素位于父UI元素里面,因此,在绘制一个Android应用程序窗口的UI之前, ...

  5. 【python之旅】python的基础三

    目录: 1.装饰器 2.迭代器&生成器 3.Json & pickle 数据序列化 4.软件目录结构规范  一.装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原 ...

  6. linux的fork函数

       fork函数  头文件:#include<unistd.h> 函数原型:pid_t fork( void);(pid_t 是一个宏定义,其实质是int 被定义在#include< ...

  7. Java String.contains()方法(转载)

    Java String.contains()方法 Java String.contains()方法用法实例教程, 返回true,当且仅当此字符串包含指定的char值序列 描述 java.lang.St ...

  8. 贴板子系列_1-exgcd

    exgcd ll exgcd(ll a,ll b,ll &x,ll &y) { ) { x=;y=;return a; } ll r=exgcd(b,a%b,x,y); ll t=x; ...

  9. Windows读取文本文件后的显示过程

    Windows首先将文本数据转换到它内部使用的编码格式:Unicode,然后按照文本的Unicode去字体文件中查找字体图像,最后将图像显示到窗口上. 总结一下前面的分析,文字的显示应该是这样的: 步 ...

  10. Webx之表单验证

    引入服务器端表单验证service,是通过在webx.xml中通过服务引入的方式完成的.例如,在user相关信息的表单验证的产生过程是这样的:webx-user.xml通过 <beans:imp ...