新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC16F877A例程---DS1302程序

        PIC16F877A例程---DS1302程序

        作者: 時間:2016-11-24 來源:網絡 收藏
        #include //調用頭文件

        //#include

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

        __CONFIG(0x3F32); //芯片配置字

        //__CONFIG(HS&UNPROTECT&PWRTEN&BORDIS&WDTDIS);//芯片配置字

        //__CONFIG(0x3FFD&0x3FFF&0x3FF7&0x3FBF&0x3FFB);//芯片配置字

        #define uchar unsigned char

        #define uint unsigned int

        //聯接DS1302的端口定義

        #define ds1302_rst RC2 //定義1302的RST接在PC4

        #define ds1302_io RC1 //定義1302的IO接在PC3

        #define ds1302_sclk RC0 //定義1302的時鐘接在PC2

        #define set_ds1302_rst_ddr() TRISC2=0 //復位端置為輸出

        #define set_ds1302_rst() ds1302_rst=1 //復位端置1

        #define clr_ds1302_rst() ds1302_rst=0 //復位端清0

        #define set_ds1302_io_ddr() TRISC1=0 //數據端置為輸出

        #define set_ds1302_io() ds1302_io=1 //數據端置1

        #define clr_ds1302_io() ds1302_io=0 //數據端清0

        #define clr_ds1302_io_ddr() TRISC1=1 //數據端置為輸入

        #define in_ds1302_io() PORTC&0X02 //數據端輸入數據

        #define set_ds1302_sclk_ddr() TRISC0=0 //時鐘端置為輸出

        #define set_ds1302_sclk() ds1302_sclk=1 //時鐘端置1

        #define clr_ds1302_sclk() ds1302_sclk=0 //時鐘端清0

        #define ds1302_sec_add 0x80 //秒數據地址

        #define ds1302_min_add 0x82 //分數據地址

        #define ds1302_hr_add 0x84 //時數據地址

        #define ds1302_date_add 0x86 //日數據地址

        #define ds1302_month_add 0x88 //月數據地址

        #define ds1302_day_add 0x8a //星期數據地址

        #define ds1302_year_add 0x8c //年數據地址

        #define ds1302_control_add 0x8e //控制數據地址

        #define ds1302_charger_add 0x90

        #define ds1302_clkburst_add 0xbe

        uchar timer[8]; //時鐘數據

        //共陰數碼管0-F顯示代碼

        uchar Table[]={0xc0,0xf9,0xa4,0xb0,0x99,

        0x92,0x82,0xf8,0x80,0x90,0xff};

        //轉換后的顯示數據

        uchar s[4];

        //定義掃描計數器

        uchar sel=0;

        uchar temp_pa=0xFF;

        //寫入1302數據函數:

        //入口:add為寫入地址碼,data為寫入數據

        //返回:無

        void ds1302_write(uchar add,uchar data)

        {

        uchar i=0;

        set_ds1302_io_ddr(); //配置IO為輸出

        NOP();NOP();

        clr_ds1302_rst(); //清復位,停止所有操作

        NOP();NOP();

        clr_ds1302_sclk(); //清時鐘,準備操作

        NOP();NOP();

        set_ds1302_rst(); //置復位,開始操作

        NOP();NOP();

        for(i=8;i>0;i--) //此循環寫入控制碼

        {

        if(add&0x01)

        set_ds1302_io(); //當前位為1,置數據位

        else

        clr_ds1302_io(); //當前位為0,清數據位

        NOP();NOP();

        set_ds1302_sclk(); //產生時鐘脈沖,寫入數據

        NOP();NOP();

        clr_ds1302_sclk();

        NOP();NOP();

        add>>=1; //移位,準備寫入下1位

        }

        for(i=8;i>0;i--) //此循環寫入數據碼

        {

        if(data&0x01)

        set_ds1302_io();

        else

        clr_ds1302_io();

        NOP();NOP();

        set_ds1302_sclk();

        NOP();NOP();

        clr_ds1302_sclk();

        NOP();NOP();

        data>>=1;

        }

        clr_ds1302_rst();

        NOP();NOP();

        clr_ds1302_io_ddr(); //清輸出狀態

        NOP();NOP();

        }

        //從1302中讀出數據:

        //入口:add為讀數據所在地址

        //返回:讀出的數據data

        uchar ds1302_read(uchar add)

        {

        uchar data=0;

        uchar i=0;

        add+=1; //讀標志

        set_ds1302_io_ddr(); //端口輸出

        NOP();NOP();

        clr_ds1302_rst(); //清復位

        NOP();NOP();

        clr_ds1302_sclk(); //清時鐘

        NOP();NOP();

        set_ds1302_rst(); //置復位

        NOP();NOP();

        for(i=8;i>0;i--) //此循環寫入地址碼

        {

        if(add&0x01)

        {set_ds1302_io();}

        else

        {clr_ds1302_io();}

        NOP();NOP();

        set_ds1302_sclk();

        NOP();NOP();

        clr_ds1302_sclk();

        NOP();NOP();

        add>>=1;

        }

        clr_ds1302_io_ddr(); //端口輸入

        NOP();NOP();

        for(i=8;i>0;i--) //此循環讀出1302的數據

        {

        data>>=1;

        if(in_ds1302_io())

        {data|=0x80;}

        NOP();NOP();

        set_ds1302_sclk();

        NOP();NOP();

        clr_ds1302_sclk();

        NOP();NOP();

        }

        clr_ds1302_rst();

        NOP();NOP();

        return(data);

        }


        上一頁 1 2 下一頁

        關鍵詞: PIC16F877ADS130

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 大同县| 东辽县| 黄梅县| 镇远县| 增城市| 民勤县| 霸州市| 巧家县| 武汉市| 东乡族自治县| 大渡口区| 社旗县| 宁强县| 牟定县| 星座| 孟村| 东阿县| 抚顺市| 嘉荫县| 饶阳县| 清水河县| 娱乐| 封开县| 临武县| 昌邑市| 台北市| 阿坝县| 广德县| 定西市| 六安市| 桃园市| 芦溪县| 花垣县| 奇台县| 鹤岗市| 沁阳市| 梧州市| 托里县| 科尔| 绥滨县| 嘉定区|