刚开始学习MSP430单片机,参考网上修改的程序, DS18B20总是初始化失败,端口读入的值总是FFFF。
延时用示波器测的,满足500,改为600US也不好用,请教各位达人,可能是什么原因,谢谢。
/***************DS18B20 Reset&Init*********************/
void Reset_18B20(void)
{
P4DIR|=0x01 ;
OUT_0;//Set output 0 主机首先发出一个480-960微秒的低电平脉冲
DelayNus(50); //500us
OUT_1; //释放数据线(将数据线拉高)
DelayNus(10); //90us
P4DIR&=~BIT0; //BIT0=0X01 P4.0=input
if((P4IN&BIT0)==BIT0)
{ Err_Flag=1; } //失败,一直都是高电平说明总线上无器件应答
else
{
Err_Flag=0; // 有低电平出现说明总线上有器件已做出应答
OUT_1;
}
P4DIR|=BIT0 ; //BIT0=0X01 P4.0=output
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
18b20的读写命令都是低位在先
所以发送或读取数值,首先发送或读取的是数据的最低位
----------------------------------------------------*/
//ds18b20写命令
void write2ds(unsigned char command)
{
unsigned char i;
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay15us();
DQ=command&0x1;//低位在先
Delay15us();
Delay15us();
Delay15us();
DQ=1;
command=command>>1;
Delay1us(1);
}
}
//ds18b20读命令
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char temp;
temp=0;
DQ=1;
Delay1us(1);
for(i=0;i<8;i++)
{
DQ=0;
Delay10us();
DQ=1;
Delay1us(2);
temp=temp>>1;
if(DQ==1)
{
temp=temp+0x80;//先读到最高位,再依次右移
}
Delay15us();
Delay15us();
Delay15us();
}
return(temp);
}
/*---------------------------------------------------------
无论是读还是写操作,开始前一定要复位一下ds18b20.
-----------------------------------------------------------*/
//跳过读序号列号的操作
void SkipRomCode(void)
{
resetpulse(); //复位
write2ds(0xCC);// 跳过读序号列号的操作
}
//启动转换
void StartADC(void)
{
resetpulse(); //复位
write2ds(0xCC);//广播
write2ds(0x44);//启动温度转换,12位,需时700ms
}
//获得温度值
int GetTempValue(void)
{
union{
unsigned char c[2];
int x;
}temp;
SkipRomCode();
write2ds(0xBE);//读取温度值的命令
temp.c[1]=readdatafromds18b20(); //温度低八位
temp.c[0]=readdatafromds18b20(); //温度高八位
StartADC();
if (temp.x<=TEMPTYPE)
temp.x=23*TEMPTYPE; //add by cw 080614 tempdefault value 23 du
return temp.x;
}
初始化还没解决,怎么就到读写了?
不过现在OK了, 忙着别的就忘了来看帖子,谢谢解答,就是那宝贝,吓我一跳
一周热门 更多>