1. 程式人生 > >應用PIC16F1938中IIC讀取LM75A溫度

應用PIC16F1938中IIC讀取LM75A溫度

ive 符號位 順序 write ali family pen active 需要

一.概述

LM75A是一個高精度溫度傳感器,精度高達0.125℃,可以采集的溫度範圍是-55℃~125℃。PIC16F1938可以通過IIC通信方式對LM75A裏面的溫度寄存器直接讀取,並可設置相關的配置寄存器。每個LM75A的地址信號前四位是一樣的(由不同生產廠家決定1001),有三位可選的邏輯地址管腳(A0A1A2,因此IIC總線上可以支持同時掛載8LM75A芯片。LM75A有不同的工作模式,正常模式下是監控環境溫度,通過IIC總線讀取;OS輸出模式有兩種可選的工作模式:OS比較模式和OS中斷模式,OS輸出高低電平來判斷溫度是否超過設定閾值,默認情況下溫度閾值為80℃,滯後溫度閾值為75

℃。工作電壓範圍:2.8V~5.5V

二.LM75A管腳

技術分享圖片

三.LM75A內部寄存器

1.溫度寄存器Temp(地址0x00

溫度寄存器中一共有兩個數據字節,高數據字節(MS)和低數據字節(LS),其中高數據字節是溫度數據的整數部分範圍為-25~+125℃,高數據字節第7位是符號位。低數據字節只有高三位有效,即將1℃分為8份,所以精度為0.125℃。

技術分享圖片

下面是手冊上給出的一些溫度值示例。

技術分享圖片

2.配置寄存器Conf(地址0x01

配置寄存器為8位可讀可寫寄存器,功能如下。

B7~B5

B4~B3

B2

B1

B0

保留

OS故障列隊

OS極性

OS比較/中斷

關斷

OS故障列隊:用於故障列隊編程,0,1,2,3,代表隊列值1,2,4,6,默認是0

OS極性:有效電平選擇,1代表OS高有效,0代表OS低有效;

OS比較/中斷:比較中斷模式選擇,1代表OS工作與中斷模式,0代表OS工作於比較模式。

關斷:期間模式選擇,1代表關斷,0代表正常模式。

3.滯後溫度寄存器Thyst(地址0x02

滯後溫度寄存器可讀可寫,提供了溫度下限溫度,默認為75℃。每次采樣溫度到Temp中和下限溫度比較,低於下限溫度會在OS腳做出相應反應。

4.過溫關斷門限溫度寄存器Tos(地址0x03

過溫關斷門限溫度寄存器可讀可寫,提供了溫度上限溫度,默認為80℃。每次采樣溫度到Temp中和上限溫度比較,高於下限溫度會在OS腳做出相應反應。過溫關斷門限溫度寄存器和滯後溫度寄存器均用9位來存儲溫度,分辨率為0.5℃,數據格式如下;

D15

D14~D8

D7

D6~D0

符號位

溫度值

保留

5.地址寄存器Address

地址寄存器的定義如下;

A7~A4

A3~A1

A0

1001

可選邏輯地址

/

A7~A0為固定地址,廠家決定為1001A3~A1可選地址,對應LM75A的三個地址引腳;A0為讀/寫功能位,1為讀取,0位寫入。

四.PIC16F1938IIC通訊模塊

內部集成電路總線(I²C)是多主器件串行數據通信總線。器件可以在主/ 從環境下通信,在該環境下,由主器件發起通信。可通過尋址控制從器件。IIC總線指定兩種信號連接:串行時鐘(SCL)和串行數據(SDA)。

1.PIC16F1938配置IIC

PIC16F1938中的主同步串行端口(MSSP)配置為IIC工作的主發送模式(通過將SSPCON1寄存器中的SSPM1並將SSPEN1),主模式下,SCLSDL均有MCU控制,用戶需要將RC3RC4引腳設為輸入(TRISC3 1TRISC4 1;),設置SCL上的時鐘頻率(通過SSPADD寄存器來設置)

2. PIC16F1938IIC模塊主模式發送序列

  • 用戶通過將SSPCON2 寄存器的SEN 位置1 來產生啟動條件。
  • 啟動條件完成時, SSPIF 由硬件置1
  • SSPIF 由軟件清零。
  • 在發生任何其他操作之前,MSSP 模塊將等待所需的啟動時間。
  • 用戶將要發送的從地址裝入SSPBUF
  • 地址將移出SDA 引腳,直到所有8 位發送完畢。寫SSPBUF 時便開始發送。
  • MSSP 模塊移入來自從器件的ACK 位,並將其值寫入SSPCON2 寄存器的ACKSTAT 位。
  • 在第9 個時鐘周期結束時, MSSP 模塊通過將SSPIF 位置1 產生中斷。
  • 用戶將8 位數據裝入SSPBUF
  • 數據被移出SDA 引腳,直到所有8 位發送完畢。
  • MSSP 模塊移入來自從器件的ACK 位,並將其值寫入SSPCON2 寄存器的ACKSTAT 位。
  • 對於所有發送的數據字節,重復第8-11 步。
  • 用戶通過將SSPCON2 寄存器的PEN RSEN位置1 來產生停止或重復啟動條件。停止/ 重復啟動條件完成時產生中斷。

3. PIC16F1938IIC模塊主模式接受序列

  • 用戶通過將SSPCON2 寄存器的SEN 位置1 來產生啟動條件。
  • 啟動條件完成時, SSPIF 由硬件置1
  • SSPIF 由軟件清零。
  • 用戶將要發送的從地址寫入SSPBUF R/W 位置1
  • 地址將移出SDA 引腳,直到所有8 位發送完畢。寫SSPBUF 便開始發送。
  • MSSP 模塊移入來自從器件的ACK 位,並將其值寫入SSPCON2 寄存器的ACKSTAT 位。
  • 在第9 個時鐘周期結束時, MSSP 模塊通過將SSPIF 位置1 產生中斷。
  • 用戶將SSPCON2 寄存器的RCEN 位置1,且主器件隨著時鐘移入來自從器件的字節。
  • SCL 信號的第8 個下降沿之後,SSPIF BF1
  • 主器件清零SSPIF,並從SSPUF 中讀取接收到的字節,清零BF 位。
  • 主器件在SSPCON2 寄存器的ACKDT 位中設置將要發送給從器件的ACK 值,並通過將ACKEN位置1 發送ACK
  • 主器件隨著時鐘將ACK 移出到從器件, SSPIF1
  • 用戶清零SSPIF
  • 對於每個從從器件接收的字節,重復第8-13 步。
  • 主器件發送非ACK 或停止位以結束通信。

五.使用PIC16F1936讀取LM75A溫度值

從上面的讀取可以看到PIC16F1936IIC模塊每次讀取8位,二LM75A的溫度數據是兩個8位存放在一個地址裏面,因此需要讀取1個字節數據後應答0,再接收第2個數據後主機應答1來停止通過過程。具體讀寫C語言代碼如下:

unsigned char IIC_Read_Byte(void)

{

//Read one byte

unsigned char b;

RCEN = 1; //使能IIC接收模式

while (!SSPIF);

SSPIF = 0;

b = SSPBUF;

BF = 0;

return b;

}

void IIC_Write_Byte(unsigned char d)

{

SSPBUF = d; //將從機地址裝入SSPBUF進行傳送,以準備進行數據讀

while (!SSPIF); //等待發送結束

SSPIF = 0; //SSPIF標誌清0

}

void IIC_ACK(unsigned char x)

{

//The master ACK 0 or 1

ACKDT = (x & 0x01); //ACK 0 or 1, 0 is active

ACKEN = 1; //SDASCL引腳上啟動應答順序,並發送ACKDT數據位

while (!SSPIF); //等待應答發送結束

SSPIF = 0; //SSPIF標誌清0

}

void IIC_Start(void)

{

SEN = 1; // Start signal

do

{

RSEN = 1;

}

while (!SSPIF); //等待啟動結束,如果沒啟動,反復重啟動

SSPIF = 0; //SSPIF標誌清0

}

void IIC_Stop(void)

{

PEN = 1; //產生IIC停止信號

while (!SSPIF); //等待發送結束

SSPIF = 0; //SSPIF標誌清0

}

unsigned int IIC_Read_LM75A(void)

{

unsigned char bytebuf1 = 0;

unsigned char bytebuf2 = 0;

unsigned int temp=0;

IIC_Start();

IIC_Write_Byte(0x91);

bytebuf1 = IIC_Read_Byte();

IIC_ACK(0);

bytebuf2 = IIC_Read_Byte();

IIC_ACK(1);

IIC_Stop();

temp= bytebuf1*256+ bytebuf2;

return temp;

}

應用PIC16F1938中IIC讀取LM75A溫度