新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于IIC總線協議的AT24C16操作程序

        基于IIC總線協議的AT24C16操作程序

        作者: 時間:2016-11-28 來源:網絡 收藏

        #include
        #define uint unsigned int
        #define uchar unsigned char
        uchar shi,ge,t,sec,write;
        uchar code table[]={0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f};
        sbit sda=P2^0;
        sbit scl=P2^1;
        void delayms(uint z)
        {
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
        }
        void delay()
        {
        ;;
        }
        void display(uchar shi,uchar ge) //顯示函數
        {
        P1=0xfd;
        P0=table[ge];
        delayms(5);
        P1=0xfe;
        P0=table[shi];
        delayms(5);
        }
        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 date) //寫數據函數
        {
        uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
        temp=temp<<1;//將數據左移一位,最高位移至CY
        scl=0;
        delay();
        sda=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; //或運算,sda為0或者1,放到了k的最低位了,因k最低位為0
        scl=0;
        delay();
        }
        return k; //即為讀到的數據
        }
        void write_add(uchar address,uchar date) //在某地址上寫數據
        {
        start(); //起始信號
        write_byte(0xa0); //發送器件地址,最低位為0,表示主機發送
        respons(); //應答
        write_byte(address);//發送某器件存儲單元地址
        respons(); //應答
        write_byte(date); //寫數據
        respons(); //應答
        stop(); //停止
        }
        uchar read_add(uchar address) //在某地址上讀數據
        {
        uchar date;
        start(); //起始信號
        write_byte(0xa0); //發送器件地址,最低位為0,表示主機發送
        respons(); //應答
        write_byte(address);//發送某器件存儲單元地址,表示要讀此位置的數據
        respons(); //應答
        start(); //起始
        write_byte(0xa1);//發送器件地址,最低位為1,表示主機接受數據
        respons();
        date=read_byte();
        stop();
        return date;
        }
        void main()
        {
        init();
        sec=read_add(2);//地址隨便寫,在一定范圍內
        if(sec>100)//防止首次讀出錯誤數據
        sec=0;
        TMOD=0x01;
        ET0=1;
        EA=1;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%6;
        TR0=1;
        while(1)
        {
        display(sec/10,sec);
        if(write==1)//一秒寫一次AT2416
        {
        write=0;
        write_add(2,sec); //sec是十進制,在定義里面是作為二進制,自動轉化??????
        }
        }
        }
        void t0() interrupt 1
        {
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%6;
        t++;
        if(t==20)
        {
        t=0;
        sec++;
        write=1;
        if(sec==100)
        {
        sec=0;
        }
        }
        }

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


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长岛县| 高青县| 广元市| 怀远县| 顺义区| 江北区| 通化市| 巴楚县| 涞源县| 达州市| 景泰县| 西畴县| 定边县| 策勒县| 科尔| 高碑店市| 林西县| 宁津县| 福鼎市| 柳州市| 山东省| 宝丰县| 定兴县| 辉南县| 金沙县| 姜堰市| 曲松县| 汉源县| 昌平区| 崇阳县| 桦甸市| 连平县| 怀仁县| 汉川市| 昌江| 辽中县| 大足县| 石嘴山市| 崇明县| 厦门市| 罗源县|