MCP9808簡介:

MCP9808實物圖

MCP9808尺寸(單位:英寸)

MCP9808原理圖
這I2C數(shù)字溫度傳感器是一個更準確的/我們見過最精確,具有±0.25°C的典型精度在傳感器的-40°C至+125°C的范圍和精度為+0.0625℃。使用標準I2C任何微控制器。有3個地址引腳,因此您可以連接多達8至單個I2C總線地址不沖突。最重要的是,在較寬的電壓范圍使其與2.7V至5.5V邏輯可用!

基于正點原子IIC實驗的程序(STM32407單片機),寫的mcp9808程序:
#include "mcp9808.h"
#include "delay.h"
void MCP9808_init(void)
{
IIC_Init();
}
//MCP9808 最高精度下的read模式
float MCP9808_ReadTP(void)
{
u8 UpperByte, LowerByte;
float Temperature;
IIC_Start();
IIC_Send_Byte(ADDRESSBYTE & 0XFE);//發(fā)送模式
IIC_Wait_Ack();
IIC_Send_Byte(0X05);//TA模式,精度為0.0625
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(ADDRESSBYTE | 0X01);//接收模式
IIC_Wait_Ack();
UpperByte = IIC_Read_Byte(1); //ACK
LowerByte = IIC_Read_Byte(0); //NACK
IIC_Stop();
UpperByte = UpperByte & 0x1F;
if ((UpperByte & 0x10) == 0x10)
{
UpperByte = UpperByte & 0x0F;
Temperature = 256.0 - (UpperByte * 16.0 + LowerByte / 16.0);
}
else
{
Temperature = (UpperByte * 16.0 + LowerByte / 16.0);
}
return Temperature;
}
MCP9808頭文件:
#ifndef __MCP9808_H
#define __MCP9808_H
#include "myiic.h"
#include "sys.h"
#define ADDRESSBYTE 0X30 //地址0011 000X A2、A1、A0不接
void MCP9808_init(void);
float MCP9808_ReadTP(void);
#endif
主函數(shù)main:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "MCP9808.h"
/************************************************
MCP9808溫度傳感器串口測試
MCP9808的SCL口接PB8,SDA口接PB9,alert不接
MCP9808自帶上拉電阻,無須外加
MCP9808的A2、A1、A0不接,從電路原理圖中可以看到它們是下拉接地
默認地址是0X30,0011 A2A1A0X(X=0寫,X=1讀),可通過修改MCP9808.h中的ADDRESSBYTE改變
************************************************/
int main(void)
{
float TP = 0.0;
delay_init(168); //延時函數(shù)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優(yōu)先級分組為組2:2位搶占優(yōu)先級,2位響應優(yōu)先級
uart_init(115200); //串口初始化為115200
LED_Init(); //初始化與LED連接的硬件接口
MCP9808_init();
while(1)
{
LED0 = !LED0;
printf("\r\n溫度實驗測試\r\n");
TP = MCP9808_ReadTP();
printf("%.2f℃\r\n",TP);
delay_ms(500);
}
}
串口顯示:

用手壓在芯片上,溫度明顯提高。
參考:
數(shù)據(jù)手冊下載地址:http://www.adafruit.com/datasheets/MCP9808.pdf