17 4 PCF8591應用程式

2021-07-14 14:58:10 字數 3525 閱讀 4050

pcf8591 的通訊介面是 i2c,那麼程式設計肯定是要符合這個協議的。微控制器對 pcf8591 進行初始化,一共傳送三個位元組即可。第乙個位元組,和 eeprom 類似,是器件位址位元組,其中 7 位代表位址,1 位代表讀寫方向。位址高 4 位固定是 0b1001,低三位是 a2,a1,a0,這三位我們電路上都接了 gnd,因此也就是 0b000,如圖 17-5 所示。

圖 17-5  pcf8591 位址位元組

傳送到 pcf8591 的第二個位元組將被儲存在控制暫存器,用於控制 pcf8591 的功能。其中第 3 位和第 7 位是固定的 0,另外 6 位各自有各自的作用,如圖 17-6 所示,我逐一介紹。

圖17-6  pcf8591 控制位元組

控制位元組的第 6 位是 da 使能位,這一位置 1 表示 da 輸出引腳使能,會產生模擬電壓輸出功能。第 4 位和第 5 位可以實現把 pcf8591 的 4 路模擬輸入配置成單端模式和差分模式,單端模式和差分模式的區別,我們在 17.5 節有介紹,這裡大家只需要知道這兩位是配置 ad輸入方式的控制位即可,如圖 17-7 所示。

圖 17-7  pcf8591 模擬輸入配置方式

控制位元組的第 2 位是自動增量控制位,自動增量的意思就是,比如我們一共有 4 個通道,當我們全部使用的時候,讀完了通道 0,下一次再讀,會自動進入通道 1 進行讀取,不需要我們指定下乙個通道,由於 a/d 每次讀到的資料,都是上一次的轉換結果,所以同學們在使用自動增量功能的時候,要特別注意,當前讀到的是上乙個通道的值。為了保持程式的通用性,我們的**沒有使用這個功能,直接做了乙個通用的程式。

控制位元組的第 0 位和第 1 位就是通道選擇位了,00、01、10、11 代表了從 0 到 3 的一共4 個通道選擇。

傳送給 pcf8591 的第三個位元組 d/a 資料暫存器,表示 d/a 模擬輸出的電壓值。d/a 模擬我們一會介紹,大家知道這個位元組的作用即可。我們如果僅僅使用 a/d 功能的話,就可以不傳送第三個位元組。

下面我們用乙個程式,把 ain0、ain1、ain3 測到的電壓值顯示在液晶上,同時大家可以轉動電位器,會發現 ain0 的值發生變化。

/***************************lcd1602.c 檔案程式源*******************************/

(此處省略,可參考之前章節的**)

/*****************************i2c.c 檔案程式源*********************************/

(此處省略,可參考之前章節的**)

/*****************************main.c 檔案程式源********************************/

#include

bitflag300ms =1;

//300ms 定時標誌

unsigned

char t0rh =0;

//t0 過載值的高位元組

unsigned

char t0rl =0;

//t0 過載值的低位元組

void

configtimer0

(unsigned

int ms);

unsigned

char

getadcvalue

(unsigned

char chn);

void

valuetostring

(unsigned

char

*str,

unsigned

char val);

extern

void

i2cstart

();extern

void

i2cstop

();extern

unsigned

char

i2creadack

();extern

unsigned

char

i2creadnak

();extern

biti2cwrite

(unsigned

char dat);

extern

void

initlcd1602

();extern

void

lcdshowstr

(unsigned

char x,

unsigned

char y,

unsigned

char

*str);

void

main()}

}/* 讀取當前的 adc 轉換值,chn-adc 通道號 0~3 */

unsigned

char

getadcvalue

(unsigned

char chn)

i2cwrite

(0x40

|chn);

//寫入控制位元組,選擇轉換通道

i2cstart

();i2cwrite

((0x48

<<1)|

0x01

);//定址 pcf8591,指定後續為讀操作

i2creadack

();//先空讀乙個位元組,提供取樣轉換時間

val =

i2creadnak

();//讀取剛剛轉換完的值

i2cstop

();return val;

}/* adc 轉換值轉為實際電壓值的字串形式,str-字串指標,val-ad 轉換值 */

void

valuetostring

(unsigned

char

*str,

unsigned

char val)

/* 配置並啟動 t0,ms-t0 定時時間 */

void

configtimer0

(unsigned

int ms)

/* t0 中斷服務函式,執行 300ms 定時 */

void

interrupttimer0

() interrupt 1

}

細心閱讀程式的同學會發現,程式在進行 a/d 讀取資料的時候,共使用了兩條程式去讀了 2 個位元組:i2creadack(); val = i2creadnak(); pcf8591 的轉換時鐘是 i2c 的 scl,8 個scl 週期完成一次轉換,所以當前的轉換結果總是在下乙個位元組的 8 個 scl 上才能讀出,因此我們這裡第一條語句的作用是產生乙個整體的 scl 時鐘提供給 pcf8591 進行 a/d 轉換,第二次是讀取當前的轉換結果。如果我們只使用第二條語句的話,每次讀到的都是上一次的轉換結果。

ios應用程式和應用程式委託

其實說白了,就是乙個類將自己不願意實現的方法以協議的方式定義,同時在這個類中包含有乙個型別為id 泛型類 的例項變數,如果另乙個類實現了這個協議,那麼另外的這個類就可以作為第乙個類的委託物件,前乙個類將自己不願意實現的類委託給後乙個類。因為第乙個類擁有第二個類的引用,所有第乙個類的例項可以直接呼叫第...

python啟動應用程式和終止應用程式

每天上班,工作需要,電腦上需要每天開機啟動一些軟體,下班時候,需要關掉一些軟體。乙個乙個開啟和關閉貌似是很繁瑣的,於是乎,這個指令碼產生了。系統環境 win7 32位 python 2.7.9 你還需要安裝pywin32。pip install pywin32 啟動應用程式指令碼 coding ut...

應用程式域

一種邊界,它由公共語言執行庫圍繞同一應用程式範圍內建立的物件建立 即,從應用程式入口點開始,沿著物件啟用的序列的任何位置 應用程式域有助於將在乙個應用程式中建立的物件與在其他應用程式中建立的物件隔離,以使執行時行為可以預知。在乙個單獨的程序中可以存在多個應用程式域。以前使用程序邊界來隔離在同一臺計算...