📄 ds18b20.c
字号:
//主题:DS18B20程序
//******************************************************************************
#include <msp430x24x.h>
//定义一个位设置,这样可以简化程序编写
#define DQ1 P5OUT|=BIT7 //DQ=1
#define DQ0 P5OUT&=~BIT7 //DQ=0
#define DQIO_OUT P5DIR|=BIT7 //设为输出
#define DQIO_IN P5DIR &= ~BIT7 //设为输入
#define positive 0x0f //正温系数
//定义
unsigned char Error = 0;
float Temper=0.0; //真正有效温度值
int temperature=0; //读取两字节温度数据
unsigned char symbol = 1 ; //温度正负符号
//******************************************************************************
//功能:us 级别延时
// n=10,则延时10*5+6=56uS
//******************************************************************************
void DelayNus(unsigned int n)
{
while(n--){};
}
//******************************************************************************
//功能:写18B20
//******************************************************************************
void Write_18B20(unsigned char n)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ0;
_NOP();_NOP(); //延时5us
_NOP();_NOP();_NOP();
if((n&0X01)==0X01) //DQ=1
DQ1;
else
DQ0; //DQ=0
n=n>>1; //下一位
DelayNus(6); //延时50us 以上
DQ1;
}
}
//******************************************************************************
//功能:读取18B20
//******************************************************************************
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char temp;
for(i=0;i<8;i++)
{
temp=temp>>1; //移向下一位
DQ0;
_NOP(); //延时1us
DQ1;
_NOP();_NOP(); //延时5us
_NOP();
DQIO_IN; //DQ口设为输入
if((P5IN&BIT7)==0) //DQ是否等于0
{
temp=temp&0x7F; //读入DQ为0
}
else
{
temp=temp|0x80; //读入DQ为1
}
DelayNus(5); //延时40us
DQIO_OUT; //DQ口设为输出
DQ1; //DQ输出1
}
return temp; //返回一个数据
}
//******************************************************************************
//复位说明:复位要求主CPU将数据线下拉500us,然后释放,
//当DS18B20收到信号后等待16~60us左右,后发出60~240微秒的存在低脉冲,
//主CPU收到此信号表示复位成功。
//初始化DS18B20
void Init (void)
{
DQ0;
DelayNus(50); //延时500us
DQ1;
DelayNus(10); //延时16~60us
DQIO_IN; //设DQ为输入
if((P5IN&BIT7)==BIT7) //1000 0000b=1f,DQ是否为1
{
Error =1; //失败1
DQIO_OUT; //设DQ为输输出
}
else
{
Error = 0; //初始化成功
DQIO_OUT; //设DQ为输输出
DQ1;
}
}
//******************************************************************************
//指令描述:跳过ROM命令,指定代码为CCH,忽略64位ROM地址,直接向DS1820发温度变换
//命令,适用于单片机工作.
void Skip(void)
{
Write_18B20(0xcc);
}
//******************************************************************************
//指令描述:温度转换命令,指定代码为44H.启动DS1820进行温度转换,12位转换时最长
//为750ms(9位为93.75ms).结果存入内部9字节RAM中.
void Convert (void)
{
Write_18B20(0x44);
}
//******************************************************************************
//指令描述:读暂存器,指定代码为BEH.读内部RAM中9字节的内容.
void ReadDo (void)
{
Write_18B20(0xbe);
}
//******************************************************************************
//读取温度值
void ReadTemp (char temp_low,char temp_high)
{
temp_low = Read_18B20(); //读低位
temp_high = Read_18B20(); //读高位
}
//******************************************************************************
//MCU对DS18B20进行温度转换时,其操作必须满足以下过程:
// 1- 每一次读写之前都要对DS18B20进行复位.
// 2- 完成复位后发送一条ROM命令到DS18B20.
// 3- 最后发送一条RAM命令到DS18B20.
// 以上系列动作是根据DS18B20的通讯协议所得.
//读取温度
void GetTemp(char temp_low,char temp_high)
{
Init(); //DS1820初始化
Skip(); //跳过64位ROM(ROM命令)
Convert(); //转换(RAM命令)
DelayNus(60000); //60000x5us=0.3s
DelayNus(60000); //0.3s
DelayNus(60000); //0.3s
Init(); //DS1820初始化
Skip(); //跳过64位ROM
ReadDo(); //读暂存器
ReadTemp( temp_low,temp_high); //读取温度值
}
//******************************************************************************
//MSP430F14初始化
void Temp_mcuinit(void)
{
P5DIR |=BIT7; //设DQ电时为1
DQ1;
}
//******************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -