增强型的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); }
------解决方案--------------------
调时序的话使用工具效率能高一些,去找个示波器或逻辑分析仪抓一抓波形就知道哪的问题了
------解决方案--------------------
在这种情况下 还是用逻辑分析仪看一下波形