<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    在51上用P1口模擬I2C

    發布時間:2010-9-18 20:06    發布者:conniede
    關鍵詞: 代碼 , 函數 , 模擬
    下面是用普通C51實現的I2C基本電平模擬函數和通用函數。

    /*電平模擬函數和基本讀寫函數
    voidIIC_Start(void);
    voidIIC_Stop(void);
    voidSEND_0(void);
    voidSEND_1(void);
    bitCheck_Acknowledge(void);
    voidWrite_Byte(ucharb)reentrant;
    bitWrite_N_Bytes(uchar*buffer,ucharn)reentrant;
    bitRead_N_Bytes(ucharSlaveAdr,ucharn,uchar*buffer);
    ucharRead_Byte(void)reentrant;
    */

    #include
    #include
    #include
    #include"aiic_51.h"

    sbitSCL=P1^6;
    sbitSDA=P1^7;

    voidDELAY(uintt)
    {
    while(t!=0)
    t--;
    }

    voidIIC_Start(void)
    {
    //啟動I2C總線的函數,當SCL為高電平時使SDA產生一個負跳變
    SDA=1;
    SCL=1;
    DE LAY(DELAY_TIME);

    SDA=0;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
    }

    voidIIC_Stop(void)
    {

    //終止I2C總線,當SCL為高電平時使SDA產生一個正跳變
    SDA=0;
    SCL=1;
    DELAY(DELAY_TIME);
    SDA=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
    }

    voidSEND_0(void)
    {
    //發送0,在SCL為高電平時使SDA信號為低
    SDA=0;
    SCL=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
    }

    voidSEND_1(void)
    {
    //發送1 ,在SCL為高電平時使SDA信號為高
    SDA=1;
    SCL=1;
    DELAY(DELAY_TIME);
    SCL=0;
    DELAY(DELAY_TIME);
    }

    bitCheck_Acknowledge(void)
    {
    //發送完一個字節后檢驗設備的應答信號
    SDA=1;
    SCL=1;
    DELAY(DELAY_TIME/2);
    F0=SDA;
    DELAY(DELAY_TIME/2);
    SCL=0;
    DELAY(DELAY_TIME);
    if(F0==1)
    returnFALSE;
    returnTRUE;
    }

    voidWrite_Byte(ucharb)reentrant
    {
    //向IIC總線寫一個字節
    uchari;
    for(i=0;i<8;i++)
    if((b< SEND_1();
    else
    SEND_0();
    }

    bitWrite_N_Bytes(uchar*buffer,ucharn)reentrantp;
    {
    //向I2C總線寫n個字節
    uchari;
    IIC_Start();

    for(i=0;i {
    Write_Byte(buffer);
    if(!Check_Acknowledge())
    {
    IIC_Stop();
    return(i==n);
    }
    }

    IIC_Stop();
    returnTRUE;
    }

      ; ucharRead_Byte(void)reentrant
    {
    //從I2C總線讀一個字節
    ucharb=0,i;
    for(i=0;i<8;i++)
    {
    SDA=1;//釋放總線
    SCL=1;//接受數據
    DELAY(10);
    F0=SDA;
    DELAY(10);
    SCL=0;
    if(F0==1)
    {
    b=b<<1;
    b=b|0x01;
    }
    else
    b=b<<1;
    }
    returnb;
    }

    bitRead_N_Bytes(ucharSlaveAdr,ucharn,uchar*buffer)
    {
    //從I2C總線讀n個字節
    uchari;
    IIC_Start();
    Write_Byte(SlaveAdr);//向總線發送接收器地址
    if(!Check_Acknowledge())//等待接收器應答信號
    returnFALSE;
    for(i=0;i {
    buffer=Read_Byte();
    if(i!=n)
    SEND_0();//發送應答
    else
    SEND_1();//發送非應答
    }
    IIC_Stop();
      ; returnTRUE;
    }

    使用上述代碼,你可以在51上用P1口模擬I2C
    本文地址:http://www.portaltwn.com/thread-27901-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷