增强型的51单片机驱动不了ds1302,普通的却行,求原因
代码以下,如果说是时序的问题,那么该在哪里该时序??
//寄存器宏定义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 数据// 调用:// 输入:// 返回值: datunsigned 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);}