中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > AT89S52單片機模擬I2C總線協(xié)議讀寫AT24C04

        AT89S52單片機模擬I2C總線協(xié)議讀寫AT24C04

        作者: 時間:2016-11-18 來源:網(wǎng)絡 收藏
        I2C總線是2條線總線.數(shù)據(jù)線SDA,時鐘線SCL.結(jié)構(gòu)簡單.

        AT24C04是具有I2C總線接口的EEPROM.大小為512*8bit.單片機AT89S52本身不具有I2C總線結(jié)口,所以可編寫程序用并行端口模擬I2C總線協(xié)議讀寫AT24C04.

        本文引用地址:http://www.antipu.com.cn/article/201611/315772.htm

        多個設備通信的重點(1.電平的區(qū)別,如串口通信中PC與單片機通信,PC機串口電平值為+12V~-12V,單片機為TTL電平0V~+5V.,所以要用電平轉(zhuǎn)換芯片轉(zhuǎn)電平.2,通信協(xié)議.(串口通信協(xié)議))

        具體的協(xié)議內(nèi)容與數(shù)據(jù)格式可查資料.

        代碼如下:

        #include

        #define WriteDeviceAddress 0xa0
        #define ReadDeviceAddress 0xa1

        sbit SCL = P3^4;
        sbit SDA = P3^5;
        sbit DOG = P0^0;
        sbit PP = P0^1;
        sbit DOG1 = P0^7;

        void DelayMs(unsigned int number)
        {
        unsigned char tmp;
        for(;number!=0;number--,DOG1=!DOG1)
        {
        for(tmp=112;tmp!=0;tmp--)
        {
        }
        }
        }

        void Start()
        {
        SDA = 1;
        DelayMs(1);
        SCL = 1;
        DelayMs(1);
        SDA = 0;
        DelayMs(1);
        SCL = 0;
        DelayMs(1);
        }

        bit Write8bit(unsigned char input)
        {
        unsigned char tmp;
        for(tmp =8;tmp!=0;tmp--)
        {
        SDA = (bit)(input&0x80);
        DelayMs(1);
        SCL = 1;
        DelayMs(1);
        SCL = 0;
        DelayMs(1);
        input = input << 1;
        }
        return 1;
        }

        bit TestAck()
        {
        bit ErrorBit;
        SDA = 1;
        DelayMs(1);
        SCL = 1;
        DelayMs(1);
        ErrorBit = SDA;
        DelayMs(1);
        SCL = 0;
        DelayMs(1);
        return(ErrorBit);
        }

        void Stop()
        {
        SCL = 0;
        DelayMs(1);
        SDA = 0;
        DelayMs(1);
        SCL = 1;
        DelayMs(1);
        SDA = 1;
        DelayMs(1);
        }

        void WriteI2C(unsigned char *Wdata, unsigned char RomAddress, unsigned char number)
        {
        Start();
        Write8bit(WriteDeviceAddress);
        TestAck();
        Write8bit(RomAddress);
        TestAck();
        for(;number!=0;number--)
        {
        Write8bit(*Wdata);
        TestAck();
        Wdata++;
        }
        Stop();
        DelayMs(1);
        }

        unsigned char Read8Bit()
        {
        unsigned char tmp,rbyte = 0;
        for(tmp=8;tmp!=0;tmp--)
        {
        SCL = 1;
        DelayMs(1);
        rbyte = rbyte << 1;
        DelayMs(1);
        rbyte = rbyte|((unsigned char)(SDA));
        SCL = 0;
        DelayMs(1);
        }
        return(rbyte);
        }

        void Ack()
        {
        SDA = 0;
        DelayMs(1);
        SCL = 1;
        DelayMs(1);
        SCL = 0 ;
        DelayMs(1);
        SDA = 1;
        DelayMs(1);
        }

        void NoAck()
        {
        SDA = 1;
        DelayMs(1);
        SCL = 1;
        DelayMs(1);
        SCL = 0 ;
        DelayMs(1);
        }
        void ReadI2C(unsigned char* RamAddress,unsigned char RomAddress,unsigned char bytes)
        {
        Start();
        Write8bit(WriteDeviceAddress);
        TestAck();
        Write8bit(RomAddress);
        TestAck();
        Start();
        Write8bit(ReadDeviceAddress);
        TestAck();
        while(bytes != 1)
        {
        *RamAddress = Read8Bit();
        Ack();
        RamAddress++;
        bytes--;
        }
        *RamAddress = Read8Bit();
        NoAck();
        Stop();
        }

        void main()
        {
        unsigned char writeByte[8] = {0xC0,0X34,0X12,0X22,0X11,0X01,0X00,0X00};

        unsigned char readByte[8];

        unsigned char *addw;
        unsigned char *addr;

        unsigned char i;
        unsigned char ok = 0;

        bit write = 1;
        DOG = 1;


        while(1)
        {
        if(write == 1)
        {
        addw = writeByte;
        addr = readByte;
        WriteI2C(addw,0x00,8);
        ReadI2C(addr,0x00,8);
        for(i=0;i<8;i++)
        {
        if(writeByte[i] == readByte[i])
        {
        ok++;
        }
        }
        if(ok == 8)
        {
        DOG = 0; //一樣P0.0亮

        }
        else
        {
        PP = 0; //不一樣P0.1亮
        }
        write = 0;
        }
        }
        }



        評論


        技術(shù)專區(qū)

        關(guān)閉