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;
} 没人吗 看不明白呀 没看你的程序,改程序比写程序费劲
坛里有范例程序,18B20或2401大都是延时问题,看看说明书里时序图,还有晶振多大,时间误差多大。 晶振8M "急啊"
you deserve it.
maybe next time, you will learn to plan ahead. 回复【5楼】millwood0
-----------------------------------------------------------------------
millwood0 还是这么酷。 我加上个按键中断,位什么显示一切OK,那应该证明时序没问题吧,但是不加按键的话,数值现在在10.5每次仿真变一个数,为什么啊
页:
[1]