搜索
bottom↓
回复: 8

1302芯片小时调整的怪问题?

[复制链接]

出0入0汤圆

发表于 2016-9-20 17:32:53 | 显示全部楼层 |阅读模式








程序用数码管显示是没问题的,调整分的时候小时会变成0,然后又恢复正常了,分钟调整是没问题的






#include <REGX52.H>
#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=P2^0; // DS1302时钟信号         7脚
sbit DIO=P2^1;  // DS1302数据信号         6脚
sbit CE=P2^2;   // DS1302片选            5脚
unsigned char Hour_10_bit,Hour_0_bit,Min_10_bit,Min_0_bit,Sec_10_bit,Sec_0_bit,g_bSystemTime2Ms,Hour,Min,Sec;
void Write1302 ( unsigned char addr,dat ) //地址、数据发送子程序   
{
       unsigned char 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;                                              
}
unsigned char Read1302 (unsigned char addr )//数据读取子程序
{
       unsigned char i,temp,dat1,dat2;           
       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( )//初始化DS1302   
{
       Write1302(WRITE_PROTECT,0X00);          //关写保护
       Write1302(WRITE_SECOND,0x40);          //秒位初始化
       Write1302(WRITE_MINUTE,0x59);         //分钟初始化
       Write1302(WRITE_HOUR,0x02);          //小时初始化
       Write1302(WRITE_PROTECT,0x80);      //开写保护
                                            }
void Read_1302( )
{
       if(g_bSystemTime2Ms>30)
                  {      
            TR0=0;                               
                              g_bSystemTime2Ms=0;
                                    TR0=1;
            Hour=Read1302(READ_HOUR);//读取时                                           
            Min=Read1302(READ_MINUTE);//读取分
                                    Sec=Read1302(READ_SECOND);//读取秒
                                    Hour_10_bit=Hour/10;
                                    Hour_0_bit=Hour%10;
                                    Min_10_bit=Min/10;
                                    Min_0_bit=Min%10;
                                    Sec_10_bit=Sec/10;
                                    Sec_0_bit=Sec%10;
                                      }
                                                                                         }

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2016-9-20 18:04:54 | 显示全部楼层
明显就是你程序问题,看看调分的时候你做了什么

出0入0汤圆

 楼主| 发表于 2016-9-20 20:03:24 来自手机 | 显示全部楼层
little_Monkey 发表于 2016-9-20 18:04
明显就是你程序问题,看看调分的时候你做了什么

我把调整小时的那部分都删掉了,还是有这个问题,同样的程序用在数码管显示就没问题的。

出0入0汤圆

 楼主| 发表于 2016-9-20 20:59:34 | 显示全部楼层
本帖最后由 4758866 于 2016-9-20 21:02 编辑

void Write1302 ( unsigned char addr,dat ) //地址、数据发送子程序   
{
       unsigned char 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;                                             
}










目前发现是发送函数有问题,不管是发送分钟数据还是小时数据都会让小时暂时归0

出0入0汤圆

发表于 2016-9-20 21:43:48 | 显示全部楼层
不会是你显示的程序有问题吧?

出0入0汤圆

 楼主| 发表于 2016-9-20 21:55:57 | 显示全部楼层
本帖最后由 4758866 于 2016-9-20 22:05 编辑
wistarky 发表于 2016-9-20 21:43
不会是你显示的程序有问题吧?


case (4)://减
                                               
                ucKeySec=0;
                      switch(Display_Variable)
        {
        case (11):
                           Clock_min_change=Min;                                                               
                 if(Clock_min_change==0)
                    Clock_min_change=60;
                    Clock_min_change--;       
                    c=BCD_BIN(Clock_min_change);                                                                       
                    //Write1302(WRITE_PROTECT,0X00); //关写保护
                    Write1302(WRITE_MINUTE,c);       //分钟初始化      
                    //Write1302(WRITE_PROTECT,0x80); //开写保护
                                                                        break;




                    //Write1302(WRITE_PROTECT,0X00); //关写保护
                    Write1302(WRITE_MINUTE,c);       //分钟初始化      
                    //Write1302(WRITE_PROTECT,0x80); //开写保护
只要执行了Write1302这个函数就会出问题

显示程序没问题,走时正常的

出0入0汤圆

发表于 2016-9-20 22:13:23 | 显示全部楼层
在 Write1302() 最后一行 CE=0 前面加个 SCLK=0 试试?

出0入0汤圆

 楼主| 发表于 2016-9-20 22:26:03 | 显示全部楼层
wistarky 发表于 2016-9-20 22:13
在 Write1302() 最后一行 CE=0 前面加个 SCLK=0 试试?

真的是这个问题,已经解决了。谢谢大神。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 16:09

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

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