bit I2CAddressing(unsigned char addr);
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main(){
bit ack;
unsigned char str[10];
InitLcd1602(); //初始化液晶
ack = I2CAddressing(0x50); //查詢地址為 0x50 的器件
str[0] = ‘5’; //將地址和應(yīng)答值轉(zhuǎn)換為字符串
str[1] = ‘0’;
str[2] = ‘:’;
str[3] = (unsigned char)ack + ‘0’;
str[4] = ‘’;
LcdShowStr(0, 0, str); //顯示到液晶上
ack = I2CAddressing(0x62); //查詢地址為 0x62 的器件
str[0] = ‘6’; //將地址和應(yīng)答值轉(zhuǎn)換為字符串
str[1] = ‘2’;
str[2] = ‘:’;
str[3] = (unsigned char)ack + ‘0’;
str[4] = ‘’;
LcdShowStr(8, 0, str); //顯示到液晶上
while (1);
}
/* 產(chǎn)生總線起始信號 */
void I2CStart(){
I2C_SDA = 1; //首先確保 SDA、SCL 都是高電平
I2C_SCL = 1;
I2CDelay();
I2C_SDA = 0; //先拉低 SDA
I2CDelay();
I2C_SCL = 0; //再拉低 SCL
}
/* 產(chǎn)生總線停止信號 */
void I2CStop(){
I2C_SCL = 0; //首先確保 SDA、SCL 都是低電平
I2C_SDA = 0;
I2CDelay();
I2C_SCL = 1; //先拉高 SCL
I2CDelay();
I2C_SDA = 1; //再拉高 SDA
I2CDelay();
}
/* I2C 總線寫操作,dat-待寫入字節(jié),返回值-從機應(yīng)答位的值 */
bit I2CWrite(unsigned char dat){
bit ack; //用于暫存應(yīng)答位的值
unsigned char mask; //用于探測字節(jié)內(nèi)某一位值的掩碼變量
for (mask=0x80; mask!=0; mask》》=1){ //從高位到低位依次進行
if ((mask&dat) == 0){ //該位的值輸出到 SDA 上
I2C_SDA = 0;
}else{
I2C_SDA = 1;
}
I2CDelay();
}
I2C_SCL = 1; //拉高 SCL
I2CDelay();
I2C_SCL = 0; //再拉低 SCL,完成一個位周期
I2C_SDA = 1; //8 位數(shù)據(jù)發(fā)送完后,主機釋放 SDA,以檢測從機應(yīng)答
I2CDelay();
I2C_SCL = 1; //拉高 SCL
ack = I2C_SDA; //讀取此時的 SDA 值,即為從機的應(yīng)答值
I2CDelay();
I2C_SCL = 0; //再拉低 SCL 完成應(yīng)答位,并保持住總線
return ack; //返回從機應(yīng)答值
}
/* I2C 尋址函數(shù),即檢查地址為 addr 的器件是否存在,返回值-從器件應(yīng)答值 */
bit I2CAddressing(unsigned char addr){
bit ack;
I2CStart(); //產(chǎn)生起始位,即啟動一次總線操作
//器件地址需左移一位,因?qū)ぶ访畹淖畹臀?/p>
//為讀寫位,用于表示之后的操作是讀或?qū)?/p>
ack = I2CWrite(addr《《1);
I2CStop(); //不需進行后續(xù)讀寫,而直接停止本次總線操作
return ack;
}
我們把這個程序在 KST-51開發(fā)板上運行完畢,會在液晶上邊顯示出來我們預(yù)想的結(jié)果,主機發(fā)送一個存在的從機地址,從機會回復(fù)一個應(yīng)答位,即應(yīng)答位為 0;主機如果發(fā)送一個不存在的從機地址,就沒有從機應(yīng)答,即應(yīng)答位為 1。
前面的章節(jié)中已經(jīng)提到利用庫函數(shù)_nop_()可以進行精確延時,一個_nop_()的時間就是一個機器周期,這個庫函數(shù)包含在 intrins.h 這個文件中,如果要使用這個庫函數(shù),只需要在程序最開始,和包含 reg52.h 一樣,include之后,程序中就可以使用這個庫函數(shù)了。
還有一點要提一下,I2C通信分為低速模式 100kbit/s、快速模式 400kbit/s 和高速模式3.4Mbit/s。因為所有的 I2C 器件都支持低速,但卻未必支持另外兩種速度,所以作為通用的I2C 程序我們選擇 100k 這個速率來實現(xiàn),也就是說實際程序產(chǎn)生的時序必須小于等于 100k的時序參數(shù),很明顯也就是要求 SCL 的高低電平持續(xù)時間都不短于 5us,因此我們在時序函數(shù)中通過插入 I2CDelay()這個總線延時函數(shù)(它實際上就是 4 個 NOP 指令,用 define 在文件開頭做了定義),加上改變 SCL 值語句本身占用的至少一個周期,來達到這個速度限制。如果以后需要提高速度,那么只需要減小這里的總線延時時間即可。
此外我們要學(xué)習(xí)一個發(fā)送數(shù)據(jù)的技巧,就是I2C通信時如何將一個字節(jié)的數(shù)據(jù)發(fā)送出去。大家注意函數(shù) I2CWrite 中,用的那個 for 循環(huán)的技巧。for (mask=0x80; mask!=0; mask》》=1),由于 I2C 通信是從高位開始發(fā)送數(shù)據(jù),所以我們先從最高位開始,0x80 和 dat 進行按位與運算,從而得知 dat 第 7 位是 0 還是 1,然后右移一位,也就是變成了用 0x40 和 dat 按位與運算,得到第 6 位是 0 還是 1,一直到第 0 位結(jié)束,最終通過 if 語句,把 dat 的 8 位數(shù)據(jù)依次發(fā)送了出去。其它的邏輯大家對照前邊講到的理論知識,認(rèn)真研究明白就可以了。容-源-電-子-網(wǎng)-為你提供技術(shù)支持
本文地址:http://www.ytjinfuren.com/dz/22/15755085833520.shtml
本文標(biāo)簽:
猜你感興趣:
運用單片機便是了解單片機硬件結(jié)構(gòu),以及內(nèi)部資源的運用,在匯編或C語言中學(xué)會各種功用的初始化設(shè)置,以及完成各種功用的程序編制。 運用按鈕輸入信號,發(fā)光二極管顯現(xiàn)輸出
關(guān)鍵詞:51單片機PIC單片機單片機 所屬欄目:設(shè)計編程
現(xiàn)場總線技術(shù)已經(jīng)廣泛應(yīng)用于工業(yè)控制中,尤其是CAN(Controler Area Nerwork)總線由于具有可靠性高、成本低、容易實現(xiàn)等優(yōu)點,在現(xiàn)場總線實際工程應(yīng)用中占有了較大份額。
關(guān)鍵詞:單片機 所屬欄目:設(shè)計編程
我的答案是:不可以原因如下:一、軟件仿真多用于教學(xué),把更多精力用在軟件的實現(xiàn)上由于學(xué)生學(xué)習(xí)時間寶貴,焊接一套單片機實驗板又比較花時間,并且實驗項目太多,所以為了
關(guān)鍵詞:PIC單片機51單片機單片機 所屬欄目:設(shè)計編程
對于新手來說,首先根據(jù)自己學(xué)的什么樣單片機就選什么類型的單片機,熟悉什么類型的單片機就選什么類型的單片機。因為單片機不僅要設(shè)計電路,還要設(shè)計控制軟件。選自己熟悉的單片機上手最快,也最容易獲得成功。下面介紹如何選擇最適合的單片機。
關(guān)鍵詞: 所屬欄目:設(shè)計編程
單片機晶振的作用是什么
在初學(xué)單片機的時候,總是伴隨很多有關(guān)于晶振的問題,其實晶振就是如同人的心臟,是血液的脈搏,把單片機的晶振問題搞明白了,51單片機的其他問題
關(guān)鍵詞:51單片機PIC單片機單片機 所屬欄目:設(shè)計編程
Keil單片機編程軟件Keil C51是單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯
關(guān)鍵詞:51單片機PIC單片機 所屬欄目:設(shè)計編程
詳解51單片機運行過程 注:1.ROM:只讀存儲器,單片機的只讀存儲區(qū)大多用于存儲程序固又稱程序存儲器。51單片機是EPROM,所謂的EPROM是可擦除的只
關(guān)鍵詞: 所屬欄目:設(shè)計編程
pic單片機和c51有什么區(qū)別(區(qū)別1)總線結(jié)構(gòu):MCS-51單片機的總線結(jié)構(gòu)是馮-諾依曼型,計算機在同一個存儲空間取指令和數(shù)據(jù),兩者不能同時進行;而PIC單片機的總線結(jié)構(gòu)是哈佛結(jié)構(gòu)
關(guān)鍵詞:單片機PIC單片機51單片機 所屬欄目:設(shè)計編程
實例分析51單片機出現(xiàn)故障及解決辦法。詳細如下:
故障現(xiàn)象:做了一個單片機溫度監(jiān)測系統(tǒng),仿真機上一切正常,燒寫芯片無法工作。相關(guān)電路框圖: 用51做處理器,外圍電路如
關(guān)鍵詞:單片機51單片機 所屬欄目:設(shè)計編程
PIC單片機匯編語言指令詳解
pic單片機為最常用單片機之一,許多程序均基于pic單片機進行開發(fā)。因此,熟練pic單片機編程尤為重要。為保證大家能準(zhǔn)確、熟練掌握pic單片機的使
關(guān)鍵詞:PIC單片機單片機 所屬欄目:設(shè)計編程
三種51單片機程序下載方法介紹
一般只能通過三種方式下載程序到單片機中:1.JTAG 2.ISP 3.IAP1.JTAG要使用JTAG方式下載程序,不管是使用J-LINK、ULINK、ST-LINK,只需要把
關(guān)鍵詞:PIC單片機51單片機單片機 所屬欄目:設(shè)計編程
越來越多的測量儀器提供GPIB(General Purpose Intefface Bus)總線接口,通過該總線可以方便快捷地連接帶有GPIB接口的儀器及計算機,組成一個GPlB網(wǎng)絡(luò)。GPIB設(shè)備與計算機連
關(guān)鍵詞:PIC單片機51單片機單片機 所屬欄目:設(shè)計編程
每個單片機系統(tǒng)里都有晶振,全程是叫晶體震蕩器,在單片機系統(tǒng)里晶振的作用非常大,他結(jié)合單片機內(nèi)部的電路,產(chǎn)生單片機所必須的時鐘頻率,單片機的一切指令的執(zhí)行都是建立
關(guān)鍵詞:51單片機PIC單片機單片機 所屬欄目:設(shè)計編程
引言變頻調(diào)速作為交流電機調(diào)速的主要手段已經(jīng)在工業(yè)領(lǐng)域中應(yīng)用的十分廣泛,其具有的調(diào)速范圍寬、穩(wěn)速精度高、動態(tài)響應(yīng)快、適用范圍廣、運行可靠等技術(shù)性能,已逐步取代直流
關(guān)鍵詞:單片機變頻器 所屬欄目:設(shè)計編程
電子密碼鎖按照輸入密碼方式的不同可分為好多種,其中最常用的一種是用數(shù)字鍵盤輸入密碼的電子密碼鎖。這一講主要介紹用ATmega8和LCD1602液晶顯示器等組成的電子密碼鎖,這
關(guān)鍵詞:單片機 所屬欄目:設(shè)計編程
1.實驗任務(wù)如圖所示,監(jiān)視開關(guān)K1(接在P3.0端口上),用發(fā)光二極管L1(接在單片機P1.0端口上)顯示開關(guān)狀態(tài),如果開關(guān)合上,L1亮,開關(guān)打開,L1熄滅。2.電路原理圖3.系統(tǒng)
關(guān)鍵詞:單片機LEDLED電路圖 所屬欄目:設(shè)計編程
近日,有媒體報道稱,北京微電子技術(shù)研究所日前成功研制出國內(nèi)首個自主可控的宇航用千萬門級高性能高可靠FPGA(現(xiàn)場可編程門陣列)芯片。FPGA一直是國內(nèi)的短板,市場基本被
關(guān)鍵詞:單片機 所屬欄目:設(shè)計編程
怎么學(xué)單片機?也?吹接腥苏f學(xué)了好幾個月可就是沒有什么進展。當(dāng)然,受限于每個人受到的教育水平不同和個人理解能力的差異,學(xué)習(xí)起來會有快慢之分,但我感覺最重的就是學(xué)
關(guān)鍵詞:單片機 所屬欄目:設(shè)計編程
在單片機中有一些獨立的存儲單元是用來控制這些器件的,被稱之為特殊功能寄存器(SFR)。 <特殊功能寄存器地址映象表(一)> <特殊功能寄存器地址映象表(二)> <
關(guān)鍵詞:單片機寄存器 所屬欄目:設(shè)計編程
倒立擺作為一種典型的控制系統(tǒng)實驗裝置,具有非線性、自然不穩(wěn)定等特性,常用來作為檢驗?zāi)撤N控制理論或方法是否合理的典型方案。一階倒立擺系統(tǒng)能用多種理論和方法來實現(xiàn)其
關(guān)鍵詞:單片機 所屬欄目:設(shè)計編程