新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 利用E2PROM寫的一個時鐘

        利用E2PROM寫的一個時鐘

        作者: 時間:2016-11-25 來源:網絡 收藏
        E2PROM是基于I2C總線的數據存儲器,網上很容易查到I2C總線協議的相關資料。

        本實驗主要是實驗的E2PROM的型號是AD24C02,其存儲容量為2K。可重復擦寫1,000,000次,數據可以保存100年。其引腳圖如下:

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

        其芯片固定的地址高四位為1010,由于此處僅僅使用了一塊,因此A0,A1,A2均接地。此處在讀寫E2PROM的程序主要是采用祥哥的思想,加以改進后的一個時鐘。程序如下:

        =================================================================================================
        #include
        #define uchar unsigned char
        #define uint unsigned int
        sbit sda=P3^7; //端口定義
        sbit scl=P3^6;
        int t;
        uchar code table[]={
        0x3F, //"0" //數碼管顯示字庫
        0x06, //"1"
        0x5B, //"2"
        0x4F, //"3"
        0x66, //"4"
        0x6D, //"5"
        0x7D, //"6"
        0x07, //"7"
        0x7F, //"8"
        0x6F, //"9"
        };
        void delay()
        { ; ;}
        void delay1(uint z)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }
        void start() //起始信號
        {
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();

        }
        void stop()//終止信號
        {
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
        }

        void respons() //應答信號
        {
        uchar i;
        scl=1;
        delay();
        while((sda==1) && (i<250))i++;//二者如果同時成立,則等待,如果有一個不成立則退出。
        scl=0;
        delay();
        }
        void init()
        {
        sda=1;
        delay();
        scl=1;
        delay();

        }
        void write_byte(uchar dat)//寫一個字節
        {
        uchar i,temp;
        temp=dat;

        for(i=0;i<8;i++)
        {
        temp=temp<<1;
        scl=0;
        delay();
        sda=CY;//將溢出位送走 ,高位送走,溢出位在CY寄存器中
        delay();
        scl=1;
        delay(); //高電平時數據保持穩定
        }
        scl=0;
        delay();
        sda=1;//釋放總線,方便讀取應答信號
        delay();
        }

        uchar read_byte() //讀取一個字節數據
        {
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++) //高位在前
        {
        scl=1;
        delay();
        k=(k<<1)|sda;
        scl=0;
        delay();
        }
        return k;
        }

        void write_add(uchar datadd,uchar date)//寫存儲器地址和數據
        {
        start();
        write_byte(0xa0);//寫芯片地址
        respons();
        write_byte(datadd);//向第三個存儲器地址寫數據
        respons();
        write_byte(date);
        respons();
        stop();

        }
        uchar read_date(uchar datadd)//讀取存儲器中的數據,參數為存儲器的地址
        {
        uchar dat;
        start();
        write_byte(0xa0); //寫芯片地址
        respons();
        write_byte(datadd);//寫存儲器地址
        respons();
        start();
        write_byte(0xa1); //再次寫芯片地址,改變數據方向
        respons();
        dat=read_byte();
        stop();
        return(dat);

        }
        void display(int shi,int fen,int miao) //顯示時間
        {
        int a,b,c,d,e,f;
        a=shi/10;
        b=shi;
        c=fen/10;
        d=fen;
        e=miao/10;
        f=miao;

        P2=read_date(a);//讀取相應數字的地址
        P1=0xf0;
        delay1(1);
        P2=read_date(b);
        P1=0xf1;
        delay1(1);
        P2=0x40;
        P1=0xf2;
        delay1(1);
        P2=read_date(c);
        P1=0xf3;
        delay1(1);
        P2=read_date(d);
        P1=0xf4;
        delay1(1);
        P2=0x40;
        P1=0xf5;
        delay1(1);
        P2=read_date(e);
        P1=0xf6;
        delay1(1);
        P2=read_date(f);
        P1=0xf7;
        delay1(1);

        }
        void main()
        {
        int num;
        int i;
        int shi,fen,miao;
        TMOD=0x01;//定時器0為工作方式1
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%6;
        EA=1; //開總中斷
        ET0=1;//開定時器0中斷
        TR0=1;//啟動定時器0
        //*******此處運行一次即可*********
        init();
        for(i=0;i<10;i++)
        {
        write_add(i,table[i]);//依次寫進數碼管要顯示的數據 ,存到E2P的前10個地址中
        delay1(50);
        }
        //******************************
        while(1)
        {
        if(t==20)
        {
        t=0;
        miao++;
        if(miao==60)
        {
        miao=0;
        fen++;
        if(fen==60)
        {
        fen=0;
        shi++;
        if(shi==24)
        shi=0;
        }
        }
        }
        display(shi,fen,miao);//顯示時間
        }


        }

        void timer_0() interrupt 1 //定時器0中斷
        {
        TH0=(65535-50000)/256;
        TL0=(65535-50000)%6;
        t++;
        }



        關鍵詞: E2PROM時

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 平顶山市| 云阳县| 兴和县| 大同县| 本溪市| 武威市| 延长县| 梅州市| 南投县| 信丰县| 新兴县| 乐业县| 兴海县| 商都县| 亳州市| 滁州市| 安义县| 界首市| 仙游县| 长宁区| 高阳县| 东乡| 岑巩县| 东源县| 石狮市| 偃师市| 肇源县| 张北县| 乃东县| 南京市| 德格县| 奉贤区| 新竹县| 辉县市| 巩留县| 兰溪市| 玛曲县| 股票| 安徽省| 金乡县| 泽库县|