微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 震惊:一男子CT107D使用DS1302模块时,数值不会改变

震惊:一男子CT107D使用DS1302模块时,数值不会改变

时间:10-02 整理:3721RD 点击:
#include"reg52.h"
#include"DS1302.h"
/****************************/
/*         地址定义         */
void DS1302_delay(unsigned char x)
{
        unsigned char i,j;
        for(i=x;i>0;i--)
                for(j=12;j>0;j--)
                        ;
}
/****************************/
/*         驱动函数         */
/****************************/
/*     DS1302写一个字节     */
/*  dat:写进DS1302的数据    */
void DS1302_WRITE(unsigned char dat)
{
        char i;
        RST=0;
        SCLK=0;
        RST=1;
        for(i=0;i<8;i++)
        {
                if(dat&0x01)
                        IO=1;
                else
                        IO=0;
                dat>>=1;
                SCLK=0;
                SCLK=1;
        }
        DS1302_delay(5);
        RST=0;
}
/*     DS1302读一个字节     */
/*     dat:读回的数据       */
char DS1302_READ()
{
        char i,dat,temp,dat2;
        RST=0;
        SCLK=0;
        RST=1;
        for(i=0;i<8;i++)
        {
                SCLK=1;
                DS1302_delay(5);
                SCLK=0;
                if(IO)
                        temp|=0x80;
                else
                        temp|=0x00;
                dat>>=1;
        }
        DS1302_delay(5);
        RST=0;
        dat2=temp/16;
        dat=temp%16;
        temp=dat+dat2*10;
        return(temp);
}
/*DS1302写寄存器驱动函数*/
/*reg:目标寄存器,dat:写进寄存器的数据*/
void DS1302_WRITE_REG(char reg,char dat)
{
        char i;
        EA=0;
        RST=0;
        SCLK=1;
        RST=1;
        for(i=0;i<8;i++)
        {
                SCLK=0;
                IO=reg&0x01;
                reg>>=1;
                DS1302_delay(5);
                SCLK=1;
        }
        for(i=0;i<0;i++)
        {
                SCLK=0;
                IO=dat&0x01;
                dat>>=1;
                DS1302_delay(5);
                SCLK=1;
        }
        DS1302_delay(5);
        RST=0;
        IO=1;
        SCLK=1;
        EA=1;
}
/*DS1302寄存器读驱动函数*/
/*reg:读目标函数,dat:读回的数据*/
char DS1302_READ_REG(char reg)
{
        char i,dat1,dat2,temp=0;
        EA=0;
        RST=0;
        SCLK=1;
        RST=1;
        for(i=0;i<8;i++)
        {
                SCLK=0;
                IO=reg&0x01;
                reg>>=1;
                DS1302_delay(5);
                SCLK=1;
        }
        for(i=0;i<8;i++)
        {
                temp>>=1;
                SCLK=0;
                if(IO)
                        temp|=0x80;
                else
                        temp|=0x00;
                        SCLK=1;
        }
        DS1302_delay(5);
        RST=0;
        IO=1;
        SCLK=1;
        dat1=temp/16;
        dat2=temp%16;
        temp=dat2+dat1*10;
        EA=1;
        return(temp);
}
#include"reg52.h"
#include"DS1302.h"
#include"absacc.h"
sfr AUXR = 0x8E;
uchar code table[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF};
//最后一个为熄灭
uchar dspbuf[]={10,10,10,10,10,10,10,10};
uchar dspcom;
uchar intr;
bit flag_DS1302;
void display();
void init_DS1302();
void init_T0();
void cls_beep();
void main()
{
        uchar second,minute,hour;
        init_DS1302();
        init_T0();
        cls_beep();
        while(1)
        {
                if(flag_DS1302)
                {
                        flag_DS1302=0;
                        hour   =DS1302_READ_REG(READ_HOUR);
                        minute =DS1302_READ_REG(READ_MINUTE);
                        second =DS1302_READ_REG(READ_SECOND);
                        dspbuf[0]=hour/10;
                        dspbuf[1]=hour%10;
                        dspbuf[2]=minute/10;
                        dspbuf[3]=minute%10;
                        dspbuf[4]=second/10;
                        dspbuf[5]=second%10;
                }
        }
}
void init_T0()
{
       
        TMOD&=0XF0;
        TMOD|=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        ET0=1;
        TR0=1;
        EA=1;
}
void init_DS1302()
{
        DS1302_WRITE_REG(WRITE_PROTECT,0X00);
        DS1302_WRITE_REG(WRITE_SECOND,0X56);
        DS1302_WRITE_REG(WRITE_MINUTE,0X15);
        DS1302_WRITE_REG(WRITE_HOUR,0X15);
        DS1302_WRITE_REG(WRITE_PROTECT,0X80);
}
void display()
{
        P0 = 0xff;
        P2 = ((P2&0x1f)|0xE0);
        P2 &= 0x1f;
        P0 = 1<<dspcom;
        P2 = ((P2&0x1f)|0xC0);
        P2 &= 0x1f;
        P0 = table[dspbuf[dspcom]];       
    P2 = ((P2&0x1f)|0xE0);
        P2 &= 0x1f;
    if(++dspcom == 8){
        dspcom = 0;
                }
}
void inter_T0() interrupt 1
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        intr++;
                        display();
        if(intr==20)
        {
                intr=0;
                flag_DS1302=1;
        }
}
void cls_beep()
{
        P2=((P2&0x1f)|0xa0);
        P0=0x00;
        P2&=0x1f;
}

标题party

明天来UC报道!
代码没细看,应该是1302的时序不对,你去参考一下开发板上的历程,荡一个下来改改。

我想问下,我那个DS1302时序已经调好了,但是我的秒数码管在从59调变到00时,却显示不出来,等到1分钟过去之后才会出现,请问您有了解过着类的问题吗/

LZ可以参考下我针对CT107D的固件库

你把1302读出来的数据通过串口打印在调试助手里看一下秒是如何变化的,尤其是从59->00的时候,数据抓到了要显示就是很简单的事情了。

多谢,我尝试一下

太棒了

你写的很棒,但是我看不懂,呜呜

请教下这位前辈,请问蓝桥杯是会给时序的驱动函数是吗?

我也是参加这届的。会给datasheet

只给数据手册?有没有底层驱动函数?

部分会给                       

我UC已经满了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top