参考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. NPOI_2.1.3-Excel中设置小数、百分比、货币、日期、科学计数法和金额大写

    在操作Excel时候一些特殊值的转换是在所难免的,下面就给出转换方法大同小异,代码如下: HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); ISheet ...

  2. JavaScript之Chart.js图例(legend)

    #html <div id="chart_line_legend" class="chart-legend"></div> <ca ...

  3. 对C#泛型中的new()约束思考

    对于new()约束,大家可能有一个误解,以为使用了new约束之后,在创建对象时与非泛型的版本是一致的:<public class Tester<T> where T:new() {  ...

  4. js与uri中location关系

    //获取域名host = window.location.host;host2=document.domain; //获取页面完整地址url = window.location.href; docum ...

  5. [转]CentOS Yum 命令详解

    总所周知,Redhat和Fedora的软件安装命令是rpm,但是用rpm安 装软件最大的麻烦就是需要手动寻找安装该软件所需要的一系列依赖关系,超级麻烦不说,要是软件不用了需要卸载的话由于卸载掉了某个依 ...

  6. session阻塞机制,解决方法

    session从生成到读取,或从生成到写入都出现锁定的情况. 1.session_start();session_commit(); 2.session_start();session_write_c ...

  7. Eclipse+Tomcat WEB开发配置

    关键字:JDK,WEB,Eclipse,Tomcat OS: Windows 8.1 with update 1.下载安装JDK:http://www.oracle.com/technetwork/j ...

  8. lucene开发序之luke神器

    lucene是一款很优秀的全文检索的开源库,目前最新的版本是lucene4.4,关于lucene的历史背景以及发展状况,在这里笔者就不多介绍了,如果你真心想学习lucene,想必在这之前你已经对此作过 ...

  9. MDK常用快捷键

    一.常用编译相关的快捷键 1.编译(单个文件)  Ctrl+F7 2.连接 F7 二.常用调试相关的快捷键 1.运行/停止     Ctrl+F5 2.Run(全速运行)  F5 3.Stop Deb ...

  10. APNs-远程推送

    一.开发iOS程序的推送功能, iOS端需要做的事 1.请求苹果获得deviceToken 2.得到苹果返回的deviceToken 3.发送deviceToken给公司的服务器 4.监听用户对通知的 ...