增强型的51单片机驱动不了ds1302,普通的却行,求原因,该如何处理

增强型的51单片机驱动不了ds1302,普通的却行,求原因
代码以下,如果说是时序的问题,那么该在哪里该时序??
C/C++ code
//寄存器宏定义
sbit DS1302_SCLK=P0^5;
sbit DS1302_IO=P0^6;
sbit DS1302_RST=P0^7;
//sbit DS1302_SCLK=P3^5;
//sbit DS1302_IO=P3^6;
//sbit DS1302_RST=P3^7;
#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
//1.将数据写入DS1302
// 名称: v_RTInputByte
// 说明:
// 功能: 往DS1302 写入1Byte 数据
// 调用:
// 输入: dat 写入的数据
// 返回值: 无
void T_delay()
{
    _nop_();_nop_();
}
void v_RTInputByte(unsigned char ucdat)
{
    unsigned char i;
    unsigned char k;
    for(i=8;i>0;i--)
    {
        DS1302_SCLK = 0;
//        for(k=4;k>0;k--)
        T_delay();
        DS1302_IO = (bit)(ucdat & 0x01); /*相当于汇编中的 RRC */
        ucdat >>= 1;
        DS1302_SCLK = 1;
        for(k=4;k>0;k--)
        T_delay();
    }
}
//2.读取DS1302 中的数据
// 名称: uchar uc_RTOutputByte
// 说明:
// 功能: 从DS1302 读取1Byte 数据
// 调用:
// 输入:
// 返回值: dat
unsigned char uc_RTOutputByte(void)
{
    unsigned char i;
    unsigned char k;
    unsigned char ucdat=0;
    for(i=8;i>0;i--)
    {
        //DS1302_IO=1;
        DS1302_SCLK = 0;
        //for(k=4;k>0;k--)
        T_delay();
        ucdat >>= 1; /*相当于汇编中的 RRC */
        if(DS1302_IO) ucdat|=0x80;
        DS1302_SCLK = 1;
        //for(k=4;k>0;k--)
        T_delay();
    }
    return(ucdat);
}
//3.往DS1302 写入数据
// 名称: v_W1302
// 说明: 先写地址,后写命令/数据
// 功能: 往DS1302 写入数据
// 调用: v_RTInputByte()
// 输入: address: DS1302 地址, dat: 要写的数据
// 返回值: 无
void v_W1302(unsigned char address, unsigned char ucdat)
{
    DS1302_RST = 0;
    DS1302_SCLK = 0;
    DS1302_RST = 1;
    v_RTInputByte(address); /* 地址,命令 */
    v_RTInputByte(ucdat); /* 写1Byte 数据*/
    //DS1302_SCLK = 1;
    _nop_();_nop_();
    DS1302_RST =0;
}
//4.读取DS1302 某地址的数据
// 名称: uc_R1302
// 说明: 先写地址,后读命令/数据
// 功能: 读取DS1302 某地址的数据
// 调用: v_RTInputByte() , uc_RTOutputByte()
// 输入: ucAddress: DS1302 地址
// 返回值: ucData :读取的数据
unsigned char uc_R1302(unsigned char address)
{
    unsigned char ucdat;
    DS1302_SCLK=0;
    DS1302_IO=0;
    DS1302_RST=0;
    DS1302_RST=1;
    v_RTInputByte(address); /* 地址,命令 */
    ucdat = uc_RTOutputByte(); /* 读1Byte 数据 */
    DS1302_SCLK = 1;
    DS1302_RST =0;
    return(ucdat);
}
//5.设置初始时间
// 名称: v_Set1302
// 说明:
// 功能: 设置初始时间
// 调用: v_W1302()
// 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
// 7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B
// 返回值: 无
void v_Set1302(unsigned char address,unsigned char *p1302,unsigned char n)
{
    unsigned char i;
    unsigned char TempData;
    v_W1302(WRITE_PROTECT,0x00); /* 控制命令,WP=0,写操作?*/
    for(i=0;i<n;i++)
    {
        TempData=*p1302;
        TempData=((TempData/10)<<4)+(TempData%10);
        v_W1302(address,TempData); /* 秒 分 时 日 月 星期 年 */
        p1302++;
        address+=2;
    }
    v_W1302(WRITE_PROTECT,0x80); /* 控制命令,WP=1,写保护?*/
}
//6.读取DS1302 当前时间
// 名称: v_Get1302
// 说明:
// 功能: 读取DS1302 当前时间
// 调用: uc_R1302()
// 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
// 7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B
// 返回值: 无
unsigned char v_Get1302(unsigned char address ,unsigned char *p1302, unsigned char n)
{
    unsigned char i;
    unsigned char TempData;
    for (i=0;i<n;i++)
    {
        TempData =uc_R1302(address);/*格式为: 秒 分 时 日 月 星期 年 */
        address+= 2;
        TempData=(TempData>>4)*10+(TempData&0x0f); //转换
        *p1302=TempData;
        p1302++;
    }
    return(*p1302);
}



------解决方案--------------------
调时序的话使用工具效率能高一些,去找个示波器或逻辑分析仪抓一抓波形就知道哪的问题了
------解决方案--------------------
在这种情况下 还是用逻辑分析仪看一下波形