搜索
bottom↓
回复: 12

ds1302 为什么反馈过来 有好多FF,秒时针走的是正确的

[复制链接]

出0入0汤圆

发表于 2011-9-5 09:39:37 | 显示全部楼层 |阅读模式
FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 06 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 07 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 08 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 09 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 10 FF 00 FF 00 FF 00 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 01 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 02 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 03 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 04 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 06 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 07 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 08 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 09 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 10 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 12 FF 00 FF 00 FF 00 FF 00 FF 00 FF 00 FF 13 FF 00 FF 00 FF 00




/**************************************
--- STC MCU Limited -------------------
--- 宏晶科技        设计 2010-6-2 -----
--- Mobile: 13922805190 ---------------
--- Fax: 0755-82944243 ----------------
--- Tel: 0755-82948412 ----------------
--- Web: www.STCMCU.com ---------------
--- 演示STC 12TMCU控制DS1302 ----------
--- 工作频率: 12MHz -------------------
如果要在程序中使用或在文章中引用该程序
请在其中注明使用了宏晶科技的资料及程序
**************************************/
#include "REG51.H"
#include "INTRINS.H"
#include <stdio.h>

typedef unsigned char BYTE;

sbit SCLK = P2^5;                   //DS1302时钟口P1.0
sbit IO = P1^0;                     //DS1302数据口P1.1
sbit RST = P2^7;                    //DS1302片选口P1.2

#define   FOSC    11059200L
#define   BAUD    9600

void Delay(unsigned char n)
{
      unsigned int x;
      while (n--)
      {
           x = 5000;
           while (x--);
      }
}

void InitUart()
{
      SCON = 0x5a;                        //8 bit data ,no parity bit
      TMOD = 0x20;                        //T1 as 8-bit auto reload
      TH1 = TL1 = -(FOSC/12/32/BAUD);    //Set Uart baudrate
      TR1 = 1;                            //T1 start running
}

void SendData(unsigned char dat)
{
      while (!TI);                       //Wait for the previous data is sent
      TI = 0;                            //Clear TI flag
      SBUF = dat;                        //Send current data
}


unsigned char  convert(unsigned char Value)
{
    Value=(Value/16)*10+(Value%16); //把8421BCD码转为十进制
   return Value;   
}

                    //秒    分    时    日    月  星期    年
BYTE code init[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
BYTE data now[7];

void DS1302_Initial();
void DS1302_SetTime(BYTE *p);
void DS1302_GetTime(BYTE *p);

void main()
{
BYTE i;
    DS1302_Initial();               //初始化DS1302
    DS1302_SetTime(init);           //设置初始时间
        InitUart();

while (1)
{
    DS1302_GetTime(now);            //读取当前时间
//        SendData(convert(now[0]));
        for(i=0;i<7;i++)
        {
        SendData(now);
        }       
        Delay(70);
//        printf("\n");
}  
}

/**************************************
从DS1302读1字节数据
**************************************/
BYTE DS1302_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        SCLK = 0;                   //时钟线拉低
        _nop_();                    //延时等待
        _nop_();
        dat >>= 1;                  //数据右移一位
        if (IO) dat |= 0x80;        //读取数据
        SCLK = 1;                   //时钟线拉高
        _nop_();                    //?óê±μè′y
        _nop_();
    }

    return dat;
}

/**************************************
向DS1302写1字节数据
**************************************/
void DS1302_WriteByte(BYTE dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
        SCLK = 0;                   //时钟线拉低
        _nop_();                    //延时等待
        _nop_();
        dat >>= 1;                  //移出数据
        IO = CY;                    //送出到端口
        SCLK = 1;                   //时钟线拉高
        _nop_();                    //延时等待
        _nop_();
    }
}

/**************************************
读DS1302某地址的的数据
**************************************/
BYTE DS1302_ReadData(BYTE addr)
{
    BYTE dat;

    RST = 0;
    _nop_();                        //延时等待
    _nop_();
    SCLK = 0;
    _nop_();                        //延时等待
    _nop_();
    RST = 1;
    _nop_();                        //延时等待
    _nop_();
    DS1302_WriteByte(addr);         //写地址
    dat = DS1302_ReadByte();        //读数据
    SCLK = 1;
    RST = 0;

    return dat;
}

/**************************************
往DS1302的某个地址写入数据
**************************************/
void DS1302_WriteData(BYTE addr, BYTE dat)
{
    RST = 0;
    _nop_();                        //延时等待
    _nop_();
    SCLK = 0;
    _nop_();                        //延时等待
    _nop_();
    RST = 1;
    _nop_();                        //延时等待
    _nop_();
    DS1302_WriteByte(addr);         //写地址
    DS1302_WriteByte(dat);          //写数据
    SCLK = 1;
    RST = 0;
}

/**************************************
写入初始时间
**************************************/
void DS1302_SetTime(BYTE *p)
{
    BYTE addr = 0x80;
    BYTE n = 7;

    DS1302_WriteData(0x8e, 0x00);   //允许写操作
    while (n--)
    {
        DS1302_WriteData(addr, *p++);
        addr += 2;
    }
    DS1302_WriteData(0x8e, 0x80);   //写保护
}

/**************************************
读取当前时间
**************************************/
void DS1302_GetTime(BYTE *p)
{
    BYTE addr = 0x81;
    BYTE n = 7;

    while (n--)
    {
        *p++ = DS1302_ReadData(addr);
        addr += 2;
    }
}

/**************************************
初始化DS1302
**************************************/
void DS1302_Initial()
{
    RST = 0;
    SCLK = 0;
    DS1302_WriteData(0x8e, 0x00);   //允许写操作
    DS1302_WriteData(0x80, 0x00);   //时钟启动
    DS1302_WriteData(0x90, 0xa6);   //一个二极管+4K电阻充电
    DS1302_WriteData(0x8e, 0x80);   //写保护
}

出0入0汤圆

 楼主| 发表于 2011-9-5 09:59:25 | 显示全部楼层
有谁碰到过啊

出0入0汤圆

发表于 2011-9-9 13:54:00 | 显示全部楼层
相同的问题 正在找原因。。。。。

出0入0汤圆

发表于 2011-9-9 20:27:04 | 显示全部楼层
加几个4.7k的电阻看看

出0入0汤圆

发表于 2011-9-14 07:26:28 | 显示全部楼层
我也正在做,也遇到了这个问题,于是换了板子加了上拉,现在能显示了,但是问题还是有

出0入0汤圆

发表于 2011-9-14 07:34:04 | 显示全部楼层
时序不对吧?NOP多放几个。

出0入0汤圆

发表于 2011-9-14 08:17:45 | 显示全部楼层
强上拉就好,24M都不用nop

出0入0汤圆

发表于 2011-9-14 10:08:23 | 显示全部楼层
BYTE DS1302_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        SCLK = 0;                   //时钟线拉低
        _nop_();                    //延时等待
        _nop_();
        dat >>= 1;                  //数据右移一位
        if (IO) dat |= 0x80;        //读取数据
        SCLK = 1;                   //时钟线拉高
        _nop_();                    //?óê±μè′y
        _nop_();
    }

    return dat;
}
  

DS1302是上升沿读数据的。应该改为

BYTE DS1302_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;                  //数据右移一位
        SCLK = 1;                   //时钟线拉高
        _nop_();                    //?óê±μè′y
        if (IO)
           dat |= 0x80;        //读取数据         
        _nop_();
        SCLK = 0;                   //时钟线拉低
        _nop_();                    //延时等待
        _nop_();

    }

    return dat;
}

出0入0汤圆

发表于 2011-9-14 13:40:25 | 显示全部楼层
回复【7楼】hbzxx
-----------------------------------------------------------------------

DS1302是下降沿读数据的,只听说一些国产芯片是上升沿读

出0入0汤圆

发表于 2011-9-14 16:42:48 | 显示全部楼层
我用的是HM1302

出0入0汤圆

 楼主| 发表于 2011-9-14 23:23:24 | 显示全部楼层
相同的程序我在proteus仿真是正确显示的,应该是强上拉的问题,我再试试

出0入42汤圆

发表于 2011-9-15 01:24:56 | 显示全部楼层
回复【8楼】yxlsdbz  初学者
回复【7楼】hbzxx
-----------------------------------------------------------------------
ds1302是下降沿读数据的,只听说一些国产芯片是上升沿读
-----------------------------------------------------------------------
7楼搞错了,
8楼正解,应该下降沿, 等待, 读数,发送上升沿(上升沿后很快1302就释放总线了,很快有多快Tccz=70ns,不能发送上升沿再读数,上升沿是告诉1302释放总线的) 1302是一个怪胎,它的数据只保持半个时钟周期,通常的SPI都会把数据保持到下一个下降沿.

从来没用过上拉, 没出过问题. 芯片是否国产的? 你上示波器吧,基本操作的时序是对的.

没明白秒时针正确是什么意思/

出0入0汤圆

发表于 2011-9-15 09:09:19 | 显示全部楼层
不好意思。搞错了。读应该是下降沿。最后一个读时钟是无效的。
秒的最高位为1时。时间是不变的。必须把它写为0.
我的HM1302上电后就不走。
日期也为都为0,初始化时间后就正常了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 19:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表