在psoc creator里写的读取ds18b20温度数据的程序,显示的值总是00A0,求帮忙看一下哪错了
#include <project.h>
#define uint unsigned int
uint temp; //定义整型的温度数据
float f_temp;
void delay(uint z)//延时
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void dsreset(void) //复位函数
{
uint i;
Pin_1_Write(0);
i=103;
while (i>0) i--;
Pin_1_Write (1);
i=4;
while (i>0)i--;
}
int tempreadbit(void)//读一位数据
{
uint i;
int dat;
Pin_1_Write(0);i++;
Pin_1_Write(1);i++;i++;
dat=Pin_1_Read();
i=8;while(i>0)i--;
return (dat);
}
uint tempread(void)//读一个字节
{
uint i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在dat里
}
return (dat);
}
void tempwritebyte(uint dat)//向DS18B20写一个字节数据函数
{
uint i;
uint j;
int testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
Pin_1_Write(0);
i++;i++;
Pin_1_Write(1);
i=8;while(i>0)i--;
}
else
{
Pin_1_Write(0); //写0
i=8;while(i>0)i--;
Pin_1_Write(1);
i++;i++;
}
}
}
void tempchange(void) //DS18B20开始获取温度并转换
{
dsreset();
delay(1);
tempwritebyte(0xcc); //写跳过读ROM指令
tempwritebyte(0x44); //写温度转换指令
}
uint get_temp() //读取寄存器中存储的温度数据
{
uint a,b;
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread(); //读低8位
b=tempread(); //读高8位
temp=b;
temp<<=8; //两个字节组合为一个字
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为0.0625
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp; //temp是整型
}
int main()
{
LCD_Start();
LCD_PrintString("Temperature: ");
while(1)
{
tempchange();
LCD_Position(1u, 0u);
LCD_PrintInt16(get_temp());
}
} |