Red de conocimiento informático - Conocimiento sistemático - Código fuente de conversión de temperatura

Código fuente de conversión de temperatura

El siguiente programa es el programa del microcontrolador 51. El puerto P0 es un tubo digital de ocho segmentos, y wela y dura son la selección de posición y la selección de segmento del tubo digital, respectivamente. DS18S20 está conectado a P2^2.

//Después de abrir el archivo EXE en el directorio de instalación, el valor de temperatura actual se puede mostrar en la computadora.

# include & ltreg52.h & gt

#Definir carácter sin signo uchar

#Definir entero uint sin signo

sbit ds =p2 ^2; //Definir la interfaz de DS18B20

sbit dula=p2^6;

sbit wela=p2^7;

uint pre _ temp = 0; //Almacena el valor de temperatura actual y reduce la frecuencia de funcionamiento del puerto serie.

Tabla de códigos de caracteres sin firmar []={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,

0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x 71};

Tabla de códigos de caracteres sin firmar 1[]={0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd,

0x87, 0xff, 0x ef } ;

Retraso no válido(recuento de unidades)//retraso

{

uint I;

mientras(recuento)

p>

{

i = 200

mientras(I & gt; 0)

I-;

count- ;

}

}

/////Función: inicialización del puerto serie, velocidad en baudios 9600, modo 1/////

void Init_Com(no válido)

{

TMOD = 0x 20

PCON = 0x 00; SCON = 0x 50;

th 1 = 0x FD;

TL 1 = 0x FD

tr 1 = 1; }

void ds reset(void)//Enviar comando de reinicio e inicialización 18B20 función de inicialización de reinicio.

{

uint I

DS = 0;

I = 103

mientras(I) & gt;0)I-;

DS = 1;

I = 4;

mientras(I & gt;0)I-;

p>

}

bit tmpreadbit(void)//Leer un bit leer función de datos de 1 bit.

{

uint I;

bit dat

DS = 0; i++; //i++ se utiliza para el retraso

DS = 1; i++; i++;

dat = DS

I = 8; mientras(I & gt; 0)I-;

return(dat);

}

uchartmpread(void)//Leer una fecha de byte y leer una función de 1 byte.

{

uchar i, j, dat

dat = 0

for(I = 1; i<=8 ;i++; )

{

j = tmpreadbit();

dat =(j & lt; & lt7)|(dat & gt; & gt1) ;/ /El bit más bajo de los datos leídos está al frente, por lo que solo hay un byte en DAT.

}

return(dat);

}

void tmpwritebyte(uchardat)//escribe un byte en ds18B20 escribe un Byte función de datos a 1820.

{

uint I;

uchar j;

bit testb

for(j = 1; j & lt=8;j++)

{

dat & amp0x 01;

dat = dat & gt& gt1;

si (testb)//Escribe 1

{

DS = 0

i++; p>

p>

I = 8; mientras(I & gt; 0)I-;

}

Otro

{

DS = 0; //Escribe 0

I = 8; mientras(I & gt; 0)I-;

DS = 1;

i++;i++;

}

}

}

cambio de tmp nulo(void)//ds 18 b 20 comenzar el cambio Recopilar datos y transformarlos.

{

dsreset();

Retraso (1);

tmpwritebyte(0x cc); //Direccionamiento del bus toda la unidad escribe al omitir el comando de lectura de ROM

tmpwritebyte(0x 44); //Inicia un comando de conversión de temperatura de escritura de conversión de temperatura única.

}

uint tmp()//Obtiene la temperatura y lee los datos de temperatura almacenados en el registro.

{

TT flotante;

uchar a, b;

Temperatura unitaria; //Variable de temperatura

>dsreset();

Retraso (1);

tmpwritebyte(0x cc);

tmpwritebyte(0x be);

a = tmpread(); //Lee los 8 bits inferiores

b = tmpread(); //Lee los 8 bits superiores

temp = b;

temp & lt& lt=8;//Dos bytes forman una variable int y dos bytes forman una palabra.

temp = temp | a;

TT = temp * 0.0625; //La temperatura es de 12 bits en el registro con una resolución de 0.0625.

temp = TT * 10.5; //Multiplicar por 10 significa tomar solo 1 dígito después del punto decimal, sumar 0.5 significa 40% de descuento y 50% de descuento.

Devuelve la temperatura;

}

//Lee la ROM de DS18B20. Esta función no se llama en este programa, se conserva para garantizar la integridad del programa.

//void readrom()//Leer serie

// {

// uchar sn1, sn2

/ /dsreset ();

//delay(1);

//tmpwritebyte(0x 33);

//sn 1 = tmpread(); p>

//sn2 = tmpread();

// }

void display(uintdemp)//Programa de visualización

{

uchar A1, A2, A2t, A3, ser

uchar serial_flag = 0; //Se actualiza a través del puerto serie cada vez que se genera una nueva temperatura. Esta es la parte de la bandera.

if (temp!=pretemperatura)

{

serial_flag = 1;

pre_temp = temp

}

a 1 = temperatura/100;

a2t = temperatura % 100;

a2 = A2t/10; A2t % 10;

Dura = 0;

P0 = Tabla [a 1]; //Mostrar dígitos de centenas

if (bandera de serie)

{

ser = temp/256; //Enviar el bit alto de datos seriales

SBUF = ser

}

dura = 1;

dura = 0;

wela = 0;

P0 = 0x7e

p>

wela = 1; ;

wela = 0;

Retraso(1);

Dura = 0;

P0 = tabla 1[A2]; //Mostrar dígito de decenas

if (indicador de serie)

{

ser = temp % 256/ /Enviar los bits bajos de datos de serie

SBUF = ser

}

dura = 1;

dura = 0; >

P0 = 0x7d

wela = 1;

wela = 0;

Tiempo de retraso(1);

P0 =table[A3];//unidad de visualización

if (indicador de serie)

{

ser = 0xff//Envía la señal del indicador de sincronización de serie. Las señales de alto nivel posteriores no pueden alcanzar este valor, a menos que sea en Sun Wukong y Bagua Furnace.

SBUF = ser

}

dura = 1

dura = 0

P0 = 0x7b;

wela = 1;

wela = 0;

Retraso (1); main()

{

uchar a;

init _ Com();

Hacer

{

tmp change();

//Retraso (200);

for(a = 10; a & gt0; respuesta-)

{

Mostrar(tmp());

}

} mientras(1);

}