2 mxiaominzi mxiaominzi 于 2014.11.22 02:51 提问

新手求教,DS1302读出来的都是0XFF?

/*************************
写一个字节
**************************/
void DS1302_Write(uchar add,uchar dat)
{

uchar i;
DS1302_CE=0;
Delay10us();
DS1302_SCLK=0;
Delay10us();
DS1302_CE=1;
Delay10us();
for(i=0;i<8;i++)//最低位开始送
{

    DS1302_IO=add&0X01;
    add=add>>1;
    Delay10us();
    DS1302_SCLK=1;
    Delay10us();
    DS1302_SCLK=0;
    Delay10us();
}
for(i=0;i<8;i++)
{

    DS1302_IO=dat&0X01;
    dat=dat>>1;
    Delay10us();
    DS1302_SCLK=1;
    Delay10us();
    DS1302_SCLK=0;
    Delay10us();
}
DS1302_CE=0;
Delay10us();

}
/*************************
读一个字节
**************************/
uchar DS1302_Read(uchar add)
{

uchar i,abit,dat;
DS1302_CE=0;
Delay10us();
DS1302_SCLK=0;
Delay10us();
DS1302_CE=1;
Delay10us();
for(i=0;i<8;i++)//先写地址
{

    DS1302_IO=add&0X01;
    add=add>>1;
    Delay10us();
    DS1302_SCLK=1;
    Delay10us();
    if(i==7)break;
    DS1302_SCLK=0;
    Delay10us();
}
for(i=0;i<8;i++)//再读数据
{

    DS1302_SCLK=0;
    Delay10us();
    abit=DS1302_IO;
    abit=abit<<i;
    dat=dat|abit;
    if(i==7)break;
    DS1302_SCLK=1;
    Delay10us();
}
DS1302_CE=0;
Delay10us();
/////////////
DS1302_SCLK=1;
Delay10us();
DS1302_IO=0;
Delay10us();
DS1302_IO=1;
Delay10us();
/////////////
return dat;

}

先说明几点,让大家方向弄对来。
1硬件都是好的,是我代码写错了(我用别人写的试过了,是能读出来的)。
2写保护已经关闭了。
问题一:为什么IO读出来的都是1?貌似根本没读到。
问题二:为什么要加最后面那几句(////里面的)?那几句时序图上并没有出现。

菜鸟求助,好人一生平安!

1个回答

mxiaominzi
mxiaominzi   2014.11.27 21:46
已采纳

问题已解决。
是错在了“读一个字节”里面的第一句:
uchar i,abit,**dat=0**;
给dat赋个初值问题就解决了。
不过没赋初值不是会自动赋为0么?我看其他人写的没赋也不会出错。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
AT24C32读取数据一直为0xFF
AT24C02程序可读可写,并且读写的数据都正确。采用AT24C32时,先写入数据,再读出数据一直为0xFF。 修改u8 AT24CXX_ReadOneByte(u16 ReadAddr)和void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite),将程序改为 if(EE_TYPE>AT24C16) { IIC_Send_Byte(0XA
DS1302显示85问题
解决办法在1302的读字节函数: #include #define uchar unsigned char #define uint unsigned int uchar code s8[18]={0x40,0x79,0x24,0x30,0x19,0x12, 0x02,0x78,0x00,0x10,0x88,0x89, 0xbf,0xfe,0xf
NandFlash的驱动程序设计
1、nandflash原理解析1)角色:相当于pc的硬盘2)从物理结构上区分: SLC:单层式存储 (在存储格上只存储一位数据,而MLC则存放两位数据)(比MLC访问速度快近3倍、10万次擦写) MLC:多层式存储(密度高,同容量价格要低很多,1万次擦写,MLC功耗比SLC高15%)3)访问方试:nandflah属于独立编址,实际上就是去操作cpu上面的nandflash控制器的相应寄存器(地址
DS1302读写错误、读写失败的解决方法
    这是我人生中的第一篇博客,文笔粗糙,还请见谅。    本人大三狗,在做项目中使用到DS1302,碰到了许多问题,查阅许多资料找到解决方案,特此写一篇博客记录,方便自己日后查阅,也希望这篇文章可以帮助到大家调试DS1302。...
DS1302基本的读写
DS1302是DALLAS公司的一个时钟芯片,能设置秒、分钟、小时、月、星期、年,且年可以设置到2100年。有时钟/日历寄存器还有31*8位的额外数据暂存寄存器(RAM),可以存储对时间的修正参数或者初始化的标志(前提是DS1302要外接备用电源),如果主机掉电后重新上电时读取RAM中的初始化标志为1的话就不对DS1302初始化了。   说到备用电源,可以用3.3v的锂电池或者电源掉电时间短的
DS1302时钟数码管显示
#include #include "ds1302.h" #define KeyPort P3 //定义按键端口 #define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存 bit ReadTimeFla
IIC读取AT24C256数据出现的问题及解析
硬件平台STM32F407ZGT6,AT24C256软件平台MDK5,GPIOG_PG2->SCL,GPIOG_PG3->SDA,属于软件模拟IIC问题描述在用逻辑分析仪分析时序时发现时序完全没问题,如图:向地址为7FFFH的地址写0X55: 对地址为7FFFH的地址读数据: 由图可以看出写并没出现问题,问题出在读数据时。读时序正确,但是读出来的值为0XFF,这是个错误值,因为前面我已经向改
51单片机对DS1302突发模式的读写
#include <STC89C5xRC.H> #include <intrins.h> #include "DS1302.h"//DS1302管脚 sbit SCLK = P3^6; //时钟 sbit CE = P3^5; //片选 sbit databus = P3^4; //双向IO//写模式寄存器 #define WRITE_CONTROL_SECONDS
CT107D蓝桥杯DS1302实例(数码管时钟)
DS1302操作
isl1208实时时钟简介
<br />摘自:http://mcu.preboss.org/?action-viewnews-itemid-1246<br /> <br /> <br />摘要:简要介绍了实时时钟ISL1208的原理、特点、功能及应用,并给出了与单片机的硬件连接图及控制程序。 <br />关键词:实时时钟;MCS51;I2C接口;串行通信;C51 <br /><br />1.引言<br />INTERSIL公司推出的ISL1208是一种I2C接口、低成本、低功耗实时时钟,它带有定时与晶体补偿、时钟/日历、电源失效指示器