参考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. MyBatis 拦截器 (实现分页功能)

    由于业务关系 巴拉巴拉巴拉 好吧 简单来说就是 原来的业务是 需要再实现类里写 selectCount 和selectPage两个方法才能实现分页功能 现在想要达到效果是 只通过一个方法就可以实现 也 ...

  2. datatable的数据转置

    没有具体测试过,5w条数据在i5机器上大概是1.3~2s左右,但是个人感觉就是在处理数据库的分页或者是写条件的时候会有一些麻烦,不如使用数据库分页! 但是这种方法不失为一种思路 private voi ...

  3. jquery放大镜插件与样式

    这是放大镜插件链接,我已经上传到我博客http://files.cnblogs.com/valiant1882331/%E6%94%BE%E5%A4%A7%E9%95%9C%E6%8F%92%E4%B ...

  4. wampserver下升级php7

    1.下载php7   http://windows.php.net/download#php-7.0 选择 VC14 x86 Thread Safe  64位选X64 32位选X86 2.下载VC14 ...

  5. ADO.NET学习小结【1】正在更新...

    小弟正在学习ADO.net有误的地方还请大大们批评指出,小弟在此谢过了 一.ADO.net简述: 以前我们写程序尤其是写和数据库有关的应用程序时,你我都得要了解Microsoft ADO COM对象才 ...

  6. python学习--string

    1\string are immutable, which means you can't change an existing string. >>>greeting = 'Hel ...

  7. 开源CMS赏析

    国内CMS产品有很多,开源的产品也不少,大概的可分为以下几类: .NET开源产品:We7CMS: PHP开源产品:Dede CMS.PHP CMS和帝国CMS: ASP开源产品:动易SiteFacto ...

  8. u-boot Makefile整体解析

    一.概述   1.理解u-boot的makefile需要的准备 linux常用命令.shell脚本基础知识.makefile脚本基础知识 2.Makefile的元素 万变不离其宗,无论工程多么复杂,文 ...

  9. Memcached(一)在Windows上安装和测试memcached

    1)下载memcached的windows安装程序 memcached-1.2.4-Win32-Preview-20080309_bin.zip 或其他版本 2)解压memcached  用管理员身份 ...

  10. 修改UISearBar的文字颜色,placehoder颜色及输入框颜色

    UISearchBar是我们经常会用到的一个控件-- 它由两个subView组成的,一个是UISearchBarBackGround,另一个是UITextField UITextField默认输入字体 ...