機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
I2C驅動程序( C51 )
I2C驅動程序( C51 )
 更新時間:2008-7-27 16:02:03  點擊數:4
【字體: 字體顏色
來源:網上轉載     作者:佚名

//****************************I2C驅動程序****************************//
void Set_SCL(uchar i)                  //定義MAX6959時鐘線為PA^7
{if(i)   PORTA |=0x80;
 else    PORTA &=0x7f;
}
 
void Set_SDA(uchar i)                  //定義MAX6959數據線為PA^6
{if(i)   PORTA |=0x40;
 else    PORTA &=0xbf;
}

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

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

void Ack()                             //I2C總線應答
{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總線應答非
{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總線應答檢查
{Set_SDA(1);                        //SDA=1;
 Set_SCL(1);                        //SCL=1;
 Ack_Flag=0;                        //清除應答標志;
 DDRA&=0xbf;                         //設置SDA為輸入
 if(!((PINA & 0x40)>>6))
   {delay(50);
    Set_SCL(0);                        //SCL=0;
    delay(100);}
 else
   {Ack_Flag=1;                        //收到應答;
    delay(50);
    Set_SCL(0);                        //SCL=0;
    delay(100);}
 DDRA |=0xff;                         //重新設置SDA為輸出 
}

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

void Write_Bit1()                      //寫1bit數據: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é)數據Data 
{uchar i;
 for(i=0;i<8;i++)
  {if(Data & 0x80)  Write_Bit1();      //傳輸位從高位到低位,先傳最高位
   else             Write_Bit0();
   Data <<=1;}                         //數據左移            
}

uchar Read_Byte()                      //讀一字節(jié)數據:返回值即讀的數據          
{uchar Read_Data=0xff;             // Read_Data為讀入的數據,初始值為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é)數據****************************//
//向從地址為Slave的IIC器件的Address地址寫一字節(jié)數據Data
void Write_1byte(uchar Slave,uchar Address,uchar Data)
{Start();                         //開始
 Write_Byte(Slave);                 //寫I2C器件地址
 do Check_Ack();                 //檢查應答位
 while(Ack_Flag==1);
 Write_Byte(Address);                  //送寄存器地址
 do Check_Ack();                 //檢查應答位
 while(Ack_Flag==1);
 Write_Byte(Data);                 //寫入一字節(jié)數據
 do Check_Ack();                       //檢查應答位
 while(Ack_Flag==1);
 Stop();                               //停止
}

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

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

 

  • 上一篇: C51寫的公歷轉農歷和星期
  • 下一篇: 128x64液晶KS0108驅動程序(C51)
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網站

    網站經營許可證:浙B2-20080178-1