24C08中文資料下載:
24cxx中文資料.pdf
(576.32 KB, 下載次數(shù): 157)
2017-5-5 23:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1. I2C總線概念
I2C(InterIntegrated Circuit Bus)總線是一種雙向二線制總線,是Philps公司推出的串行總線標準(為二線制)。總線上擴展的外圍器件及外設接口通過總線尋址。它的結構簡單,可靠性和抗干擾性能好。目前很多公司都推出了基于I2C總線的外圍器件,例如我們學習板上的24c08芯片,就是一個帶有I2C總線接口的E2PROM存儲器,具有掉電記憶的功能,方便進行數(shù)據(jù)的長期保存。
2. I2C總線結構
I2C總線結構很簡單,只有兩條線,包括一條數(shù)據(jù)線(SDA)和一條串行時鐘線(SCL)。具有I2C接口的器件可以通過這兩根線接到總線上,進行相互之間的信息傳遞。連接到總線的器件具有不同的地址,CPU根據(jù)不同的地址進行識別,從而實現(xiàn)對硬件系統(tǒng)簡單靈活的控制。
一個典型的I2C總線應用系統(tǒng)的組成結構如下圖1所示(假設圖中的微控制器、LCD驅動、E2PROM、ADC各器件都是具有I2C總線接口的器件):
我們知道單片機串行通訊的發(fā)送和接收一般都各用一條線TXD和RXD,而I2C總線的數(shù)據(jù)線既可以發(fā)送也可以接受,工作方式可以通過軟件設置。所以,I2C總線結構的硬件結構非常簡潔。當某器件向總線上發(fā)送信息時,它就是發(fā)送器,而當其從總線上接收信息時,又成為接收器。
3. I2C總線特點
組成系統(tǒng)結構簡單,占用空間小。芯片管腳的數(shù)量少,無需片選信號,價格低,允許若干兼容器件共享總線,應用比較廣泛,總線的長度可達7.6m,傳送速度可達400kbps,標準速率為100kbps,支持多個組件,I2C上所有的設備的SDA,SCL引腳必須外加上拉電阻
4. I2C總線上的數(shù)據(jù)傳送
下面我們看看I2C總線是如何進行數(shù)據(jù)傳送的。我們知道,在一根數(shù)據(jù)線上傳送數(shù)據(jù)時必須一位一位的進行,所以我們首先研究位傳送。
1) 位傳輸
I2C總線每傳送一位數(shù)據(jù)必須有一個時鐘脈沖。被傳送的數(shù)據(jù)在時鐘SCL的高電平期間保持穩(wěn)定,只有在SCL低電平期間才能夠改變,示意圖如下圖1所示,在標準模式下,高低電平寬度必須不小于4.7us。
圖1 位傳輸時序圖
那么是不是所有I2C總線中的信號都必須符合上述的有效性呢?只有兩個例外,就是開始和停止信號。
開始信號:當SCL為高電平時,SDA發(fā)生從高到低的跳變,出現(xiàn)開始信號以后,總線被認為“忙”。
停止信號:當SCL為高電平時,SDA發(fā)生從低到高的跳變,停止信號過后,總線被認為“空閑”。
開始和結束信號的時序圖如下圖所示:
2) 數(shù)據(jù)傳輸?shù)淖止?jié)格式
SDA傳送數(shù)據(jù)是以字節(jié)為單位進行的。每個字節(jié)必須是8位,但是傳輸?shù)淖止?jié)數(shù)量不受限制,首先傳送的是數(shù)據(jù)的最高位。每次傳送一個字節(jié)完畢,必須接收到從機發(fā)出的一個應答位,才能開始下一個字節(jié)的傳輸。如果沒有接受到應答位,主機則產(chǎn)生一個停止條件結束本次的傳送。那么從機應該發(fā)出什么信號算是產(chǎn)生了應答呢?這個過程是這樣的。當主器件傳送一個字節(jié)后,在第9個SCL時鐘內(nèi)置高SDA線,而從器件的響應信號將SDA拉低,從而給出一個應答位。了解了I2C傳輸數(shù)據(jù)的格式,下面我們來研究雙方傳送的協(xié)議問題。
3) I2C數(shù)據(jù)傳輸協(xié)議
I2C總線的數(shù)據(jù)傳輸協(xié)議如下:
(1)、主器件發(fā)出開始信號
(2)、主器件發(fā)出第一個字節(jié),用來選通相應的從器件。其中前7位為地址碼,第8位為方向位(R/W)。方向位為“0”表示發(fā)送,方向位為“1”表示接受。
(3)、從機產(chǎn)生應答信號,進入下一個傳送周期,如果從器件沒有給出應答信號,此時主器件產(chǎn)生一個結束信號使得傳送結束,傳送數(shù)據(jù)無效。
(4)、接下來主、從器件正式進行數(shù)據(jù)的傳送,這時在I2C總線上每次傳送的數(shù)據(jù)字節(jié)數(shù)不限,但每一個字節(jié)必須為8位(傳送的時候先送高位,再送低位)。當一個字節(jié)傳送完畢時,再發(fā)送一個應答位(第9位),如上一條所述,這樣每次傳送一個字節(jié)都需要9個時鐘脈沖。數(shù)據(jù)的傳送過程如下圖所示:
圖2 I2C總線數(shù)據(jù)傳輸協(xié)議
4) 24c08芯片相關介紹
AT24c08是帶有I2C總線接口的E2PROM存儲器,具有掉電記憶的功能,并且可以象普通RAM一樣用程序改寫。它的容量是1024個字節(jié),有A2、A1、A0三位地址,可見I2C總線上可以連接8片AT24c08,它的尋址字節(jié)是1010 A2A1A0 R/W。板上面24c08的電路連接如圖所示:
圖3 24C08的硬件接線圖
我們對引腳的功能作一個簡單的解釋:
VCC,GND: 電源、地引腳
A2A1A0: 地址引腳
SCLK、SDA: 通信引腳
WP: 寫保護引腳
從上面的電路連接知:A2A1A0=000,可見如果要對24c08進行寫操作,尋址字節(jié)是1010 000 0;如果對24c08進行讀操作,尋址字節(jié)是1010 000 1。用單片機的P3.4腳作為串行時鐘線,用P3.5腳作串行數(shù)據(jù)線。
寫過程:
(1)、主機首先發(fā)出開始信號
(2)、發(fā)出寫24c08的尋址字節(jié)1010000 0,即0A0H
(3)、發(fā)數(shù)據(jù)寫入24c08的地址,本例中為01H
(4)、往24c08中寫入數(shù)據(jù),這里是3個字節(jié),分別為48h,0ebh,52h。
(5)、寫完畢發(fā)出停止信號
讀過程:
(1)、主機發(fā)出start信號
(2)、發(fā)寫24c08的尋址字節(jié)1010000 0
(大家可能要問:我們是讀數(shù)據(jù),為什么要發(fā)寫信號呢?這是因為你首先要送出一個信號,說明從24c08中的哪個地址讀取數(shù)據(jù)。)
(3)、發(fā)要讀取的數(shù)據(jù)在24c08中的地址,即01h
(4)、主機發(fā)start信號
(5)、發(fā)讀24c08的尋址字節(jié)1010000 1
(5)、從24 C02中讀取數(shù)據(jù)
(6)、讀取完畢發(fā)出停止信號
5.實例演練
1) 實驗目的
從地址0x00 開始連續(xù)寫入16個數(shù)據(jù)(LED流水燈顯示碼),然后再從地址0x00 開始讀出所寫入的16個數(shù)據(jù),由P0口的LED燈顯示出來(先從右到左流,再從左到右流)。
2) 實驗電路
3) 實驗步驟
將JPLED P0跳線的跳線帽插好
不要插1602LCD 以免干擾P0口LED燈
4) 流程圖
5) C語言源程序
通電后 數(shù)碼管從00開始計數(shù) 每過1秒加1 直到99 計數(shù)。過程中你可以關閉電源,然后再開啟電源,可以看到數(shù)值并沒有從00開始計數(shù),而是從你關閉電源前的數(shù)值開始,這證明我們通過24C08設計的斷電記憶功能的計時器設計成功。按鍵K1鍵 可以使數(shù)值清零 清零后從00開始計數(shù)。
//24c08地址為0xa0
#include <reg52.h>
#define uchar unsigned char
unsigned char codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char sec=0; //定義計數(shù)值,每過1秒,sec加1
unsigned int count; //定時中斷次數(shù)
bit write=0; //寫24C08的標志;
sbit gewei=P2^7; //個位選通定義
sbit shiwei=P2^6; //十位選通定義
/////////24C08讀寫驅動程序////////////////////
sbit scl=P3^4; // 24c08 SCL
sbit sda=P3^5; // 24c08 SDA
sbit K5=P1^4; //清0按鍵
/***********************************************/
void delay() //delay 5us
{ ;; }
/**********************************************/
void delay1(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
/**********************************************/
void start() //開始信號
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
/************************************************/
void stop() //停止信號
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
/**************************************************/
void respons() //應答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
/**************************************************/
void init_24c08() //初始化24C02
{
sda=1;
delay();
scl=1;
delay();
}
/************************************************/
void write_byte(uchar date)
{
uchari,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();
// scl=0;
// delay();
}
scl=0;
delay();
sda=1;
delay();
}
/**********************************************/
uchar read_byte()
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();
}
return k;
}
/*****************************************************************/
void write_24c08(uchar address,uchar shuju) //給指定地址中寫入數(shù)據(jù)
{
start();
write_byte(0xa0); // 最低位為0寫,1讀
respons();
write_byte(address);
respons();
write_byte(shuju);
respons();
stop();
}
/*****************************************************************/
uchar read_24c08(uchar address) //從24c08指定地址中讀出數(shù)據(jù)
{
uchardate;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
returndate;
}
/////////////24C02讀寫驅動程序完/////////////////////
/***********************************************************/
void LEDshow() //LED顯示函數(shù)
{
P0=table[sec/10];
shiwei=0;
delay1(40);
shiwei=1;
P0=table[sec%10];
gewei=0;
delay1(40);
gewei=1;
}
/***********************************************************/
void main(void)
{
TMOD=0x01;//定時器工作在方式1
ET0=1;
EA=1;
init_24c08();//初始化24C08
sec=read_24c08(2);//讀出保存的數(shù)據(jù)賦于sec
TH0=(65536-50000)/256;//對TH0 TL0賦值
TL0=(65536-50000)%256;//使定時器0.05秒中斷一次
TR0=1; //開始計時
while(1)
{
LEDshow();
if(write==1)//判斷計時器是否計時一秒
{
write=0;//清零
write_24c08(2,sec);//在24c08的地址2中寫入數(shù)據(jù)sec
}
if(K5==0){
delay1(10);
if(K5==0){
sec=0;
}
}
}
}
/**************************************************************/
void t0(void) interrupt 1 using 0 //定時中斷服務函數(shù)
{
TH0=(65536-50000)/256;//對TH0 TL0賦值
TL0=(65536-50000)%256;//重裝計數(shù)初值
count++;//每過50ms tcnt加一
if(count==20)//計滿20次(1秒)時
{
count=0;//重新再計
sec++;
write=1;//1秒寫一次24C08
if(sec==100)//定時100秒,在從零開始計時
{sec=0;}
}
}
6 拓展訓練
1)用24C08與1602LCD設計電子密碼鎖
2)12864LCD顯示24C08保存的開機畫面。即運行時,單片機程序從24C08中讀取該畫面并顯示在12864LCD液晶顯示屏上。
|