liufeng10101 发表于 2010-12-26 11:35:33

18B20显示455.5 急啊

#include "msp430x14x.h"

//DS18B2O控制引脚定义
#define   DQ_OUTP2DIR|=BIT6
#define   DQ_IN   P2DIR&=~BIT6
#define   DQ_H    P2OUT|=BIT6
#define   DQ_L    P2OUT&=~BIT6
#define   DQ_DATE (P2IN & BIT6)


void delay_us(unsigned int i);//delay 2.5us at 8M
unsigned char rest_ds18b20(void);//DS18B20复位程序
void ReadTemp1820(void);//读取温度
void WriteOneChar(unsigned char value);//写一个字节
unsigned char ReadOneChar(void);



//****************************************************

//读一个字节
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char value = 0;
for (i=0;i<8;i++)
{
value>>=1;
DQ_OUT;
DQ_L;
delay_us(1);
DQ_H; //DQ = 1

DQ_IN;
if(DQ_DATE) value|=0x80;
delay_us(16); //延时40us
DQ_OUT;
DQ_H; //DQ = 1
delay_us(1);
}
return value;
}

//写一个字节
void WriteOneChar(unsigned char value)
{
   unsigned char i=0;
   for(i=0;i<8;i++)
   {
    DQ_OUT;
    DQ_L;
   
    if (value&0x01) DQ_H; //DQ = 1
    delay_us(30); //延时50us 以上
    DQ_H; //DQ = 1
    value>>=1;
   }

}

//;**************************************************
//ds18b20复位子程序
unsigned char rest_ds18b20(void)
{
unsigned char ds18b20_rest_flag;
delay_us(4); //稍做延时
DQ_OUT;
DQ_L;
delay_us(200); //480us<T<960us
DQ_IN; //拉高总线
delay_us(36); //延时90us
ds18b20_rest_flag=DQ_DATE;
delay_us(40); //延时100us
return ds18b20_rest_flag; //如果stDQ=0则初始化成功 stDQ=1则初始化失败
}
      
//***************************************************
//2.5us延时程序      
void delay_us(unsigned int i)//delay 2.5us at 8M
{
   unsigned int ii;
   for(ii =i;ii > 0;ii--)
   {
      _NOP();_NOP();_NOP();_NOP();   
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();
      _NOP();_NOP();_NOP();_NOP();   
   }   
}


//******************************************************
//352微秒延时程序
void delay_352us(unsigned int i)//352us延时程序,延时时间的计算在前面已经讲过
{
unsigned char j;

while(i--)
{
   for(j=0;j<255;j++)
   {
    _NOP();
    _NOP();
    _NOP();
    _NOP();   
    }
}
}


//读取温度
unsigned long temp32;
void ReadTemp18B20(void)
{
   unsigned char templ,temph;
   while(rest_ds18b20());   
   WriteOneChar(0xcc); //跳过读序列号的操作
   WriteOneChar(0x44); //启动温度转换
   delay_us(10);

   while(rest_ds18b20());
   WriteOneChar(0xcc); //跳过读序列号的操作
   WriteOneChar(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
   templ=ReadOneChar();
   temph=ReadOneChar();
   temp32=temph*256+templ;//执行这句程序后,temp32/16就是温度
//   return temp32;
}

liufeng10101 发表于 2010-12-27 15:05:10

没人吗

taotaoliu 发表于 2010-12-27 15:47:01

看不明白呀

285676818 发表于 2010-12-27 16:45:45

没看你的程序,改程序比写程序费劲
坛里有范例程序,18B20或2401大都是延时问题,看看说明书里时序图,还有晶振多大,时间误差多大。

liufeng10101 发表于 2010-12-29 08:08:45

晶振8M

millwood0 发表于 2010-12-29 08:15:51

"急啊"

you deserve it.

maybe next time, you will learn to plan ahead.

exploer 发表于 2010-12-29 08:41:49

回复【5楼】millwood0
-----------------------------------------------------------------------

millwood0 还是这么酷。

liufeng10101 发表于 2010-12-29 14:10:16

我加上个按键中断,位什么显示一切OK,那应该证明时序没问题吧,但是不加按键的话,数值现在在10.5每次仿真变一个数,为什么啊
页: [1]
查看完整版本: 18B20显示455.5 急啊