新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > SPI時鐘芯片DS1302的應用

        SPI時鐘芯片DS1302的應用

        作者: 時間:2016-11-21 來源:網絡 收藏
        DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發方式一次傳送多個字節的時鐘信號或RAM數據。DS1302內部有一個31×8的用于臨時性存放數據的RAM寄存器。采用普通32.768kHz晶振!RST是復位/片選線,通過把RST輸入驅動置高電平來啟動所有的數據傳送。RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節或多字節數據的傳送手段。當RST為高電平時,所有的數據傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數據傳送,I/O引腳變為高阻態。上電運行時,在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數據輸入輸出端(雙向),在控制指令字輸入后的下一個SCLK時鐘的上升沿時,數據被寫入DS1302,數據輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個SCLK脈沖的下降沿讀出DS1302的數據,讀出數據時從低位0位到高位7。SCLK始終是輸入端。

        //======================================驅動
        sbit SDA_1302=P1^0;//數據輸入輸出腳
        sbit SCL_1302=P1^1;//串行時鐘輸入
        sbit RST =P1^2;//復位腳
        void send_data(unsigned char ch)
        {
        unsigned char i;
        SCL_1302=0;
        _nop_();
        RST=1;
        for(i=0;i<8;i++)
        {
        SCL_1302=0;
        SDA_1302=(bit)(ch&0x01);
        SCL_1302=1;
        ch=ch>>1;
        }
        SCL_1302=0;
        RST=0;
        }
        unsigned char receive_data()
        {
        unsigned char i,data;
        SCL_1302=0;
        _nop_();
        RST=1;
        for(i=0;i<8;i++)
        {
        data>>=1;
        SCL_1302=0;
        if(SDA_1302) data|=0x80;
        elsedata&=0x7f;
        SCL_1302=1;
        }
        SCL_1302=0;
        RST=0;
        return data;
        }
        ================================================//
        //=======================================應用
        sbit SDA_1302=P1^0;
        sbit SCL_1302=P1^1;
        sbit RST=P1^2;
        #define WSEC0x80
        #define RSEC0x81
        #define WMIN0x82
        #define RMIN0x83
        #define WHOU0x84
        #define RHOU0x85
        #define WDAY0x86
        #define RDAY0x87
        #define WMON0x88
        #define RMON0x89
        #define WWEEK 0X8a
        #define RWEEK 0X8b
        #define WYEAR 0x8c
        #define RYEAR 0x8d
        #define EWOK0X8e //
        #define EW0X8F //
        #define CDOK0X90 // 涓流充電寫
        #define CD0X91 // 讀

        void delay(void)
        {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }
        void write_ds1302(unsigned char addr,unsigned char tempdata)
        {
        unsigned char i=0;
        SCL_1302=0;
        delay();
        RST=1;
        delay();
        for(i=0;i<8;i++)
        {
        SCL_1302=0;
        SDA_1302=(bit)(addr&0x01);
        SCL_1302=1;
        addr>>=1;
        }
        for(i=0;i<8;i++)
        {
        SCL_1302=0;
        SDA_1302=(bit)(tempdata&0x01);
        SCL_1302=1;
        addr>>=1;
        }
        RST=0;
        delay();
        SCL_1302=0;
        }
        unsigned char read_ds1302(unsigned char addr)
        {
        unsigned char i=0;
        unsigned char temp=0;
        SCL_1302=0;
        delay();
        RST=1;
        delay();
        for(i=0;i<8;i++)
        {
        SCL_1302=0;
        SDA_1302=(bit)(addr&0x01);
        SCL_1302=1;
        addr>>=1;
        }
        SDA_1302=1;
        for(i=0;i<8;i++)
        {
        temp>>=1;
        SCL_1302=1;
        if(SDA_1302)
        temp|=0x80;
        else
        temp&=0x7f;
        SCL_1302=0;
        }
        RST=0;
        delay();
        SCL_1302=0;
        return (temp);
        }
        void write_initial(void) //寫入初始時間 2009年 1月1日1時0分0秒
        {
        SCL_1302=0;
        RST=0;
        write_ds1302(EWOK,0x00);
        write_ds1302(WSEC,0X00);
        write_ds1302(WMIN,0X00);
        write_ds1302(WHOU,0X81);
        write_ds1302(WDAY,0X01);
        write_ds1302(WMON,0X01);
        write_ds1302(WWEEK,0X04);
        write_ds1302(WYEAR,0X09);
        }
        void read(void)
        {
        DAY=read_ds1302(RDAY);
        MONTH=read_ds1302(RMON);
        YEAR=read_ds1302(RYEAR);
        }


        關鍵詞: SPI時鐘芯片DS130

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大邑县| 宜宾县| 东明县| 通道| 三穗县| 射阳县| 道孚县| 丹凤县| 大田县| 察雅县| 五常市| 理塘县| 古蔺县| 个旧市| 沙雅县| 搜索| 大港区| 高邑县| 乌鲁木齐县| 景东| 环江| 施秉县| 乌兰县| 威信县| 灵璧县| 上饶市| 和平区| 岐山县| 晋江市| 贞丰县| 北宁市| 武隆县| 东台市| 郁南县| 广宗县| 东至县| 岳阳市| 八宿县| 三亚市| 赤水市| 阳江市|