使用Arduino和DS12C887芯片制作电子时钟(附Arduino源代码)

如何使用Arduino对DS12C887时钟模块进行时间读写

搜了一下DS12C887的资料,最详细的是郭天祥关于这个模块的视频教程,教程中讲解了这个模块的使用手册和程序的编写,但是这个教程是在51单片机上讲的,由于51与Arduino的不同,把程序直接移植到Arduino上比较困难。

由于在网上没有搜到与这个时钟模块相关的Arduino库或基于arduino的教程,本人参考了一些资料,写出了Arduino下的程序,并成功进行了时间的读写,于是就把方法记录下来保存了。

本文将提供相应的接线方法以及程序。

先简单介绍一下DS12C887这个时钟模块:

可计算到2100年前的秒、分、小时、星期、日期、月、年七种日历信息并带闰年补偿;
自带晶体振荡器和锂电池。在没有外部电源的情况下可工作10年;
——百度百科

使用Arduino和DS12C887芯片制作电子时钟(附Arduino源代码)_第1张图片

缺点:
地址/数据总线有8根,占用了很多IO口
相比1302,3231时钟模块体积更大,不适合装在小体积产品上


零件表

零件 数量
arduino UNO 1
arduino 拓展版 1
DS12C887模块 1
面包板 1
电池 1
杜邦线 若干

Arduino UNO+DS12C887接线

NC=not connect,就是不连接的意思。
MOT悬空即Inter总线模式,这里我们选用Inter总线模式,所以MOT引脚悬空。
使用Arduino和DS12C887芯片制作电子时钟(附Arduino源代码)_第2张图片
DS12C887对应Arduino UNO引脚

DS12C887 UNO
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 GND
13 14(A0)
14 15(A1)
15 16(A2)
17 17(A3)
18 VCC
19 12
24 VCC

程序源码

  1const int dscs=14;
2const int dsas=15;
3const int dsrw=16;
4const int dsds=17;
5const int dsirq=12;
6//define bidirectional address-data bus(定义双向地址总线)
7const int ad[8]={4,5,6,7,8,9,10,11};
8//寄存器A B C D的地址
9#define regA 0x0A
10#define regB 0x0B
11#define regC 0x0C
12#define regD 0x0D
13//函数声明
14void bus2out();
15void bus2in();
16void write_ds(byte add,byte date);
17byte read_ds(byte add);
18void set_time();
19void set_alarm(byte ashi,byte afen,byte amiao);
20byte miao,fen,shi,ri,yue,nian,xq;
21int i;
22void setup()
23
{
24 Serial.begin(9600);
25 pinMode(dscs, OUTPUT);
26 pinMode(dsas, OUTPUT);
27 pinMode(dsrw, OUTPUT);
28 pinMode(dsds, OUTPUT);
29 pinMode(dsirq, OUTPUT);
30//芯片初始化
31// write_ds(regA,0x20); // 控制A寄存器来开启晶体振荡器且保持时钟运行。
32// write_ds(regB,0x26); //设置24小时模式,数据二进制模式,开启闹铃中断。
33//时间初始化
34// set_time();//设置初始时间,运行一次即可注释掉
35// set_alarm(13,30,0);//设置闹钟
36}
37void loop()
38
{
39 //读取时间
40 miao=read_ds(0);
41 fen=read_ds(2);
42 shi=read_ds(4);
43 ri=read_ds(7);
44 yue=read_ds(8);
45 nian=read_ds(9);
46 xq=read_ds(6);
47// miao=(miao&0x0f)+((miao&0xf0)>>4)*10;//若使用BCD码需要进行位运算处理
48 Serial.print(nian);
49 Serial.print("/");
50 Serial.print(yue);
51 Serial.print("/");
52 Serial.print(ri);
53 Serial.print(" ");
54 Serial.print(shi);
55 Serial.print(":");
56 Serial.print(fen);
57 Serial.print(":");
58 Serial.print(miao);
59 Serial.print(" 星期:");
60 Serial.println(xq);
61}
62void bus2out(){
63 for(i=0;i<8;i++)
64 {
65 pinMode(ad[i], OUTPUT);
66 }
67}
68void bus2in(){
69 for(i=0;i<8;i++)
70 {
71 pinMode(ad[i], INPUT);
72 }
73}
74void write_ds(byte add,byte date) //芯片写指令
75
{
76 bus2out(); //set address pins to output
77 digitalWrite(dscs,0);
78 digitalWrite(dsas,1);
79 digitalWrite(dsds,1);
80 digitalWrite(dsrw,1);
81 //set address on bus(写地址)
82 for(i=0;i<8;i++)
83 {digitalWrite(ad[i],bitRead(add,i));}
84 digitalWrite(dsas,0);
85 digitalWrite(dsrw,0);
86 //set byte to write(写数据)
87 for(i=0;i<8;i++)
88 {digitalWrite(ad[i],bitRead(date,i));}
89 digitalWrite(dsrw,1);
90 digitalWrite(dsas,1);
91 digitalWrite(dscs,1);
92}
93byte read_ds(byte add) //芯片读指令
94
{
95 byte readb=0;
96 bus2out(); //set address pins to output
97 digitalWrite(dscs,0);
98 digitalWrite(dsas,1);
99 digitalWrite(dsds,1);
100 digitalWrite(dsrw,1);
101 //set address on bus(写地址)
102 for(i=0;i<8;i++)
103 {digitalWrite(ad[i],bitRead(add,i));}
104 digitalWrite(dsas,0);
105 digitalWrite(dsds,0);
106 bus2in();
107 for(i=0;i<8;i++){digitalWrite(ad[i],1);}
108 readb = digitalRead(ad[0])|(digitalRead(ad[1])<<1)|(digitalRead(ad[2])<<2)|(digitalRead(ad[3])<<3)|(digitalRead(ad[4])<<4)|(digitalRead(ad[5])<<5)|(digitalRead(ad[6])<<6)|(digitalRead(ad[7])<<7);
109 digitalWrite(dsds,1);
110 digitalWrite(dsas,1);
111 digitalWrite(dscs,1);
112 return readb;
113}
114void set_time()//需要自行调整时间,修改第二个参数
115
{
116 write_ds(0,10);//秒
117 write_ds(2,19);//分
118 write_ds(4,13);//时
119 write_ds(7,26);//日
120 write_ds(8,2);//月
121 write_ds(9,18);//年
122 write_ds(6,1);//星期
123}
124void set_alarm(byte ashi,byte afen,byte amiao) //闹钟设初值
125
{
126 write_ds(1,amiao);
127 write_ds(3,afen);
128 write_ds(5,ashi);
129}

arduino程序源码以及DS12C887模块的中文手册:
https://pan.baidu.com/s/1c369ui0

你可能感兴趣的:(Arduino项目)