基于msp430g2553的ds18b20程序
求大神帮帮忙!!!MSP430G2553写的ds18b20的测温程序,程序能运行,感觉也没什么问题,可是得到的结果一直是0fff,不会改变的。到底是为什么会这样啊??求大神帮忙orz
#include <msp430g2553.h>
#include <intrinsics.h>
//#define unsigned char uchar
//#define unsigned int uint
#define DQ1 P1OUT |= BIT7
#define DQ0 P1OUT &= ~BIT7
#define DQ_in P1DIR &= ~BIT7
#define DQ_out P1DIR |= BIT7
#define DQ_val (P1IN & BIT7)
#define light_out P1DIR |= BIT0
#define light_1 P1OUT |= BIT0
#define light_0 P1OUT &= ~BIT0
unsigned int temp0,temp1,temp2;
void set_time (void);
unsigned char Init_18B20(void);
void Write_18B20(unsigned char wdata);
unsigned char Read_18B20(void);
void Skip(void);
void Convert(void);
void Read_SP(void);
unsigned int Do1Convert(void);
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关狗
set_time();
//循环读数显示
while(1)
{
Disp_Numb(Do1Convert());
}
}
void set_time (void)
{
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL = CALDCO_1MHZ;
}
/*******************************************
函数名称:Init_18B20
功 能:对DS18B20进行复位操作
参 数:无
返回值 :初始化状态标志:1--失败,0--成功
********************************************/
unsigned char Init_18B20(void)
{
unsigned char Error;
DQ_out;
_DINT();
DQ0;
//DelayNus(500);
__delay_cycles(500);//保持低电平480us-960us
DQ1;
__delay_cycles(55);//上拉,持续15-60us
DQ_in;
// _NOP();
if(DQ_val) //检测ds18b20是否发送了存在脉冲(60-240us)
{
Error = 1; //初始化失败
}
else
{
Error = 0; //初始化成功
}
DQ_out;
DQ1;//再拉高
// _EINT();
__delay_cycles(450);//从上拉开始至少480us
return Error;
}
/*******************************************
函数名称:Write_18B20
功 能:向DS18B20写入一个字节的数据//写时间片
参 数:wdata--写入的数据
返回值 :无
********************************************/
void Write_18B20(unsigned char wdata)
{
unsigned char i;
_DINT();
for(i = 0; i < 8;i++)
{
DQ0;
__delay_cycles(6); //延时6us//至少1us
if(wdata & 0X01) DQ1; //在15-60us之间对I/O口电平采样,高为1,低为0
else DQ0; //写1时,必须在15us内拉高,写0时,低电平至少要保持60us
wdata >>= 1;
__delay_cycles(60); //延时60us//写时间片至少持续60us
DQ1;
__delay_cycles(6); //延时6us//两次写之间至少间隔1us
}
//_EINT();
}
/*******************************************
函数名称:Read_18B20
功 能:从DS18B20读取一个字节的数据//读时间片
参 数:无
返回值 :读出的一个字节数据
********************************************/
unsigned char Read_18B20(void)
{
unsigned char i;
unsigned char t = 0;
_DINT();
for(i = 0;i < 8;i++)
{
t >>= 1;
DQ0;
__delay_cycles(6); //延时3us//至少1us
DQ1; //延时11us//加上上面的最好等于15us
DQ_in;
// _NOP();
__delay_cycles(10);
if(DQ_val)
{
t |= 0x80; //读时间片,如果输入为1.就最高位置1
}// else t |=0x00;
__delay_cycles(60); //延时50us //一个周期至少持续60us
DQ_out;
// DQ1;
__delay_cycles(6); //延时3us//两次读时间片间最少间隔1us
}
// _EINT();
return t;
}
/*******************************************
函数名称:Skip
功 能:发送跳过读取产品ID号命令
参 数:无
返回值 :无
********************************************/
void Skip(void)
{
Write_18B20(0xCC);
}
/*******************************************
函数名称:Convert
功 能:发送温度转换命令
参 数:无
返回值 :无
********************************************/
void Convert(void)
{
Write_18B20(0x44);
}
/*******************************************
函数名称:Read_SP
功 能:发送读ScratchPad命令
参 数:无
返回值 :无
********************************************/
void Read_SP(void)
{
Write_18B20(0xBE);
}
/*******************************************
函数名称:ReadTemp
功 能:从DS18B20的ScratchPad读取温度转换结果
参 数:无
返回值 :读取的温度数值
********************************************/
unsigned int ReadTemp(void)
{
unsigned int temp_l,temp_h;
unsigned int temp;
temp_l = Read_18B20(); //读低位
temp_h = Read_18B20(); //读高位
temp = (temp_h<<8) + temp_l;
temp1 = temp_h<<8;
temp2 = temp_l;
temp = temp/16;
return temp;
}
/*******************************************
函数名称:ReadTemp
功 能:控制DS18B20完成一次温度转换
参 数:无
返回值 :测量的温度数值
********************************************/
unsigned int Do1Convert(void)
{
unsigned char i;
// unsigned int temp0;
do
{
i = Init_18B20();
}
while(i);
Skip();
Convert();
/* light_out;
light_1;
__delay_cycles(1000000); //高电平持续至少2S
light_0;*/
__delay_cycles(800000);
do
{
i = Init_18B20();
}
while(i);
Skip();
Read_SP();
temp0=ReadTemp();
do
{
i = Init_18B20();
}
while(i);
return temp0;
}