基於51單片機IIC通訊的PCF8591學習筆記

 

引言

PCF8591 是單電源,低功耗8 位CMOS 數據採集器件,具備4 個模擬輸入、一個輸出和一個串行I2C 總線接口。3 個地址引腳A0、A1 和A2 用於編程硬件地址,容許將最多8 個器件鏈接至I2C總線而不須要額外硬件。PCF8591因爲其使用的簡單方便和集成度高,在單片機應用系統中獲得了普遍的應用,這篇文章是介紹IIC通訊在ADDA轉換芯片PCF8591中的應用。html

關於IIC

IIC總線通訊協議的介紹在"基於51單片機IIC通訊的AT24C02學習筆記"有詳細的介紹。git

關於PCF8591

 

PCF8591是單片、單電源低功耗8位CMOS數據採集器件,具備4個模擬輸入、一個輸出和一個串行I2C總線接口。3個地址引腳A0、A1 和A2 用於編程硬件地址,容許將最多8個器件鏈接至I2C總線而不須要額外硬件。器件的地址、控制和數據經過兩線雙向I2C總線傳輸。器件功能包括多路複用模擬輸入、片上跟蹤和保持功能、8位模數轉換和8位數模擬轉換。最大轉換速率取決於I2C總線的最高速率。算法

PCF8591的操做和AT24C02很是相似,只不過AT24C02是寫入或讀出數據,而PCF8591是AIN端口輸入模擬電壓,而後PCF8591將轉換後的數字量經過IIC總線發送給單片機,或是單片機經過IIC總線給一個數字量,而後PCF8591經過AOUT端口將模擬電壓輸出.編程

控制字格式

最高位默認爲0微信

第6位是選擇是否容許模擬電壓輸出,在DA轉換時設置爲1,AD轉換時設置爲0或1都可markdown

第5/4位是選擇模擬電壓輸出方式,通常選擇00單端輸入方式,其餘的幾種方式以下圖所示併發

 

第3位默認爲0模塊化

第2位是自動增量使能位,若是自動增量(auto-increment)標誌置1,每次A/D 轉換後通道號將自動增長。函數

第1/0爲是在AD轉換時選擇哪個通道輸入的電壓轉換爲數字量.post

PCF8591的器件地址

每個IIC器件都有一個器件地址,來區分不一樣的IIC設備,下面是PCF8591的地址

 

 

它的地址是由1001和A2A1A0組成的,在原理圖中能夠看出,A2A1A0均爲0,因此器件地址爲0x90/0x91,最後一位是讀寫方向位,0表示下一個字節往總線上寫數據,1表示下一個字節從總線上讀取數據.

AD轉換函數

AD轉換即將AIN端口輸入的模擬電壓轉換爲數字量併發送到總線上,能夠知道該函數須要指定輸入的通道,還要將轉換後的數字量返回,因此該函數有返回值,和一個形參

程序實現:

 

 

/*讀取某一個通道轉換後的數字量*/
uchar Read_D(uchar Channel)
{
uchar dat;
start();
write_byte(0x90); //器件地址+0
ack();
write_byte(Channel); //控制字0x01表示通道1
ack();
start();
write_byte(0x91); //器件地址+1,下一個字節要讀取
ack();
dat=read_byte();
ack();
stop();
// AD_led=0; //轉換成功顯示
return dat;
}

 

 

DA轉換函數

DA轉換即將從總線上接收到的數字量經過AOUT輸出,該函數無返回值,有一個形參

程序實現:

 

void Out_A(uchar Digital)				
{
	start();
	write_byte(0x90);				//器件地址+0,下一個字節爲寫入
	ack();
	write_byte(0x40);				//設置控制字			0100 0000 容許模擬輸出,不自增單端
	ack();
	write_byte(Digital);		//將要轉換的數字量寫入
	ack();	
	stop();
//	DA_led=0;							//轉換成功顯示				
}

 

 轉換公式

咱們能夠用一個轉換公式,將AD轉換後的數字量轉換爲對應的電壓值,在數碼管或液晶上顯示,公式以下:

#define fun(x) (int)(5*x/255.0*100+0.5)				//數字電壓x轉換爲模擬電壓的公式

 

 主函數調用

 

        dat1 = Read_D(0x01);			//將通道1(電位器v2)的模擬電壓轉換的數字量讀出
        Out_A(dat1);						//將數字量轉換爲模擬量輸出到led顯示
        dis_Voltage1(fun(dat1));		//數碼管顯示電壓值
        Delay_Ms(5);						//延時緩衝

  這樣就能夠實時顯示輸入的電壓值了.還能夠將電壓值輸出到led亮度顯示出來.這樣就能夠做爲一個簡易的小量程(5v)的電壓表了

總結

從程序能夠看出PCF8591的操做和AT24C02基本一致,就是增長了控制字的內容,相比於其餘的ADDA轉換芯片,它結構簡單,不須要外圍的電路,能夠直接使用,並且容易實現模塊化設計,在大多數單片機系統中ADDA幾乎是不可缺乏的,而PCF8591只須要兩個IO口(時鐘和數據)和電源就能夠實現,大大節省了IO口的使用。

 

關於AT24C02的使用,請看我另外一篇隨筆:「基於51單片機IIC通訊的AT24C02學習筆記

 

參考資料:

PCF8591_百度百科

iic_百度百科

 

 

個人其餘博文:

歡迎你們關注個人我的博客www.wangchaochao.top

或微信掃碼關注個人公衆號

 
 
 
相關文章
相關標籤/搜索