搜索
bottom↓
回复: 6

DS1302读取的时间不能正常显示在数码管上

[复制链接]

出0入0汤圆

发表于 2012-6-30 08:22:17 | 显示全部楼层 |阅读模式
本帖最后由 4758866 于 2012-6-30 20:10 编辑

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71
};
sbit duan=P2^6;
sbit wei=P2^7;
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0x81
#define READ_MINUTE 0x83
#define READ_HOUR 0x85
#define WRITE_PROTECT 0x8E
sbit ACC_7=ACC^7;//位寻址寄存器定义
sbit SCLK=P3^2; // DS1302时钟信号         6脚
sbit DIO=P2^4;  // DS1302数据信号         7脚
sbit CE=P3^3;   // DS1302片选            5脚
uchar miao,fen,shi;
void smgxs(uchar, uchar, uchar);
void delay(uchar z);
void Write1302 ( uchar addr,dat );
uchar Read1302 (uchar addr );
void Initial( );
void main()
{
  Initial();//时钟初始化
  while(1)
{
  miao=Read1302(READ_SECOND);//读取秒
           
  fen=Read1302(READ_MINUTE);//读取分
           
  shi=Read1302(READ_HOUR);//读取时
           
  smgxs(shi,fen,miao);
}
}
void smgxs(uchar shi, uchar fen, uchar miao)
{
     uchar w1,w2,w3,w4,w5,w6;      
           w1=shi/10;
           w2=shi%10;
           w3=fen/10;
           w4=fen%10;
           w5=miao/10;
           w6=miao%10;

           duan=1;//打开段选
           P0=table[w1];//段数据
           duan=0;//关闭段选
           P0=0xff;//消隐
           wei=1;//打开位选
           P0=0xfe;//位数据
           wei=0;//关闭位选
           delay(5);//延时

           duan=1;
           P0=table[w2];
           duan=0;
           P0=0xff;
           wei=1;
           P0=0xfd;
           wei=0;
           delay(5);
         
           duan=1;
           P0=table[w3];
           duan=0;
           P0=0xff;
           wei=1;
           P0=0xfb;
           wei=0;
           delay(5);

           duan=1;
           P0=table[w4];
           duan=0;
           P0=0xff;
           wei=1;
           P0=0xf7;
           wei=0;
           delay(5);

           duan=1;
           P0=table[w5];
           duan=0;
           P0=0xff;
           wei=1;
           P0=0xef;
           wei=0;
           delay(5);

           duan=1;
           P0=table[w6];
           duan=0;
           P0=0xff;
           wei=1;
           P0=0xdf;
           wei=0;
           delay(5);
           
}
void delay(uchar z)//延时子程序ms
{
   uchar x,y;
    for (x=z;x>0;x--)
        for(y=110;y>0;y--);   
}
void Write1302 ( uchar addr,dat ) //地址、数据发送子程序   
{
       uchar i,temp;
       CE=0;                         //CE引脚为低,数据传送中止
       SCLK=0;                    //清零时钟总线
       CE=1;                       //CE引脚为高,逻辑控制有效//发送地址
       for ( i=8; i>0; i-- ) //循环8次移位
       {     
              SCLK=0;
              temp=addr;
              DIO=(bit)(temp&0x01);//每次传输低字节
              addr>>= 1;//右移一位
              SCLK=1;//发送数据
       }
      
       for ( i=8; i>0; i-- )
       {     
              SCLK=0;
              temp=dat;
              DIO=(bit)(temp&0x01);         
              dat>>=1;                  
              SCLK=1;
       }
              CE=0;         
}
uchar Read1302 (uchar addr )//数据读取子程序
{
       uchar i,temp,dat1,dat2;
       CE=0;           
       SCLK=1;            
       CE=1;
      
       for ( i=8; i>0; i-- ) //发送地址                      //循环8次移位
       {     
              SCLK=0;
              temp=addr;
              DIO=(bit)(temp&0x01);//每次传输低字节
              addr>>=1;//右移一位
              SCLK=1; //读取数据
       }
      
       for ( i=8;i>0;i--)
       {
              ACC_7=DIO;
              SCLK=1;//注意时序
              ACC>>=1;
              SCLK=0;
       }     
       CE=0;
       dat1=ACC;
       dat2=dat1/16;         //数据进制转换
       dat1=dat1%16;        //十六进制转十进制
       dat1=dat1+dat2*10;
       return (dat1);
}
void Initial( )//初始化DS1302   
{
       Write1302(WRITE_PROTECT,0X00);          //禁止写保护
       Write1302(WRITE_SECOND,0x56);          //秒位初始化
       Write1302(WRITE_MINUTE,0x34);         //分钟初始化
       Write1302(WRITE_HOUR,0x12);          //小时初始化
       Write1302(WRITE_PROTECT,0x80);      //允许写保护
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-6-30 16:05:48 来自手机 | 显示全部楼层
你在主函数里面调用数码管显示函数时候,给W1 变量的值是W1不觉得这个很奇怪吗。你直接把对W1等变量的定义写在数码管显示函数里面试试。。。

出0入0汤圆

发表于 2012-6-30 16:08:05 来自手机 | 显示全部楼层
本帖最后由 yangkuan85988 于 2012-6-30 16:09 编辑

直接定义个数组用来显示时间,然后在这个对这个数组写个时间处理的函数不是更方便吗?……还有建议楼主以后多用英文起函数名,这样其实更容易懂

出0入0汤圆

 楼主| 发表于 2012-6-30 20:11:25 | 显示全部楼层
修改了还是不行

出0入0汤圆

 楼主| 发表于 2012-6-30 21:16:06 | 显示全部楼层
还是时序问题啊

出0入0汤圆

发表于 2012-6-30 23:13:56 | 显示全部楼层
不到啥电路,看着就是个晕?

出0入0汤圆

发表于 2012-7-1 22:30:05 | 显示全部楼层
本帖最后由 hongli3154 于 2012-7-1 22:33 编辑

我昨天刚好也做了这个给你看这个图可能你就明白了
拿秒这一部分来说吧它的低4位是秒范围是0-9,高4-高5位是十秒范围是0-59刚开始我的9秒过了就显示16秒了看了ds才搞定的希望能帮到你

本帖子中包含更多资源

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

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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