参考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. ubuntu 12.04 mysql转移目录后 无法 启动

    http://www.boyunjian.com/do/article/snapshot.do?uid=com.iteye.xgbjmxn%2Fblog%2F1208086(转,)     我是用ap ...

  2. ubuntu nginx 伪静态 设置

    简单的静态设置 1  vim nginx.conf // 修改nginx配置文件 server { .... root /usr/local/nginx/html; #nginx网站根目录 #下面这个 ...

  3. Traveller数据访问路径

    2015年10月数据访问路径

  4. javascript 事件流及应用

    当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序发生该元素的触发 事件,事件传播的顺序叫做事件流 1.事件流的分类: A.冒泡型事件(所有浏览器都支持)   由明确的事件源到最不确定 ...

  5. [转]PHP Session原理分析及使用

    之前在一个叫魔法实验室的博客中看过一篇<php session原理彻底分析>的文章,作者从session的使用角度很好阐述了在代码运行过程中,每个环节的变化以及相关参数的设置及作用.本来想 ...

  6. 在使用MOS管时要注意的问题

    1.当Vds电压增大,Ciss增大,栅极充放电电流也会增大 2.MOS管的功率损耗要控制在额定功耗以下 3.在Buck电路中,开关MOS管的Vds在MOS管关断时会非常大

  7. codeforces 278Div1 B题

    虚拟参赛的时候没想到是线段树,看到很多人都过了,也蛮着急的. 首先用二分+线段树的方法更新DP[i]:它表示以A[i]为结尾可以最前到哪个位置: 再用线段树计算ans[i]:它表示当前i个A元素可以最 ...

  8. iOS - 应用程序国际化

    开发的移动应用更希望获取更多用户,走向世界,这就需要应用国际化,国际化其实就是多语言.这篇文章介绍Xcode4.5以后的国际化,包括应用名国际化和应用内容国际化.如果是Xcode4.5之前版本请参考. ...

  9. JNI/NDK开发指南(二)——JVM查找java native方法的规则

    通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...

  10. DZ真是各种强大

    近期对论坛做了大装修,非常享受这个过程. 真是着迷了,这个装修工程让我接连几天几乎到了废寝忘食的地步. 终于告一段落,又想起来折腾,因为对之前的文库系统感觉种种别扭. 没有空调,没有风扇,居然忙到夜里 ...