基于51单片机IIC通信的PCF8591学习笔记
引言
PCF8591 是單電源,低功耗8 位CMOS 數(shù)據(jù)采集器件,具有4 個(gè)模擬輸入、一個(gè)輸出和一個(gè)串行I2C 總線接口。3 個(gè)地址引腳A0、A1 和A2 用于編程硬件地址,允許將最多8 個(gè)器件連接至I2C總線而不需要額外硬件。PCF8591由于其使用的簡單方便和集成度高,在單片機(jī)應(yīng)用系統(tǒng)中得到了廣泛的應(yīng)用,這篇文章是介紹IIC通信在ADDA轉(zhuǎn)換芯片PCF8591中的應(yīng)用。
關(guān)于IIC
IIC總線通信協(xié)議的介紹在"基于51單片機(jī)IIC通信的AT24C02學(xué)習(xí)筆記"有詳細(xì)的介紹。
關(guān)于PCF8591
PCF8591是單片、單電源低功耗8位CMOS數(shù)據(jù)采集器件,具有4個(gè)模擬輸入、一個(gè)輸出和一個(gè)串行I2C總線接口。3個(gè)地址引腳A0、A1 和A2 用于編程硬件地址,允許將最多8個(gè)器件連接至I2C總線而不需要額外硬件。器件的地址、控制和數(shù)據(jù)通過兩線雙向I2C總線傳輸。器件功能包括多路復(fù)用模擬輸入、片上跟蹤和保持功能、8位模數(shù)轉(zhuǎn)換和8位數(shù)模擬轉(zhuǎn)換。最大轉(zhuǎn)換速率取決于I2C總線的最高速率。
PCF8591的操作和AT24C02非常類似,只不過AT24C02是寫入或讀出數(shù)據(jù),而PCF8591是AIN端口輸入模擬電壓,然后PCF8591將轉(zhuǎn)換后的數(shù)字量通過IIC總線發(fā)送給單片機(jī),或是單片機(jī)通過IIC總線給一個(gè)數(shù)字量,然后PCF8591通過AOUT端口將模擬電壓輸出.
控制字格式
最高位默認(rèn)為0
第6位是選擇是否允許模擬電壓輸出,在DA轉(zhuǎn)換時(shí)設(shè)置為1,AD轉(zhuǎn)換時(shí)設(shè)置為0或1均可
第5/4位是選擇模擬電壓輸出方式,一般選擇00單端輸入方式,其他的幾種方式如下圖所示
第3位默認(rèn)為0
第2位是自動(dòng)增量使能位,如果自動(dòng)增量(auto-increment)標(biāo)志置1,每次A/D 轉(zhuǎn)換后通道號將自動(dòng)增加。
第1/0為是在AD轉(zhuǎn)換時(shí)選擇哪一個(gè)通道輸入的電壓轉(zhuǎn)換為數(shù)字量.
PCF8591的器件地址
每一個(gè)IIC器件都有一個(gè)器件地址,來區(qū)分不同的IIC設(shè)備,下面是PCF8591的地址
它的地址是由1001和A2A1A0組成的,在原理圖中可以看出,A2A1A0均為0,所以器件地址為0x90/0x91,最后一位是讀寫方向位,0表示下一個(gè)字節(jié)往總線上寫數(shù)據(jù),1表示下一個(gè)字節(jié)從總線上讀取數(shù)據(jù).
AD轉(zhuǎn)換函數(shù)
AD轉(zhuǎn)換即將AIN端口輸入的模擬電壓轉(zhuǎn)換為數(shù)字量并發(fā)送到總線上,可以知道該函數(shù)需要指定輸入的通道,還要將轉(zhuǎn)換后的數(shù)字量返回,所以該函數(shù)有返回值,和一個(gè)形參
程序?qū)崿F(xiàn):
/*讀取某一個(gè)通道轉(zhuǎn)換后的數(shù)字量*/
uchar Read_D(uchar Channel)
{
uchar dat;
start();
write_byte(0x90); //器件地址+0
ack();
write_byte(Channel); //控制字0x01表示通道1
ack();
start();
write_byte(0x91); //器件地址+1,下一個(gè)字節(jié)要讀取
ack();
dat=read_byte();
ack();
stop();
// AD_led=0; //轉(zhuǎn)換成功顯示
return dat;
}
DA轉(zhuǎn)換函數(shù)
DA轉(zhuǎn)換即將從總線上接收到的數(shù)字量通過AOUT輸出,該函數(shù)無返回值,有一個(gè)形參
程序?qū)崿F(xiàn):
void Out_A(uchar Digital)
{
start();
write_byte(0x90); //器件地址+0,下一個(gè)字節(jié)為寫入
ack();
write_byte(0x40); //設(shè)置控制字 0100 0000 允許模擬輸出,不自增單端
ack();
write_byte(Digital); //將要轉(zhuǎn)換的數(shù)字量寫入
ack();
stop();
// DA_led=0; //轉(zhuǎn)換成功顯示
}
轉(zhuǎn)換公式
我們可以用一個(gè)轉(zhuǎn)換公式,將AD轉(zhuǎn)換后的數(shù)字量轉(zhuǎn)換為對應(yīng)的電壓值,在數(shù)碼管或液晶上顯示,公式如下:
#define fun(x) (int)(5*x/255.0*100+0.5) //數(shù)字電壓x轉(zhuǎn)換為模擬電壓的公式
主函數(shù)調(diào)用
dat1 = Read_D(0x01); //將通道1(電位器v2)的模擬電壓轉(zhuǎn)換的數(shù)字量讀出
Out_A(dat1); //將數(shù)字量轉(zhuǎn)換為模擬量輸出到led顯示
dis_Voltage1(fun(dat1)); //數(shù)碼管顯示電壓值
Delay_Ms(5); //延時(shí)緩沖
這樣就可以實(shí)時(shí)顯示輸入的電壓值了.還可以將電壓值輸出到led亮度顯示出來.這樣就可以作為一個(gè)簡易的小量程(5v)的電壓表了
總結(jié)
從程序可以看出PCF8591的操作和AT24C02基本一致,就是增加了控制字的內(nèi)容,相比于其他的ADDA轉(zhuǎn)換芯片,它結(jié)構(gòu)簡單,不需要外圍的電路,可以直接使用,而且容易實(shí)現(xiàn)模塊化設(shè)計(jì),在大多數(shù)單片機(jī)系統(tǒng)中ADDA幾乎是不可缺少的,而PCF8591只需要兩個(gè)IO口(時(shí)鐘和數(shù)據(jù))和電源就可以實(shí)現(xiàn),大大節(jié)省了IO口的使用。
關(guān)于AT24C02的使用,請看我另一篇隨筆:“基于51單片機(jī)IIC通信的AT24C02學(xué)習(xí)筆記”
參考資料:
PCF8591_百度百科
iic_百度百科
我的其他博文:
一鍵自動(dòng)格式化你的代碼
C標(biāo)準(zhǔn)庫string.h中幾個(gè)常用函數(shù)的使用詳解
Jlink使用技巧系列教程索引
Jlink使用技巧之燒寫SPI Flash存儲(chǔ)芯片
Jlink使用技巧之虛擬串口功能
Jlink使用技巧之讀取STM32內(nèi)部的程序
Jlink使用技巧之J-Scope虛擬示波器功能
基于uFUN開發(fā)板的RGB調(diào)色板
基于uFUN開發(fā)板的心率計(jì)(一)DMA方式獲取傳感器數(shù)據(jù)
基于uFUN開發(fā)板的心率計(jì)(二)動(dòng)態(tài)閾值算法獲取心率值
基于uFUN開發(fā)板的心率計(jì)(三)Qt上位機(jī)的實(shí)現(xiàn)
Qt實(shí)現(xiàn)軟件自動(dòng)更新的一種簡單方法
【UFUN開發(fā)板評測】小巧而不失精致,簡單而不失內(nèi)涵——uFun開發(fā)板開箱爆照
如何使用串口來給STM32下載程序
STM32串口打印輸出亂碼的解決辦法
Keil報(bào)錯(cuò):cannot open source input file "core_cmInstr.h" 解決辦法
歡迎大家關(guān)注我的個(gè)人博客:www.wangchaochao.top
或微信掃碼關(guān)注我的公眾號
總結(jié)
以上是生活随笔為你收集整理的基于51单片机IIC通信的PCF8591学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows的全新文件系统:ReFS
- 下一篇: mysql优化之N+1问题