|
我已经把程序写好了··但是读出来的一直都是0,不知道什么原因··请高手解答啊··
#include
extern void delay(unsigned int z); //延时子程序
#define uchar unsigned char
#define uint unsigned int
#define T_CONVER 0x44 //开始温度转换
#define T_CONFIG 0x5f //11位转换
#define T_READ 0xbe //读暂存器
#define T_WRITE 0x4e //写暂存器
#define T_ROM_JMP 0xcc //忽略64ROM地址
#define T_cont 0.0625 //温度转换常数
sbit DQ = P0^0; //DS18B20数据输出端
bit REC_suc = 0; //DS18B20成功复位标志位
bit T_sign; //温度正负符号
float temp = 0; //转换好的温度数值
unsigned char t_bai,t_shi,t_ge,t_feng; //温度转换好的各个位
bit DS18B20_init(); //DS18B20初始化函数
void DS18B20_send(unsigned char in_data); //DS18B20发送一个字节数据函数
unsigned char DS18B20_read(); //从DS18B20读取一个字节函数
void ReadTemperature(); //读取温度数值
void temp_data_turn(float in_data); //温度转换
void Delayus(uchar us)
{
while(us--);
}
bit DS18B20_init()
{
bit tem = 1;
unsigned char i = 1,j = 0;
DQ = 0;
j ++;
DQ = 1;
Delayus(2);
while(REC_suc == 0)
{
DQ = 0;
Delayus(100);
DQ = 1;
Delayus(10); //等待DS18B20作出相应
while(1)
{
i = DQ;
if(i == 0)
{
REC_suc = 1;
tem = i ;
Delayus(70);
break;
}
}
DQ = 1;
}
REC_suc = 0;
return tem;
}
void DS18B20_send(unsigned char in_data)
{
unsigned char i,out_data,k,j = 0;
out_data = in_data;
for(i = 1; i < 9; i++) //串行发送数据
{
DQ = 0;
_nop_();
_nop_();
k = out_data&0x01;
if(k == 0x01) //判断数据 写1
{
DQ = 1;
}
else //写0
{
DQ = 0;
}
Delayus(9); //延时62us
DQ = 1;
out_data = _cror_(out_data,1); //循环左移1位
}
DQ = 1;
}
unsigned char DS18B20_read()
{
unsigned char i,in_data,k,j = 0;
in_data = 0;
for(i = 1; i < 9; i ++) //串行发送数据
{
DQ = 0;
_nop_();
_nop_();
DQ=1;
j ++;
_nop_();
_nop_();
k = DQ; //读DQ端
if(k == 1) //读到的数据是1
{
in_data = in_data|0x01;
}
else
{
in_data = in_data|0x00;
}
Delayus(7); //延时51us
DQ=1;
in_data = _cror_(in_data,1); //循环左移1位
j ++;
}
return(in_data);
}
void ReadTemperature()
{
unsigned char T_L = 0;
unsigned char T_H = 0;
unsigned char k;
DS18B20_init();
DS18B20_send(T_ROM_JMP); // 跳过读序号列号的操作
DS18B20_send(T_CONVER); // 启动温度转换
DS18B20_init();
DS18B20_send(T_ROM_JMP); //跳过读序号列号的操作
DS18B20_send(T_READ); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
T_L=DS18B20_read();
T_H=DS18B20_read();
k = T_H&0xf8;
if(k == 0xf8)
T_sign = 1; //温度是负数
else
T_sign = 0; //温度是正数
T_H = T_H&0x07;
temp = (T_H*256+T_L)*T_cont;
}
void temp_data_turn(float in_data)
{
unsigned int y;
in_data = in_data*10; //数值扩大10倍,精度到0.1
t_bai = in_data/1000;
y = (unsigned int)in_data%1000;
t_shi = y/100;
y = y%100;
t_ge = y/10;
t_feng = y%10;
}
|
|