用的是内部8M的时钟。是不是哪里时序不对? 请各位大侠指点
#include "msp430g2553.h"//声明库
/*************************ds18b20程序**************************/
unsigned int tvalue=0;//温度值
void delay_10us(unsigned int t)
{
unsigned int i;
for(i=0;i<t;i++)
__delay_cycles(80);
}
void ds1820rst()/*ds1820复位*/
{
//unsigned char x=0;
//DQ = 1; //DQ复位
P1DIR |=BIT4;
P1OUT |=BIT4;
//delay_18B20(4); //延时
delay_10us(1);
//DQ = 0; //DQ拉低
P1OUT &=~BIT4;
//delay_18B20(100); //精确延时大于480us
delay_10us(50);
//DQ = 1; //拉高
P1OUT |=BIT4;
//delay_18B20(40);
delay_10us(4);
}
unsigned char ds1820rd()/*读数据*/
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
//DQ = 0; //给脉冲信号
P1DIR |=BIT4;
P1OUT &=~BIT4;
dat>>=1;
//DQ = 1; //给脉冲信号
P1OUT |=BIT4;
P1DIR &=~BIT4;
if((P1IN&BIT4)==1)
{
dat|=0x80;
}//第一位拉高
//delay_18B20(10);
else
{
;
}
delay_10us(4);
}
return(dat);
}
void ds1820wr(unsigned char wdata)/*写数据*/
{
unsigned char i=0;
for (i=8; i>0; i--)
{
//DQ = 0;
P1DIR |=BIT4;
P1OUT &=~BIT4;
//DQ = wdata&0x01;//前7位拉低
if((wdata&0x01)==0)
{
P1OUT &=~BIT4;
}
else
{
P1OUT |=BIT4;
}
//delay_18B20(10);
delay_10us(4);
//DQ = 1;
P1OUT |=BIT4;
wdata>>=1;
}
}
unsigned int read_temp()/*读取温度值并转换*/
{
unsigned char a,b;
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
//if(tvalue<0x0fff)
//tflag=0;
//else
// {
//tvalue=~tvalue+1;
//tflag=1;
//}
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
此帖出自
小平头技术问答
一周热门 更多>