新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機讀寫AT24C02源代碼(詳細注釋)

        51單片機讀寫AT24C02源代碼(詳細注釋)

        作者: 時間:2016-12-02 來源:網絡 收藏
        在P1口上接八個led燈,結果就顯示在這八個燈上面。AT24C02的接線方式見程序的頂部的定義。以下是源代碼:

        #include //包含頭文件
        typedef unsigned char uchar;
        typedef unsigned int uint;
        #define write_c02 0xa0
        #define read_c02 0xa1
        sbit sda = P2^0;
        sbit scl = P2^1;
        void delay()
        { //delay:5us
        ;;
        }
        //i2c:init
        void i2c_init()
        {
        sda = 1;
        delay();
        scl = 1;
        delay();
        }
        //delayms:
        void delayms(uint xms)
        {
        uchar x, y;
        for(x = xms; x > 0; x--)
        for(y = 110; y > 0; y--);
        }
        //start:
        void start() //啟動i2c
        {
        sda = 1;
        scl = 1;
        delay();//延時必須大于4.7us,此約為五微秒
        sda = 0; //在scl為高電平時,sda一個下降沿為啟動信號
        delay();
        }
        //stop:
        void stop() //停止i2c
        {
        sda = 0;
        scl = 1;
        delay();
        sda = 1; //在scl為高電平時,sdasda一個上升沿為停止信號
        delay();
        }
        //ack:
        void ack() //應答信號0
        {
        uchar i = 0; //等待變量
        scl = 1;//在scl為高電平期間等待應答
        delay();
        while((sda == 1) && i < 250)//若為應答0即退出,從機向主機發送應答信號
        i++;//等待一段時間
        scl = 0; //應答之后將scl拉低
        delay();
        }
        //nack:
        void nack() //非應答
        {
        scl = 1;//在scl為高電平期間,由主機向從機發送一個1,非應答信號
        delay();
        sda = 1;
        scl = 0; //應答之后將scl拉低
        delay();
        }
        //send byte:
        void send_byte(uchar date)//寫一個字節
        {
        uchar i, temp;
        temp = date; //存入要寫入的數據,即要發送到sda上的數據
        for(i = 0; i < 8; i++)
        { //發送8位
        temp <<= 1; //to CY 將數據的最高位移入到PSW中的CY位中
        scl = 0;//只有在scl為低電平時,才允許sda上的數據變化
        delay();
        sda = CY; //將CY里的數據發送到sda數據線上
        delay(); //可以延時
        scl = 1; //在scl為高電平時,不允許sda上的數據變化,使數據穩定
        delay();
        scl = 0;//允許sda數據線的數據變化,等待下一個數據的傳輸
        delay();
        }
        //wait ack:發送完一個字節數據后要主機要等待從機的應答,第九位
        scl = 0;//允許sda變化
        delay();
        sda = 1;//wait:ack,sda拉高等待應答,當sda=0時,表示從機的應答
        delay();
        }
        //read: byte
        uchar read_byte() //讀一個字節數據
        {
        uchar i, j, k;
        scl = 0; //讀之前先允許sda變化
        delay(); //等待數據
        for(i = 0; i < 8; i++)
        {
        scl = 1; //不允許sda變化
        delay(); //使sda數據穩定后開始讀數據
        j = sda; //讀出sda上的數據
        k = (k << 1)| j; //將數據通過|運算存入k中
        scl = 0;//允許sda變化等待下一位數據的到來
        delay();
        }
        //delay();//可不用延時
        return k;//返回讀出的數據
        }
        //write:at24c02 在at24c02中的指定地址寫入數據
        void write_at24c02(uchar address, uchar date)
        {
        start(); //啟動i2c
        send_byte(write_c02);//寫入期間地址和寫操作
        ack(); //從機應答0
        send_byte(address); //寫入寫數據的單元地址
        ack(); //ack0
        send_byte(date); //在指定地址中寫入數據
        ack(); //從機應答0
        stop(); //停止i2c
        }
        //read: at24c02 在at24c02的指定地址中讀出寫入的數據
        uchar read_at24c02(address)
        {
        uchar dat;//用來存儲讀出的數據
        start(); //啟動i2c
        send_byte(write_c02); //寫入at24c02器件地址和寫操作
        ack(); //從機應答0
        send_byte(address); //寫入要讀取AT24C02的數據的單元地址
        ack(); //從機應答0
        start(); //再次啟動i2c
        send_byte(read_c02); //寫入AT24C02器件地址和讀操作
        ack();//從機應答‘0’
        dat = read_byte();//讀出指定地址中的數據
        nack(); //主機發出非應答‘1’
        stop(); //停止i2c
        return dat; //返回讀出的數據
        }
        //main:
        void main()
        {
        uchar i;
        i2c_init();
        start();
        while(1)
        {
        for(i = 0x00; i < 0xff; i++)
        {
        write_at24c02(10, i);
        delayms(10);//需等待十毫秒
        P1 = read_at24c02(10);//1010 1010
        delayms(2000);
        }
        }
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黔西县| 沙河市| 大同市| 吉首市| 营口市| 温泉县| 郴州市| 巨鹿县| 宁津县| 商城县| 剑河县| 靖边县| 开鲁县| 公主岭市| 临桂县| 工布江达县| 涟水县| 马鞍山市| 普宁市| 青州市| 崇义县| 中牟县| 汝阳县| 广灵县| 云龙县| 长汀县| 永善县| 长乐市| 任丘市| 衡南县| 静海县| 万盛区| 突泉县| 宜黄县| 鲁甸县| 平湖市| 花垣县| 东兴市| 田东县| 华蓥市| 彭山县|