Red de conocimiento informático - Conocimiento de la instalación - Buscando el programa de diseño en lenguaje Keil c para el microcontrolador C8051F310 y el sensor DS18B20

Buscando el programa de diseño en lenguaje Keil c para el microcontrolador C8051F310 y el sensor DS18B20

Sensor de temperatura DS18B20 C51 sin programa CRC*

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)

}

/******** ******************************** ***************

* 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)

{

Delayus(10); //(250)1514us el tiempo se puede acortar

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 *

********************************************* * **********/

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_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; >

//------------------------------------------

// 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*

************ ********** *************************************/

#define uchar unsigned char

#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

#define AlarmSearch 0xEC

#define Convert 0x44

#define WriteScr0x4E

#define ReadScr 0xBE

#define CopyScr 0x48

#define RecallEE 0xB8

#define ReadPower 0xB4

/* *************** *** ********************************** ****

* Función*

****************************** ******************* ***********/

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)