在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > I2c程序 51系列及 AVR系列

            I2c程序 51系列及 AVR系列

            作者: 時(shí)間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            keil c編譯 51

            #define uchar unsigned char
            #define uint unsigned int
            #include "reg51.h"
            #include "intrins.h"

            本文引用地址:http://www.biyoush.com/article/201611/316772.htm

            sbit Scl=P3^3; //串行時(shí)鐘
            sbit Sda=P3^4; //串行數(shù)據(jù)

            /*發(fā)送起始條件*/
            void Start(void) /*起始條件*/
            {
            Sda=1;
            Scl=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Sda=0;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            }
            void Stop(void) /*停止條件*/
            {
            Sda=0;
            Scl=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Sda=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            }
            void Ack(void) /*應(yīng)答位*/
            {
            Sda=0;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Scl=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Scl=0;
            }
            void NoAck(void) /*反向應(yīng)答位*/
            {
            Sda=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Scl=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Scl=0;
            }
            void Send(uchar Data) /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/
            {
            uchar BitCounter=8; /*位數(shù)控制*/
            uchar temp; /*中間變量控制*/
            do
            {
            temp=Data;
            Scl=0;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            if((temp&0x80)==0x80)/* 如果最高位是1*/
            Sda=1;
            else
            Sda=0;
            Scl=1;
            temp=Data<<1; /*RLC*/
            Data=temp;
            BitCounter--;
            }while(BitCounter);
            Scl=0;
            }
            uchar Read(void) /*讀一個(gè)字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/
            {
            uchar temp=0;
            uchar temp1=0;
            uchar BitCounter=8;
            Sda=1;
            do{
            Scl=0;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            Scl=1;
            _nop_ ();
            _nop_ ();
            _nop_ ();
            _nop_ ();
            if(Sda) /*如果Sda=1;*/
            temp=temp|0x01; /*temp的最低位置1*/
            else
            temp=temp&0xfe; /*否則temp的最低位清0*/
            if(BitCounter-1)
            { temp1=temp<<1;
            temp=temp1;
            }
            BitCounter--;
            }while(BitCounter);
            return(temp);
            }
            ////////////////////////////////////////////////
            void WrToROM(uchar Data[],uchar Address,uchar Num)
            {
            uchar i=0;
            uchar *PData;
            PData=Data;
            Start();
            Send(0xa0);
            Ack();
            Send(Address);
            Ack();
            for(i=0;i {
            Send(*(PData+i));
            Ack();
            }
            Stop();
            }
            void RdFromROM(uchar Data[],uchar Address,uchar Num)
            {
            uchar i=0;
            uchar *PData;
            PData=Data;
            for(i=0;i {
            Start();
            Send(0xa0);
            Ack();
            Send(Address+i);
            Ack();
            Start();
            Send(0xa1);
            Ack();
            *(PData+i)=Read();
            Scl=0;
            NoAck();
            Stop();
            }
            }

            /////////////////////////////////END of IIC/////////////////////////////////
            ////////////////////start of DS1621/////////////////////////////////
            void delay_ms(unsigned char temp)
            {
            while(temp--);
            }
            void temp_config(unsigned char temp)
            {

            Start();
            Send(0x90);
            Ack();
            Send(0xac);
            Ack();
            Send(temp);
            Ack();
            Stop();
            delay_ms(110);
            }


            void init_temp()
            {
            Scl=1; //串行時(shí)鐘
            Sda=1;
            Start();
            Send(0x90);
            Ack();
            Send(0xee);
            Ack();
            Stop();
            temp_config(8);
            }


            void read_temp() ////// Returns degrees F (0-255)
            {
            unsigned char datah,datal;

            ////溫度數(shù)據(jù)讀入開始
            Start(); //
            Send(0x90);
            Ack();
            Send(0xaa);
            Ack();
            Start();
            Send(0x91);
            Ack();
            datah=Read();
            Ack();
            datal=Read();
            Stop();
            ///溫度數(shù)據(jù)讀入結(jié)束
            if((datah&0x80)!=0)
            {
            word1[3]=-;
            datah=datah-1;
            datah=~datah;
            word1[4]=datah/100+48;
            word1[5]=((datah/10)%10)+48;
            word1[6]=datah%10+48;
            word1[7]=C;

            }
            else
            {
            word1[3]=+;
            word1[4]=datah/100+48;
            word1[5]=((datah/10)%10)+48;
            word1[6]=datah%10+48;
            word1[7]=C;

            }

            }


            AVR

            void Start() //I2C總線的開始條件
            {Set_SDA(1); //SDA=1;
            Set_SCL(1); //SCL=1;
            delay(100); //等待時(shí)鐘信號變高
            Set_SDA(0); //SDA=0;
            delay(100);
            Set_SCL(0); // SCL=0;
            }

            void Stop() //I2C總線結(jié)束條件
            {Set_SDA(0); //SDA=0;
            delay(100);
            Set_SCL(1); //SCL=1;
            delay(100); //等待時(shí)鐘信號變低
            Set_SDA(1); //SDA=1;
            delay(100);
            Set_SCL(0); //SCL=0;
            }

            void Ack() //I2C總線應(yīng)答
            {Set_SDA(0); //SDA=0;
            delay(50);
            Set_SCL(1); //SCL=1;
            delay(100);
            Set_SCL(0); //SCL=0;
            delay(50);
            Set_SDA(1); //SDA=1;
            }

            void Nack() //I2C總線應(yīng)答非
            {Set_SDA(1); //SDA=1;
            delay(50);
            Set_SCL(1); //SCL=1;
            delay(100);
            Set_SCL(0); //SCL=0;
            delay(50);
            Set_SDA(0); //SDA=0;
            }

            void Check_Ack() //I2C總線應(yīng)答檢查
            {Set_SDA(1); //SDA=1;
            Set_SCL(1); //SCL=1;
            Ack_Flag=0; //清除應(yīng)答標(biāo)志;
            DDRA&=0xbf; //設(shè)置SDA為輸入
            if(!((PINA & 0x40)>>6))
            {delay(50);
            Set_SCL(0); //SCL=0;
            delay(100);}
            else
            {Ack_Flag=1; //收到應(yīng)答;
            delay(50);
            Set_SCL(0); //SCL=0;
            delay(100);}
            DDRA |=0xff; //重新設(shè)置SDA為輸出
            }

            void Write_Bit0() //寫1bit數(shù)據(jù):0
            {Set_SDA(0); //SDA=0;
            Set_SCL(1); //SCL=1;
            delay(100);
            Set_SCL(0); //SCL=0;
            }

            void Write_Bit1() //寫1bit數(shù)據(jù):1
            {Set_SDA(1); //SDA=1;
            Set_SCL(1); //SCL=1;
            delay(100);
            Set_SCL(0); //SCL=0;
            Set_SDA(0); //SDA=0;
            }

            void Write_Byte(uchar Data) //寫一字節(jié)數(shù)據(jù)Data
            {uchar i;
            for(i=0;i<8;i++)
            {if(Data & 0x80) Write_Bit1(); //傳輸位從高位到低位,先傳最高位
            else Write_Bit0();
            Data <<=1;} //數(shù)據(jù)左移
            }

            uchar Read_Byte() //讀一字節(jié)數(shù)據(jù):返回值即讀的數(shù)據(jù)
            {uchar Read_Data=0xff; // Read_Data為讀入的數(shù)據(jù),初始值為0xff
            uchar j;
            for (j=0;j<8;j++)
            {Set_SDA(1);
            Set_SCL(1);
            DDRA &=0xbf;
            if((PINA & 0x40)==0)
            {Read_Data <<=1;
            Read_Data=(Read_Data & 0xfe);
            Set_SCL(0);}
            else
            {Read_Data <<=1;
            Read_Data =( Read_Data | 0x01);
            Set_SCL(0);}}
            DDRA |=0x40;
            return(Read_Data);
            }

            //***************************寫一字節(jié)數(shù)據(jù)****************************//
            //向從地址為Slave的IIC器件的Address地址寫一字節(jié)數(shù)據(jù)Data
            void Write_1byte(uchar Slave,uchar Address,uchar Data)
            {Start(); //開始
            Write_Byte(Slave); //寫I2C器件地址
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Write_Byte(Address); //送寄存器地址
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Write_Byte(Data); //寫入一字節(jié)數(shù)據(jù)
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Stop(); //停止
            }

            //***************************寫兩字節(jié)數(shù)據(jù)****************************//
            //向從地址為Slave的IIC器件的Address地址開始寫兩字節(jié)數(shù)據(jù)Data0,Data1
            void Write_2byte(uchar Slave,uchar Address,uchar Data0,uchar Data1)
            {Start(); //開始
            Write_Byte(Slave); //寫I2C器件地址
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Write_Byte(Address); //送寄存器地址
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Write_Byte(Data0);
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Write_Byte(Data1);
            do Check_Ack(); //檢查應(yīng)答位
            while(Ack_Flag==1);
            Stop(); //停止信號
            }

            //***************************讀一字節(jié)數(shù)據(jù)****************************//
            //從從地址為Slave的IIC器件的Address地址處讀一字節(jié)數(shù)據(jù)
            uchar Read_1byte(uchar Slave,uchar Address)
            {uchar data0,x;
            do{
            Start(); //開始信號
            Write_Byte(Slave); //寫I2C器件地址
            Check_Ack(); //檢查應(yīng)答位
            }while(Ack_Flag);
            do{
            Write_Byte(Address); //寫寄存器地址
            Check_Ack(); //檢查應(yīng)答位
            }while(Ack_Flag);
            do{
            Start(); //開始
            Write_Byte(Slave+1); //寫I2C器件地址(+1表示為讀操作)
            Check_Ack(); //檢查應(yīng)答位
            }while(Ack_Flag);
            data0=Read_Byte(); //讀1字節(jié)
            Nack(); //讀完發(fā)送一個(gè)Not Ack應(yīng)答
            Stop(); //停止
            return data0; //返回讀取數(shù)據(jù)
            }



            關(guān)鍵詞: I2c程序51系列AVR系

            評論


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

            關(guān)閉