在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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)用 > 51單片機(jī)I2C總線驅(qū)動(dòng)程序

            51單片機(jī)I2C總線驅(qū)動(dòng)程序

            作者: 時(shí)間:2016-11-18 來源:網(wǎng)絡(luò) 收藏
            SI2I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機(jī)系統(tǒng)所需的包括總線裁決和高低速器件同步功能的高性能串行總線。

            I2C總線只有兩根雙向信號(hào)線。一根是數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。

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

            一.I2C系統(tǒng)結(jié)構(gòu)

            每個(gè)接到I2C總線上的器件都有唯一的地址。主機(jī)與其它器件間的數(shù)據(jù)傳送可以是由主機(jī)發(fā)送數(shù)據(jù)到其它器件,這時(shí)主機(jī)即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。

            二.數(shù)據(jù)位的有效性規(guī)定

            I2C總線進(jìn)行數(shù)據(jù)傳送時(shí),時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線上的信號(hào)為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。

            三.字節(jié)傳送與應(yīng)答

            每一個(gè)字節(jié)必須保證是8位長度。數(shù)據(jù)傳送時(shí),先傳送最高位(MSB),每一個(gè)被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)。

            四.驅(qū)動(dòng)程序

            #define uchar unsigned char#define uint unsigned int#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()sbit SCL=P2^1;sbit SDA=P2^0;
            • 1
            • 2
            • 3
            • 4
            • 5

            1.起始信號(hào)和終止信號(hào)

            SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號(hào);
            SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號(hào)。

            起始和終止信號(hào)都是由主機(jī)發(fā)出的,在起始信號(hào)產(chǎn)生后,總線就處于被占用的狀態(tài);在終止信號(hào)產(chǎn)生后,總線就處于空閑狀態(tài)

            void I2C_Start()     //起始{SCL=1;somenop();SDA=1;somenop();SDA=0;somenop();SCL=0;somenop();}void I2C_Stop()      //終止{  SDA=0;somenop();SCL=1;somenop();SDA=1;somenop();}
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
            • 19
            • 20
            • 21
            • 22

            2.發(fā)送數(shù)據(jù)

            void I2C_SendByte(uchar dat, uchar ack)   //發(fā)送一個(gè)字節(jié){uchar i,j,b=0;for(i=0;i<8;i++){    SCL=0;  somenop();   SDA=(bit)(dat&0x80);     //每次取最高位進(jìn)行發(fā)送dat<<=1;        //從最高位開始發(fā)送,左移使每一位逐漸成為最高位SCL=1;          //上升沿時(shí)發(fā)送數(shù)據(jù)somenop();      }SCL=0;somenop(); SDA=1;     somenop();SCL=1;_nop_();while((SDA==1)&&(j<250))  j++;  //等待應(yīng)答,也就是等待從設(shè)備把SDA拉低SCL=0;_nop_();   }
            • 1
            • 2
            • 3
            • 4
            • 5
            • 6
            • 7
            • 8
            • 9
            • 10
            • 11
            • 12
            • 13
            • 14
            • 15
            • 16
            • 17
            • 18
            • 19
            • 20
            • 21
            • 22

            3.讀取數(shù)據(jù)

            uchar I2C_ReadByte()     //讀一個(gè)字節(jié){uchar i,dat=0;SCL=0;         //此處也可以不置低,因?yàn)槠鹗己桶l(fā)送一個(gè)字節(jié)之后SCL都是0somenop();SDA=1;      //拉高準(zhǔn)備數(shù)據(jù)讀取_nop_();for(i=0;i<8;i++)   //讀取8位數(shù)據(jù){SCL=1;somenop();dat<<=1;if(SDA==1)dat=dat"0x01;somenop();SCL=0;     //下降沿時(shí)讀取數(shù)據(jù)somenop();}return dat;}


            評(píng)論


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

            關(guān)閉