新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > [C51代碼]DS1302驅動

        [C51代碼]DS1302驅動

        作者: 時間:2016-11-10 來源:網絡 收藏
        /*********************ds1302.c**********************/

        #include "Atmel/AT89X51.h"
        #include "link.h"
        #include "ds1302.h"
        /*******************變量定義********************/
        uchar code WeekTab[] = { //閏年月星期表
        (3 << 5) + 31,//1月
        (6 << 5) + 29,//2月
        (0 << 5) + 31,//3月
        (3 << 5) + 30,//4月
        (5 << 5) + 31,//5月
        (1 << 5) + 30,//6月
        (3 << 5) + 31,//7月
        (6 << 5) + 31,//8月
        (1 << 5) + 30,//9月
        (4 << 5) + 31,//10月
        (0 << 5) + 30,//11月
        (2 << 5) + 31 //12月
        };

        本文引用地址:http://www.104case.com/article/201611/317077.htm

        uchar DataArrayYear[5];
        uchar DataArrayMonth[3];
        uchar DataArrayDay[3];
        uchar TimeArray[9];
        uchar WeekArray[7][4]={"Mon.","Tue.","Wed.","Thu.","Fri.","Sat.","Sun."};

        systemtime Nowtime;
        /****************************************************************
        *函數功能:寫入數據到ds1302
        *入口參數:數據uchar Content
        *出口參數:無
        ****************************************************************/
        void DS1302Write_f(uchar Content )
        {
        uchar i ;
        for( i = 8 ; i > 0 ; i-- )
        {
        if( Content & 0x01 )
        {
        DIO=0x01;
        }
        else
        {
        DIO=0x00;
        }
        Content >>= 1 ;
        SCLK=1;
        SCLK=0;
        }
        }

        /****************************************************************
        *函數功能:讀取ds1302的數據
        *入口參數:無
        *出口參數:uchar ReadValue
        ****************************************************************/
        uchar DS1302Read_f( void )
        {
        uchar i, ReadValue ;
        DIO=1;
        for( i = 8 ; i > 0 ; i-- )
        {
        ReadValue >>= 1 ;
        if( DIO )
        {
        ReadValue |= 0x80 ;
        }
        else
        {
        ReadValue &= 0x7f ;
        }
        SCLK=1;
        SCLK=0;

        }
        return ReadValue ;
        }
        /****************************************************************
        *函數功能:從DS1302指定的地址寫入一個字節的內容
        *入口參數:要寫入數據的地址:Address
        寫入數據的具體值:Content
        *出口參數:無
        ****************************************************************/
        void DS1302Writebyte( uchar Address, uchar Content )
        {
        RST=0;
        SCLK=0;
        RST=1;
        DS1302Write_f( Address ) ;
        DS1302Write_f( Content ) ;
        RST=0;
        SCLK=1;
        }
        /****************************************************************
        *函數功能:從DS1302指定的地址讀出一個字節的內容
        *入口參數:要讀出數據的地址:Address
        *出口參數:uchar ReadValue
        ****************************************************************/
        uchar DS1302Readbyte( uchar Address )
        {
        uchar ReadValue ;
        RST=0;
        SCLK=0;
        RST=1;
        DS1302Write_f( Address );
        ReadValue = DS1302Read_f();
        RST=0;
        SCLK=1;
        return ReadValue ;
        }
        /****************************************************************
        *函數功能:讀取DS1302時間
        *入口參數:無
        *出口參數:無
        ****************************************************************/
        void DS1302Gettime(void)
        {
        Nowtime.Year = BCD2DEC(DS1302Readbyte(READ_YEAR)); //年
        Nowtime.Month = BCD2DEC(DS1302Readbyte(READ_MONTH)); //月
        Nowtime.Day = BCD2DEC(DS1302Readbyte(READ_DAY)); //日
        Nowtime.Week = BCD2DEC(DS1302Readbyte(READ_WEEK)); //周
        Nowtime.Hour = BCD2DEC(DS1302Readbyte(READ_HOUR)); //時
        Nowtime.Minute = BCD2DEC(DS1302Readbyte(READ_MINUTE)); //分
        Nowtime.Second = BCD2DEC(DS1302Readbyte(READ_SECOND)); //秒
        }
        /****************************************************************
        *函數功能:周數調整函數
        *入口參數:年:y ;月:m ;日:d
        *出口參數:周幾uchar week
        ****************************************************************/
        /*****************周數調整函數*******************/
        uchar WeekDay20(uchar y, uchar m, uchar d)
        {
        uchar week, day;
        day = WeekTab[m - 1]; //月表
        week = day >> 5; //月星期數
        day &= 0x1f; //月天數
        if((m < 3) && (y & 0x03))
        { //平年
        if (m == 2) day--; //平年月天數
        week++; //平年月表+1
        }
        y = y + (y >> 2); //年+年/4
        week = (week + y + d + 2) % 7; //(星期=年+年/4+月表+2日)%7
        return week; //返回星期
        }
        /****************************************************************
        *函數功能:初始化寫入DS1302時鐘寄存器的值(主程序中只需調用一次即可)
        *入口參數:無
        *出口參數:無
        ****************************************************************/
        void DS1302Initial(void)
        {
        if(DS1302Readbyte( 0xc1)!= 0xf0 )
        {
        DS1302Writebyte( WRITE_PROTECT,0x00) ; //允許寫操作
        DS1302Writebyte( WRITE_YEAR, 0x09 ) ; //年
        DS1302Writebyte( WRITE_WEEK, 0x05 ) ; //星期
        DS1302Writebyte( WRITE_MONTH, 0x05 ) ; //月
        DS1302Writebyte( WRITE_DAY, 0x16 ) ; //日
        DS1302Writebyte( WRITE_HOUR, 0x14 ) ; //小時
        DS1302Writebyte( WRITE_MINUTE, 0x41 ) ; //分鐘
        DS1302Writebyte( WRITE_SECOND, 0x00 ) ; //秒
        DS1302Writebyte( 0x90, 0x00 ) ; //不充電
        DS1302Writebyte( 0xc0, 0xf0 ) ; //判斷是否初始化一次標識寫入
        DS1302Writebyte( WRITE_PROTECT, 0x80 ) ; //禁止寫操作
        DS1302Writebyte( 0xc1, 0xf0 );
        }
        }
        /****************************************************************
        *函數功能:數據轉換成ASCII碼
        *入口參數:無
        *出口參數:無
        ****************************************************************/
        void DS1302DataConvert(void)
        {
        DS1302Gettime();
        DataArrayYear[0] =2;
        DataArrayYear[1] =0;
        DataArrayYear[2] =Nowtime.Year/10+0;
        DataArrayYear[3] =Nowtime.Year%10+0;
        DataArrayYear[4] =

        主站蜘蛛池模板: 通化市| 广元市| 神木县| 永胜县| 德庆县| 德州市| 亚东县| 砀山县| 伊吾县| 通河县| 郧西县| 孝昌县| 兴宁市| 库尔勒市| 顺义区| 新疆| 宝鸡市| 图木舒克市| 广丰县| 鄂尔多斯市| 苏州市| 张掖市| 简阳市| 高唐县| 射阳县| 巧家县| 建湖县| 江孜县| 扶余县| 富民县| 九江市| 申扎县| 莲花县| 临高县| 桓仁| 阜新| 崇明县| 莆田市| 万源市| 易门县| 九龙县|