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

2020-01-16 18:35发布

<ignore_js_op> <img src="https://www.xiaopingtou.net/data/attach/2001/5u5fgme5y3xijc6wf75zr59qnfowjcge.jpg">&nbsp;</ignore_js_op><p><br> <br> 程序用数码管显示是没问题的,调整分的时候小时会变成0,然后又恢复正常了,分钟调整是没问题的<br><br> <br> #include <regx52.h><br> #define WRITE_SECOND 0x80<br> #define WRITE_MINUTE 0x82<br> #define WRITE_HOUR 0x84<br> #define READ_SECOND 0x81<br> #define READ_MINUTE 0x83<br> #define READ_HOUR 0x85<br> #define WRITE_PROTECT 0x8E<br> sbit ACC_7=ACC^7;//位寻址寄存器定义<br> sbit SCLK=P2^0; // DS1302时钟信号&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;7脚<br> sbit DIO=P2^1;&nbsp;&nbsp;// DS1302数据信号&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;6脚<br> sbit CE=P2^2;&nbsp; &nbsp;// DS1302片选&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;5脚<br> 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;<br> void Write1302 ( unsigned char addr,dat ) //地址、数据发送子程序&nbsp; &nbsp; <br> {<br> &nbsp; &nbsp;&nbsp; &nbsp; unsigned char i,temp;<br> &nbsp; &nbsp;&nbsp; &nbsp; CE=0;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //CE引脚为低,数据传送中止<br> &nbsp; &nbsp;&nbsp; &nbsp; SCLK=0;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//清零时钟总线<br> &nbsp; &nbsp;&nbsp; &nbsp; CE = 1;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//CE引脚为高,逻辑控制有效//发送地址<br> &nbsp; &nbsp;&nbsp; &nbsp; for ( i=8; i&gt;0; i-- ) //循环8次移位<br> &nbsp; &nbsp;&nbsp; &nbsp; {&nbsp; &nbsp;&nbsp;&nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=0;//上升沿准备<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;temp=addr;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;DIO=(bit)(temp&amp;0x01);//每次传输低字节<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;addr&gt;&gt;= 1;//右移一位<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=1;//形成上升沿<br> &nbsp; &nbsp;&nbsp; &nbsp; }<br> &nbsp; &nbsp;&nbsp; &nbsp; <br> &nbsp; &nbsp;&nbsp; &nbsp; for ( i=8; i&gt;0; i-- ) <br> &nbsp; &nbsp;&nbsp; &nbsp; {&nbsp; &nbsp;&nbsp;&nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=0;//上升沿准备<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;temp=dat;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;DIO=(bit)(temp&amp;0x01);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;dat&gt;&gt;=1;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=1;//形成上升沿<br> &nbsp; &nbsp;&nbsp; &nbsp; }<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;CE=0;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br> }<br> unsigned char Read1302 (unsigned char addr )//数据读取子程序<br> {<br> &nbsp; &nbsp;&nbsp; &nbsp; unsigned char i,temp,dat1,dat2;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp; CE=1; <br> &nbsp; &nbsp;&nbsp; &nbsp; <br> &nbsp; &nbsp;&nbsp; &nbsp; for ( i=8; i&gt;0; i-- ) //发送地址&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //循环8次移位<br> &nbsp; &nbsp;&nbsp; &nbsp; {&nbsp; &nbsp;&nbsp;&nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=0;//上升沿准备<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;temp=addr;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;DIO=(bit)(temp&amp;0x01);//每次传输低字节<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;addr&gt;&gt;=1;//右移一位<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=1; //形成上升沿<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; }<br> &nbsp; &nbsp;&nbsp; &nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp; for ( i=8;i&gt;0;i--) <br> &nbsp; &nbsp;&nbsp; &nbsp; {<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ACC_7=DIO;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=1;//下降沿准备<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;ACC&gt;&gt;=1;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;SCLK=0;//形成下降沿<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}&nbsp; &nbsp;&nbsp;&nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp; CE=0;<br> &nbsp; &nbsp;&nbsp; &nbsp; dat1=ACC;<br> &nbsp; &nbsp;&nbsp; &nbsp; dat2=dat1/16;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//数据进制转换<br> &nbsp; &nbsp;&nbsp; &nbsp; dat1=dat1%16;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;//十六进制转十进制<br> &nbsp; &nbsp;&nbsp; &nbsp; dat1=dat1+dat2*10;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br> &nbsp; &nbsp;&nbsp; &nbsp; return (dat1);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br> void Initial_DS1302( )//初始化DS1302&nbsp; &nbsp; <br> { <br> &nbsp; &nbsp;&nbsp; &nbsp; Write1302(WRITE_PROTECT,0X00);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //关写保护<br> &nbsp; &nbsp;&nbsp; &nbsp; Write1302(WRITE_SECOND,0x40);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //秒位初始化<br> &nbsp; &nbsp;&nbsp; &nbsp; Write1302(WRITE_MINUTE,0x59);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;//分钟初始化<br> &nbsp; &nbsp;&nbsp; &nbsp; Write1302(WRITE_HOUR,0x02);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; //小时初始化<br> &nbsp; &nbsp;&nbsp; &nbsp; Write1302(WRITE_PROTECT,0x80);&nbsp; &nbsp;&nbsp; &nbsp;//开写保护<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br> void Read_1302( )<br> {<br> &nbsp; &nbsp;&nbsp; &nbsp; if(g_bSystemTime2Ms&gt;30)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;{&nbsp; &nbsp;&nbsp; &nbsp;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;TR0=0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; g_bSystemTime2Ms=0;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;TR0=1;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Hour=Read1302(READ_HOUR);//读取时&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; <br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;Min=Read1302(READ_MINUTE);//读取分<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Sec=Read1302(READ_SECOND);//读取秒 <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Hour_10_bit=Hour/10;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Hour_0_bit=Hour%10;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Min_10_bit=Min/10;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Min_0_bit=Min%10;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Sec_10_bit=Sec/10;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Sec_0_bit=Sec%10;<br> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;}<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} </regx52.h></p><p><br></p><p></p>
8条回答
wistarky
1楼 · 2020-01-17 14:46.采纳回答
在 Write1302() 最后一行 CE=0 前面加个 SCLK=0 试试?
little_Monkey
2楼-- · 2020-01-16 23:20
明显就是你程序问题,看看调分的时候你做了什么
4758866
3楼-- · 2020-01-17 02:49
little_Monkey 发表于 2016-9-20 18:04
明显就是你程序问题,看看调分的时候你做了什么

我把调整小时的那部分都删掉了,还是有这个问题,同样的程序用在数码管显示就没问题的。
4758866
4楼-- · 2020-01-17 06:09
本帖最后由 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
wistarky
5楼-- · 2020-01-17 10:51
 精彩回答 2  元偷偷看……
4758866
6楼-- · 2020-01-17 12:31
本帖最后由 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这个函数就会出问题

显示程序没问题,走时正常的
4758866
7楼-- · 2020-01-17 16:41
wistarky 发表于 2016-9-20 22:13
在 Write1302() 最后一行 CE=0 前面加个 SCLK=0 试试?

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

一周热门 更多>