標題: 單片機I2C通信程序 [打印本頁]

作者: 51hei單片    時間: 2016-3-13 16:33
標題: 單片機I2C通信程序
I2C 總線是一雙線串行總線, 它提供一小型網(wǎng)絡系統(tǒng),為總線上的電路共享公共的總線?偩上的器件有單片機、LCD 驅(qū)動器以及上E2PROM 器等等。自從菲利普公司提出I2C總 線規(guī)范以來,I2C器件得到了廣泛的應用。I2C器件的應用大大減少了電路間連線,減小了電路板尺寸,降低了硬件成本,并提高了系統(tǒng)可靠性。


I2C通信的起始程序
void Delay(void)
{
        _nop_; _nop_; _nop_;_nop_;//此函數(shù)的頭文件為intrins.h
        _nop_; _nop_; _nop_;_nop_;
}

void I2Cstart(void)
{
        SDA =1;
        Delay();        //延時函數(shù)
        SCL = 1;   //主要的就是在時鐘信號為高電平的時候,
        Delay();        //數(shù)字信號有一個從高到底的跳變
        SDA =0;
        Delay();
        SCL = 0;
}
void I2Cstop(void)
{
        SCL = 0;
        Delay();        //延時函數(shù)
         SDA =0;  //主要的就是在時鐘信號為高電平的時候,
        Delay();        //數(shù)字信號有一個從低到高的跳變
        SCL = 1;
        Delay();
        SDA =1;
        Delay();
}
void ack(void)         //主要的是主機給重機發(fā)送數(shù)據(jù)后,檢測重機得應答。
{
        uchar i;
        SCL = 1; //將時鐘信號拉高準備接受,應答!
        Delay();
        while(SDA == 1&&i<250)//防止時間長時間的等待因此增加i<250
        {
                i++;
        }
        SCL = 0;  //釋放時鐘總線準備下一次數(shù)據(jù)的傳輸
        Delay();
}
void nack(void)    //主要的是主機讀取重機得數(shù)據(jù),讀到最后一個字符的時候
{
        SDA = 0;  //重機回復的非應答
        Delay();
        SCL = 1;
        Delay();
        SCL = 0;
}
void iicwrite(uchar dat)
{
        uchar i;
        for(i=0;i<8;i++)
        {
           SCL = 0;//釋放時鐘信號  讓數(shù)據(jù)總線變化
           Delay();
           if(dat&&0x80)   //將數(shù)據(jù)從高位到底位依次的付給SDA
           {
                   SDA = 1;
           }       
           else
           {
                   SDA = 0;
           }
           dat = dat << 1;
           Delay();
           SCL = 1;//將數(shù)據(jù)從高位到底位依次的發(fā)送出去
           Delay();
        }
        SDA = 1;
                 Delay();
}
uchar iicread(void)
{
         uchar i,dat;
         for(i=0;i<8;i++)
         {
                SCL = 0;
                        SDA = 1;
                         Delay();
                  SCL = 1;
                         Delay();
                 dat = dat << 1;
                 if(SDA)
                 {
                          dat++;
                 }
         }
         return dat;
}







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1