JiZzJiZZ国产免费A_国产午夜成人AV在线播放_亚洲欧美在线观看一区二区_91久久久久精品无嫩草影院_欧美高清一区二区三区_欧美日韩国产码高清_亚洲精品国产电影_亚洲AV无码专区亚洲AV桃
廣告招募

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

2025年07月15日 08:46:50      來源:江蘇瑞易通電子科技有限公司 >> 進(jìn)入該公司展臺(tái)      閱讀量:0

分享:

模塊名:I2C總線驅(qū)動(dòng)    型號(hào):I2C


功能描述:

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

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

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

#Include "AT89X52.h"
#Include

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

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

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

 

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

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

功能描述:?jiǎn)?dòng)I2C總線,即發(fā)送I2C初始條件
調(diào)用函數(shù): 
全局變量:

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

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

void I2C_Start()
{
SDA = 1;      //發(fā)送起始條件的數(shù)據(jù)信號(hào)
_Nop();
SCL = 1;
_Nop();       //起始條件建立時(shí)間大于4.7us,延時(shí)
_Nop();
_Nop();
_Nop();
_Nop();
SDA = 0;      //發(fā)送起始信號(hào)
_Nop();       //起始條件建立時(shí)間大于4us,延時(shí)
_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ù)信號(hào)
_Nop();
SCL = 1;      //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
_Nop();       //結(jié)束條件建立時(shí)間大于4us,延時(shí)
_Nop();
_Nop();
_Nop();
_Nop();
SDA = 1;      //發(fā)送I2C總線結(jié)束信號(hào)
_Nop();
_Nop();
_Nop();
_Nop();
}

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

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

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

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

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

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

bit I2C_CheckAck(void)
{
uchar errtime = 255;     // 因故障接收方無 Ack,超時(shí)值為255
SDA = 1;
_Nop();
_Nop();
_Nop();
SCL = 1;
_Nop();         //時(shí)鐘電平周期大于 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)答,并對(duì)
此狀態(tài)位進(jìn)行操作

調(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++)  ="">
{
   if((c
   {
    SDA = 1;
   }
   else
   {
    SDA = 0;
   }

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

_Nop();
_Nop();

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


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

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

功能描述:
接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),收完后需要調(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<>
{
   _Nop();
   SCL = 0;         //置時(shí)鐘線為低準(zhǔn)備接收數(shù)據(jù)位
   _Nop();          //時(shí)鐘低電平周期大于4.7us
   _Nop();
   _Nop();
   _Nop();
   _Nop();
   SCL = 1;         //置時(shí)鐘線為高使數(shù)據(jù)有效
   _Nop();
   _Nop();
   retc = retc<>
   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
出口:

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

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

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


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

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

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

功能描述:從啟動(dòng)總線到發(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();     //啟動(dòng)總線

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(操作有誤)

功能描述:從啟動(dòng)總線到發(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();      //啟動(dòng)總線

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);
}


版權(quán)與免責(zé)聲明:
1.凡本網(wǎng)注明"來源:中美貿(mào)易網(wǎng)"的所有作品,版權(quán)均屬于中美貿(mào)易網(wǎng),轉(zhuǎn)載請(qǐng)必須注明中美貿(mào)易網(wǎng)。違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
2.企業(yè)發(fā)布的公司新聞、技術(shù)文章、資料下載等內(nèi)容,如涉及侵權(quán)、違規(guī)遭投訴的,一律由發(fā)布企業(yè)自行承擔(dān)責(zé)任,本網(wǎng)有權(quán)刪除內(nèi)容并追溯責(zé)任。
3.本網(wǎng)轉(zhuǎn)載并注明自其它來源的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)或證實(shí)其內(nèi)容的真實(shí)性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個(gè)人從本網(wǎng)轉(zhuǎn)載時(shí),必須保留本網(wǎng)注明的作品來源,并自負(fù)版權(quán)等法律責(zé)任。 4.如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系。

JiZzJiZZ国产免费A_国产午夜成人AV在线播放_亚洲欧美在线观看一区二区_91久久久久精品无嫩草影院_欧美高清一区二区三区_欧美日韩国产码高清_亚洲精品国产电影_亚洲AV无码专区亚洲AV桃