首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

msp430 +ds18b20的程序有关问题

2012-05-12 
msp430 +ds18b20的程序问题#include msp430x12x2.htypedef unsigned char uchartypedef unsigned intui

msp430 +ds18b20的程序问题
#include "msp430x12x2.h"
typedef unsigned char uchar;
typedef unsigned int uint;
uchar TMPL,TMPH;
uint j=10; //这里是为了测试,调试的时候是10,但是最后它一直为0,j是得到的温度值。

/**************函数的声明*************************/
 void delay_us(); //延时1.25us
 uchar rest_ds18b20(void); //复位函数 
 uchar read_bit(); //读一位
 void write_bit(char bitval) ; //写一位
 uchar read_byte(); //读一个字节
 void write_byte(uchar val); //写一个字节 
 uint get_temp(); //获得温度
 void display(uint tem) ; //调用显示
/************DS18B20控制引脚定义****************/
#define DQ_OUT P2DIR|=BIT2
#define DQ_IN P2DIR&=~BIT2
#define DQ_H P2OUT|=BIT2
#define DQ_L P2OUT&=~BIT2
#define DQ_DATE (P2IN&BIT2) //读出P2.7口数据 1 OR 0
//延时函数
 void delay_us(uint i)
{
  for(;i>0; i--)
  {
  _NOP();
  }
}

//ds18b20复位子程序
uchar rest_ds18b20(void) 

  uchar ds18b20_rest_flag; 
  delay_us(4); //稍做延时
  DQ_OUT;
  DQ_L; 
  delay_us(500); //480us<T<960us
  DQ_IN; //拉高总线
  delay_us(70); //延时90us
  ds18b20_rest_flag=DQ_DATE;
  delay_us(75); //延时100us
  return ds18b20_rest_flag; //如果stDQ=0则初始化成功 stDQ=1则初始化失败 
}

//读一个位
uchar read_bit()
{
   
  DQ_OUT;
DQ_H;
DQ_L;
delay_us(10); //从时间隙开始延时15us。
return DQ_DATE; //读出的一个位值返回
}
//写一个位
void write_bit(char bitval)
{
  DQ_OUT;
  DQ_L; //先把数据位置0,开始时间隙。
  delay_us(12); //延时16us。
  if(bitval==1)
  DQ_H;
  delay_us(5); //在其余的时间隙保持值。
  DQ_H;

}
//读一个字节

uchar read_byte()
{
  uchar i;
uchar value=0;
for(i=0;i<8;i++)
{
if(read_bit()) //当read_bit()=0时,value=0。
{ //当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
value|=0x01<<i; //按位或|。 有一个为1则为1
 
 
}
delay_us(5) ; //等待剩下时间隙。

}

return value;

}

//写一个字节
void write_byte(uchar val)
{
  //uchar i,temp;
  uchar i,temp;
for(i=0;i<8;i++)
{
 
temp=val>>i;
temp=temp&0x01;
write_bit(temp);
}
delay_us(3);

}

//获得温度的值
uint get_temp()
{
  float f_temp;
  //uint temp; 
  rest_ds18b20(); //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
  write_byte(0xcc); // 写跳过读ROM指令。因为只对一个DB18B20操作。
  write_byte(0xbe); //read_EEROM =0xBE ,读暂存器,读内部RAM中9字节的温度
  TMPL = read_byte(); //读取低字节的8位数据
  TMPH = read_byte(); //读取低字节的8位数据
  temp = TMPH; //把高位的8字节数据 付给temp。
  temp <<= 8; //两个字节为一个字
  temp = temp | TMPL;
  f_temp=temp*0.0625; //温度在寄存器里面是12位,分辨率为:0.0625。
  temp=f_temp*10+0.5; //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
  f_temp=f_temp+0.05;
  return temp;
}
//*****************温度转换函数****************************
void tempchange()
{
  rest_ds18b20();
delay_us(50);
write_byte(0XCC); // 写跳过读ROM指令。因为只对一个DB18B20操作。


write_byte(0x44 ); // 写温度转换指令。

}
void main( void )

  

  WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
  while(1)
  {
  tempchange(); //温度转换函数。
  j=get_temp(); 
  }
}


//问题1:开头说了。
  问题2:这是1232芯片的,是不是上电默认就是DCO呢?我觉得我的那个延时是1.25us。
  谢谢大家啊。

[解决办法]
电路的原因了

热点排行