用PIC16F721 模拟的DS18B20,貌似和外部通信时,外部得到的温度值不定。求批判!
#include <htc.h>
#include "IO.h"
#include "Temperature.h"
bit Rest_Flag = 0;
bit Read_Data = 0;
extern unsigned char BCountL;
/*************************************************
*
* 16M晶振延时3.25US
*
**************************************************/
void delay_us(unsigned int time)
{
do
{
time--;
}while (time > 1);
}
/*************************************************
*
* DQ口涵数方向
*
**************************************************/
void DQ_Direction(unsigned char value)
{
if(value)
DQ_TRIS = DQ_Value; // 输入
else
{
DQ_TRIS &= ~DQ_Value; // 输出 0
DQ &= ~DQ_Value;
}
}
/*************************************************
*
* 主机复位时序的标志位
*
**************************************************/
void Rest_Master_Flag()
{
if( BCountL >= 8 ) // 16M晶振,64US溢出次,512US
{
BCountL = 0;
if( DQ == !DQ_Value) // DQ_Value =1
Rest_Flag = 1;
else
{
Rest_Flag = 0;
}
}
}
/*************************************************
*
* 主机读时序的标志位
*
**************************************************/
void Read_Master_Flag()
{
delay_us(2); // 约延时6个us
if( DQ == !DQ_Value)
{
Read_Data = 1; // 读到的是数据
}
else
{
Read_Data = 0;
}
}
/*************************************************
*
* 从机读到主机传来的数据
*
**************************************************/
unsigned char Read_Byte()
{
unsigned char temp;
unsigned char i;
for(i = 8;i > 0;i--)
{
temp = temp >> 1;
DQ_Direction(0); // 输出低电平
delay_us(9); // 约延时30US
DQ_Direction(1); // 输入
delay_us(9); // 延时30US
if(DQ)
{
temp |= 0x80;
}
delay_us(9); //延时30us
}
return temp;
}
/*************************************************
*
* 从机发送复位函数
*
**************************************************/
void Slave_Rest()
{
DQ_Direction(0); // 输出低
delay_us(61); // 延时200us
DQ = DQ_Value; // 输出高
delay_us(6); // 等待20us
}
/*************************************************
*
* 从机发送写函数
*
**************************************************/
void Slave_Write( unsigned char value)
{
unsigned char i;
unsigned char temp;
DQ_TRIS &= ~DQ_Value; // 输出
for(i = 8;i > 0;i --)
{
DQ &= ~DQ_Value; // 低电平
temp = value & 0x01; // 取低位
delay_us(12); // 延时39US;
if(temp)
{
DQ |= DQ_Value; // 输出高
}
else DQ &= ~DQ_Value; // 输出低
delay_us(12); // 延时39us
DQ |= DQ_Value; // 输出高
delay_us(2); // 延迟6.25US
value = value >> 1;
}
}
/*************************************************
*
* 从机发送温度数据函数
*
**************************************************/
void Send_Temperature_Data()
{
unsigned char BTemp;
unsigned char BTemp_Data;
DQ_Direction(1); // 输入
Rest_Master_Flag();
Read_Master_Flag();
if( ( Rest_Flag == 1) && ( Read_Data == 0) )
{
Slave_Rest();
}
if( Read_Data == 1)
{
BTemp = Read_Byte();
if( BTemp == 0X44)
{
BTemp_Data = Number();
}
if( BTemp == 0XBE)
{
Slave_Write( BTemp_Data );
}
}
}
unsigned short Number()
{
unsigned short Wtemp;
Wtemp = (unsigned short)(60 / 0.0625);
return Wtemp;
} |