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。
谢谢大家啊。
[解决办法]
电路的原因了