这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » DS1302 DS1302读写,困扰了一天

共2条 1/1 1 跳转至

DS1302 DS1302读写,困扰了一天

院士
2006-09-17 18:14:16     打赏
DS1302 DS1302读写,困扰了一天



关键词: DS1302     读写     困扰     一天    

院士
2006-12-22 22:43:00     打赏
2楼
问 PORTB0对应1302的I/O口.感觉对照时序写的,确老是得不到正确结果.与网上别人的C51程序比较也没什么差别.做过的帮忙看看给点意见.
void WriteOneByte(unsigned char Data)
{
    unsigned char i;
        
    for(i = 8;i > 0;i--)
    {
        T_CLK_L;
         asm("nop");        
        if(Data & 0x01)
        {T_IO_H;}
        else
        {T_IO_L;}
        asm("nop");
        T_CLK_H;
         asm("nop");
        Data >>= 1;
    }
    
}

unsigned char GetOneByte(void)
{
    unsigned char i;
    unsigned char Retval = 0x00;
    unsigned char tmpPORTB = PORTB;
        
    DDRB &= 0xFE;
    PORTB |= 0x01;
    
    for(i = 8;i > 0;i--)
    {
        T_CLK_L;
         asm("nop");
        if (PINB&0x01)
        {Retval |= 0x80;}
        asm("nop");
        T_CLK_H;
        asm("nop");
        Retval >>= 1;
    }
        
    PORTB = tmpPORTB;
    DDRB |= 0x01;

    return Retval;
}    
void Set1302Reg(unsigned char CtrlByte, unsigned char Data)
{
    T_RST_L;
    T_CLK_L;
    asm("nop");
    asm("nop");
    asm("nop");
    T_RST_H;

    WriteOneByte(CtrlByte);
    WriteOneByte(Data);

    T_RST_L;
    asm("nop");
    asm("nop");
    asm("nop");
     T_CLK_L;
}

unsigned char Get1302Reg(unsigned char CtrlByte)
{
    unsigned char Retval;
    T_RST_L;
    T_CLK_L;
    asm("nop");
    asm("nop");
    asm("nop");
     T_RST_H;        //*****//
    
    WriteOneByte(CtrlByte);
    Retval = GetOneByte();
     
    T_RST_L;
    asm("nop");
    asm("nop");
    asm("nop");
     T_CLK_L;
    return Retval;
} 1: 告诉我你的EMAIL,我发一份给你。 2: 谢谢先啊.S_Anitya@163.com 3: 测试时,写入(0x8E,0x00),(0x80,0x00)后通过示波器可以看到晶振起振了,但是执行Get函数时,晶振又不起振.检测发现,Get函数中的T_RST_H(置/RST脚高电平)语句的执行与否直接影响到晶振的起振?!!!想不出所以然:( 4: 搞定.根据GF网上面的例子改成了...找到自己程序和测试通过程序的不同在于函数GetOneByte();
原为:
unsigned char GetOneByte(void)
{
    unsigned char i;
    unsigned char Retval = 0x00;
        
    DDRB &= 0xFE;
    PORTB |= 0x01;
    
    for(i = 8;i > 0;i--)
    {
        T_CLK_L;
        if (PINB&0x01)
        {Retval |= 0x80;}
        T_CLK_H;
        Retval >>= 1;
    }
        
    DDRB |= 0x01;

    return Retval;
}    
修改后:
unsigned char GetOneByte(void)
{
    unsigned char i,j;
    unsigned char Retval = 0x00;
        
     DDRB &= 0xFE;
     PORTB |= 0x01;
    
    for(i = 8;i > 0;i--)
    {
        T_CLK_H;
        asm("nop");    
        T_CLK_L;
        Retval >>= 1;
        if (PINB&0x01)
        {Retval |= 0x80;}
    }
        
     DDRB |= 0x01;
     
    return Retval;
}

看起来象是Retval >>= 1的语句的位置不一样造成的,Retval定义时已经赋值了.先移位或后移位对于最高位都是为0啊(编译后 >>= 为 LSR).过是过了.不知道怎么回事,还是郁闷........... 5: 网上程序的主要问题就是这个吗??我现在也在用1302,他的初始化,主要做什么??

谢谢! 6: 我以前是用1307电路板还没出来,所以先写程序,程序的延时准不准啊??

如果能发一份给我,就非常感激
cjb9705037@163.com
谢谢先!!!!!1

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]