基于msp430g2553的ds18b20程序

Karson.L 2018-02-04 11:32:42
求大神帮帮忙!!!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;
}
...全文
884 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Haiguozhe 2018-02-27
  • 打赏
  • 举报
回复
看看你的延时准不准,一般都是时序问题
fly 100% 2018-02-09
  • 打赏
  • 举报
回复
这种单线的协议时序要求严格,能上个波形图最好了,一般延时不准就读不出来了。
w22net 2018-02-05
  • 打赏
  • 举报
回复
多数是时序问题,用示波器看看

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧