找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2153|回复: 2
收起左侧

DS1302显示在数码管没有反应

[复制链接]
ID:280978 发表于 2018-2-6 02:27 | 显示全部楼层 |阅读模式
就是00-00-00,没有任何反应。希望大家解决一下,源码如下


#include <reg52.h>
#include <shumaguan.h>
#include <DS1302.h>


//main.c文件

unsigned char count;
void main()
{


  EA=1;
  ET0=1;
  TR0=1;
  TMOD=0x01;
  TH0=(65536-50000)/256;//50ms
  TL0=(65536-50000)%256;

  while(1)
  {
            show();
          ling=Time[2]/16;
          yi=Time[2]%16;
          er=10;
          san=Time[1]/16;
          si=Time[1]%16;
          wu=10;
          liu=Time[0]/16;
          qi=Time[0]%16;

          if (count==20)// 一秒后变成显示年月日
          {
          ling=Time[6]/16;
          yi=Time[6]%16;
          er=10;
          san=Time[4]/16;
          si=Time[4]%16;
          wu=10;
          liu=Time[3]/16;
          qi=Time[3]%16;
          
          }

  }

}

void Time0() interrupt 1
{       
    TH0=(65536-50000)/256;//50ms
    TL0=(65536-50000)%256;
        count++;


}

//shumaguan.h文件
#ifndef __shumaguan_H_
#define __shumaguan_H_

#include<intrins.h>

void Delay2ms();
void show();
unsigned char  digital[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};
unsigned char ling,yi,er,san,si,wu,liu,qi;
unsigned char Time[7];

void show()
{  
unsigned char i;

  for(i=0;i<8;i++)
  {       
    P2=0xc0;
        switch(i)  
   {
            case 0:P0=0x01;P2=0xE0;P0=digital[ling];break;
            case 1:P0=0x02;P2=0xE0;P0=digital[yi];break;
            case 2:P0=0x04;P2=0xE0;P0=digital[er];break;
            case 3:P0=0x08;P2=0xE0;P0=digital[san];break;
            case 4:P0=0x10;P2=0xE0;P0=digital[si];break;
            case 5:P0=0x20;P2=0xE0;P0=digital[wu];break;
                  case 6:P0=0x40;P2=0xE0;P0=digital[liu];break;
                  case 7:P0=0x80;P2=0xE0;P0=digital[qi];break;


   }
    Delay2ms();
    P0=0xff;
}
}
void Delay2ms()                //@11.0592MHz
{
        unsigned char i, j;

        _nop_();
        i = 4;
        j = 146;
        do
        {
                while (--j);
        } while (--i);
}



#endif

DS1302文件
#ifndef __DS1302_H_
#define __DS1302_H_


#include <intrins.h>

sbit SCK=P1^7;               
sbit SDA=P2^3;               
sbit RST = P1^3;   // DS1302复位
                                                                                               
unsigned char Read_Ds1302 ( unsigned char address );
void Write_Ds1302_Byte(unsigned  char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
void init_DS1302();
void gettime();

unsigned char Time[7];
unsigned char init[]={15,30,3,6,2,2,18};//完成时间2018年2月6日周二凌晨2点30分15秒        BCD码


void Write_Ds1302_Byte(unsigned  char temp)
{
        unsigned char i;

        for (i=0;i<8;i++)            
        {
                SCK=0;
                SDA=temp&0x01;
                temp>>=1;
                SCK=1;
        }
}   

void Write_Ds1302( unsigned char address,unsigned char dat )     
{       
        RST=0;
        _nop_();
        SCK=0;
        _nop_();
        RST=1;       
           _nop_();  
        Write_Ds1302_Byte(address);       
        Write_Ds1302_Byte(dat);               
        RST=0;
}

unsigned char Read_Ds1302 ( unsigned char address )
{
        unsigned char i,temp=0x00,dat1,dat2;
        RST=0;
        _nop_();
        SCK=0;
        _nop_();
        RST=1;
        _nop_();
        Write_Ds1302_Byte(address);
        for (i=0;i<8;i++)        
        {               
                SCK=0;
                temp>>=1;       
                if(SDA)
                temp|=0x80;       
                SCK=1;
        }
        RST=0;
        _nop_();
        RST=0;
        SCK=0;
        _nop_();
        SCK=1;
        _nop_();
        SDA=0;
        _nop_();
        SDA=1;
        _nop_();
        dat1=temp/16;
        dat2=temp%16;
        temp=dat1*10+dat2;
        return (temp);                       
}

void init_DS1302()//初始化DS1302
{
   unsigned char i,adr;//写的地址是从0x80h开始加2的
   adr=0x80;
   Write_Ds1302(0x8e,0x00);
   for(i=0;i<7;i++)
    {
             Write_Ds1302(adr,init[i]/10*16+init[i]%10);
          adr=adr+2;

    }
        Write_Ds1302(0x8e,0x80);
}

void gettime()//得到DS1302时间
{
   unsigned char place=0x81,j;//读的地址是从0x81h开始加2的
    Write_Ds1302(0x8e,0x00);
         for(j=0;j<7;j++)
         {
           Time[j]=Read_Ds1302(place);
           place=place+2;
         
         }

          Write_Ds1302(0x8e,0x80);//操作0x8e地址最高位,0表示操作,1表示关闭


}

#endif

回复

使用道具 举报

ID:48150 发表于 2018-2-6 09:35 | 显示全部楼层
看看代码,是不是有问题?
回复

使用道具 举报

ID:155507 发表于 2018-2-6 19:50 | 显示全部楼层
看看可以用



  1. #include <reg52.h>
  2. #include "shumaguan.h"
  3. #include "DS1302.h"


  4. //main.c文件

  5. unsigned char count;
  6. void main()
  7. {
  8.         TMOD=0x01;
  9.         TH0=(65536-50000)/256;//50ms
  10.         TL0=(65536-50000)%256;
  11.         EA=1;
  12.         ET0=1;
  13.         TR0=1;
  14.        
  15.         init_DS1302(); //初始化DS1302

  16.         while(1)
  17.         {
  18.                 gettime(); //得到DS1302时间

  19.                 ling=Time[2]/16;
  20.                 yi=Time[2]%16;
  21.                 er=10;
  22.                 san=Time[1]/16;
  23.                 si=Time[1]%16;
  24.                 wu=10;
  25.                 liu=Time[0]/16;
  26.                 qi=Time[0]%16;

  27.                 if (count==20)// 一秒后变成显示年月日
  28.                 {
  29.                         ling=Time[6]/16;
  30.                         yi=Time[6]%16;
  31.                         er=10;
  32.                         san=Time[4]/16;
  33.                         si=Time[4]%16;
  34.                         wu=10;
  35.                         liu=Time[3]/16;
  36.                         qi=Time[3]%16;
  37.                        
  38.                 }
  39.                 show(); // 显示在数码管
  40.         }

  41. }

  42. void Time0() interrupt 1
  43. {        
  44.         TH0=(65536-50000)/256;//50ms
  45.         TL0=(65536-50000)%256;
  46.         count++;
  47. }


  48. //shumaguan.h文件
  49. #ifndef __shumaguan_H_
  50. #define __shumaguan_H_

  51. #include <intrins.h>

  52. void Delay2ms();
  53. void show();
  54. unsigned char  digital[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF};
  55. unsigned char ling,yi,er,san,si,wu,liu,qi;
  56. // unsigned char Time[7];

  57. void show()
  58. {  
  59.         unsigned char i;

  60.         for(i=0;i<8;i++)
  61.         {        
  62.                 P2=0xc0;
  63.                 switch(i)  
  64.                 {
  65.                         case 0: P0=0x01; P2=0xE0;P0=digital[ling];break;
  66.                         case 1: P0=0x02; P2=0xE0;P0=digital[yi];break;
  67.                         case 2: P0=0x04; P2=0xE0;P0=digital[er];break;
  68.                         case 3: P0=0x08; P2=0xE0;P0=digital[san];break;
  69.                         case 4: P0=0x10; P2=0xE0;P0=digital[si];break;
  70.                         case 5: P0=0x20; P2=0xE0;P0=digital[wu];break;
  71.                         case 6: P0=0x40; P2=0xE0;P0=digital[liu];break;
  72.                         case 7: P0=0x80; P2=0xE0;P0=digital[qi];break;

  73.                 }
  74.                 Delay2ms();
  75.                 P0=0xff;
  76.         }
  77. }

  78. void Delay2ms()                //@11.0592MHz
  79. {
  80.         unsigned char i, j;

  81.         _nop_();
  82.         i = 4;
  83.         j = 146;
  84.         do
  85.         {
  86.                 while (--j);
  87.         } while (--i);
  88. }



  89. #endif


  90. //DS1302文件
  91. #ifndef __DS1302_H_
  92. #define __DS1302_H_

  93. #include <intrins.h>

  94. sbit SCK = P1^7;               
  95. sbit SDA = P2^3;               
  96. sbit RST = P1^3;   // DS1302复位

  97. unsigned char Read_Ds1302 ( unsigned char address );
  98. void Write_Ds1302_Byte(unsigned  char temp);
  99. void Write_Ds1302( unsigned char address,unsigned char dat );
  100. void init_DS1302();
  101. void gettime();

  102. unsigned char Time[7];
  103. unsigned char init[]={15,30,3,6,2,2,18};//完成时间2018年2月6日周二凌晨2点30分15秒        BCD码


  104. void Write_Ds1302_Byte(unsigned  char temp)
  105. {
  106.         unsigned char i;

  107.         for (i=0;i<8;i++)            
  108.         {
  109.                 SCK=0;
  110.                 SDA=temp&0x01;
  111.                 temp>>=1;
  112.                 SCK=1;
  113.         }
  114. }   

  115. void Write_Ds1302( unsigned char address,unsigned char dat )     
  116. {        
  117.         RST=0;
  118.         _nop_();
  119.         SCK=0;
  120.         _nop_();
  121.         RST=1;        
  122.         _nop_();  
  123.         Write_Ds1302_Byte(address);        
  124.         Write_Ds1302_Byte(dat);               
  125.         RST=0;
  126. }

  127. unsigned char Read_Ds1302 ( unsigned char address )
  128. {
  129.         unsigned char i,temp=0x00,dat1,dat2;
  130.         RST=0;
  131.         _nop_();
  132.         SCK=0;
  133.         _nop_();
  134.         RST=1;
  135.         _nop_();
  136.         Write_Ds1302_Byte(address);
  137.         for (i=0;i<8;i++)         
  138.         {               
  139.                 SCK=0;
  140.                 temp>>=1;        
  141.                 if(SDA)
  142.                 temp|=0x80;        
  143.                 SCK=1;
  144.         }
  145.         RST=0;
  146.         _nop_();
  147.         RST=0;
  148.         SCK=0;
  149.         _nop_();
  150.         SCK=1;
  151.         _nop_();
  152.         SDA=0;
  153.         _nop_();
  154.         SDA=1;
  155.         _nop_();
  156.         dat1=temp/16;
  157.         dat2=temp%16;
  158.         temp=dat1*10+dat2;
  159.         return (temp);                        
  160. }

  161. void init_DS1302()//初始化DS1302
  162. {
  163.         unsigned char i,adr;//写的地址是从0x80h开始加2的
  164.         adr=0x80;
  165.         Write_Ds1302(0x8e,0x00);
  166.         for(i=0;i<7;i++)
  167.         {
  168.                 Write_Ds1302(adr,init[i]/10*16+init[i]%10);
  169.                 adr=adr+2;
  170.         }
  171.         Write_Ds1302(0x8e,0x80);
  172. }

  173. void gettime()//得到DS1302时间
  174. {
  175.         unsigned char place=0x81,j;//读的地址是从0x81h开始加2的
  176.         Write_Ds1302(0x8e,0x00);
  177.         for(j=0;j<7;j++)
  178.         {
  179.                 Time[j]=Read_Ds1302(place);
  180.                 place=place+2;
  181.                
  182.         }
  183.         Write_Ds1302(0x8e,0x80);//操作0x8e地址最高位,0表示操作,1表示关闭
  184. }

  185. #endif


复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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