久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

51單片機驅動高精度時鐘DS3231源代碼

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月08日   【字體:

本程序一共有2個文件,成功的用stc89c51單片機驅動,完整的代碼從 http://www.zg4o1577.cn/f/ds3231code.rar 處下載
下面是源碼預覽(第一個文件):
 ///////////////////////////////////////////////////////////////////////////////////
/*
DS3231.h文件

*/
////////////////////////////////////////////////////////////////////////////////////

#ifndef _ds3231_h_
#define _ds3231_h_
#define uint unsigned int
#define uchar unsigned char
/**************************************/
extern void IIC_Init(void);
extern uchar l_tmpdate[];
extern uchar l_tmpdisplay[];
extern void delay_IIC(void);
extern void IIC_start(void);
extern void IIC_stop(void);
extern bit IIC_Tack(void);
extern void Read_RTC(void);
extern void Set_RTC(void);
extern void DS1302_Initial();
#endif
///////////////////////////////////////////////////////////////////////////////////
/*
DS3231.C文件

*/
////////////////////////////////////////////////////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#include"ds3231.h"
sbit IIC_SDA=P0^3;
sbit IIC_RST=P0^2;
sbit IIC_SCL=P0^1;
code unsigned char rtc_address[7]={0x00,0x01,0x02,0x04,0x05,0x03,0x06}; //秒分時日月周年 最低位讀寫位


//-------------------------------------------------------------------
void delay_IIC(void)  
{//IIC總線限速延時函數。
//該函數是空函數,延時4個機器周期。
_nop_();_nop_();_nop_();_nop_();
}
//-------------------------------------------------------------------
void IIC_Init(void)
{//IIC總線初始化函數
    IIC_RST=1;
    IIC_SDA=1;//釋放IIC總線的數據線。
    IIC_SCL=1;//釋放IIC總線的時鐘線。
}
//-------------------------------------------------------------------
void IIC_start(void)
{//IIC總線產生起始信號函數
    
     IIC_SDA=1;//拉高數據線
     IIC_SCL=1;//拉高時鐘線
     delay_IIC();
     IIC_SDA=0;//在時鐘線為高電平時,拉低數據線,產生起始信號。
     delay_IIC();
     IIC_SCL=0;//拉低時鐘線
}
//-------------------------------------------------------------------
void IIC_stop(void)
{//IIC總線產生停止信號函數
    IIC_SDA=0;//拉低數據線
    delay_IIC();
    IIC_SCL=1;//拉高時鐘線。
    delay_IIC();
    IIC_SDA=1;//時鐘時線為高電平時,拉高數據線,產生停止信號。
    delay_IIC();
}
//-------------------------------------------------------------------
bit IIC_Tack(void)
{//接收應答信號函數
    bit ack;//定義一個位變量,來暫存應答狀態。
    IIC_SDA=1;//釋放數據總線,準備接收應答信號。
    delay_IIC();
    IIC_SCL=1;//拉高時鐘線。
    delay_IIC();
    ack=IIC_SDA;//讀取應答信號的狀態。
    delay_IIC();
    IIC_SCL=0;//拉低時鐘線。
    delay_IIC();
    return ack;//返回應答信號的狀態,0表示應答,1表示非應答。
}
//-------------------------------------------------------------------
void IIC_write_byte(unsigned char Data)
{//向IIC總線寫入一個字節的數據函數
    unsigned char i;
     for(i=0;i<8;i++)//有8位數據
    {
        IIC_SDA=Data&0x80;//寫最高位的數據
          delay_IIC();
          IIC_SCL=1; //拉高時鐘線,將數寫入到設備中。
        delay_IIC();
        IIC_SCL=0;//拉低時鐘線,允許改變數據線的狀態
        delay_IIC();
        Data=Data<<1;//數據左移一位,把次高位放在最高位,為寫入次高位做準備
    }
}
//-------------------------------------------------------------------
unsigned char IIC_read_byte()
{//從IIC總線讀取一個字節的數據函數
    unsigned char i;
    unsigned char Data;       //定義一個緩沖寄存器。
    for(i=0;i<8;i++)//有8位數據
    {
        IIC_SCL=1;//拉高時鐘線,為讀取下一位數據做準備。
        delay_IIC();
        Data=Data<<1;//將緩沖字節的數據左移一位,準備讀取數據。
        delay_IIC();
      
        if(IIC_SDA)//如果數據線為高平電平。
            Data=Data|0x01;//則給緩沖字節的最低位寫1。
        IIC_SCL=0;//拉低時鐘線,為讀取下一位數據做準備。
        delay_IIC();
    }
    return Data;//返回讀取的一個字節數據。
}
//-------------------------------------------------------------------
void IIC_single_byte_write(unsigned char Waddr,unsigned char Data)
{//向任意地址寫入一個字節數據函數
    IIC_start();//產生起始信號
    IIC_write_byte(0xd0);//寫入設備地址(寫)
    IIC_Tack();//等待設備的應答
    IIC_write_byte(Waddr);//寫入要操作的單元地址。
    IIC_Tack();//等待設備的應答。
    IIC_write_byte(Data);//寫入數據。
    IIC_Tack();//等待設備的應答。
    IIC_stop();//產生停止符號。
}
//-------------------------------------------------------------------
unsigned char IIC_single_byte_read(unsigned char Waddr)
{//從任意地址讀取一個字節數據函數
    unsigned char Data;//定義一個緩沖寄存器。
    IIC_start();//產生起始信號
    IIC_write_byte(0xd0);//寫入設備地址(寫)
    IIC_Tack();//等待設備的應答
    IIC_write_byte(Waddr);//寫入要操作的單元地址。
    IIC_Tack();//等待設備的應答。
    IIC_stop();//產生停止符號。

    IIC_start();//產生起始信號
    IIC_write_byte(0xd1);//寫入設備地址(寫)
    IIC_Tack();//等待設備的應答
    Data=IIC_read_byte();//寫入數據。
    delay_IIC();
    IIC_stop();//產生停止符號。
    //-------------------返回讀取的數據--------------------
    return Data;//返回讀取的一個字節數據。
}

void Read_RTC(void)
{
    unsigned char i,*p;
     p=rtc_address;         //地址傳遞
    for(i=0;i<7;i++)            //分7次讀取 秒分時日月周年
    {
      l_tmpdate[i]=IIC_single_byte_read(*p);
      p++;
    }  
}
void Set_RTC(void)
{
    unsigned char i,tmp;
    for(i=0;i<7;i++)
    {       //BCD處理
        tmp=l_tmpdate[i]/10;
        l_tmpdate[i]=l_tmpdate[i]%10;
        l_tmpdate[i]=l_tmpdate[i]+tmp*16;
    }
//    IIC_single_byte_write(0x0e,0X8c);
     for(i=0;i<7;i++)        //7次寫入 秒分時日月周年
     {
        IIC_single_byte_write(rtc_address[i],l_tmpdate[i]);
    }
    IIC_single_byte_write(0x0e,0x0c);
}

void DS1302_Initial()
{
    IIC_RST=1;
    IIC_SDA=1;//釋放IIC總線的數據線。
    IIC_SCL=1;
    IIC_single_byte_write(0x0e,0x0c);
}

關閉窗口

相關文章

主站蜘蛛池模板: 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 韩日一区 | 午夜a级理论片915影院 | 国产在线视频一区二区 | 欧美国产日韩精品 | 久久久久久九九九九 | 成人性视频在线播放 | 日韩影院一区 | 好姑娘高清在线观看电影 | 亚洲人a | 国产福利资源在线 | 国产精品久久av | 日韩毛片| 成人av免费 | 久久99精品久久久久久秒播九色 | 麻豆国产一区二区三区四区 | 亚洲精品在线观看视频 | 国产精品毛片一区二区在线看 | 欧美日韩黄色一级片 | 国产亚洲成av人片在线观看桃 | 亚洲电影免费 | 日韩三级在线 | 午夜精品久久 | 一区欧美 | 先锋av资源网 | 精品国产区 | 久久久免费 | 日韩午夜 | 天天玩天天干天天操 | 粉嫩一区二区三区性色av | 久久国产精品一区二区三区 | 日韩毛片播放 | 欧美日韩高清在线一区 | 在线观看av网站永久 | 婷婷色在线播放 | 日本三级日产三级国产三级 | 日本人和亚洲人zjzjhd | 精品欧美一区二区三区久久久小说 | 视频1区2区 | 99精品一区 | 日韩乱码一二三 |