新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機的DS1302操作程序

        AVR單片機的DS1302操作程序

        作者: 時間:2011-02-18 來源:網絡 收藏

        變成浪子
        //mega16 7.3728MHz石英晶體 iccavr6.31a
        //相關定義:
        #define uint unsigned int
        #define uchar unsigned char
        #define DS1302_RST 0 //pc0
        #define DS1302_SDA 1 //pc1
        #define DS1302_SCLK 6 //pc6
        //ds1302相關
        //DS1302_RST=1
        #define Set_DS1302_RST() PORTC|=1//DS1302_RST=0
        #define Clr_DS1302_RST() PORTC=~(1//DS1302_SDA=1
        #define Set_DS1302_SDA() PORTC|=1//DS1302_SDA=0
        #define Clr_DS1302_SDA() PORTC=~(1//DS1302_SCLK=1
        #define Set_DS1302_SCLK() PORTC|=1//DS1302_SCLK=0
        #define Clr_DS1302_SCLK() PORTC=~(1//DS1302的SDA置為輸出腳
        #define Set_DS1302_DDRSDA() DDRC|=1//DS1302的SDA置為輸入腳
        #define Clr_DS1302_DDRSDA() DDRC=~(1#define DS1302_SEC_Reg 0x80
        #define DS1302_MIN_Reg 0x82
        #define DS1302_HR_Reg 0x84
        #define DS1302_DATE_Reg 0x86
        #define DS1302_MONTH_Reg 0x88
        #define DS1302_DAY_Reg 0x8a
        #define DS1302_YEAR_Reg 0x8c
        #define DS1302_CONTROL_Reg 0x8e
        #define DS1302_CHARGER_Reg 0x90
        #define DS1302_CLKBURST_Reg 0xbe
        //全局變量
        //為了方便,我把個位和十位分開了
        uchar year1=0x88;
        uchar year0=0x88;
        uchar month1=0x88;
        uchar month0=0x88;
        uchar date0=0x88;
        uchar date1=0x88;
        uchar day=0x88;
        uchar hour1=0x88;
        uchar hour0=0x88;
        uchar minute1=0x88;
        uchar minute0=0x88;
        uchar second1=0x88;
        uchar second0=0x88;
        //自程序開始
        void DS1302_Write(uchar reg,uchar data)
        {
        uchar i;
        Set_DS1302_DDRSDA();
        Clr_DS1302_RST();
        asm("nop");
        asm("nop");
        Clr_DS1302_SCLK();
        asm("nop");
        asm("nop");
        Set_DS1302_RST();
        asm("nop");
        asm("nop");
        for(i=8;i>0;i--)
        {
        if(reg0x01) Set_DS1302_SDA();
        else Clr_DS1302_SDA();
        asm("nop");
        asm("nop");
        Set_DS1302_SCLK();
        asm("nop");
        asm("nop");
        Clr_DS1302_SCLK();
        asm("nop");
        asm("nop");
        reg>>=1;
        }
        for(i=8;i>0;i--)
        {
        if(data0x01) Set_DS1302_SDA();
        else Clr_DS1302_SDA();
        asm("nop");
        asm("nop");
        Set_DS1302_SCLK();
        asm("nop");
        asm("nop");
        Clr_DS1302_SCLK();
        asm("nop");
        asm("nop");
        data>>=1;
        }
        Clr_DS1302_RST();
        asm("nop");
        asm("nop");
        Clr_DS1302_DDRSDA();
        }
        uchar DS1302_Read(uchar reg)
        {
        uchar data=0,i;
        reg+=1;//讀標志
        Set_DS1302_DDRSDA();
        Clr_DS1302_RST();
        asm("nop");
        asm("nop");
        Clr_DS1302_SCLK();
        asm("nop");
        asm("nop");
        Set_DS1302_RST();
        asm("nop");
        asm("nop");
        for(i=8;i>0;i--)
        {

        if(reg0x01) Set_DS1302_SDA();
        else Clr_DS1302_SDA();
        asm("nop");
        asm("nop");
        Set_DS1302_SCLK();
        asm("nop");
        asm("nop");
        Clr_DS1302_SCLK();
        asm("nop");
        asm("nop");
        reg>>=1;
        }
        Clr_DS1302_DDRSDA();
        for(i=8;i>0;i--)
        {
        data>>=1;
        if((PINC(1Set_DS1302_SCLK();
        asm("nop");
        asm("nop");
        Clr_DS1302_SCLK();
        asm("nop");
        asm("nop");
        }
        Clr_DS1302_RST();
        asm("nop");
        asm("nop");
        return(data);
        }
        uchar Check_DS1302(void)
        {
        DS1302_Write(DS1302_CONTROL_Reg,0x80);
        if(DS1302_Read(DS1302_CONTROL_Reg)==0x80) return 1;
        return 0;
        }
        void DS1302_Init(void)
        {
        DS1302_Write(DS1302_CONTROL_Reg,0x00);//關閉寫保護
        DS1302_Write(DS1302_SEC_Reg,0x80);//暫停
        DS1302_Write(DS1302_CHARGER_Reg,0xa9);//涓流充電
        DS1302_Write(DS1302_YEAR_Reg,0x04); //年
        DS1302_Write(DS1302_MONTH_Reg,0x12); //月
        DS1302_Write(DS1302_DATE_Reg,0x09); //日
        DS1302_Write(DS1302_DAY_Reg,0x04); //周
        DS1302_Write(DS1302_HR_Reg,0x10); //時
        DS1302_Write(DS1302_MIN_Reg,0x25); //分
        DS1302_Write(DS1302_SEC_Reg,0x00); //秒

        DS1302_Write(DS1302_CONTROL_Reg,0x80);//打開寫保護
        }
        void ReadTime(void)
        {
        uchar data;
        data=DS1302_Read(DS1302_YEAR_Reg);//年
        year0=data0x0f;
        year1=data>>4;
        data=DS1302_Read(DS1302_MONTH_Reg);//月
        month0=data0x0f;
        month1=(data>>4)0x01;
        data=DS1302_Read(DS1302_DATE_Reg);//日
        date0=data0x0f;
        date1=(data>>4)0x03;
        data=DS1302_Read(DS1302_DAY_Reg);//周
        day=data0x07;
        data=DS1302_Read(DS1302_HR_Reg);//時
        hour0=data0x0f;
        hour1=(data>>4)0x03;
        data=DS1302_Read(DS1302_MIN_Reg);//分
        minute0=data0x0f;
        minute1=(data>>4)0x07;
        data=DS1302_Read(DS1302_SEC_Reg);//秒
        second0=data0x0f;
        second1=(data>>4)0x07;
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 渭南市| 永清县| 广东省| 株洲县| 应城市| 公主岭市| 靖州| 三原县| 化德县| 太湖县| 韩城市| 达拉特旗| 湖州市| 邵阳市| 凤冈县| 玉屏| 类乌齐县| 突泉县| 仁布县| 民勤县| 云阳县| 南漳县| 翼城县| 孙吴县| 文化| 三原县| 睢宁县| 时尚| 资兴市| 栾城县| 青神县| 兰溪市| 贵港市| 曲沃县| 文登市| 湖北省| 莎车县| 疏勒县| 综艺| 岳普湖县| 五河县|