新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機的24C02通信程序

        AVR單片機的24C02通信程序

        作者: 時間:2018-07-24 來源:網絡 收藏

        #include

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

        #define uchar unsigned char

        #define uint unsigned int

        #define setbit(sfr,bit) (sfr|=(1#define clrbit(sfr,bit) (sfr=~(1#define SDA_out() setbit(DDRD,0) //設置SDA為輸出

        #define SCL_out() setbit(DDRD,2) //設置SCL為輸出

        #define SDA_in() clrbit(DDRD,0) //設置SDA為輸入

        #define SDA_high() setbit(PORTD,0) //設置SDA為高電平

        #define SDA_low() clrbit(PORTD,0) //設置SDA為低電平

        #define SCL_high() setbit(PORTD,2) //設置SCL為高電平

        #define SCL_low() clrbit(PORTD,2) //設置SCL為低電平

        void delay_us(uchar t)

        {

        uchar i;

        for(i=0;i}

        void delay_ms(uchar m)

        {

        uchar i;

        for(i=0;i {

        delay_us(250); //延時250us

        delay_us(250);

        delay_us(250);

        delay_us(250);

        }

        }

        void init()

        {

        SDA_out();

        SCL_out();

        //SCL_low();

        MCUCR = 0x00; //使能上拉

        }

        void start_signed()

        {

        SDA_out();

        SDA_high();

        SCL_high();

        delay_us(4);

        SDA_low();

        delay_us(4);

        SCL_low();

        }

        void stop_signed()

        {

        SDA_out();

        SDA_low();

        SCL_high();

        delay_us(4);

        SDA_high();

        delay_us(4);

        SCL_low();

        }

        uchar ACK_signed()

        {

        uchar q=1,i;

        SDA_in();

        SCL_high();

        for(i=0;i200;i++)

        {

        q = PIND0x01;

        if(!q)break;

        else

        i = 0;

        }

        delay_us(4);

        SCL_low();

        return q;

        }

        uchar mask_ack()

        {

        SDA_out();

        SCL_low();

        delay_us(2);

        SDA_low();

        delay_us(4);

        SCL_high();

        delay_us(4);

        }

        void write_byte(uchar w_byte)

        {

        uchar i;

        SDA_out();

        SCL_out();

        for(i=0;i8;i++)

        {

        if((w_byte0x80)!=0)SDA_high();

        else

        SDA_low();

        w_byte=1;

        SCL_high();

        delay_us(4);

        SCL_low();

        delay_us(4);

        }

        }

        uchar read_byte()

        {

        uchar i,read_byte;

        SDA_in();

        for(i=0;i8;i++)

        {

        SCL_high();

        delay_us(10);

        read_byte=read_byte1;

        if((PIND0x01)!=0)read_byte|=0x01;

        delay_us(10);

        SCL_low();

        delay_us(10);

        }

        return read_byte;

        }

        write_24c02(uchar addr,uchar w_data)

        {

        start_signed();

        write_byte(0xa0);

        if(ACK_signed())return;

        write_byte(addr);

        if(ACK_signed())return;

        write_byte(w_data);

        if(ACK_signed())return;

        stop_signed();

        delay_ms(10); //延時10MS等待寫操作完成

        }

        uchar read_24c02(uchar addr)

        {

        uchar temp;

        start_signed();

        write_byte(0xa0);

        if(ACK_signed())return;

        write_byte(addr);

        if(ACK_signed())return;

        start_signed(); //從新開始

        write_byte(0xa1);

        if(ACK_signed())return;

        temp = read_byte();

        mask_ack(); //主機發送應答信號

        stop_signed();

        return temp;

        }

        uchar main()

        {

        uchar p = 0xff;

        init();

        DDRB = 0xff;

        PORTB = 0xff;

        while(1)

        {

        write_24c02(0x03,0x43);

        delay_ms(10);

        p = read_24c02(0x03);

        PORTB = p;

        }

        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 吉林市| 彭阳县| 吉林省| 盐池县| 苍溪县| 福建省| 台北市| 兴业县| 克什克腾旗| 房山区| 吴川市| 奉贤区| 来安县| 民权县| 中超| 穆棱市| 湘乡市| 德昌县| 濮阳县| 达州市| 卫辉市| 龙江县| 台南县| 宕昌县| 吉安市| 周宁县| 库车县| 大新县| 济阳县| 阳泉市| 延川县| 兴城市| 镇坪县| 磐石市| 禹州市| 罗定市| 唐海县| 青浦区| 萍乡市| 繁昌县| 平顶山市|