音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

請(qǐng)教,為什么DS1302工作不正常?

作者:小羅納耳朵 欄目:技術(shù)交流
請(qǐng)教,為什么DS1302工作不正常?
我用51單片機(jī)與DS1302時(shí)鐘芯片相連。仿真時(shí)DS1302電源VCC2電壓5V正常,VCC1接一個(gè)3V的紐扣電池。接地正常。三條線RST、SCLK、IO數(shù)據(jù)均正常。
DS1302讀寫子程序如下:

void WrData(Uchar dd)  //寫DS1302子程序
{
    Uchar i;
    DataTrans=dd;
    for(i=0;i<8;i++){
         SCLK = 0;
         IO_DATA = BIT0;
         SCLK = 1;            //SCLK上升沿寫入數(shù)據(jù)
         DataTrans = DataTrans>>1;
     }
             
}

Uchar RdData(void)  //讀DS1302子程序
{
    Uchar i;
    for(i=0;i<8;i++){
    DataTrans = DataTrans>>1;
    IO_DATA = 1;
    SCLK = 1;
         BIT7  = IO_DATA;
    SCLK = 0;       //SCLK下降沿讀入數(shù)據(jù)
     }
  return DataTrans;
        
}

void Wr_DS1302 (Uchar addr,Uchar dd){ //將指令寫入DS1302對(duì)應(yīng)地址寄存器子程序
        RST = 0;
        SCLK = 0;
        RST = 1;
        WrData(addr);
        Delayus(1);
        WrData(dd);
        RST = 0;
        IO_DATA = 1;
    }
    
Uchar Rd_DS1302(Uchar addr){ //讀DS1302相應(yīng)地址寄存器子程序
        
        Uchar DS_Data;
        RST = 0;
        SCLK = 0;
        RST = 1;
        WrData(addr);
        Delayus(1);
        DS_Data = RdData();
        RST = 0;
        return DS_Data;
}    

在主程序中,先初始化DS1302
    Wr_DS1302(0x8e,0x00);   //允許寫入
    Wr_DS1302(0x80,0x00);   //啟動(dòng)時(shí)鐘

然后讀取相應(yīng)寄存器的值。但是讀出的數(shù)值均為0,


那位高手能指點(diǎn)一下啊,問(wèn)題出在可能出在什么地方?

2樓: >>參與討論
小羅納耳朵
晶振也不起振
32.768K的晶振,帶2個(gè)10PF的電容,示波器測(cè)不到波形?是這的原因嗎?

3樓: >>參與討論
zgl7903
個(gè)人見(jiàn)解
可以先試者在DS1302的RAM里寫些數(shù)據(jù),讀出來(lái)后作比較,可以知道時(shí)序和操作周期上是否有問(wèn)題。然后再作RTC的操作

4樓: >>參與討論
rossi_lao
re
1302接6p或12p電容,我試過(guò)不接電容都可以,時(shí)間挺準(zhǔn)的!

5樓: >>參與討論
小羅納耳朵
試了試向寄存器寫數(shù)據(jù)
試了試向寄存器寫數(shù)據(jù),向0x80里面寫0x01,讀0x81卻是0x02,寫0x02,讀出0x04。是怎么回事。砍绦驎r(shí)序有問(wèn)題嗎? 

6樓: >>參與討論
nevea
re
小羅納耳朵 發(fā)表于 2006-10-17 21:15 技術(shù)交流 ←返回版面    

晶振也不起振

32.768K的晶振,帶2個(gè)10PF的電容,示波器測(cè)不到波形?是這的原因嗎?


晶振都不振,那肯定是不對(duì)的啊。你換成6PF的試一試......



7樓: >>參與討論
小羅納耳朵
讀寫正常了
讀寫正常了。但是寫進(jìn)秒寄存器一個(gè)值。再去讀還是那個(gè)值不變。是因?yàn)檫是沒(méi)有工作嗎?到底是怎么回事啊。手頭沒(méi)有6pF的電容,就把10PF的卸了。還是不行啊

8樓: >>參與討論
rossi_lao
re
應(yīng)該是秒寄存器的啟動(dòng)位沒(méi)有置位!

9樓: >>參與討論
小羅納耳朵
?
樓上的?秒寄存器啟動(dòng)位置位?應(yīng)該是清零才能啟動(dòng)吧?

10樓: >>參與討論
szzhengjin
說(shuō)說(shuō)
我用了很多,但不是我修機(jī)器,所以起振是否要程序控制我倒沒(méi)認(rèn)真去看

你的程序讀單字節(jié)錯(cuò)了,這里我提供完整源碼給你,你改一下IO就可以用了
////========DS1302.H=============
#ifndef __DS1302_H__
#define __DS1302_H__

#define RTC_OK                1        //操作成功
#define RTC_FAIL            0        //操作失敗
#define SECOND_INVALID        40        //秒值無(wú)效
#define MINUTE_INVALID        41        //分鐘值無(wú)效
#define HOUR_INVALID        42        //小時(shí)值無(wú)效
#define WEEK_INVALID        43        //星期值無(wú)效
#define DAY_INVALID            44        //日期值無(wú)效
#define MONTH_INVALID        45        //月份值無(wú)效
#define YEAR_INVALID        46        //年份值無(wú)效
#define CENTURY_INVALID        47        //世紀(jì)值無(wú)效

//時(shí)鐘制式參數(shù)定義(暫沒(méi)開啟,全用24小時(shí)制)
#define MODE_12_HOUR    0x80    //12小時(shí)制,即有AM/PM
#define MODE_24_HOUR    0x00    //24小時(shí)制

//充電參數(shù)定義
#define CHARGE_ENABLE    0xA0    //開啟充電,此時(shí),若限流電阻選擇SELECT_NONE,還是不能充電
#define CHARGE_DISABLE    0x00    //關(guān)閉充電
//充電二極管參數(shù)
#define SELECT_ONE_DIODE    0x04    //選擇一個(gè)二極管
#define SELECT_TWO_DIODE    0x08    //選擇二個(gè)二極管
//充電限流電阻參數(shù)
#define SELECT_NONE        0x00    //不用連,即斷開充電電路
#define SELECT_R1_2k    0x01    //選擇電阻1,2K
#define SELECT_R2_4k    0x02    //選擇電阻2,4K
#define SELECT_R3_8k    0x03    //選擇電阻3,8K


#define RAM_MAXSIZE        31    //時(shí)鐘內(nèi)部用戶可自定義的RAM最大空間

typedef struct _DATETIME
{
    unsigned CHAR Century;
    unsigned CHAR Year;
    unsigned CHAR Month;
    unsigned CHAR Day;
    unsigned CHAR Hour;
    unsigned CHAR Min;
    unsigned CHAR Sec;
    unsigned CHAR Week;
}sttDateTime;


//初始化時(shí)鐘
void InitDS1302(unsigned CHAR ChargeMode);
//讀時(shí)鐘
void ReadClock(sttDateTime *pstDateTime);
//寫時(shí)鐘
void WriteClock(sttDateTime *pstDateTime);


//========DS1302.C=================
#include <REG52.H>
#include "DS1302.H"

sbit    RST        =    P1^5;
sbit    SCL        =    P1^6;
sbit    SDA        =    P1^7;

#define SEC_ADDR        0x80    //1000 0000
#define MIN_ADDR        0x82    //1000 0010
#define HOUR_ADDR        0x84    //1000 0100
#define DAY_ADDR        0x86    //1000 0110
#define MOM_ADDR        0x88    //1000 1000
#define WEEK_ADDR        0x8A    //1000 1010
#define YEAR_ADDR        0x8C    //1000 1100    
#define CENTURY_ADDR    0xC0    //1100 0000        用其RTC內(nèi)存一字節(jié)作為年世紀(jì)字節(jié)
#define CONTROL_ADDR    0x8E    //1000 1110
#define TRCH_ADDR        0x90    //1001 0000    

#define RAM_BASE_ADDR    0xC0

#define READ            1
#define WRITE            0

void DS1302_SendByte(unsigned CHAR Data)
{
    unsigned CHAR i;
    for(i=0;i<8;i++)
    {
        SCL = 0;
        SDA = (bit)(Data & 0x01);
        SCL = 1;
        Data >>= 1;
    }
    return;
}


unsigned CHAR DS1302_ReadByte(void)
{
    unsigned CHAR i,Data;
    SDA = 1;
    for(i=0;i<8;i++)
    {
        Data >>= 1;
        SCL = 0;
        if(SDA==1) Data |= 0x80;
        SCL = 1;
    }
    return(Data);
}

void  DS1302WriteByte(unsigned CHAR Addr, unsigned CHAR Data)
{
    SCL = 0;
    RST = 1;
    DS1302_SendByte(Addr);
    DS1302_SendByte(Data);
    RST = 0;
    return ;
}

unsigned CHAR DS1302ReadByte(unsigned CHAR Addr)
{
    unsigned CHAR Data;
    SCL = 0;
    RST = 1;
    DS1302_SendByte(Addr | READ);
    Data = DS1302_ReadByte();
    RST = 0;
    return Data;
}

//初始化時(shí)鐘
void InitDS1302(unsigned CHAR ChargeMode)
{
    unsigned CHAR i;
    SCL = 0;
    RST = 0;
    DS1302WriteByte(CONTROL_ADDR,0x00);    //WP=0;
    i = DS1302ReadByte(SEC_ADDR);
    if((i & 0x80) == 0x80)
    {    //若時(shí)鐘丟失,即鋰電池沒(méi)電時(shí),自動(dòng)復(fù)位為2005-1-1 00:00:00 星期六
        DS1302WriteByte(CENTURY_ADDR,0x20);
        DS1302WriteByte(YEAR_ADDR,0x06);
        DS1302WriteByte(MOM_ADDR,0x01);
        DS1302WriteByte(DAY_ADDR,0x01);
 
11樓: >>參與討論
小羅納耳朵
謝謝!
已經(jīng)調(diào)通了,換個(gè)了芯片起振了。程序沒(méi)變。感謝樓上的!

12樓: >>參與討論
hq_y
2個(gè)電容一定要去掉,加上這2個(gè)電容有時(shí)候會(huì)不起振
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
買芯片
搞一個(gè)工作室,請(qǐng)問(wèn)如何到工商所注冊(cè)?稅收會(huì)不會(huì)很重?
[求助]向大蝦們求CF(compact flash)卡的接口資料,謝謝
PowerLogic 怎樣才能隔頁(yè)copy?
有誰(shuí)知道這個(gè)原理!急!
免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)