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