新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > I2C總線協議(AT24c02)程序

        I2C總線協議(AT24c02)程序

        作者: 時間:2016-12-01 來源:網絡 收藏

        下面是代碼

        本文引用地址:http://www.104case.com/article/201612/324254.htm#include
        #define uchar unsigned char
        #define addr_x 0xae // 寫
        #define addr_d 0xaf// 讀
        sbit sda = P2^1; //數據管腳
        sbit scl = P2^0; //時鐘管腳
        bit ack;
        void DelayUs2x(unsigned char t) //延時1
        {
        while(--t);
        }
        void DelayMs(unsigned char t) //延時2
        {
        while(t--)
        {
        //大致延時1mS
        DelayUs2x(245);
        DelayUs2x(245);
        }
        }
        void delay() //延時大于4μs
        {;;}
        void i2_qs() //起始信號
        {
        sda = 1; //拉高數據
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        sda = 0; //拉低數據產生起始信號(下降沿)
        delay(); //延時大于 4μs
        scl = 0; //拉低時鐘
        delay(); //延時大于 4μs
        }
        void i2_tz() //停止信號
        {
        sda = 0; //拉低數據
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        sda = 1; //拉高時鐘產生結束信號(上升沿)
        delay(); //延時大于 4μs
        }
        void i2_ack(bit _ack) //入口產生 0 ack 1 nak
        {
        sda = _ack; //ack或者nak
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        scl = 0; //拉低時鐘
        delay(); //延時大于 4μs
        }
        void i2_fs(uchar Data) //發送8位數據
        {
        uchar i;
        for(i=0;i<8;i++) //8位計數
        {
        Data <<= 1; //把最高位移送到進制標志位中(CY)
        sda = CY; //把進制位中的數據賦值給數據線
        scl = 1; //拉高時鐘
        delay(); //延時大于 4μs
        scl = 0; //拉低時鐘
        //這里
        }
        //下面代碼是接收ACK的代碼
        delay();//延時大于 4μs
        sda = 1; //拉高數據準備接收ACK
        scl = 1; //拉高時鐘產生穩定的有效的數據(相對的)
        if(sda==1) //確認接收的是ACK還是NAK
        ack = 0;//ack
        else
        ack = 1;//nak
        scl = 0; //拉低時鐘
        delay(); //延時大于 4us
        }
        uchar i2_js() //接收8位數據
        {
        uchar i,Data = 0;
        sda = 1; //使能內部上拉,準備讀取數據
        for(i=0;i<8;i++) //8位計數器
        {
        Data <<= 1; //移出數據的最高位
        scl = 1; //拉高時鐘
        delay(); //延時大于 4us
        Data |= sda;//接收數據
        scl = 0; //拉低時鐘
        delay(); //延時大于 4us
        }
        return Data;
        }
        void i2_sj_x(uchar addr,uchar Data) //往設備內寫入數據(參數 1、寄存器地址 2、寫入的數據)
        {
        i2_qs(); //起始信號
        i2_fs(addr_x); //設備地址+寫信號
        i2_fs(addr); //寄存器內部地址
        i2_fs(Data); //寫入設備的數據
        i2_tz(); //停止信號
        }
        uchar i2_sj_d(uchar addr) //讀取數據(參數 寄存器地址)
        {
        uchar Data;
        i2_qs(); //起始信號
        i2_fs(addr_x); //設備地址+寫信號
        i2_fs(addr); //寄存器內部地址
        i2_qs(); //起始信號
        i2_fs(addr_d); //設備地址+讀信號
        Data = i2_js(); //讀取數據
        i2_ack(0); //ACK應答
        i2_tz(); //停止信號
        return Data; //返回讀取的數據
        }
        void main(void)
        {
        uchar dat;
        i2_sj_x(3,0x0f); //數據寫入24c02
        DelayMs(50);
        dat = i2_sj_d(3); //從24c02中讀取數據
        P1 = dat; //使用8個LED顯示讀出的數據
        while(1)
        {
        ;
        }
        }
        以上代碼只是簡單的實現I2C總線的讀寫

        上一頁 1 2 下一頁

        關鍵詞: I2C總線協議AT24c0

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 南木林县| 南华县| 永泰县| 香河县| 满城县| 翁牛特旗| 饶阳县| 淅川县| 太白县| 涞水县| 丰顺县| 奎屯市| 桃源县| 武义县| 南宁市| 志丹县| 富蕴县| 敦化市| 陵水| 洛川县| 米泉市| 玉溪市| 台南县| 石柱| 榆社县| 洛川县| 思茅市| 龙山县| 南京市| 大方县| 忻城县| 桦川县| 喜德县| 安义县| 隆子县| 辽宁省| 花莲县| 阿拉善盟| 都匀市| 北辰区| 武宁县|