amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 323|回复: 0

DS1302的分寄存器读写异常求助

[复制链接]
发表于 2015-9-15 18:25:35 | 显示全部楼层 |阅读模式
代码如下
  1. /*硬件连接方式
  2. sbit DS1302_SCLK        =P2^7;        //时钟  
  3. sbit DS1302_IO    =P2^6;  //数据
  4. sbit DS1302_CE                =P2^5;         //使能
  5. */

  6. #define        SECOND_W  0x80 //对秒寄存器进行写操作
  7. #define        SECOND_R  0x81 //对秒寄存器进行读操作
  8. #define        MINUTE_W  0x82 //对分寄存器进行写操作
  9. #define        MINUTE_R        0x83 //对分寄存器进行读操作
  10. #define        HOUR_W          0x84 //对小时寄存器进行写操作
  11. #define        HOUR_R          0x85 //对小时寄存器进行读操作


  12. /**************************************************************************
  13. * 名        称:                void DS1302_write_byte(uchar dat)
  14. * 功        能:                向DS1302写入一个字节数据
  15. * 说        明:   
  16. * 输        入:                dat 要写入的数据
  17. * 输        出:               
  18. **************************************************************************/
  19. void DS1302_write_byte(uchar dat)
  20. {
  21.         uchar        i;
  22.        
  23.         for(i=0;i<8;i++)                        //开始传输8个字节的数据
  24.         {
  25.                 DS1302_SCLK=0;                        //初始时钟线置为0
  26.                 DS1302_IO=dat&0x01;        //取最低位,注意DS1302的数据和地址都是从最低位开始传输的
  27.                 DS1302_SCLK=1;                        //时钟线拉高,制造上升沿,SDA的数据被传输
  28.                 dat>>=1;                                                //数据右移一位,准备传输下一位数据
  29.         }
  30. }

  31. /**************************************************************************
  32. * 名        称:                uchar DS1302_read_byte()  
  33. * 功        能:                从DS1302读一个字节的数据
  34. * 说        明:   
  35. * 输        入:               
  36. * 输        出:                读出的数据 返回给 dat
  37. **************************************************************************/
  38. uchar DS1302_read_byte()   
  39. {
  40.         uchar i,dat;
  41.   for(i=0;i<7;i++)
  42.   {
  43.                 DS1302_SCLK=0;
  44.     if(DS1302_IO==1)
  45.                 {
  46.                         dat=dat|0x80;
  47.                 }
  48.     else
  49.     {
  50.                         dat=dat&0x7f;
  51.                 }
  52.                 DS1302_SCLK=1;             //产生下跳沿
  53.     dat=dat>>1;
  54.    }
  55.    return (dat);
  56. }         

  57. /**************************************************************************
  58. * 名        称:                void DS1302_write(uchar addr,uchar dat)
  59. * 功        能:               
  60. * 说        明:   
  61. * 输        入:                寄存器地址addr,要写入的数据dat
  62. * 输        出:               
  63. **************************************************************************/
  64. void DS1302_write(uchar addr,uchar dat)
  65. {
  66.         DS1302_CE=0;
  67.         DS1302_SCLK=0;
  68.         DS1302_CE=1;                                                //打开使能
  69.         DS1302_write_byte(addr);
  70.         DS1302_write_byte(dat);       
  71.         DS1302_SCLK=1;
  72.         DS1302_CE=0;                                                //关闭使能
  73. }

  74. /**************************************************************************
  75. * 名        称:                uchar DS1302_read(uchar addr)   
  76. * 功        能:                从DS1302读取地址addr数据
  77. * 说        明:   
  78. * 输        入:                uchar addr
  79. * 输        出:                返回的数据        dat
  80. **************************************************************************/
  81. uchar DS1302_read(uchar addr)   
  82. {
  83.         uchar        dat;
  84.         DS1302_CE=0;
  85.         DS1302_SCLK=0;
  86.         DS1302_CE=1;        //打开使能
  87.         DS1302_write_byte(addr);
  88.         dat=DS1302_read_byte();
  89.         DS1302_SCLK=1;
  90.         DS1302_CE=0;        //打开使能
  91.         return dat;       
  92. }         

  93. /**************************************************************************
  94. * 名        称:                void DS1302_init()   
  95. * 功        能:                DS1302初始化
  96. * 说        明:   
  97. * 输        入:               
  98. * 输        出:               
  99. ***************************************************************************/
  100. void DS1302_init()   
  101. {
  102.         DS1302_CE=0;
  103.         DS1302_SCLK=0;
  104.        
  105.        
  106.         DS1302_write(0x8e,0x00);                        //对0x8e寄存器操作,去掉写保护,对最高位WP写0
  107.         DS1302_write(0x90,0xab);                        //对0x8e寄存器操作,去掉写保护,对最高位WP写0
  108.        
  109.         //对DS1302写入时间 20:24:22
  110.         DS1302_write(HOUR_W,0x13);                //设置小时,模式24h制,
  111.         DS1302_write(0X82,0x13);                //设置分钟
  112.         DS1302_write(SECOND_W,0x30);        //设置秒并且使DS1302开始走时

  113.         DS1302_write(0x8e,0x80);                        //进行写保护

  114. }
复制代码

  1. uchar time_buf[7]={0,0,0,0,0,0,0};        //秒 分 时 日 月 星期 年




  2. void read_time()
  3. {
  4.         DS1302_write(0x8e,0x00);                        //对0x8e寄存器操作,去掉写保护,对最高位WP写0

  5.         hour=DS1302_read(HOUR_R);
  6.         minute=DS1302_read(0X83);
  7.         second=DS1302_read(SECOND_R);
  8.        
  9.         //将读取到的16进制数时间转化为10进制
  10.        
  11.         time_buf[0]=second/16*10+second%16;       
  12.         time_buf[1]=minute/16*10+minute%16;
  13.         time_buf[2]=hour/16*10+hour%16;
  14.        
  15.         temp_second_shiwei=time_buf[0]/10;        //秒十位
  16.         temp_second_gewei        =time_buf[0]%10;        //秒个位
  17.        
  18.         temp_minute_shiwei=time_buf[1]/10;        //分十位
  19.         temp_minute_gewei        =time_buf[1]%10;        //分个位
  20.        
  21.         temp_hour_shiwei=time_buf[2]/10;                //时十位
  22.         temp_hour_gewei        =time_buf[2]%10;                //十个位
  23. }
复制代码

单片机是stc12c5a60s2 12M晶振
时寄存器和秒寄存器的写入和读出都是正常的,就是分寄存器一直显示的是85,不知道是什么原因
注:显示程序肯定是没有问题的
希望高手帮忙解答下
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-20 14:31

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表