[51单片机] 求助 DS1302初始化之后读出任何东西都是0

[复制链接]
 楼主| Nivans 发表于 2015-9-1 20:17 | 显示全部楼层 |阅读模式
TI, TE, tmp, ui, AD
本帖最后由 Nivans 于 2015-9-1 20:19 编辑

各位大神帮帮忙,目前已经调试了2天,程序完全按照时序图来做的。其他的地方都正常,但是上电初始化读取秒寄存器来判断是否断过电,之后就无法读出数据了,读出的数据都是零,数码管显示的都是0。无法查找原因。代码如下。
  1. **************************************Main.c
  2. #include "system.h"
  3. #include "ds1302.h"

  4. sbit LS138A=P2^2;  
  5. sbit LS138B=P2^3;
  6. sbit LS138C=P2^4;

  7. bit ReadRTC_Flag = 0;

  8. uint8 l_tmpdisplay[8];

  9. code uint8 table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
  10.                                  //共阴数码管 0-9  '-' '熄灭‘表

  11. cTime RealTime;

  12. void InitTIMER0(void)
  13. {
  14. TMOD|=0x01;//定时器设置 16位
  15. TH0=0xef;//初始化值
  16. TL0=0xf0;
  17. ET0=1;
  18. TR0=1;
  19. EA=1;
  20. }

  21. void main(void)
  22. {

  23.         ds1302_Init();
  24.         
  25.         InitTIMER0();          //初始化定时器0
  26.          
  27.         while(1)
  28.         {
  29.                 if(ReadRTC_Flag)
  30.                 {
  31.                   GetTime(&RealTime);        
  32.                         l_tmpdisplay[0]=RealTime.hour/16;                        //数据的转换,因我们采用数码管0~9的显示,将数据分开
  33.                         l_tmpdisplay[1]=RealTime.hour&0x0f;
  34.                         l_tmpdisplay[2]=10;                                                    //加入"-"
  35.                         l_tmpdisplay[3]=RealTime.min/16;
  36.                         l_tmpdisplay[4]=RealTime.min&0x0f;
  37.                         l_tmpdisplay[5]=10;
  38.                         l_tmpdisplay[6]=RealTime.sec/16;
  39.                         l_tmpdisplay[7]=RealTime.sec&0x0f;
  40.                 }
  41.         
  42.         }
  43.         
  44.         return;
  45. }

  46. void tim(void) interrupt 1 using 1
  47.                             //中断,用于数码管扫描
  48. {

  49.     static uint8 i,num;
  50.     TH0=0xf5;
  51.     TL0=0xe0;

  52.          P0=table[l_tmpdisplay[i]];                //查表法得到要显示数字的数码段

  53.     switch(i)                                          
  54.              {            
  55.                                         case 0:LS138A=0; LS138B=0; LS138C=0; break;         
  56.                 case 1:LS138A=1; LS138B=0; LS138C=0; break;                     
  57.                 case 2:LS138A=0; LS138B=1; LS138C=0; break;
  58.                 case 3:LS138A=1; LS138B=1; LS138C=0; break;
  59.                                         case 4:LS138A=0; LS138B=0; LS138C=1; break;
  60.                                         case 5:LS138A=1; LS138B=0; LS138C=1; break;
  61.                                         case 6:LS138A=0; LS138B=1; LS138C=1; break;
  62.                                         case 7:LS138A=1; LS138B=1; LS138C=1; break;
  63.                         
  64.              }
  65.         i++;
  66.         if(i==8)
  67.           {
  68.            i=0;
  69.            num++;
  70.            if(10==num)       //隔段时间读取1302的数据。时间间隔可以调整
  71.              {
  72.                  ReadRTC_Flag=1; //使用标志位判断
  73.                  num=0;
  74.                  }
  75.           }
  76. }
  77. [code]***************************ds1302.c
  78. #include "system.h"
  79. #include "ds1302.h"

  80. /*---------------------------------------------
  81. /* DS1302 Read Byte
  82. /*-------------------------------------------*/
  83. uint8 ReadByte()
  84. {
  85.         uint8 i,tmp = 0x00;
  86.         
  87.         io = 1; //IO 置1
  88.         
  89.         for(i = 0; i < 8 ; i ++)
  90.          {         
  91.                   if(io) tmp|=0x80;
  92.                   sclk = 1 ;
  93.                   sclk = 0;
  94.                   tmp >>= 1;
  95.          }
  96.          
  97.          return tmp;
  98. }

  99. /*---------------------------------------------
  100.   DS1302 WriteByte()
  101. --------------------------------------------*/
  102. void WriteByte(uint8 dat)
  103. {
  104.         uint8 i;
  105.         
  106.                  for(i = 0; i < 8 ; i ++)
  107.           {
  108.                         io = (bit)(dat & 0x01);
  109.                   sclk = 0;
  110.                         sclk = 1;
  111.                         dat >>= 1;
  112.           }
  113.                  
  114. }
  115. /*---------------------------------------------
  116. /* DS1302 SingleRead 单字节读
  117. /*-------------------------------------------*/
  118. uint8 SingleRead(uint8 addr)
  119. {
  120.           uint8 dat;
  121.           cs = 0;
  122.           sclk = 0;
  123.                 cs = 1;
  124.         
  125.           WriteByte(addr);
  126.           dat = ReadByte();
  127.         
  128.           sclk = 0;
  129.           cs = 0;
  130.         
  131.         return(dat);
  132. }

  133. /*----------------------------------------------
  134. /* DS1302 SingleWrite 单字节写
  135. /---------------------------------------------*/
  136. void SingleWrite(uint8 addr,uint8 dat)
  137. {
  138.                 cs = 0;
  139.           sclk = 0;
  140.                 cs = 1;
  141.           WriteByte(addr);
  142.           WriteByte(dat);
  143.           sclk = 0;
  144.           cs = 0;
  145. }


  146. /*---------------------------------------------
  147. /* DS1302 MultiRead 多字节读
  148. /*-------------------------------------------*/
  149. void MultiRead(uint8 *ptr)
  150. {
  151.         uint8 i;
  152.         cs = 0;
  153.         sclk = 0;
  154.         cs = 1;
  155.         
  156.         WriteByte(0xbf);
  157.         
  158.         for(i = 0; i < 8 ; i ++)
  159.         {
  160.                 ptr[i] = ReadByte();
  161.         }
  162.         
  163.         sclk = 0;
  164.         cs = 0;
  165.         
  166. }


  167. /*---------------------------------------------
  168. /* DS1302 MultiWrite 多字节读
  169. /*-------------------------------------------*/
  170. void MultiWrite(uint8 *ptr)
  171. {
  172.         uint8 i;
  173.         cs = 0;
  174.         sclk = 0;
  175.         cs = 1;
  176.         
  177.         WriteByte(0xbe);
  178.         
  179.         for(i = 0; i < 8 ; i ++)
  180.         {
  181.                 WriteByte(ptr[i]);
  182.         }
  183.         
  184.         sclk = 0;
  185.         cs = 0;
  186.         
  187. }

  188. /*-----------------------------------------------
  189. /* DS1302 GetTime
  190. /*---------------------------------------------*/
  191. void GetTime(cTime *p)
  192. {
  193.         uint8 tmp[8];
  194.         
  195.   MultiRead(tmp);        //多字节读,传地址方式返回时间、日期
  196.         
  197.         (*p).sec  =  tmp[0];
  198.         (*p).min  =  tmp[1];
  199.         (*p).hour =  tmp[2];
  200.         (*p).date =  tmp[3];
  201.         (*p).month = tmp[4];
  202.         (*p).week =  tmp[5];
  203.         (*p).year =  tmp[6];
  204.         
  205. }

  206. /*-----------------------------------------------
  207. /* DS1302 SetTime
  208. /*---------------------------------------------*/
  209. void SetTime(cTime *p)
  210. {
  211.         uint8 tmp[8];
  212.                
  213.         tmp[0]  =  (*p).sec;
  214.         tmp[1]  =  (*p).min;
  215.   tmp[2]  =  (*p).hour;
  216.         tmp[3]  =  (*p).date ;
  217.         tmp[4]  =  (*p).month;
  218.   tmp[5]        =  (*p).week ;
  219.   tmp[6]        =  (*p).year ;
  220.         tmp[7]  =  0x00;
  221.         
  222.         MultiWrite(tmp);        //多字节写,传地址方式返回时间、日期
  223.         
  224. }

  225. /*-----------------------------------------------
  226. /* DS1302 INIT
  227. /*---------------------------------------------*/
  228. void ds1302_Init(void)
  229. {
  230.           cTime code DefaultTime [] = {0x06,0x10,0x09,0x31,0x08,0x01,0x15};
  231.                
  232.                   
  233.                   
  234.                 if(SingleRead(0x81)&0x80)
  235.                 {
  236.                         
  237.                                 SingleWrite(0x8e,0x00);        //解除读写保护
  238.                                 SetTime(DefaultTime);               
  239.                                 
  240.                 }                        
  241. }
[/code]
  1. *********************************DS1302.H
  2. #ifndef _DS1302_H
  3. #define _DS1302_H

  4. typedef struct Timelist
  5. {
  6.                 uint8 sec;    //秒
  7.                 uint8 min;    //分
  8.                 uint8 hour;   //时
  9.                 uint8 date;   //日
  10.                 uint8 month;  //月
  11.                 uint8 week;    //星期
  12.                 uint8 year;          //年
  13.         
  14. }cTime;         //定义一个时间数据结构

  15. /*      函数声明        */

  16. void ds1302_Init(void);
  17. void GetTime(cTime *);

  18. /*      端口定义        */
  19. sbit cs = P3^5;  //片选使能
  20. sbit sclk = P3^6; //时钟线
  21. sbit io = P3^7;   //串行数据端口

  22. #endif

  1. *****************************SYSTEM.H
  2. #ifndef _STSTEM_H
  3. #define _SYSTEM_H

  4. #include <reg52.h>                 //8052头文件
  5. #include <intrins.h>

  6. /*-------------------------------------------------*/
  7. /*             自定义类型                          */
  8. /*-------------------------------------------------*/
  9. typedef signed   char   int8;
  10. typedef signed   int    int16;
  11. typedef signed   long   int32;
  12. typedef unsigned char   uint8;
  13. typedef unsigned int    uint16;
  14. typedef unsigned long   uint32;


  15. #endif

cjseng 发表于 2015-9-1 23:57 | 显示全部楼层
用proteus试试吧,直接单步仿真,看看问题出在哪里
ningling_21 发表于 2015-9-2 08:52 | 显示全部楼层
时序弄错了,百度一下有很多程序可以参考
ningling_21 发表于 2015-9-2 08:52 | 显示全部楼层
时序弄错了,百度一下有很多程序可以参考
forget345 发表于 2015-9-2 09:03 | 显示全部楼层
本帖最后由 forget345 于 2015-9-2 09:06 编辑

时钟线拉高拉低时加 延时程序
这个程序给你参考 http://wenku.baidu.com/link?url= ... gbQLVyiA0mOz7rpIGFi

您需要登录后才可以回帖 登录 | 注册

本版积分规则

117

主题

692

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部