No.86567 作者:liuji10 邮件:liuji@126.com ID:43299 登陆:2次 文章数:6篇 最后登陆IP:202.206.163.94 最后登陆:2006/5/30 8:46:38 注册:2005/10/27 20:40:34 财富:122 发帖时间:2005/12/5 21:06:00 发贴者IP:202.206.163.94 标题:liuji10:来帮帮忙呀!DS1302为什么返回的都是FF啊? 摘要:No.86567来帮帮忙呀!DS1302为什么返回的都是FF啊? 今天实验了一片51与DS1302,我实验想先写入DS1302中时间,然后再读出来,可读出的都是FF,不知道怎么回事,是不是硬件就没有工作啊?因为手头没有逻辑笔和示波器也不知道,有没有人遇到过这个情况啊。我的DS1302引脚接法为VCC1接5V,VCC2悬空(不使用充电模式),X1,X2分别接32.768KHZ晶振的2端 我的程序如下: #include <reg51.h> sbit T_CLK = P2^2; /*实时时钟时钟线引脚 */ sbit T_IO = P2^1; /*实时时钟数据线引脚 */ sbit T_RST = P2^0; /*实时时钟复位线引脚 */ sbit ACC0=ACC^0; sbit ACC7=ACC^7; /******************************************************************** * * 名称: v_RTInputByte * 说明: * 功能: 往DS1302写入1Byte数据 * 调用: * 输入: ucDa 写入的数据 * 返回值: 无 ***********************************************************************/ void v_RTInputByte(unsigned char ucDa) { unsigned char i; ACC = ucDa; for(i=8; i> 0; i--) { T_IO = ACC0; T_CLK = 1; T_CLK = 0; ACC = ACC > > 1; } } /******************************************************************** * * 名称: unsigned char uc_RTOutputByte * 说明: * 功能: 从DS1302读取1Byte数据 * 调用: * 输入: * 返回值: ACC ***********************************************************************/ unsigned char uc_RTOutputByte(void) { unsigned char i; for(i=8; i> 0; i--) { ACC = ACC> > 1; ACC7=T_IO; T_CLK = 1; T_CLK = 0; } return(ACC); } /******************************************************************** * * 名称: v_W1302 * 说明: 先写地址,后写命令/数据 * 功能: 往DS1302写入数据 * 调用: v_RTInputByte() * 输入: ucAddr: DS1302地址, ucDa: 要写的数据 * 返回值: 无 ***********************************************************************/ void v_W1302(unsigned char ucAddr, unsigned char ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ v_RTInputByte(ucDa); /* 写1Byte数据*/ T_CLK = 1; T_RST =0; } /******************************************************************** * * 名称: uc_R1302 * 说明: 先写地址,后读命令/数据 * 功能: 读取DS1302某地址的数据 * 调用: v_RTInputByte() , uc_RTOutputByte() * 输入: ucAddr: DS1302地址 * 返回值: ucDa :读取的数据 ***********************************************************************/ unsigned char uc_R1302(unsigned char ucAddr) { unsigned char ucDa; T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(ucAddr); /* 地址,命令 */ ucDa = uc_RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST =0; return(ucDa); } /******************************************************************** * * 名称: v_BurstW1302T * 说明: 先写地址,后写数据(时钟多字节方式) * 功能: 往DS1302写入时钟数据(多字节方式) * 调用: v_RTInputByte() * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B * 返回值: 无 ***********************************************************************/ void v_BurstW1302T(unsigned char *pSecDa) { unsigned char i; v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ T_RST = 0; T_CLK = 0; T_RST = 1; v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */ for (i=8;i> 0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/ { v_RTInputByte(*pSecDa);/* 写1Byte数据*/ pSecDa++; } T_CLK = 1; T_RST =0; } /******************************************************************** * * 名称: v_BurstR1302T * 说明: 先写地址,后读命令/数据(时钟多字节方式) * 功能: 读取DS1302时钟数据 * 调用: v_RTInputByte() , uc_RTOutputByte() * 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B * 返回值: ucDa :读取的数据 ************************************* ......
>>返回讨论的主题
|