新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC12C5A60S2控制AT24C04 C程序

        STC12C5A60S2控制AT24C04 C程序

        作者: 時間:2013-05-11 來源:網絡 收藏
        /**************************************
        主芯片:(1T)
        工作頻率:12.000MHz
        **************************************/ #include"REG51.H"
        #include"INTRINS.H"
        typedefunsignedcharBYTE;
        typedefunsignedshortWORD; sbitSCL=P3^4;//的時鐘
        sbitSDA=P3^5;//的數據 BYTEBUF[16];//數據緩存區 BYTEcodeTESTDATA[]=
        {
        0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,
        0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF
        }; voidDelay5us();
        voidDelay5ms();
        void_Start();
        voidAT24C04_Stop();
        voidAT24C04_SenDACK(bitack);
        bitAT24C04_RecvACK();
        voidAT24C04_SendByte(BYTEdat);
        BYTEAT24C04_RecvByte();
        voidAT24C04_ReadPage();
        voidAT24C04_WritePage(); voidmain()
        {
        AT24C04_WritePage();
        Delay5ms();
        AT24C04_ReadPage(); while(1); } /**************************************
        向AT24C04寫1頁(16字節)數據
        將TESTDATA開始的16個測試數據寫如設備的00~0F地址中
        **************************************/
        voidAT24C04_WritePage()
        {
        BYTEi; AT24C04_Start();//起始信號
        AT24C04_SendByte(0xa0);//發送設備地址+寫信號
        AT24C04_SendByte(0x00);//發送存儲單元地址
        for(i=0;i16;i++)
        {
        AT24C04_SendByte(TESTDATA[i]);
        }
        AT24C04_Stop();//停止信號
        } /**************************************
        從AT24C04讀取1頁(16字節)數據
        將設備的00~0F地址中的數據讀出存放在DATA區的BUF中
        **************************************/
        voidAT24C04_ReadPage()
        {
        BYTEi; AT24C04_Start();//起始信號
        AT24C04_SendByte(0xa0);//發送設備地址+寫信號
        AT24C04_SendByte(0x00);//發送存儲單元地址
        AT24C04_Start();//起始信號
        AT24C04_SendByte(0xa1);//發送設備地址+讀信號
        for(i=0;i16;i++)
        {
        BUF[i]=AT24C04_RecvByte();
        if(i==15)
        {
        AT24C04_SendACK(1);//最后一個數據需要會NAK
        }
        else
        {
        AT24C04_SendACK(0);//回應ACK
        }
        }
        AT24C04_Stop();//停止信號
        } /**************************************
        延時5微秒(@12M)
        不同的工作環境,需要調整此函數
        此延時函數是使用1T的指令周期進行計算,與傳統的12T的MCU不同
        **************************************/
        voidDelay5us()
        {
        BYTEn=4; while(n--)
        {
        _nop_();
        _nop_();
        }
        } /**************************************
        延時5毫秒(@12M)
        不同的工作環境,需要調整此函數
        此延時函數是使用1T的指令周期進行計算,與傳統的12T的MCU不同
        **************************************/
        voidDelay5ms()
        {
        WORDn=2500; while(n--)
        {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }
        } /**************************************
        起始信號
        **************************************/
        voidAT24C04_Start()
        {
        SDA=1;//拉高數據線
        SCL=1;//拉高時鐘線
        Delay5us();//延時
        SDA=0;//產生下降沿
        Delay5us();//延時
        SCL=0;//拉低時鐘線
        } /**************************************
        停止信號
        **************************************/
        voidAT24C04_Stop()
        {
        SDA=0;//拉低數據線
        SCL=1;//拉高時鐘線
        Delay5us();//延時
        SDA=1;//產生上升沿
        Delay5us();//延時
        } /**************************************
        發送應答信號
        入口參數:ack(0:ACK1:NAK)
        **************************************/
        voidAT24C04_SendACK(bitack)
        {
        SDA=ack;//寫應答信號
        SCL=1;//拉高時鐘線
        Delay5us();//延時
        SCL=0;//拉低時鐘線
        Delay5us();//延時
        } /**************************************
        接收應答信號
        **************************************/
        bitAT24C04_RecvACK()
        {
        SCL=1;//拉高時鐘線
        Delay5us();//延時
        CY=SDA;//讀應答信號
        SCL=0;//拉低時鐘線
        Delay5us();//延時 returnCY;
        } /**************************************
        向IIC總線發送一個字節數據
        **************************************/
        voidAT24C04_SendByte(BYTEdat)
        {
        BYTEi; for(i=0;i8;i++)//8位計數器
        {
        dat=1;//移出數據的最高位
        SDA=CY;//送數據口
        SCL=1;//拉高時鐘線
        Delay5us();//延時
        SCL=0;//拉低時鐘線
        Delay5us();//延時
        }
        AT24C04_RecvACK();
        } /**************************************
        從IIC總線接收一個字節數據
        **************************************/
        BYTEAT24C04_RecvByte()
        {
        BYTEi;
        BYTEdat=0; SDA=1;//使能內部上拉,準備讀取數據
        for(i=0;i8;i++)//8位計數器
        {
        dat=1;
        SCL=1;//拉高時鐘線
        Delay5us();//延時
        dat|=SDA;//讀數據
        SCL=0;//拉低時鐘線
        Delay5us();//延時
        } returndat;
        }


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 牡丹江市| 东阳市| 石嘴山市| 资源县| 龙门县| 丹阳市| 久治县| 英吉沙县| 大埔县| 佳木斯市| 渝北区| 武胜县| 油尖旺区| 叶城县| 上犹县| 凉城县| 吴桥县| 洛川县| 白朗县| 枝江市| 任丘市| 周至县| 安丘市| 青海省| 都江堰市| 平远县| 手机| 县级市| 扎兰屯市| 普兰县| 达拉特旗| 江油市| 兰坪| 咸宁市| 湟中县| 保德县| 霍林郭勒市| 凤山市| 吉木乃县| 长岭县| 内乡县|