在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 2092|回复: 0

[求助] 关于DS1302的问题求高手解答

[复制链接]
发表于 2011-12-6 16:31:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
数码管由595控制,在显示数据时数码管余辉现象比较明显,数据显示的不是很清晰,
我将重读数据的延时调到1秒左右才行,不过每重新读一次数据数码仍然会闪一下,哪位高手知道是哪不对呢???
/********************************************************************
*DS1302控制程序     2011.12.01   wqz
********************************************************************/
#include<reg52.h>
#include<intrins.h>

typedef unsigned uchar;

sbit sda=P2^1;    //DS1302
sbit clk=P2^0;
sbit ce=P2^2;

sbit IO =P1^7;    //595控制信号
sbit RLK =P1^6;
sbit CLK =P1^5;

#define  my_delay5us()  _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
                              
uchar cc[8];  //将要显示的时间由BCD码转换成要显示的数值存放在CC[]中
uchar bb[8];  //存放从DS1302中读取出来的数据

uchar aa[7]={0,30,18,20,12,6,11};  //初始时间
uchar code write_rtc[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};   //时间寄存器写地址
uchar code  tember[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管显示表

void my_delay1ms(int t);   //延时1ms函数
void write_1byte(uchar temp);  //写一字节数据
uchar read_1byte();     //读一字李数据
void write_addr_data(uchar Addr, uchar Data);  //先写地址再写数据
uchar writeadd_readdat(uchar ucAddr);     //先写地址再读数据
void write1_readM();        //连续读多个字节数据
void ds1302_init();         //DS1302初始化
/********************************************************************
*
* 主函数
********************************************************************/
void main()
{
       uchar i,j,dat;

       my_delay1ms(10);
      ds1302_init();    //给DS1302付初值   11年12月20日 周六 18-30-00

      while(1)
     {  
               write1_readM();   //读DS1302中的数据
               cc[0]=bb[0]%16;
               cc[1]=bb[0]/16;
               cc[2]=10;
               cc[3]=bb[1]%16;
               cc[4]=bb[1]/16;
               cc[5]=10;
               cc[6]=bb[2]%16;
               cc[7]=bb[2]/16;

              for(j=0;j<8;j++)                      //显示部分
             {
                    dat=tember[cc[j]];
                    RLK=0;
                    my_delay5us();
                    for(i=0;i<8;i++)
                   {
                         if(dat&0x80)IO=1;
                         else IO=0;
                         my_delay5us();
                         CLK=1;
                         my_delay5us();
                         CLK=0;
                         dat<<=1;
                   }
                   my_delay5us();
                   RLK=1;
              }
              my_delay1ms(10);
        }
}

/**********************************************************************/

void my_delay1ms(int t)  //延时
{
          uchar i,j;
          while(t--)
        {
               for(i=4;i>0;i--)
                for(j=50;j>0;j--);
        }
}

/**********************************************************************/

void write_1byte(uchar temp)  //写一字节数据
{
       uchar i;

       clk=0;
       my_delay5us();
       for (i=0;i<8;i++)      
       {
              if(temp&0x01)sda=1;
              else sda=0;     
              my_delay5us();   
              clk=1;
             my_delay5us();
              clk=0;
              temp>>=1;
       }
}

/**********************************************************************/

uchar read_1byte()     //读一字节数据
{
        uchar i,num;

       for (i=0;i<8;i++)   
       {
              num>>=1;
             if(sda)
             num|=0x80;
             my_delay5us();   
             clk=1;
             my_delay5us();  
             clk=0;
       }
       return num;
}

/**********************************************************************/

void write_addr_data(uchar Addr, uchar Data)  //先写地址再写数据
{
       ce = 0;
       my_delay5us();
       clk = 0;
       my_delay5us();
       ce = 1;
       my_delay5us();
       write_1byte(Addr); // 地址,命令
       write_1byte(Data); // 写1Byte数据
       my_delay5us();
       clk=1;
       my_delay5us();
       ce =0;
}

/**********************************************************************/

uchar writeadd_readdat(uchar ucAddr)    //先写地址再读数据
{
      uchar num1=0;
      ce = 0 ;
      my_delay5us();
      clk = 0;
      my_delay5us();
      ce = 1;
      my_delay5us();
      write_1byte(ucAddr); // 地址,命令
      num1 = read_1byte(); // 读1Byte数据
      my_delay5us();
      clk = 1;
      my_delay5us();
      ce =0;
      return(num1);
}

/**********************************************************************/

void write1_readM()      //连续读多个字节数据
{
       uchar i,Addr;

       Addr=0x81;
       for (i=0;i<7;i++)
       {
             bb = writeadd_readdat( Addr);//*格式为: 秒 分 时 日 月 星期 年
             Addr += 2;
       }
}

/**********************************************************************/

void ds1302_init()    //初始时间  11年12月20日 周六 18-30-00
{
       uchar i,*p,tmp;
       for(i=0;i<7;i++)
       {                           /*转BCD
             tmp=aa/10;     
             aa=aa%10;     
             aa=aa+tmp*16;
        }  
       write_addr_data(0x8E,0X00);

       p=write_rtc;            //传地址
       for(i=0;i<7;i++)            //7次写入 秒分时日月周年
       {
            write_addr_data(*p,aa);
             p++;  
       }
       write_addr_data(0x8E,0x80);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-6-16 14:02 , Processed in 0.052944 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表