日韩欧美自拍在线观看-欧美精品在线看片一区二区-高清性视频一区二区播放-欧美日韩女优制服另类-国产精品久久久久久av蜜臀-成人在线黄色av网站-肥臀熟妇一区二区三区-亚洲视频在线播放老色-在线成人激情自拍视频

輕松學(xué)PIC之I2C總線篇

出處:chenbintom 發(fā)布于:2011-08-31 11:56:45

  大家好,通過前一期的學(xué)習(xí),我們已經(jīng)對(duì)ICD2 仿真燒寫器和增強(qiáng)型PIC 實(shí)驗(yàn)板的使用方法及學(xué)習(xí)方式有所了解與熟悉,學(xué)會(huì)了如何用單片機(jī)來控制發(fā)光管、繼電器、蜂鳴器、按鍵、數(shù)碼管、RS232 串口、步進(jìn)電機(jī)、溫度傳感器等資源,體會(huì)到了學(xué)習(xí)板的易用性與易學(xué)性,看了前幾期實(shí)例,當(dāng)你實(shí)驗(yàn)成功后一定很興奮,很有成就感吧!現(xiàn)在我們就趁熱打鐵,再向上跨一步,一起來學(xué)習(xí)一下I2C 總線的工作原理及使用方法,這樣我們可以將一些我們要保存的數(shù)據(jù)存儲(chǔ)到I2C總線的非易失存儲(chǔ)器中,實(shí)現(xiàn)斷電保持的功能,比如:你設(shè)置了一個(gè)密碼,但不至于這個(gè)設(shè)備斷過電以后就要重新設(shè)置過,我們可以將密碼數(shù)據(jù)寫在非易失存儲(chǔ)器里面,還有如汽車的量程表的讀數(shù)是不斷累計(jì)的,可以通過不斷訪問I2C 存儲(chǔ)器實(shí)現(xiàn)。

  一、I2C總線特點(diǎn)

  I2C 總線是主從結(jié)構(gòu),單片機(jī)是主器件,存儲(chǔ)器是從器件。一條總線可以帶多個(gè)從器件( 也可以有多主結(jié)構(gòu)),I2C 總線的SDA 和SCL 是雙向的,開路門結(jié)構(gòu),通過上拉電阻接正電源。進(jìn)行數(shù)據(jù)傳輸時(shí),SDA 線上的數(shù)據(jù)必須在時(shí)鐘的高電平周期保持穩(wěn)定。數(shù)據(jù)線的高或低電平狀態(tài)只有在SCL 線的時(shí)鐘信號(hào)是低電平時(shí)才能改變,如圖1 所示。

圖1 數(shù)據(jù)位的有效性規(guī)定

圖1 數(shù)據(jù)位的有效性規(guī)定

  在SCL 線是高電平時(shí),SDA 線從高電平向低電平切換表示起始條件;當(dāng)SCL 是高電平時(shí)SDA 線由低電平向高電平切換表示停止條件如圖2 所示。

圖2 起始和停止信號(hào)

圖2 起始和停止信號(hào)

  發(fā)送到SDA 線上的每個(gè)字節(jié)必須為8 位。

  可以由高位到低位傳輸多個(gè)字節(jié)。每個(gè)字節(jié)后必須跟一個(gè)響應(yīng)位(ACK)。響應(yīng)時(shí)鐘脈沖由主機(jī)產(chǎn)生。主機(jī)釋放SDA 線從機(jī)將SDA 線拉低,并在時(shí)鐘脈沖的高電平期間保持穩(wěn)定。如圖3 示。當(dāng)主機(jī)接受數(shù)據(jù)時(shí),它收到一個(gè)數(shù)據(jù)字節(jié)后,必須向從機(jī)發(fā)出一個(gè)結(jié)束傳送的信號(hào)。這個(gè)信號(hào)是由主機(jī)對(duì)從機(jī)的“非應(yīng)答”來實(shí)現(xiàn)的。然后,從機(jī)釋放SDA 線,以允許主機(jī)產(chǎn)生終止或重復(fù)起始信號(hào)。

圖3 字節(jié)格式與應(yīng)答

圖3 字節(jié)格式與應(yīng)答

  二、數(shù)據(jù)幀格式

 ?。?)主機(jī)向從機(jī)發(fā)送數(shù)據(jù),數(shù)據(jù)的傳送方向在傳輸過程中不改變,如圖4 所示。

圖4 主機(jī)向從機(jī)發(fā)送數(shù)據(jù)

圖4 主機(jī)向從機(jī)發(fā)送數(shù)據(jù)

  注:陰影部分:表示主機(jī)向從機(jī)發(fā)送數(shù)據(jù);無陰影部分:表示主機(jī)向從機(jī)讀取數(shù)據(jù)。

  A:表示應(yīng)答; :表示非應(yīng)答。S:起始信號(hào);P :終止信號(hào)。

 ?。?)主機(jī)在個(gè)字節(jié)后,立即向從機(jī)讀取數(shù)據(jù),如圖5 所示。

圖5 主機(jī)在個(gè)字節(jié)后立即讀從機(jī)

圖5 主機(jī)在個(gè)字節(jié)后立即讀從機(jī)

 ?。?)復(fù)合格式,如圖6 所示。傳輸改變方向的時(shí)候,起始條件和從機(jī)地址都會(huì)被重復(fù),但R/ W- 位取反。如果主機(jī)接收器發(fā)送一個(gè)停止或重復(fù)起始信號(hào),它之前應(yīng)該發(fā)送了一個(gè)不響應(yīng)信號(hào)(  )。

圖6 復(fù)合格式

圖6 復(fù)合格式

  由以上格式可見,無論哪種傳輸方式,起始信號(hào)、終止信號(hào)和地址均由主機(jī)發(fā)出(圖中陰影部分),數(shù)據(jù)字節(jié)的傳送方向則由尋址字節(jié)中的方向位規(guī)定,每個(gè)字節(jié)的傳送都必須有應(yīng)答位(A 或 )。

  下面通過24C02 實(shí)例在增強(qiáng)型PIC 實(shí)驗(yàn)板上編程,其硬件原理圖如圖7 所示,U7 為實(shí)驗(yàn)板上24C02 芯片,SDA 與單片機(jī)的RB5 口相連,SCL 與單片機(jī)RB4 相連,七段數(shù)碼管D5、D7、D8 組成了顯示單元,字形碼的數(shù)據(jù)通過RC 口送入,各數(shù)碼管的顯示片選信號(hào)分別不同的RA 口進(jìn)行控制。

圖7 讀/ 寫AT24C 系列存儲(chǔ)器原理圖

圖7 讀/ 寫AT24C 系列存儲(chǔ)器原理圖

  在MPLab IDE 軟件中新建工程,加入源程序代碼,同時(shí)進(jìn)行芯片型號(hào)的選擇和配置位的設(shè)置,我們實(shí)驗(yàn)所用的芯片型號(hào)為PIC16F877A。

  編寫的程序代碼如下,其中程序流程圖如圖8 所示。

  三、軟件流程圖

圖8 I2C 總線讀/ 寫數(shù)據(jù)流程圖

圖8 I2C 總線讀/ 寫數(shù)據(jù)流程圖

  四、軟件代碼

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

  /* 目標(biāo)器件:PIC16F877A */

  /* 晶振:4.0MHZ */

  /* 編譯環(huán)境:MPLAB V7.51 */

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

  /**********

  包含頭文件

  **********/

  #include<pic.h>

  /**********

  數(shù)據(jù)定義

  **********/

  #define address 0xa

  #define nop() asm("nop")

  #define OP_READ 0xa1

  // 器件地址以及讀取操作

  #define OP_WRITE 0xa0

  // 器件地址以及寫入操作

  /**********

  端口定義

  **********/

  #define SCL RB4

  #define SDA RB5

  #define SCLIO TRISB4

  #define SDAIO TRISB5

  /**********

  共陰LED 段碼表

  **********/

  const char table[]={0xC0,0xF9,0xA4,0x

  B0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x

  83,0xC6,0xA1,0x86,0x8E};

  /**********

  函數(shù)功能: 延時(shí)子程序

  **********/

  void delay()

  {

  int i;

  for(i=0;i<100;i++)

  {;}

  }

  /**********

  函數(shù)功能: 開始信號(hào)

  **********/

  void start()

  {

  SDA=1;

  nop();

  SCL=1;

  nop();nop();nop();nop();nop();

  SDA=0;

  nop();nop();nop();nop();nop();

  SCL=0;

  nop();nop();

  }

  /**********

  函數(shù)功能: 停止信號(hào)

  **********/

  void stop()

  {

  SDA=0;

  nop();

  SCL=1;

  nop();nop();nop();nop();nop();

  SDA=1;

  nop();nop();nop();nop();

  }

  /**********

  函數(shù)功能: 讀取數(shù)據(jù)

  出口參數(shù):read_data

  **********/

  unsigned char shin()

  {

  unsigned char i,read_data;

  for(i=0;i<8;i++)

  { nop();nop();nop();

  SCL=1;

  nop();nop();

  read_data《=1;

  if(SDA == 1)

  read_data=read_data+1;

  nop();

  SCL=0;

  }

  return(read_data);

  }

  /**********

  函數(shù)功能: 向EEPROM 寫數(shù)據(jù)

  入口參數(shù):write_data

  出口參數(shù):ack_bit

  **********/

  bit shout(unsigned char write_data)

  {

  unsigned char i;

  unsigned char ack_bit;

  for(i = 0; i < 8; i++)

  {

  if(write_data&0x80)

  SDA=1;

  else

  SDA=0;

  nop();

  SCL = 1;

  nop();nop();nop();nop();nop();

  SCL = 0;

  nop();

  write_data 《= 1;

  }

  nop();nop();

  SDA = 1;

  nop();nop();

  SCL = 1;

  nop();nop();nop();

  ack_bit = SDA; // 讀取應(yīng)答

  SCL = 0;

  nop();nop();

  return ack_bit;

  // 返回AT24Cxx 應(yīng)答位

  }

  /**********

  函數(shù)功能: 向指定地址寫數(shù)據(jù)

  入口參數(shù):addr,write_data

  **********/

  void write_byte(unsigned char addr,

  unsigned char write_data)

  {

  start();

  shout(OP_WRITE);

  shout(addr);

  SDAIO = 0;

  // 在寫入數(shù)據(jù)前SDA 應(yīng)設(shè)置為輸出

  shout(write_data);

  stop();

  delay();

  }

  /**********

  函數(shù)功能: 向指定地址讀數(shù)據(jù)

  入口參數(shù):random_addr

  出口參數(shù):read_data

  **********/

  unsigned char read_random(unsigned

  char random_addr)

  { unsigned char read_data;

  start();

  shout(OP_WRITE);

  shout(random_addr);

  start();

  shout(OP_READ);

  SDAIO = 1;

  // 讀取數(shù)據(jù)前SDA 應(yīng)設(shè)置為輸入

  read_data = shin();

  stop();

  return(read_data);

  }

  /**********

  函數(shù)功能: 顯示子程序

  入口參數(shù):k

  **********/

  void display(unsigned char k)

  {

  TRISA=0X00;

  // 設(shè)置A 口全為輸出

  PORTC=table[k/1000];

  // 顯示千位

  PORTA=0xEF;

  delay();

  PORTC=table[k/100%10];

  // 顯示百位

  PORTA=0xDF;

  delay();

  PORTC = table [k/ 10%10] ;

  // 顯示十位

  PORTA=0xFB;

  delay();

  PORTC=table[k%10]; // 顯示個(gè)位

  PORTA=0xF7;

  delay();

  }

  /**********

  函數(shù)功能: 主程序

  **********/

  void main()

  {

  unsigned char eepromdata;

  TRISB=0X00;

  OPTION&=~(1《7);

  // 設(shè)置RB 口內(nèi)部上拉電阻有效

  TRISC=0X00;

  PORTB=0X00;

  PORTC=0xff;

  TRISA=0X00;

  eepromdata=0;

  write_byte(0x01,0x55);

  // 向0x01 地址寫入0x55(85) 的數(shù)據(jù)

  delay();

  write_byte(0x02,0xaa);

  // 向0x02 地址寫入0xAA(170) 的數(shù)據(jù)

  delay();

  eepromdata=read_random(0x02);

  // 讀取其中一個(gè)地址內(nèi)的數(shù)據(jù)來驗(yàn)證

  while(1)

  {

  display(eepromdata);

  }

  }

  編好程序后將編譯好的HEX 碼通過ICD2仿真燒寫器燒入單片機(jī)芯片,上電運(yùn)行,主程序中在0x01 地址寫入了“0x55”, 在0x02 地址寫入了“0xaa”,然后在while 循環(huán)中讀出0x02地址的值,也就是我們之前寫入的“0x55”,讀出后顯示在數(shù)碼管上,我們可以看到數(shù)碼管顯示“170”,即“0xaa”相應(yīng)的十進(jìn)制數(shù)。

  作為初學(xué)者的讀者一定對(duì)有些語句會(huì)有點(diǎn)疑問,可以看程序中的注釋部份,24c 系列IC 數(shù)據(jù)手冊(cè)和源程序相結(jié)合來進(jìn)行分析。有的常用的函數(shù),請(qǐng)參閱在前幾期的教程。

關(guān)鍵詞:輕松學(xué)PIC之I2C總線篇I2C總線

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫(kù)電子市場(chǎng)網(wǎng)”的所有作品,版權(quán)均屬于維庫(kù)電子市場(chǎng)網(wǎng),轉(zhuǎn)載請(qǐng)必須注明維庫(kù)電子市場(chǎng)網(wǎng),http://www.hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(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é)任。

如涉及作品內(nèi)容、版權(quán)等問題,請(qǐng)?jiān)谧髌钒l(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機(jī)號(hào)碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時(shí)間周一至周五
9:00-17:30

關(guān)注官方微信號(hào),
第一時(shí)間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫(kù)提出的寶貴意見,您的參與是維庫(kù)提升服務(wù)的動(dòng)力!意見一經(jīng)采納,將有感恩紅包奉上哦!