新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 用ds1302制作一個(gè)精密的電子時(shí)鐘

        用ds1302制作一個(gè)精密的電子時(shí)鐘

        作者: 時(shí)間:2016-11-23 來(lái)源:網(wǎng)絡(luò) 收藏
        題目:用ds1302制作一個(gè)精密電子時(shí)鐘

        感想:我看視頻的時(shí)候講的是DS12CR887這塊芯片,兩塊畢竟是不一樣的,所以,我只是看了他講怎樣看時(shí)序,之后的就沒(méi)再看了。我就拿著自己下載打印的DS1302數(shù)據(jù)手冊(cè),研習(xí),研習(xí),再研習(xí)。還查了書(shū)上的,網(wǎng)上的,源程序。但是,你別指望著誰(shuí)會(huì)把所有的東西都給你寫(xiě)上去。只能作為參考。后來(lái),我終于寫(xiě)出了一個(gè)程序,可是一編譯,就漏洞百出。最主要的有兩點(diǎn):for循環(huán)和BCD碼。不過(guò)還好,都得到了很好的解決。

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

        解決方案:

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        uchar data table[]="2009-01-01 Mon.";
        uchar data table1[]=" 00:00:00";
        uchar code xingqi[]="Mon. Tue. Wed. Thu. Fri. Sat. Sun.";
        uchar num;
        uchar hour,min,sec,week,day,month,year;
        sbit ds1302_sclk=P1^4;
        sbit ds1302_io=P1^5;
        sbit ds1302_ce=P2^2;
        sbit acc0=ACC^0;
        sbit acc7=ACC^7;
        sbit lcdrs=P1^7; //端口定義
        sbit lcdrw=P1^6;
        sbit lcde=P2^4;
        sbit le=P3^6;
        sbit leden=P2^5;
        sbit dkle=P3^7;
        void delay(uint a);
        void write_byte(uchar dat)//寫(xiě)入一個(gè)字節(jié)
        {
        uchar i;
        ACC=dat;
        for(i=8;i>0;i--)
        {
        ds1302_io=acc0;
        ds1302_sclk=1;
        ds1302_sclk=0;
        ACC=ACC>>1;
        }
        }

        uchar read_byte() //讀出一個(gè)字節(jié)
        {
        uchar i;
        for(i=8;i>0;i--)
        {
        ACC=ACC>>1;
        acc7=ds1302_io;
        ds1302_sclk=1;
        ds1302_sclk=0;
        }
        return(ACC);
        }

        void s_write(uchar add,uchar dat)//單字節(jié)寫(xiě)入子函數(shù)
        {
        ds1302_ce=0;
        ds1302_sclk=0;
        ds1302_ce=1;
        write_byte(add);
        write_byte(dat);
        ds1302_sclk=1;
        ds1302_ce=0;
        }
        uchar s_read(uchar add) //單字節(jié)讀出子函數(shù)
        {
        uchar temp;
        ds1302_ce=0;
        ds1302_sclk=0;
        ds1302_ce=1;
        write_byte(add);
        temp=read_byte();
        ds1302_sclk=1;
        ds1302_ce=0;

        temp=(temp/0x0a)*10+temp%0x0a;

        return(temp);
        }
        void set_ds1302(uchar *pClock)//設(shè)置ds1302的時(shí)間
        {
        uchar i;
        uchar add=0x80;
        EA=0;
        s_write(0x8e,0x00);
        for(i=7;i>0;i--)
        {
        s_write(add,*pClock);
        pClock++;
        add+=2;
        }
        s_write(0x8e,0x80);
        EA=1;
        }
        void read_ds1302(uchar Curtime[]) //讀取ds1302的時(shí)間
        {
        uchar i;
        uchar add=0x81;
        EA=0;
        for(i=7;i>0;i--)
        {
        Curtime[i]=s_read(add);
        add+=2;
        }
        EA=1;
        }
        void write_com(uchar com) //寫(xiě)命令子函數(shù)
        {
        lcde=0;
        lcdrw=0;
        lcdrs=0;
        delay(1);
        lcde=1;
        delay(1);
        P0=com;
        delay(1);
        lcde=0;
        }
        void write_data(uchar dat)//寫(xiě)數(shù)據(jù)子函數(shù)
        {
        lcde=0;
        lcdrw=0;
        lcdrs=1;
        delay(1);
        lcde=1;
        delay(1);
        P0=dat;
        delay(1);
        lcde=0;
        }
        void init()
        {
        month=1;
        day=1;
        year=9;

        lcde=0; //LCD1602初始化
        le=0;
        leden=0;
        write_com(0x38);
        delay(100);
        write_com(0x38);
        delay(50);
        write_com(0x38);
        delay(10);
        write_com(0x08);
        write_com(0x01);
        write_com(0x0c);
        write_com(0x80);

        for(num=0;num<15;num++) //在第一行顯示“ 2000-00-00 Mon.”
        {
        write_data(table[num]);
        }
        write_com(0x80+0x40);
        for(num=0;num<10;num++) //在第二行末尾顯示“ 00:00:00”
        {
        write_data(table1[num]);
        }

        }
        void write_time(uchar add,uchar dat) //寫(xiě)入時(shí)間子函數(shù)
        {
        uchar shi,ge;
        shi=dat/16;
        ge=dat%16;
        write_com(0x80+0x40+add);
        write_data(0x30+shi);
        write_data(0x30+ge);
        }
        void write_riqi(uchar add,uchar dat) //寫(xiě)入日期子函數(shù)
        {
        uchar shi,ge;
        shi=dat/16;
        ge=dat%16;
        write_com(0x80+add);
        write_data(0x30+shi);
        write_data(0x30+ge);
        }
        void write_xingqi(uchar dat) //寫(xiě)入星期子函數(shù)
        {
        write_com(0x80+0x0b);
        switch(dat)
        {
        case 1: for(num=0;num<4;num++)
        {
        write_data(xingqi[num]);
        };break;
        case 2: for(num=5;num<9;num++)
        {
        write_data(xingqi[num]);
        };break;
        case 3: for(num=10;num<14;num++)
        {
        write_data(xingqi[num]);
        };break;
        case 4: for(num=15;num<19;num++)
        {
        write_data(xingqi[num]);
        };break;
        case 5: for(num=20;num<24;num++)
        {
        write_data(xingqi[num]);
        };break;
        case 6: for(num=25;num<29;num++)
        {
        write_data(xingqi[num]);
        };break;
        case 7: for(num=30;num<34;num++)
        {
        write_data(xingqi[num]);
        };break;

        }
        }
        void main()
        {
        init();
        delay(5);
        s_write(0x8e,0x00); //控制寫(xiě)入WP=0
        s_write(0x90,0xa5);
        s_write(0x80,0x00); //秒
        s_write(0x82,0x20); //分
        s_write(0x84,0x09); //時(shí)24時(shí)制
        s_write(0x86,0x27); //日
        s_write(0x88,0x08); //月
        s_write(0x8a,0x04); //星期
        s_write(0x8c,0x09); //年 */
        s_write(0x8e,0x80);//控制寫(xiě)入WP=1;

        P0=0xff;

        while(1)
        {
        sec=s_read(0x81);
        write_time(8,sec);
        write_com(0x80+0x40+9);
        min=s_read(0x83);
        write_time(5,min);
        write_com(0x80+0x40+6);
        hour=s_read(0x85);
        write_time(2,hour);
        write_com(0x80+0x40+3);
        week=s_read(0x8b);
        write_xingqi(week);
        write_com(0x80+0x0d);
        day=s_read(0x87);
        write_riqi(8,day);
        write_com(0x80+9);
        month=s_read(0x89);
        write_riqi(5,month);
        write_com(0x80+6);
        year=s_read(0x8d);
        write_riqi(2,year);
        write_com(0x80+3);
        }
        }
        void delay(uint a) { //延時(shí)子函數(shù)
        uint i,j;
        for(j=a;j>0;j--)
        for(i=250;i>0;i--) ;
        }



        關(guān)鍵詞: ds1302精密電子時(shí)

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 元江| 唐河县| 新宁县| 江门市| 石河子市| 新野县| 且末县| 张家港市| 泸定县| 历史| 金湖县| 巫溪县| 托里县| 南投市| 扎赉特旗| 祁门县| 杨浦区| 常山县| 海城市| 西贡区| 河西区| 商南县| 呈贡县| 上犹县| 高尔夫| 洛扎县| 锡林郭勒盟| 浮梁县| 定结县| 顺平县| 砚山县| 右玉县| 安陆市| 迁安市| 新乡市| 四川省| 荣昌县| 托里县| 乌什县| 洛川县| 波密县|