您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

cncml手绘网 门户 查看主题

为树莓派 添加一个 实时时钟DS1302

发布者: admin | 发布时间: 2020-7-20 22:10| 查看数: 21031| 评论数: 6|帖子模式

1、在系统中安装wiringPi(这个就不多说了很简单)
7 S. F" D+ J" A. b% `4 U& f2、连接ds1302模块和树莓派引脚! H! E9 O; r# f5 R0 T) a" P2 g5 L2 y
连接前需要在ds1302的DTA引脚上添加一个10K的上拉电阻,
- N6 b0 D. R* Z3 H2 LVCC—3.3V—-  g9 ^* F* O6 i, k6 b
GND—0V—-0 [4 m" A  @& P3 \2 Z  `
CLK—SCLK—-23
1 T+ ]2 G* ?' t" IDTA—SDA0—-240 U2 d; c8 d$ {% q+ h* S
RST—CE0—–27, w' J& J8 w, _# V* _+ O
3、修改程序
, T; ]5 @6 d1 o1 N1 j: n2 Lds1302.c的mian函数里有一个ds1302setup()函数 ,用来设置引脚,修改如图:
, E3 X; B# t& Y9 q% r
1 z$ C/ W0 \+ R
  1. int main(int argc, char *argv[])
    ' ]* [5 m9 }# r
  2. {/ W4 {, I. V! Y4 U* T2 i
  3. int i;
    8 G6 n2 k1 I' V$ O4 E
  4. int clock[8];/ V; n0 [5 w) E" F
  5. $ k! c1 _- Q+ [. b5 o& Y
  6. wiringPiSetup();, e$ Z3 _! U  u: j3 F
  7. //ds1308setup(0,1,2);
    0 F0 r- q2 t8 W5 `7 W0 B
  8. ds1302setup(14,10,30);
    ' L  q5 Q7 V2 L

  9. * A, U! T5 s  b. U% D
  10. if(argx == 2)
    ' Z( E6 j) y. \) P3 S  U+ p
  11. {* j! g6 \3 _4 y8 M+ s) ]- }
  12.   /**/if(strcmp(argv[1],"-slc") == 0)( h( J" J: q$ }
  13.    return setLinuxClocl();
    5 ~1 J$ G* ~+ g# |$ Y
  14.   else if(strcmp(argv[1],"-sdsc") == 0)0 }( m1 [% J  T- f
  15.    return setDSclock();0 I8 D$ Y+ P6 m) O# I1 A; U6 V) ]
  16.   else if(strcmp(argv[1],"-rtest") == 0); w' S" l2 N8 \  d+ Q. N$ l0 x' V9 R
  17.    return ramTest();6 {" V9 O. C3 O9 S- l
  18.   else  k, k& X9 c9 \- J8 T9 n" x1 b
  19.   {
    . U+ ~9 ?+ }! H2 H
  20.   printf("Usage:ds1302[-slc|-sdsc|-rtest]\n");) P4 x2 t' d1 E" @
  21.   return EXIT_FAILURE;
    & m  Q. g# X- J$ U( P' K/ ~
  22.   }  |2 @5 v# ?, y" |8 _- [
  23. }
    - d' m- d  {6 V% u* Y) }- b( n/ l+ h

  24. 9 X# N' `7 @; c* K
  25. }
复制代码
这里的14,10,30引脚号是wPi的编号不要弄错了
  M, I; u. D) W9 e 303ec4121c97625abd12b35452cadd69_20161008100442416.png & w' I/ B2 w# C9 c
! a1 X; v! P" j# J" I+ P
在wiringPi/examples目录下有ds1302.c文件 在wiringPi/examples目录下执行make ds1302即可生产可执行文件ds1302
+ W6 M2 P! t$ x7 S4、测试0 v: D  a, g- Z9 m9 U3 z" P2 i/ t
4.1 执行sudo ./ds1302 -rtest- b& y. K3 b' F( B, O: ?3 L
显示:. s  K0 o5 ]8 Y* n% p1 R' ^% q
cf544462f45da68d67e29f936619c15b_20161008100724605.png . t0 ]% g5 i; C: b, N& b- _$ A
说明一切正常,否者请检查连接是否正确* o9 P% r& p; }3 u4 S3 V8 b
4.2 sudo ./ds1302 -sdsc 即可将系统时间写进ds1302模块中去
4 [$ X+ Z& G! l( z4.3 从DS模块读取时间9 y* @0 v. L& u( B0 h3 e
执行sudo ./ds1302
! _7 b* ^7 r7 \! n( P, b 4ccd4471f013445e9fef90a29fc92db1_20161008101010871.png % E& d7 N" X4 @' H' l
4.4 从DS模块读取时间来设置系统的时间
+ a2 q8 g! N% X9 y, O3 Qsudo ./ds1302 -slc: B% l, n' a7 M: |  ~
5、获取当地时间 (以上获取的是UTC(Coordinated Universal Time)时间到当前时刻的秒数,要想从该秒数转换成本地时间需要用localtime()函数struct tm *localtime(const time_t *clock),)
* ^6 `/ W8 `; i: i6 i* v修改ds1302.c中的setDSclock()函数0 ?. R" P8 U0 C; b  S
如下:
2 S! W1 @  A# g: h9 C8 e a84790d69b7859c79aa2db2e2b3889a8_20161008102322970.png 5 e# X# R1 [+ q" X3 f% s( s( i
  1. static int setDSclock (void)% N! N& J9 G: t! o+ m# K
  2. {6 I0 d" t# F4 v3 U2 A+ C4 x
  3.   //struct tm t ;' W% ^1 R4 C/ m* @- g0 N
  4.   struct tm* t = NULL;: A# X3 G) z# f; s# [8 M
  5.   time_t now ;! F  d% v3 _/ Y. F* g
  6.   int clock [8] ;
    . ?0 b; q' d# m/ k

  7. ( ~7 e/ c+ f% ~" T
  8.   printf ("Setting the clock in the DS1302 from Linux time... ") ;" X: X- V2 C9 g1 ~5 ~: j, m# S2 ?
  9. 5 }: B' v, A$ g: d  h
  10.   now = time (NULL) ;+ p$ h3 m, D# P0 f: r. U4 U* @5 v
  11.   //gmtime_r (&now, &t) ;
    6 w8 k% U" J6 u& e# T) a7 Q9 V8 b
  12.   t = localtime(&now);& H9 ?1 |8 a( e
  13.   
    ( B6 V( T  ]/ }/ h! @1 n7 z* p
  14.   //clock [ 0] = dToBcd (t.tm_sec) ;        // seconds6 J9 A2 d+ W/ H# r( P# C
  15.   //clock [ 1] = dToBcd (t.tm_min) ;        // mins- [) \0 k/ |1 x
  16.   //clock [ 2] = dToBcd (t.tm_hour) ;        // hours! W: F2 U3 S# u. \) `" q
  17.   //clock [ 3] = dToBcd (t.tm_mday) ;        // date$ b1 ^6 ^1 K- P* n. V3 z  I
  18.   //clock [ 4] = dToBcd (t.tm_mon + 1) ;        // months 0-11 --> 1-121 }# \5 |6 Y0 t; }4 L- d  {( j: y
  19.   //clock [ 5] = dToBcd (t.tm_wday + 1) ;        // weekdays (sun 0)
    ! D4 }) W3 ~" n; M
  20.   //clock [ 6] = dToBcd (t.tm_year - 100) ;       // years$ R) v9 d8 w1 w6 Y4 T( @
  21.   //clock [ 7] = 0 ;                        // W-Protect off. q: p& r$ S. Q  a! z1 A
  22.   8 h0 W% P, N8 s4 d' U) m, K6 X- O
  23.   clock [ 0] = dToBcd (t->tm_sec) ;        // seconds
    + R6 C" {2 Y- @
  24.   clock [ 1] = dToBcd (t->tm_min) ;        // mins' B, C7 Z: d  @2 J# _% R- _1 Q& W
  25.   clock [ 2] = dToBcd (t->tm_hour) ;        // hours
    . ^) N1 i, e# ~# P- z
  26.   clock [ 3] = dToBcd (t->tm_mday) ;        // date( }- T: [' e. K% \% ]+ b
  27.   clock [ 4] = dToBcd (t->tm_mon + 1) ;        // months 0-11 --> 1-12
    9 i# a4 |4 R/ r
  28.   clock [ 5] = dToBcd (t->tm_wday + 1) ;        // weekdays (sun 0)
    4 n! V( H. b. \, E, X
  29.   clock [ 6] = dToBcd (t->tm_year - 100) ;       // years
    - V- u$ e( P- S& w
  30.   clock [ 7] = 0 ;                        // W-Protect off
    2 L9 N* }; ]% v* |
  31. 2 r" m2 J9 S1 T4 y+ H3 P
  32.   ds1302clockWrite (clock) ;
    . Q# l  G  @. L: ?9 ]( n

  33. ! _$ y0 [2 _* `7 _4 s1 ^4 ]1 @
  34.   printf ("OK\n %2d:%02d\n %2d:%02d\n",t->tm_hour,t->tm_min,dToBcd (t->tm_hour),dToBcd (t->tm_min) ) ;
复制代码

* N5 Z; R+ A% m# l之后重新编译make ds1302 重新执行以上指令即可获取当地时间了' q' u$ f+ B4 T' D" ]4 m- d' M" C
+ b9 {6 n7 K/ }
( R2 x) Q/ R" {, E" w
2 N3 B: |  E. W3 @4 l; O6 x$ b
相关文章:树莓派4B 更新wiringPi库到2.52的方法

最新评论

admin 发表于 2020-7-20 23:34:22
如果出现报错 : I* I" e/ T. w) Q9 O
DS1302 RAM TEST FAILURE. 433 errors.
" \0 s! g8 t2 S# i9 e& RDS1302 RAM TEST FAILURE. 465 errors.7 j. d8 B" L0 W# q, u+ o
等错误 那就是你接了三角 并没有接vcc和gnd接地
admin 发表于 2020-7-21 00:10:20
VCC:模块的电源引脚,接树莓派的1号引脚(3.3V)
1 K3 _8 a; x$ B: `0 R0 f$ d) Y4 g9 g
  W. a8 ?1 _. C9 G, s) y. v' ^! f& fGND:模块的地,接树莓派的6号引脚(Grand)
' S1 t- @0 s+ j  B% j
% X) t5 x" |! bCLK:SCLK 串行时钟,接树莓派wiringPi 0(物理编号:11号)
/ F1 h+ V- j$ K+ k6 z# Q. A4 H" x  l( I1 T) s6 i" X
DAT:I/O 数据线,接树莓派wiringPi 1(物理编号:12号)
: c4 f: ?1 V! f4 t9 N/ I8 H% O( x$ n7 ]% y% a8 U! P- a& C
RST:复位引脚,接树莓派wiringPi 2(物理编号:13号)
admin 发表于 2020-7-21 00:14:23
七、开机同步时间
将树莓派的时间与网络同步后,就可以写入到DS1302中,这样DS1302具有准确的当前时间,就算掉电也不会丢失,在树莓派离线时,可以在每次开机时将DS1302的时间写入到树莓派中,从而使得树莓派实现了实时时钟的功能。
获得可执行文件ds1302的目录
  1. pi@raspberrypi:~/wiringPi/examples $ pwd6 F. }6 y+ v. K7 B
  2. /home/pi/wiringPi/examples
复制代码
然后修改 /etc/rc.local 文件,在exit 0前面添加时间同步命令,这样在树莓派开机时就会自动将DS1302的时间同步到树莓派上。添加以下命令:
  1. sudo /home/pi/wiringPi/examples/ds1302 -slc
复制代码
保存后退出。我们将树莓派断网,然后树莓派关机,过一会开机,使用date命令读取时间,可以看到树莓派的走时和当前时间一致,说明时间自动同步成功!

* }. o8 z( P  N* a4 V& V
admin 发表于 2020-7-21 00:29:14
解决小时无法同步问题. _, g" l: p0 o2 G5 `

4 {, {0 ^- P! ^6 C& X" k/ i! ?
  1. static int setDSclock (void)
      A& j2 e5 U, v' _2 w
  2. {
    , A. [+ u2 C5 Z* E1 w& X
  3.   //struct tm t ;: i' m  f! q) u# ]
  4.   struct tm* t = NULL;
    4 ?. X+ x6 P0 w* F: B  |. S$ ~
  5.   time_t now ;
    3 v  v* W. x+ }, t1 i+ A
  6.   int clock [8] ;" C7 v9 ^% r( l) |

  7. . L4 A  |( }( M
  8.   printf ("Setting the clock in the DS1302 from Linux time... ") ;/ N  ?3 Z2 e: f* Y0 j& W# ~

  9. 6 z$ l- R/ A/ x6 q
  10.   now = time (NULL) ;/ `. G- D6 x4 z: s0 W2 `
  11.   //gmtime_r (&now, &t) ;
    ' }& A, z( h* m9 P" W
  12.   t = localtime(&now);: x$ {4 `- V. }5 A& q! f5 N: r
  13.   9 k- H# e% b- c/ H4 m, R
  14.   //clock [ 0] = dToBcd (t.tm_sec) ;        // seconds
    & i; W  v6 D+ P3 c0 |# {
  15.   //clock [ 1] = dToBcd (t.tm_min) ;        // mins
    ' d% j4 ]6 _6 Y+ m$ k
  16.   //clock [ 2] = dToBcd (t.tm_hour) ;        // hours; r1 I8 V+ @! }! g  i
  17.   //clock [ 3] = dToBcd (t.tm_mday) ;        // date
    9 C. N* t; a$ w  W: z
  18.   //clock [ 4] = dToBcd (t.tm_mon + 1) ;        // months 0-11 --> 1-12
    9 B1 A/ ^4 S8 q" b3 [
  19.   //clock [ 5] = dToBcd (t.tm_wday + 1) ;        // weekdays (sun 0)
    % \/ o+ ^' H, i- F; q
  20.   //clock [ 6] = dToBcd (t.tm_year - 100) ;       // years6 w/ U0 u' c5 j, I7 k# h
  21.   //clock [ 7] = 0 ;                        // W-Protect off7 h- g  q7 W" K1 K! \& T% F5 J
  22.   ( {. ]9 m2 J% o
  23.   clock [ 0] = dToBcd (t->tm_sec) ;        // seconds
    9 `2 g9 ^3 N) d5 ]
  24.   clock [ 1] = dToBcd (t->tm_min) ;        // mins
    # }* Y1 ~" k! c& ]
  25.   clock [ 2] = dToBcd (t->tm_hour) ;        // hours
    ' K$ L! e  r  l6 r& A  R
  26.   clock [ 3] = dToBcd (t->tm_mday) ;        // date3 n9 T# \( M) M
  27.   clock [ 4] = dToBcd (t->tm_mon + 1) ;        // months 0-11 --> 1-12
    7 |6 g7 p2 S( i" S- u
  28.   clock [ 5] = dToBcd (t->tm_wday + 1) ;        // weekdays (sun 0)
    6 Y3 n; X; g8 N1 B/ Z8 [6 U
  29.   clock [ 6] = dToBcd (t->tm_year - 100) ;       // years$ k8 p; \# w6 `0 g, }- N4 b
  30.   clock [ 7] = 0 ;                        // W-Protect off' a  z4 O. Y4 p5 B% V3 E! [

  31. ! ]. i1 o! V0 k7 K
  32.   ds1302clockWrite (clock) ;3 h* T& p& w6 B' O

  33. ) ~- Q2 l/ {3 I0 \
  34.   printf ("OK\n %2d:%02d\n %2d:%02d\n",t->tm_hour,t->tm_min,dToBcd (t->tm_hour),dToBcd (t->tm_min) ) ;
复制代码
admin 发表于 2020-7-21 15:21:15
20190404153444155436328469251[1].png
) d- l: u0 |* {* ]8 J
admin 发表于 2020-7-21 15:27:02
gpio readall 调出接口图+ E3 I9 J, }1 C2 W+ R  g

; ~, t& B9 j0 H" l. D; k, c& p
  1. +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+
    " ?2 p# L4 X4 U7 A; G9 }
  2. | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |& _) p9 V' F1 E" G) A7 V1 b2 O: _
  3. +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
    5 e) e8 H3 P. D& O1 m
  4. |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
    + P/ r) n, O. |1 t/ K5 n6 T
  5. |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
    6 L! o' f" c1 S( i
  6. |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
    ! O- |7 F& w4 L# s. b
  7. |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
    9 i$ V% b4 o& b" N$ S7 R
  8. |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
    : H3 ]; z( J, B" n
  9. |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
    9 F) {2 w1 a6 V
  10. |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |1 S& w4 v9 O' V+ d8 B% [
  11. |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
    0 x" I8 q9 R1 J- q* u$ I, o& o. f
  12. |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |9 D, I  l1 z7 i. ?
  13. |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
    7 {1 G" d0 r& `5 ^9 z
  14. |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |" B6 e5 A: ^# {0 e: q2 m$ e
  15. |  11 |  14 |    SCLK |  OUT | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |* p0 B% s0 e) K2 @5 C. x
  16. |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |; j- {% w9 Q2 i6 j! n9 N4 T
  17. |   0 |  30 |   SDA.0 |  OUT | 0 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |0 J# n: W2 |6 ?5 |( Q" g1 N! V
  18. |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
      b% n8 P' d/ F% b
  19. |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |& j. ~( ]/ P9 g4 x) t1 r- @
  20. |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
    6 [/ x3 d- z- |
  21. |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |. g7 C- v/ A3 y
  22. |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
    ' x9 S4 s" v# i
  23. |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |" y* g% f$ p% e6 h
  24. +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
    * e/ E7 j2 a3 Q5 s4 K
  25. | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
    - Y( f+ G0 V3 F, c: `
  26. +-----+-----+---------+------+---+---Pi A+--+---+------+---------+-----+-----+; a/ K6 \# ~, ?7 X: ?
复制代码

GMT+8, 2026-5-16 00:41 , Processed in 0.067034 second(s), 24 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!