jackrich 发表于 2005-11-9 11:50:15

各位能否提供DS12C887时钟芯片的motorola格式的C语言程序参考一下呢?

谁能提供DS12C887时钟芯片的motorola格式的C语言程序?谢谢!

jackrich 发表于 2005-11-9 12:36:01

在线等!

jackrich 发表于 2005-11-9 14:21:08

下面是DS12C887 C程序motorola读写时序,有问题的?芯片感觉不工作?





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

函数功能:用来写

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

void WriteAddrData(uint8_t dsaddress,uint8_t dsdata)

{

    DS_READ;



    PORTA = dsaddress;          //RAM地址

    DS_CS0;                     //选中时钟芯片



    DS_AS1;                     //1 地址有效

    NOP();

    NOP();

    DS_AS0;                     //0 地址失效

   

    DS_WRITE;                   //写

    PORTA = dsdata;             //data

    DS_DS1;

    NOP();

    DS_DS0;

    NOP();

   

    DS_CS1;                     //关闭时钟芯片

    DS_READ;

}



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

函数功能:用来读

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

uint8_t ReadAddrData(uint8_t dsaddress)

{

    uint8_t dsdata;

    DS_READ;                  //读

   

    PORTA = dsaddress;          //RAM地址

    DS_CS0;                     //选中时钟芯片

   

    DS_AS1;                     //1 地址有效

    NOP();

    NOP();

    DS_AS0;                     //0 地址失效

   

    DS_DS1;

    NOP();

    DS_DS0;

    NOP();

    dsdata = PINA;            //data

    NOP();

   

    DS_CS1;                     //关闭时钟芯片

    return dsdata;

}

jackiezeng 发表于 2005-11-9 15:15:32

楼主,

    可以把你的程序 贴 完整 吗 ?我也正在 弄 这个 rtc 。

jackrich 发表于 2005-11-10 10:40:42

终于调试成功了,下面把moto时序和模拟intel时序贴上来了:



//===== DS12C887 moto时序======

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

函数功能:用来写

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

void WriteAddrData(uint8_t dsaddress,uint8_t dsdata)

{

    DS_AS0;

    DS_DS1;

    DS_READ;

    DS_CS0;                     //选中时钟芯片

    //

    DS_DS0;

    DS_AS1;                     //1 地址有效

    PORTA = dsaddress;          //RAM地址

    NOP();

    NOP();

    DS_AS0;                     //0 地址失效

    //

    DS_WRITE;

    DS_DS1;

    PORTA = dsdata;             //data

    NOP();

    NOP();

    DS_DS0;

    //

    DS_CS1;                     //关闭时钟芯片

    DS_READ;

}



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

函数功能:用来读

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

uint8_t ReadAddrData(uint8_t dsaddress)

{

    uint8_t dsdata;

    DS_AS0;

    DS_DS1;

    DS_READ;

    DS_CS0;                     //选中时钟芯片

    //

    DS_DS0;

    DS_AS1;                     //1 地址有效

    PORTA = dsaddress;          //RAM地址

    NOP();

    NOP();

    DS_AS0;                     //0 地址失效

    //

    DDRA=0x00;// PORTA in

    DS_DS1;

    NOP();

    NOP();

    DS_DS0;

    dsdata = PINA;            //data

    //

    DS_CS1;                     //关闭时钟芯片

    DDRA=0xff;// PORTA out

    return dsdata;

}







//===== DS12C887 intel时序 ======

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

函数功能:用来写

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

void WriteAddrData(uint8_t dsaddress,uint8_t dsdata)

{

    DS_ALE0;

    DS_RD1;

    DS_WR1;

    DS_CS0;                     //选中时钟芯片

    NOP();

    //

    DS_ALE1;

    PORTA = dsaddress;          //RAM地址

    NOP();

    NOP();

    DS_ALE0;

    NOP();

    NOP();

    //

    PORTA = dsdata;             //data

    NOP();

    DS_WR0;

    NOP();

    NOP();

    NOP();

    DS_ALE1;

    DS_WR1;

    DS_CS1;                     //关闭时钟芯片

}



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

函数功能:用来读

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

uint8_t ReadAddrData(uint8_t dsaddress)

{

    uint8_t dsdata;

    DS_ALE0;

    DS_RD1;

    DS_WR1;

    DS_CS0;                     //选中时钟芯片

    NOP();

    //

    DS_ALE1;

    PORTA = dsaddress;          //RAM地址

    NOP();

    NOP();

    DS_ALE0;

    NOP();

    NOP();

    //

    DDRA=0x00;// PORTA in

    DS_RD0;

    NOP();

    dsdata = PINA;             //data

    DS_ALE1;

    DS_RD1;

    DS_CS1;                     //关闭时钟芯片

    DDRA=0xff;// PORTA out

    return dsdata;

}

jackiezeng 发表于 2005-11-10 15:03:57

好人啊, 我刚刚在做这个, 看了半天的 data sheet   都没有搞懂

jackiezeng 发表于 2005-11-10 15:19:26

DS_ALE0;

    DS_RD1;

    DS_WR1;

    DS_CS0;



能不能把这个宏定义 拿来看看 啊,我英文太差 看不懂 手册 啊

jackrich 发表于 2005-11-10 16:26:34

// 控制引脚定义moto

DS_CS             -----/CS

DS_AS             -----AS

DS_READ(DS_WRITE) -----R//W

DS_DS             -----DS



#define DS_CS0      cbi(PORTC,PC0)

#define DS_CS1      sbi(PORTC,PC0)

#define DS_AS0      cbi(PORTC,PC1)

#define DS_AS1      sbi(PORTC,PC1)

#define DS_READ   sbi(PORTC,PC2)

#define DS_WRITE    cbi(PORTC,PC2)

#define DS_DS0      cbi(PORTC,PC3)

#define DS_DS1      sbi(PORTC,PC3)



// 控制引脚定义intel

DS_CS             -----/CS

DS_ALE            -----AS

DS_WR             -----R//W

DS_RD             -----DS



#define DS_CS0      cbi(PORTC,PC0)

#define DS_CS1      sbi(PORTC,PC0)

#define DS_ALE0   cbi(PORTC,PC1)

#define DS_ALE1   sbi(PORTC,PC1)

#define DS_WR1      sbi(PORTC,PC2)

#define DS_WR0      cbi(PORTC,PC2)

#define DS_RD0      cbi(PORTC,PC3)

#define DS_RD1      sbi(PORTC,PC3)





贴好了!

jackrich 发表于 2005-11-10 16:30:56

TO:jackiezeng 剑客曾



      谢谢提建议!你用什么型号的芯片?

jackiezeng 发表于 2005-11-10 16:58:18

我用 mega 16   。我只是做实验而已~!



想问问, moto和 intel    有什么区别呢 ?

jackiezeng 发表于 2005-11-11 08:06:10

晕哦, 大哥你可以给我讲讲, 怎么初始化, 怎么使用这个东西啊,



我去读00 单元的 秒信号,出来的全是 0

jackrich 发表于 2005-11-11 08:25:35

Intel和Motorola是芯片能正常工作两种时序!



初始化时,首先应禁止芯片内部的更新周期操作,所以先将DS12C887状态寄存器B中的SET位置“1”,然后初始化00H~09H时标参数寄存器和状态寄存器A,此后再通过读状态寄存器C,清除寄存器C中的周期中断标志位PF,报警中断标志位AF,更新周期结束中断标志位UF。通过读寄存器口D中的VRT位,读状态寄存器口后VRT位将自动置“1”,最后将状态寄存器B中的SET位置“0”,芯片开始计时工作。



DS12887实时时钟芯片中文资料:

点击此处打开armok0185646.pdf

jackiezeng 发表于 2005-11-11 14:59:31

楼主, 你的单片机 工作 的 晶振是多少兆 的?

jackrich 发表于 2005-11-11 16:53:29

4Mhz

jackiezeng 发表于 2005-11-11 21:31:37

o my god ~!



how can i do ~!



我还是没搞定, 郁闷中~!

avrboy 发表于 2006-1-7 18:39:38

#define M818_PORT          PORTB

#define M818_DDR         DDRB

#define M818_PIN         PINB

#define M818_CONTROL_PORT      PORTD

#define AS                     PD5

#define WD                     PD6

#define RD                     PD7



#define AS_ON()   ( M818_CONTROL_PORT |=(1<<AS) )

#define AS_OFF()( M818_CONTROL_PORT &= ~(1<<AS) )

#define WD_ON()   ( M818_CONTROL_PORT &= ~(1<<WD) )

#define WD_OFF()( M818_CONTROL_PORT |=(1<<WD) )

#define RD_ON()   ( M818_CONTROL_PORT &= ~(1<<RD) )

#define RD_OFF()( M818_CONTROL_PORT |=(1<<RD) )



unsigned char get_clock_data(unsigned char address)

{

        unsigned char data=0;



        M818_DDR = 0xFF;

        M818_PORT = 0x00;

        RD_OFF();

        WD_OFF();

        AS_OFF();

        M818_PORT = address;

        _delay_us(5);

        AS_ON();

        _delay_us(5);

        AS_OFF();

        _delay_us(5);

        M818_DDR = 0x00;

        M818_PORT = 0x00;

        M818_PIN = 0x00;

        _delay_us(5);

        RD_ON();

        _delay_us(5);

        data = M818_PIN;

        _delay_us(5);

        RD_OFF();

        return data;

}



void set_clock_data(unsigned char address, unsigned char data)

{

        M818_DDR = 0xFF;

        M818_PORT = 0x00;

        RD_OFF();

        WD_OFF();

        AS_OFF();

        M818_PORT = address;

        _delay_us(5);

        AS_ON();

        _delay_us(5);

        AS_OFF();

        _delay_us(5);

        M818_PORT = data;

        _delay_us(5);

        WD_ON();

        _delay_us(5);

        WD_OFF();

}



我寫的Intel總線的, 已經在使用了
-----此内容被avrboy于2006-01-07,18:42:41编辑过

jackrich 发表于 2006-1-9 08:32:25

笼统标题我试了改不了吗?

kangkang 发表于 2009-10-30 22:41:07

什么东西嘛,我都看了一个星期了,读出来的都是时间的地址,都不知道什么东西

现在都无奈了,开始以为是时序问题,后来我试了哥便,最后读出来确实数据所在的地址,烦死了!

lzf713 发表于 2009-10-31 00:35:43

TO:【17楼】 kangkang
可以参考
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=1667149&bbs_page_no=1&search_mode=3&search_text=lzf713&bbs_id=1006

kangkang 发表于 2009-11-3 21:50:27

谢谢十八楼啦

zjsdlt2013 发表于 2014-9-19 09:57:41

请问怎么把它做在数码管上显示,怎么转换那些BCD码?
页: [1]
查看完整版本: 各位能否提供DS12C887时钟芯片的motorola格式的C语言程序参考一下呢?