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


 

引言

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

關於IIC

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

關於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均可

第5/4位是選擇模擬電壓輸出方式,一般選擇00單端輸入方式,其他的幾種方式如下圖所示

 

第3位默認為0

第2位是自動增量使能位,如果自動增量(auto-increment)標志置1,每次A/D 轉換后通道號將自動增加。

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

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

或微信掃碼關注我的公眾號

 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM