Buscando el programa de diseño en lenguaje Keil c para el microcontrolador C8051F310 y el sensor DS18B20
2008-06-30 11:18
/********************* ***** *************************************
* Sensor de temperatura DS18B20*
* C51 *
* yajou 2008-06-28 Sin CRC *
************ ********** ****************************************/
#include " reg51.h"
#include "intrins.h"
#include "DS18B20.h"
/ ************ **************************************** **********
* programa de retraso de EE. UU.*
********************* ******************* **********************/
void Delayus (ucharnos)
{
while(us--); // 12M, 6us una vez, más ingresa a la salida 14us (8M cristal, 9us una vez)
}
/******** ******************************** *************** p>
* Inicialización DS18B20*
* *************** ****************** *************************/
bit Ds18b20_Init(void) //existe devuelve 0, de lo contrario devuelve 1
{
bit temp = 1;
uchar outtime = ReDetectTime;
while(outtime-- amp; amp; temp) p>
{
Delayus(10); //(250)1514us el tiempo se puede acortar p>
ReleaseDQ();
Delay2us();
PullDownDQ();
Delayus(100); //614us(480-960); )
ReleaseDQ();
Retraso( 10); //73us (gt; 60)
temp = dq; Delayus(70); //nosotros
}
temperatura de retorno;
}
/******** **************************** ************* ********** *****
* Escribir bit2DS18B20 *
***** ********************** *******************
**********/
void Ds18b20_WriteBit(bit bitdata)
{
if(bitdata)
{
PullDownDQ();
Delay2us(); //2us(gt; 1us)
ReleaseDQ();
Delayus(12); //86us(45- x, tiempo total gt; 60)
}else
{
PullDownDQ();
Delayus(12); //86us(60-120)
}
LiberaciónDQ(); Delay2us(); //2us(gt; 1us)
}
/************************ ************************************
* Escribir byte DS18B20 * p>
********************************************* * **********/
void Ds18b20_WriteByte(uchar chrdata)
{
uchar ii;
para (ii = 0; ii lt; 8; ii)
{
Ds18b20_WriteByte(chrdata amp; 0x01);
chrdata gt;
}
}
}
/****************** * *****************************************
*Escribir DS18B20 *
*************************************** ********* ************/
//void Ds18b20_Write(uchar *p_readdata, uchar bytes)
// {
/ / while(bytes--)
// {
// Ds18b20_ WriteByte(*p_readdata
/ / p_readdata
> }
/}
// ******************* ********* *******************************
* Leer bits de DS18B20*
*************************************** ***************** *********/
bit Ds18b20_ReadBit(void)
{
bit bitdata;
PullDownDQ()
Delay2us(); //2us( gt; 1us)
ReleaseDQ(); p>
Retraso8us(); //8us( lt; 15us)
bit
data = dq;
Delayus(7); //86us (el tiempo total anterior es gt; 60us)
Devolver bitdata;
}
/****************************************** **** * ********
* Leer los bytes de DS18B20*
****************** ** **************************************/
uchar Ds18b20_ReadByte ( void )
{
uchar ii, chardata
for(ii = 0; ii lt; 8; ii )
{
chardata gt; = 1;
if(Ds18b20_ReadBit()) chardata |= 0x80; chardata
}
/********************************* ****************************
* Leer ROM DS18B20 *
*** ******* ******************************************* *****/
bit Ds18b20_ReadRom(uchar *p_readdata) //devuelve 0 significa éxito, 1 significa fracaso
{
uchar ii = 8;
if(Ds18b20_Init()) devuelve 1;
Ds18b20_WriteByte(ReadROM);
mientras(ii--)
{
*p_ readdata = Ds18b20_ReadByte();
p_readdata
}
Devuelve 0; p>}
/*************************************** ******* *** **********
* Leer DS18B20 EE *
*********** ************ *************************************/
bit Ds18b20_ReadEE(uchar *p_ readdata) //Devuelve 0 en caso de éxito, 1 en caso de error
{
uchar ii = 2;
if(Ds18b20_Init()) devuelve 1;
Ds18b20_WriteByte(SkipROM);
Ds18b20_WriteByte(ReadScr);
mientras(ii--) p>
{
* p_readdata = Ds18b20_ReadByte();
p_readdata
}
devuelve 0; >
}
/* **********************************
*********************
* Adquisición y cálculo de temperatura*
******** *** **************************** *******************/
bit TempCal(float *p_wendu) //retorno exitoso 0, retorno fallido 1 (rango de temperatura -55 --- 128)
{
uchar temp [9] , ii;
uint tmp;
float tmpwendu
TR1 = 0
TR0 = 0; p>
//Leer temperatura y valor CRC-------------------------------
if(Ds18b20_ReadEE(temp))
{
TR1 = 1;
TR0 = 1;
Devuelve 1; >
//------------------------------------------ p>
// Suma de comprobación CRC---------------------------------<
for(ii = i; ii gt ; 0; ii--)
{
p_wendu
}
i ; /p>
si( i gt; 4) i = 0;
/------------------------- --------- -- ----
// Procesamiento de números positivos y negativos de temperatura-------------------- ---
//
/------------------------------ -------
// Cálculo de temperatura----------------- ------------
tmp = temp[1];/ /
tmp lt;lt;= 8; //
tmp |= temp[0] //Los dos bytes que componen la temperatura se combinan
tmpwendu = tmp;
*p_wendu = tmpwendu / 16;
//--------- -------------- ---------------
//Iniciar conversión de temperatura--------- ------------ -
if(Ds18b20_Init())
{
TR1 = 1
TR0 = 1;
Devolver 1
}
Ds18b20_WriteByte(SkipROM);
Ds18b20_WriteByte(Convertir); p>
ReleaseDQ(); //levanta DQ cuando hay poder parásito
//------------------------ ------------
TR1 = 1
TR0 = 1
devuelve 0
}
/// // /////DS18B20.h//////
/////////////////////
/************************ ****** **********************************
* E/S definición de puerto*
****************************************** ******* **********/
sbit dq = P1^3;
sbit dv = P1^4; //DS18B20 fuerte; fuente de alimentación pull-up
/****************** ******************* ********* **********
* Definición de palabra de comando*
************ ********** *************************************/ p>
#define uchar unsigned char p>
#define uint unsigned int
#define ReleaseDQ() dq = 1 //Levanta/suelta el autobús
#define PullDownDQ() dq = 0; / /Desplegar bus
#define Delay2us() _nop_(); _nop_() //Retraso 2us, 1us por nop
#define Delay8us() _nop_(); _nop_() ;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define Delay8us( )_nop_();_nop_();_nop_();_nop_ ();_ nop_();
//Establecer el número de detecciones repetidas Si se excede este número, se excederá el tiempo de espera<. /p>
#define ReDetectTime 20
//comando ds18b20
#define SkipROM 0xCC
#define MatchROM 0x55
#define ReadROM 0x33
#define SearchROM 0xF0 p>
#define AlarmSearch 0xEC
#define Convert 0x44
#define WriteScr0x4E
#define ReadScr 0xBE
#define CopyScr 0x48
#define RecallEE 0xB8
#define ReadPower 0xB4
/* *************** *** ********************************** ****
* Función* p>
****************************** ******************* ***********/
void Delayus(uchar us);
//void Dog(void);
bit Ds18b20_Init (void); //inicialización de DS18B20, devuelve 0 si existe, de lo contrario devuelve 1
void D
s18b20_WriteBit(bit bitdata); //escribe bit2DS18B20
void Ds18b20_WriteByte(uchar chrdata); //escribe Byte DS18B20
void Ds18b20_Write(uchar *p_readdata, uchar bytes); DS18B20
bit Ds18b20_ReadBit(void); //leer bit de DS18B20
uchar Ds18b20_ReadByte(void); //leer byte DS18B20
bit Ds18b20_ReadRom (uchar * p_readdata); //leer ROM DS18B20: devuelve 0 en caso de éxito, 1 en caso de error
bit Ds18b20_ReadEE(uchar *p_readdata); //leer DS18B20 EE: devuelve 0 en caso de éxito, 1 en caso de error
bit TempCal(float *p_wendu); //Devuelve 0 en caso de éxito, 1 en caso de error (rango de temperatura -55 - 128)