91视频丝瓜-91视频完整版高清-91视频网-91视频网店-91视频网或将从此无大神-91视频网入口

您好,歡迎訪問上?,F易電子元器件有限公司網站!

021-51870898
021-51870898   18019251567
您的位置: 首頁 ->  新聞資訊 -> 單片機

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

文章出處:單片機 責任編輯:上?,F易電子元器件有限公司 發表時間:2018-05-20

模塊名:I2C總線驅動    型號:I2C


功能描述:

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

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

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

#include "AT89X52.h"
#include

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

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

bit   bdata I2C_Ack;    //應答標志位

 

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

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

功能描述:啟動I2C總線,即發送I2C初始條件
調用函數: 
全局變量:

創建者:陳曦    日期:2005-6-15
修改者:           日期:

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

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


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

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

功能描述:結束I2C總線,即發送I2C結束條件
調用函數: 
全局變量:

創建者:陳曦   日期:2005-6-15
修改者:    日期:

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


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

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

函數名:bit I2C_CheckAck(void)
入口:
出口:0(無應答),1(有應答)

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

調用函數:void I2C_Stop()
全局變量:

創建者:陳曦   日期: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 ************************************

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

功能描述:
字節數據傳送函數,將數據 c 發送出去,可以是地址,也可以是數據,發完后等待應答,并對
此狀態位進行操作

調用函數:bit I2C_CheckAck()
全局變量:I2C_Ack

創建者:陳曦   日期:2005-6-15
修改者:          日期:

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

void I2C_SendB(uchar c)
{
uchar BitCnt;

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

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

_Nop();
_Nop();

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


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

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

功能描述:
接收從器件傳來的數據,并判斷總線錯誤(不發應答信號),收完后需要調用應答函數。

調用函數:
全局變量:

創建者:陳曦   日期:2005-6-15
修改者:          日期:

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

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

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

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

return(retc);
}

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

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

功能描述:主控制器進行應答信號(可以是應答或非應答信號)
調用函數:
全局變量:

創建者:陳曦   日期:2005-6-15
修改者:          日期:

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


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

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

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

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

調用函數:I2C_Start(),I2C_SendB(uchar c),I2C_Stop()
全局變量:I2C_Ack

創建者:陳曦   日期:2005-6-15
修改者:           日期:

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

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

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

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

I2C_SendB(c);     //發送數據
if(!I2C_Ack)
{
   return(0);
}

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

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

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

功能描述:從啟動總線到發送地址、讀數據,結束總線的全過程。

調用函數: I2CS_tart(),
     I2C_SendB(uchar c),
     I2C_RcvB(),
     I2C_Ackn(bit a),
     I2C_Stop()

全局變量:I2C_Ack

創建者:陳曦   日期: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);     //發送器件子地址
if(!I2C_Ack)
{
   return(0);
}

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

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

*c = I2C_RcvB();     //讀取數據
I2C_Ackn(1);      //發送非應答位
I2C_Stop();       //結束總線
return(1);
}


上海現易電子元器件有限公司 版權所有 未經授權禁止復制或鏡像

CopyRight 2020-2025 www.urqm.cn All rights reserved   滬ICP備2020031792號

友情鏈接:

電話

易經理

18019251567

微信

易經理

易經理

頂部

咨詢
主站蜘蛛池模板: 性荡视频播放器在线视频播放 | 又硬又粗进去爽A片免费无码 | 91网站网站网站在线 | 国自产拍偷拍精品啪啪一区二区 | 欧美在线看欧美高清视频免费 | 非洲天堂WWWWXXX | 免费又黄又爽1000禁片 | 国产精品久线观看视频 | 婷婷国产 | caoporn地址 | 日韩视频第二页 | 亚洲精品国产综合AV在线观看 | 国产浓毛大泬熟妇视频 | 丁香花在线影院观看在线播放 | 亚洲欧美强伦一区二区另类 | 日韩做A爰片久久毛片A片毛茸茸 | 国产午夜精品福利 | 亚欧色 | 狼狼色丁香久久女婷婷综合 | 成人精品网 | 美女露出尿口让男生爽痛 | 国产色情乱码久久久久一区二区 | 四房播播在线电影 | 少妇性夜夜春夜夜爽A片 | 国产自偷自拍 | 欧美国产日韩一区二区三区 | 3D肉蒲团之极乐宝鉴8K影院 | 日本欧美大码aⅴ在线播放 日本欧美不卡一区二区三区在线 | 爱啪网亚洲第一福利网站 | 久久99九九99九九99精品 | 毛片久久 | 最近最新中文字幕免费1 | 在线看免费大片45分钟 | 欧美婷婷| 性xxxxbbbb免费播放视频 | 国产GV无码A片在线观看 | 天天躁狠狠躁夜躁2021 | a级毛片在线免费 | 日韩A片无码毛片免费看久久 | 欧美亚洲国产一区 | 欧美女同视频激情 |