www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]#define ROMADDRESS0xA0sfr IIC_CON = 0xA0; sbit WP = IIC_CON^5;sfr IIC_INTER = 0x90; sbit SCL = IIC_INTER^6; sbit SDA = IIC_INTER^7;bit ack; /*應(yīng)答標(biāo)志位*/void DelayMs(unsigned char i) { unsigned

#define ROMADDRESS0xA0

sfr IIC_CON = 0xA0;
sbit WP = IIC_CON^5;

sfr IIC_INTER = 0x90;
sbit SCL = IIC_INTER^6;
sbit SDA = IIC_INTER^7;

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

void DelayMs(unsigned char i)
{
unsigned int count;
for(i;i!=0;i--)for(count=6;count!=0;count--);
}
/***********************************************************************/
/*名稱:IIC_Start()
/*說明:啟動(dòng)I2C總線,即發(fā)送I2C起始條件.
/*輸入: 無
/*輸出:無
/***********************************************************************/
void IIC_Start(void)
{
SCL=1;DelayMs(1);
SDA=1;DelayMs(1);
SDA=0;DelayMs(1);/*發(fā)送起始信號(hào)*/
SCL=0;DelayMs(1);/*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */

}
/***********************************************************************/
/*名稱:IIC_Stop()
/*說明:結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
/*輸入: 無
/*輸出:無
/***********************************************************************/
void IIC_Stop(void)
{
SCL=1;DelayMs(1);/*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
SDA=0;DelayMs(1);
SDA=1;DelayMs(1);/*發(fā)送I2C總線結(jié)束信號(hào)*/
SCL=0;DelayMs(1);

}
/***********************************************************************/
/*名稱:IIC_DataSend()
/*說明:將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
ack=1表示發(fā)送數(shù)據(jù)正常; ack=0表示被控器無應(yīng)答或損壞。
/*輸入: cmd 要輸入的指令數(shù)據(jù)
/*輸出:無
/***********************************************************************/
void IIC_DataSend(unsigned char byte)
{
unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)/*要傳送的數(shù)據(jù)長(zhǎng)度為8位*/
{
if(byte&0x80)
SDA=1; /*判斷發(fā)送位*/
else
SDA=0;
DelayMs(1);
SCL=1;DelayMs(1);/*置時(shí)鐘線為高,通知被控器開始發(fā)送數(shù)據(jù)位*/
SCL=0;DelayMs(1);
byte = byte<<1;
}
SDA=0;DelayMs(1); /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
SCL=1;DelayMs(1);
if(SDA==1)
ack=0;
else
ack=1;/*判斷是否接收到應(yīng)答信號(hào)*/
SCL=0;DelayMs(1);
}


/***********************************************************************/
/*名稱:IIC_DataRcv()
/*說明:用來接收從器件傳來的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。
/*輸入: 無
/*輸出:從器件傳來的數(shù)據(jù)
/***********************************************************************/
unsigned char IIC_DataRcv(void)
{
unsigned char BitCnt,Result = 0;

SDA=1;/*置數(shù)據(jù)線為輸入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
SCL=0;DelayMs(1);/*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
SCL=1;DelayMs(1);/*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
Result <<= 1;
if(SDA)
Result++;/*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入Result中 */
}
SCL=0;DelayMs(1);
return Result;
}

/***********************************************************************/
/*名稱:IIC_Ack()
/*說明:主控器進(jìn)行應(yīng)答信號(hào)(可以是應(yīng)答或非應(yīng)答信號(hào),由位參數(shù)a決定)
/*輸入: 應(yīng)答信號(hào)
/*輸出:無
/***********************************************************************/
void IIC_Ack(bit a)
{
if(a)
SDA=1;/*在此發(fā)出應(yīng)答或非應(yīng)答信號(hào) */
else
SDA=0;
Delay(20);
SCL=1;DelayMs(1);/*時(shí)鐘低電平周期大于4μs*/
SCL=0;DelayMs(1);/*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/

}

/***********************************************************************/
/*名稱:IIC_StrWrite()
/*說明:向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)程序
/*輸入: addrh存儲(chǔ)器子地址高8位
/*addrl存儲(chǔ)器子地址低8位
/**str數(shù)據(jù)指針
/*length數(shù)據(jù)長(zhǎng)度
/*輸出:寫入是否成功
/***********************************************************************/
bit IIC_ByteWrite(unsigned char addrh,unsigned char addrl,unsigned char byte)
{
WP = 0;
IIC_Start();/*啟動(dòng)總線*/
IIC_DataSend(ROMADDRESS);/*發(fā)送器件地址*/
if(ack==0)return(0);
IIC_DataSend(addrh);/*發(fā)送存儲(chǔ)器子地址高8位*/
if(ack==0)return(0);
IIC_DataSend(addrl);/*發(fā)送存儲(chǔ)器子地址低8位*/
if(ack==0)return(0);
IIC_DataSend(byte);/*發(fā)送數(shù)據(jù)*/
if(ack==0)return(0);
IIC_Stop();/*結(jié)束總線*/
DelayMs(100);
WP = 1;
return(1);
}

/***********************************************************************/
/*名稱:IIC_StrWrite()
/*說明:向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)程序
/*輸入: addrh存儲(chǔ)器子地址高8位
/*addrl存儲(chǔ)器子地址低8位
/**str數(shù)據(jù)指針
/*length數(shù)據(jù)長(zhǎng)度
/*輸出:寫入是否成功
/***********************************************************************/
bit IIC_StrWrite(unsigned char addrh,unsigned char addrl,unsigned char *str,unsigned char length)
{
unsigned char i;

WP = 0;
IIC_Start();/*啟動(dòng)總線*/
IIC_DataSend(ROMADDRESS);/*發(fā)送器件地址*/
if(ack==0)return(0);
IIC_DataSend(addrh);/*發(fā)送存儲(chǔ)器子地址高8位*/
if(ack==0)return(0);
IIC_DataSend(addrl);/*發(fā)送存儲(chǔ)器子地址低8位*/
if(ack==0)return(0);

for(i=0;i{
IIC_DataSend(*(str++));/*發(fā)送數(shù)據(jù)*/
if(ack==0)return(0);
}
IIC_Stop();/*結(jié)束總線*/
DelayMs(100);
WP = 1;
return(1);
}

/***********************************************************************/
/*名稱:IIC_ByteRead()
/*說明:向有子地址器件讀取單字節(jié)數(shù)據(jù)程序
/*輸入: addrh存儲(chǔ)器子地址高8位
/*addrl存儲(chǔ)器子地址低8位
/*輸出:讀取的數(shù)據(jù)
/***********************************************************************/
bit IIC_ByteRead(unsigned char addrh,unsigned char addrl,unsigned char byte)
{
IIC_Start();/*啟動(dòng)總線*/
IIC_DataSend(ROMADDRESS);/*發(fā)送器件地址*/
if(ack==0)return(0);
IIC_DataSend(addrh);/*發(fā)送存儲(chǔ)器子地址高8位*/
if(ack==0)return(0);
IIC_DataSend(addrl);/*發(fā)送存儲(chǔ)器子地址低8位*/
if(ack==0)return(0);

IIC_Start();/*重新啟動(dòng)總線*/
IIC_DataSend(ROMADDRESS+1);/*設(shè)置讀*/
if(ack==0)return(0);
byte = IIC_DataRcv();/*讀取數(shù)據(jù)*/
IIC_Ack(1);/*發(fā)送非應(yīng)位*/
IIC_Stop();/*結(jié)束總線*/
DelayMs(100);
return(1);
}

/***********************************************************************/
/*名稱:IIC_StrRead()
/*說明:向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)程序
/*輸入: addrh存儲(chǔ)器子地址高8位
/*addrl存儲(chǔ)器子地址低8位
/*輸出:讀取是否成功
/***********************************************************************/
bit IIC_StrRead(unsigned char addrh,unsigned char addrl,unsigned char *str,unsigned char length)
{
unsigned char i;

IIC_Start();/*啟動(dòng)總線*/
IIC_DataSend(ROMADDRESS);/*發(fā)送器件地址*/
if(ack==0)return(0);
IIC_DataSend(addrh);/*發(fā)送存儲(chǔ)器子地址高8位*/
if(ack==0)return(0);
IIC_DataSend(addrl);/*發(fā)送存儲(chǔ)器子地址低8位*/
if(ack==0)return(0);

IIC_Start();/*重新啟動(dòng)總線*/
IIC_DataSend(ROMADDRESS+1);/*設(shè)置讀*/
if(ack==0)return(0);
for(i=0;i{
*(str++) = IIC_DataRcv();/*讀取數(shù)據(jù)*/
IIC_Ack(0);/*發(fā)送就答位*/
}
*str=IIC_DataRcv();/*讀取數(shù)據(jù)*/
IIC_Ack(1);/*發(fā)送非應(yīng)位*/
IIC_Stop();/*結(jié)束總線*/
DelayMs(100);
return(1);
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

單片機(jī)內(nèi)部有很多的特殊功能寄存器,每個(gè)寄存器在單片機(jī)內(nèi)部都分配有唯一的地址,一般我們會(huì)根據(jù)寄存器功能的不同給寄存器賦予各自的名稱,當(dāng)我們需要在程序中操作這些特殊功能寄存器時(shí),必須要在程序的最前面將這些名稱加以聲明,聲明的...

關(guān)鍵字: C51 數(shù)據(jù)類型 擴(kuò)充定義

數(shù)據(jù)元(Data Element),也稱為數(shù)據(jù)元素,是用一組屬性描述其定義、標(biāo)識(shí)、表示和允許值的數(shù)據(jù)單元,在一定語境下,通常用于構(gòu)建一個(gè)語義正確、獨(dú)立且無歧義的特定概念語義的信息單元。數(shù)據(jù)元可以理解為數(shù)據(jù)的基本單元,將若...

關(guān)鍵字: C51 數(shù)據(jù)類型

▼點(diǎn)擊下方名片,關(guān)注公眾號(hào)▼歡迎關(guān)注【玩轉(zhuǎn)單片機(jī)與嵌入式】公眾號(hào),回復(fù)關(guān)鍵字獲取更多免費(fèi)資料?;貜?fù)【加群】,限時(shí)免費(fèi)進(jìn)入知識(shí)共享群;回復(fù)【3D封裝庫】,常用元器件的3D封裝庫;回復(fù)【電容】,獲取電容、元器件選型相關(guān)的內(nèi)容...

關(guān)鍵字: C51 MDK RealView

在Keil C51軟件中51單片機(jī)的中斷服務(wù)和外設(shè)驅(qū)動(dòng)程序的開發(fā)

關(guān)鍵字: keil5 編譯 C51

Intel公司1980年推出了MCS-51系列單片機(jī):集成 8位CPU、4K字節(jié)ROM、128字節(jié)RAM、4個(gè)8位并口、1個(gè)全雙工串行口、2個(gè)16位定時(shí)/計(jì)數(shù)器。尋址范圍64K,并有控制功能較強(qiáng)的布爾處理器。 80C5...

關(guān)鍵字: C51 KEIL 編程

c上標(biāo)3下標(biāo)5怎么算用計(jì)算機(jī),c上標(biāo)3下標(biāo)5怎么算

關(guān)鍵字: C51 KEIL

▼點(diǎn)擊下方名片,關(guān)注公眾號(hào)▼大家好,很高興和各位一起分享我的第16篇原創(chuàng)文章,喜歡和支持我的工程師,一定記得給我點(diǎn)贊、收藏、分享。加微信[xyzn3333]與作者溝通交流,免費(fèi)獲取更多單片機(jī)與嵌入式的海量電子資料。很多初...

關(guān)鍵字: 51單片機(jī) C51

??匆姵鯇W(xué)者要求使用_at_,這是一種謬誤,把C當(dāng)作ASM看待了。在C中變量的定位是編譯器的事情,初學(xué)者只要定義變量和變量的作 用域,編譯器就把一個(gè)固定地址給這個(gè)變量。

關(guān)鍵字: C51 單片機(jī) 誤區(qū) 注意事項(xiàng)

簡(jiǎn)介:編程首要是要考慮程序的可行性,然后是可讀性、可移植性、健壯性以及可測(cè)試性。這是總則。但是很多人忽略了可讀性、可移植性和健壯性(可調(diào)試的方法可能歌不相同),這是不對(duì)的。

關(guān)鍵字: C51 編程規(guī)范 文件配置

如果你用 Keil C51 進(jìn)行編譯,記住一點(diǎn):它不區(qū)分大小寫!!!臥槽,今天編程序那個(gè)調(diào)錯(cuò)啊,就因?yàn)橐粋€(gè)數(shù)組名和一個(gè)變量名完全一樣,只是大小寫不一樣罷了,標(biāo)準(zhǔn) C 我怎么記得這樣可以啊……上網(wǎng)一查,臥槽,Keil C5...

關(guān)鍵字: C51 單片機(jī) 編程要點(diǎn)
關(guān)閉