您好,歡迎訪問上海意泓電子科技有限責(zé)任公司網(wǎng)站!
      4新聞資訊
      您的位置: 首頁 ->  新聞資訊 -> 單片機

      ?I2C模擬程序----匯編語言格式

      文章出處:單片機 責(zé)任編輯:上海意泓電子科技有限責(zé)任公司 發(fā)表時間:
      2018
      05-20

      模塊名:I2C總線驅(qū)動    型號:I2C


      功能描述:

      此模塊包括發(fā)送數(shù)據(jù)及接收數(shù)據(jù),應(yīng)答位發(fā)送,并提供了幾個直接面對器件的操作函數(shù),能很
      方便的與用戶程序進行連接并擴展。
          需要注意的是,函數(shù)是采用延時方法產(chǎn)生 SCL 脈沖,對高晶振頻率要做一定的修改??!
          在寫E2PROM的時候一定要延時?。?!
          
      說明:

      1us機器周期,晶振頻率要小于12MHz
      返回 1 則操作成功,返回 0 則操作失敗。
      sla 為器件從地址,suba 為器件子地址。

      *************************************************************************************/

      #include "AT89X52.h"
      #include

      #define   _Nop() _nop_()    //定義空指令

      sbit   SDA = P1^3;     //模擬I2C數(shù)據(jù)傳輸位
      sbit   SCL = P1^2;     //模擬I2C時鐘控制位

      bit   bdata I2C_Ack;    //應(yīng)答標(biāo)志位

       

      /************************************ I2C_Start ************************************

      函數(shù)名:void I2C_Start()
      入口:
      出口:

      功能描述:啟動I2C總線,即發(fā)送I2C初始條件
      調(diào)用函數(shù): 
      全局變量:

      創(chuàng)建者:陳曦    日期:2005-6-15
      修改者:           日期:

      **********************************************************************************/

      void I2C_Start()
      {
      SDA = 1;      //發(fā)送起始條件的數(shù)據(jù)信號
      _Nop();
      SCL = 1;
      _Nop();       //起始條件建立時間大于4.7us,延時
      _Nop();
      _Nop();
      _Nop();
      _Nop();
      SDA = 0;      //發(fā)送起始信號
      _Nop();       //起始條件建立時間大于4us,延時
      _Nop();
      _Nop();
      _Nop();
      _Nop();
      SCL = 0;      //鉗住I2C總線準(zhǔn)備發(fā)送或接收數(shù)據(jù)
      _Nop();
      _Nop();
      }


      /************************************ I2C_Stop ************************************

      函數(shù)名:void I2C_Stop()
      入口:
      出口:

      功能描述:結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件
      調(diào)用函數(shù): 
      全局變量:

      創(chuàng)建者:陳曦   日期:2005-6-15
      修改者:    日期:

      **********************************************************************************/


      void I2C_Stop()
      {
      SDA = 0;      //發(fā)送結(jié)束條件的數(shù)據(jù)信號
      _Nop();
      SCL = 1;      //發(fā)送結(jié)束條件的時鐘信號
      _Nop();       //結(jié)束條件建立時間大于4us,延時
      _Nop();
      _Nop();
      _Nop();
      _Nop();
      SDA = 1;      //發(fā)送I2C總線結(jié)束信號
      _Nop();
      _Nop();
      _Nop();
      _Nop();
      }

      /************************************ I2C_CheckAck ************************************

      函數(shù)名:bit I2C_CheckAck(void)
      入口:
      出口:0(無應(yīng)答),1(有應(yīng)答)

      功能描述:
      檢驗I2C總線應(yīng)答信號,有應(yīng)答則返回1,否則返回0,超時值取255

      調(diào)用函數(shù):void I2C_Stop()
      全局變量:

      創(chuàng)建者:陳曦   日期:2005-6-15
      修改者:          日期:

      **********************************************************************************/

      bit I2C_CheckAck(void)
      {
      uchar errtime = 255;     // 因故障接收方無 Ack,超時值為255
      SDA = 1;
      _Nop();
      _Nop();
      _Nop();
      SCL = 1;
      _Nop();         //時鐘電平周期大于 4 us
      _Nop();
      _Nop();
      _Nop();
      _Nop();
      while(SDA)
      {
         errtime--;
         if(errtime==0)
         {
          I2C_Stop();
          return(0);
         }
      }
      SCL = 0;
      _Nop();
      return(1);
      }

      /************************************ I2C_SendB ************************************

      函數(shù)名:void I2C_SendB(uchar c)
      入口:uchar 型數(shù)據(jù)
      出口:

      功能描述:
      字節(jié)數(shù)據(jù)傳送函數(shù),將數(shù)據(jù) c 發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
      此狀態(tài)位進行操作

      調(diào)用函數(shù):bit I2C_CheckAck()
      全局變量:I2C_Ack

      創(chuàng)建者:陳曦   日期:2005-6-15
      修改者:          日期:

      **********************************************************************************/

      void I2C_SendB(uchar c)
      {
      uchar BitCnt;

      for (BitCnt=0; BitCnt<8; BitCnt++)   //要傳送的數(shù)據(jù)長度為8位
      {
         if((c<   {
          SDA = 1;
         }
         else
         {
          SDA = 0;
         }

         _Nop();
         _Nop();
         SCL = 1;        //置時鐘線為高通知被控器開始接收數(shù)據(jù)位
         _Nop();         //保證時鐘高電平周期大于 4us
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         SCL = 0;
      }

      _Nop();
      _Nop();

      I2C_Ack = I2C_CheckAck();     //檢驗應(yīng)答信號
      _Nop();
      _Nop();
      }


      /************************************ I2C_RcvB ************************************

      函數(shù)名:uchar I2C_RcvB()
      入口:
      出口:uchar型數(shù)據(jù)

      功能描述:
      接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),收完后需要調(diào)用應(yīng)答函數(shù)。

      調(diào)用函數(shù):
      全局變量:

      創(chuàng)建者:陳曦   日期:2005-6-15
      修改者:          日期:

      **********************************************************************************/

      uchar I2C_RcvB()
      {
      uchar retc;
      uchar BitCnt;         //位

      retc = 0;
      SDA = 1;          //置數(shù)據(jù)總線為輸入方式
      for(BitCnt=0;BitCnt<8;BitCnt++)
      {
         _Nop();
         SCL = 0;         //置時鐘線為低準(zhǔn)備接收數(shù)據(jù)位
         _Nop();          //時鐘低電平周期大于4.7us
         _Nop();
         _Nop();
         _Nop();
         _Nop();
         SCL = 1;         //置時鐘線為高使數(shù)據(jù)有效
         _Nop();
         _Nop();
         retc = retc<<1;
         if(SDA==1)
         {
          retc = retc + 1;      //讀數(shù)據(jù)位,接收的數(shù)據(jù)放入retc中
         }
         _Nop();
         _Nop();
      }

      SCL = 0;
      _Nop();
      _Nop();

      return(retc);
      }

      /************************************ I2C_Ackn ************************************

      函數(shù)名:void I2C_Ackn(bit a)
      入口:0或1
      出口:

      功能描述:主控制器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號)
      調(diào)用函數(shù):
      全局變量:

      創(chuàng)建者:陳曦   日期:2005-6-15
      修改者:          日期:

      **********************************************************************************/


      void I2C_Ackn(bit a)
      {
      if(a==0)      //在此發(fā)送應(yīng)答或非應(yīng)答信號
      {
         SDA = 0;
      }
      else
      {
         SDA = 1;
      }
      _Nop();
      _Nop();
      _Nop();
      SCL = 1;
      _Nop();       //時鐘電平周期大于 4 us
      _Nop();
      _Nop();
      _Nop();
      _Nop();
      SCL = 0;      //清時鐘線鉗住I2C總線以便繼續(xù)接收
      _Nop();
      _Nop();
      }

      /******************************** I2C_ISendB ************************************

      函數(shù)名:bit I2C_ISendB(uchar sla, uchar suba, uchar c)
      入口:從器件地址 sla,子地址 suba, 發(fā)送字節(jié) c
      出口:0(操作有誤),1(操作成功)

      功能描述:從啟動總線到發(fā)送地址、數(shù)據(jù),結(jié)束總線的全過程,
           如果返回1,表示操作成功,否則操作有誤。

      調(diào)用函數(shù):I2C_Start(),I2C_SendB(uchar c),I2C_Stop()
      全局變量:I2C_Ack

      創(chuàng)建者:陳曦   日期:2005-6-15
      修改者:           日期:

      **********************************************************************************/

      bit I2C_ISendB(uchar sla, uchar suba, uchar c)
      {
      I2C_Start();     //啟動總線

      I2C_SendB(sla);     //發(fā)送器件地址
      if(!I2C_Ack)
      {
         return(0);
      }

      I2C_SendB(suba);    //發(fā)送器件子地址
      if(!I2C_Ack)
      {
         return(0);
      }

      I2C_SendB(c);     //發(fā)送數(shù)據(jù)
      if(!I2C_Ack)
      {
         return(0);
      }

      I2C_Stop();      //結(jié)束總線
      return(1);
      }

      /********************************** I2C_IRcvB ************************************

      函數(shù)名:bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
      入口:從器件地址 sla, 子地址 suba, 收到的數(shù)據(jù)在 c
      出口:1(操作成功),0(操作有誤)

      功能描述:從啟動總線到發(fā)送地址、讀數(shù)據(jù),結(jié)束總線的全過程。

      調(diào)用函數(shù): I2CS_tart(),
           I2C_SendB(uchar c),
           I2C_RcvB(),
           I2C_Ackn(bit a),
           I2C_Stop()

      全局變量:I2C_Ack

      創(chuàng)建者:陳曦   日期:2005-5-15
      修改者:          日期:

      **********************************************************************************/

      bit I2C_IRcvB(uchar sla, uchar suba, uchar *c)
      {
      I2C_Start();      //啟動總線

      I2C_SendB(sla);
      if(!I2C_Ack)
      {
         return(0);
      }

      I2C_SendB(suba);     //發(fā)送器件子地址
      if(!I2C_Ack)
      {
         return(0);
      }

      I2C_Start();      //重復(fù)起始條件

      I2C_SendB(sla+1);     //發(fā)送讀操作的地址
      if(!I2C_Ack)
      {
         return(0);
      }

      *c = I2C_RcvB();     //讀取數(shù)據(jù)
      I2C_Ackn(1);      //發(fā)送非應(yīng)答位
      I2C_Stop();       //結(jié)束總線
      return(1);
      }


      上海意泓電子科技有限責(zé)任公司 版權(quán)所有 未經(jīng)授權(quán)禁止復(fù)制或鏡像

      CopyRight 2020-2025 www.topsschool.com All rights reserved   滬ICP備2021005866號

      亚洲精品无码va人在线观看,少妇 逼小 水多,国产区免费av,国产精品无码观看

          亚洲免费人成视频| 制服丝袜亚洲经典中文字幕| 99re热久久精品这里都是精品| 免费萌白酱国产一区二区| 2021最新精品无码专区| 最新国产无码在线播放| 日韩免费Av中文字幕人妻| 中文字幕熟妇人妻在线女人视频| 国产欧洲一区二区在线观看| 久久综合久久香蕉网欧美| 蜜月aⅴ欧美日韩国产精品| 国产成年无码中国字幕av片| 亚洲中文无码日韩AV| 婷婷五月综合国产激情| 又粗又深又猛视频国产| 日本成本人片免费久久| 在线亚洲乱码视频| 久久久国产精品2020| 人妻无码中文专区久久综合| 久热热国产久热| 2021年国产精品每日更新| 无码中文字幕伊人| 色综合天天综合网在线观看| 亚洲黄色影院| 扒开腿添十八视频免费| 东京热一区二区无码视频| 免费毛片一区二区三区久久久| 国产在线自在拍91精品| 亚洲成A∨人片在线观看不卡|