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