Usando el microcontrolador 8051 para recopilar y mostrar la temperatura (tubo digital LED), ¿cómo escribirlo en lenguaje C? dar un truco

#include ltreg52.h gt// Incluye el archivo de encabezado, generalmente no es necesario cambiarlo. El archivo de encabezado contiene definiciones de registros de funciones especiales.

#incluir ltstdio.h gt

#Incluir "18b20.h"

#Incluir "1602.h"

#Incluir "delay.h"

Bit ReadTempFlag //Definir marca de tiempo de lectura

void Init _ timer 0 (void); //Inicialización del temporizador

/ * -

Inicialización de comunicación serie

- */

void UART_Init(void)

{

SCON = 0x 50 ; // SCON: Modo 1, UART de 8 bits, recepción habilitada.

TMOD | = 0x 20; //tmod: temporizador 1, modo 2, recarga de 8 bits.

th 1 = 0x FD; // TH1: Recargar oscilador de cristal, velocidad en baudios 9600 01,0592 mhz.

tr 1 = 1; // TR1: Se inicia el temporizador 1.

//EA = 1; //Activar la interrupción del host

//ES = 1; //Activar la interrupción del puerto serie

TI = 1;

}

/* -

Funciones principales

- */

Administrador no válido (no válido)< / p>

{

Temperatura interna;

Temperatura de flotación;

Temperatura de visualización de caracteres [16] //Definir la matriz de almacenamiento temporal del área de visualización.

LCD_Init(); //Inicializa el LCD

Dylems(20); //El retraso ayuda con la estabilidad.

LCD_Clear(); //Borrar la pantalla

init_timer 0();

UART_Init();

LCD _ Usuario _ Chr(); //Escribir caracteres personalizados

LCD_Write_String(0,0,"www.doflye.net");

LCD_Write_Char(13,1, 0x 01); Escribe la temperatura en la esquina superior derecha.

LCD_Write_Char(14, 1, ' C '); //Escribe el carácter c

While (1) //Bucle principal

{

if(ReadTempFlag==1)

{

ReadTempFlag = 0;

temp = leer temperatura();

Temperatura = (punto flotante) temp * 0.0625

sprintf(displaytemp, "Temp 7.3f", temperatura); //Imprimir valor de temperatura

LCD_Write_String(0, 1, display temp ) ; //Mostrar la segunda línea

}

}

}

/* -

Dispositivo de cronometraje subrutina de inicialización

- */

void Init_Timer0(void)

{

TMOD | = 0x 01; Temporizadores de 16 bits, el símbolo "|" no se ve afectado cuando se utilizan varios temporizadores.

//TH0 = 0x 00; //Valor inicial dado

//TL0 = 0x 00;

EA = 1 //Se activa la interrupción total; on

ET0 = 1; //La interrupción del temporizador está activada

TR0 = 1; //El interruptor del temporizador está activado

}

/ * -

Subrutina de interrupción del temporizador

- */

Temporizador no válido 0_isr (no válido) interrupción 1

{

Entero estático sin signo;

TH0 =(65536-2000)/256; //Reasignar el valor de 2 milisegundos

TL0 =(65536-2000) 256;

num ;

if(num==300) //

{

num = 0;

ReadTempFlag = 1; //Leer la posición del indicador 1

}

}

/* -

Nombre: LCD1602

Foro: www.doflye.net

Escrito por Shifang

Fecha: mayo de 2009

Modificación: Ninguna

Contenido :

Las definiciones de pines son las siguientes: 1-VSS 2-vdd 3-v04-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK.

- */

#Contiene "1602.h"

#Contiene "delay.h"

sbit RS = p2^ 4; //Definir puerto

sbit rw = p2^5;

sbit en = p2^6;

#Definir RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#Definir puerto de datos P0

/* -

Función de decisión de ocupado

- */

Bit LCD_Check_Busy(void)

{

Puerto de datos = 0xFF

RS _ CLR

RW _ SET

EN _ CLR

_ nop _();

EN _ SET

Retorno (bit)( Puerto de datos amp0x 80);

}

/* -

Función de comando de escritura

- */

void LCD_Write_Com(carácter sin firmar Com)

{

// while(LCD _ Check _ Busy()); //Espera si está ocupado.

Daremus(5);

RS_CLR

RW_CLR

EN_SET

DataPort = com

_ nop _();

ES _ CLR

}

/* -

Función de escritura de datos

- */

void LCD_Write_Data (datos de caracteres sin firmar)

{

// while( LCD_Check_Busy()) ; //Si está ocupado, espere.

Daremus(5);

RS_SET

RW_CLR

EN_SET

DataPort =datos;

_ nop _();

ES _ CLR

}

/* -

Función de borrar pantalla

- */

void LCD_Clear(void)

{

LCD _ Write _ Com( 0x 01) ;

Daremus(5);

}

/* -

Escribir función de cadena

p>

- */

void LCD_Write_String(carácter sin firmar x, carácter sin firmar y, carácter sin firmar *s)

{

If (y == 0)

{

LCD_Write_Com(0x 80 x); //Indica la primera línea.

}

Otros

{

LCD _ Write _ Com(0xc 0 x); //Indica la segunda línea.

}

mientras (*s)

{

LCD _ Escritura _ Datos(* s); p>s;

}

}

/* -

Función de escritura de caracteres

- */

void LCD_Write_Char(carácter sin firmar x, carácter sin firmar y, datos de carácter sin firmar)

{

If (y == 0)

{

LCD _ Write _ Com(0x 80 x

}

Otros

{

LCD_Write_Com(0xc 0 x);

}

LCD_Write_Data(datos);

}

/* -

Función de inicialización

- */

void LCD_Init(void)

{

LCD _ Write _ Com(0x 38

/*Configuración del modo de visualización*/

Dalems(5);

LCD _ Write _ Com(0x 38);

p>

Daremus(5);

LCD_Write_Com(0x 38);

Daremus(5);

LCD_Write_Com(0x 38);

LCD_Write_Com(0x 08);/*Pantalla apagada*/

LCD_Write_Com(0x 01 ); /*Mostrar una pantalla clara*/

LCD _ Write _ Com( 0x 06); /*Mostrar configuración de movimiento del cursor*/

Daremus(5);

LCD _ Write _ Com(0x0C); /p>

}

/* -

Establezca dos caracteres personalizados Las direcciones de los caracteres personalizados en LCD1602 son 0x00 - 0x07.

Puedes definir 8 caracteres.

Aquí configuramos el carácter personalizado en 0x00 (000).

El otro está colocado en la ubicación 0x001 (001).

- */

void Lcd_User_Chr(void)

{//El primer carácter personalizado

LCD _ Write _ Com (0x 40 //"01 000 000" dirección de fila 1 (¿D7D6 está en forma de comando de configuración de dirección? D5D4D3 es la ubicación de almacenamiento de caracteres (0-7), D2D1D0 es la dirección de fila de caracteres (0-7)).

LCD _ Write _ Data(0x 00); //" p>

LCD _ Write _ Com(0x 41); //"01 000 001 "Dirección de línea 2

LCD _ Write _ Data(0x 04); //"XXX 10001 "Línea 2 dirección 2 líneas de datos

LCD _ Write _ Com(0x 42); //"01 000 010 "Tercero); línea de dirección

LCD _ Write _ Data(0x0e); //" XXX 10101 "La tercera línea de datos

LCD _ Write _ Com(0x 43); la dirección está en la cuarta línea de "01 000 011"

LCD _ Write _ Data( 0x0e);//"XXX 10001 "Datos de la línea 4

LCD _ Write _ Com( 0x 44); //"01 000 100 "Dirección de la línea 5

LCD _ Write _ Data(0x0e); //"XXX 11111" los datos están en la línea 5.

LCD _ Write _ Com(0x 45); //"01 000 101 "Dirección de la línea 6

LCD _ Write _ Data(0x 1f); //"XXX 01010 "Datos de la línea 6

LCD _ Write _ Com(0x 46); //"01 000 110 "Dirección de fila de la línea 7

LCD _ Write _ Data(0x 04); //" XXX 11111 "La séptima fila de datos

LCD _ Write _ Com(0x 47); //" 01 000 111 "Dirección de línea 8

LCD _ Write _ Data(0x 00); "Datos de línea 8

//Segundo carácter personalizado

LCD _ Write _ Com(0x 48); //La dirección "01 001 000" está en la línea 1

LCD _ Write _ Data(0x 03); //"XXX 00001 "Datos de la línea 1

LCD _ Write _ Com(0x 49); //La dirección está en la línea 2 de "01 001); 001"

LCD _ Write _ Data(0x 03); //"XXX 11011" los datos están en la línea 2

LCD _ Write _ Com(0x4a); //"01 001 010 "La dirección en la línea 3

LCD _ Write _ Data(0x 00); //"

LCD _ Write _ Data(0x 00); // "XXX 11001 "La cuarta fila de datos

LCD _ Write _ Com(0x4c); " Dirección de línea 5

LCD _ Write _ Data(0x 00); //" XXX 11101 "Los datos están en la línea 5

LCD _ Write _ Com(0x4d); // " 01 001 101 "Dirección de la línea 6

LCD _ Write _ Data(0x 00); //" XXX 11011 "Datos de la línea 6

LCD _ Write _ Com(0x4e); //" 01 001 110 "Dirección de la línea 7

LCD _ Write _ Data(0x 00); //"XXX 00001 "Datos de la línea 7

LCD _ Write _ Com(0x4f) ); //" 01 001 11 "La octava línea de dirección

LCD _ Write _ Data(0x 00); //"XXX 00000 "La octava línea de datos

}

#Contiene "delay.h"

#Contiene "18b20.h"

/* -

Inicialización 18b20

- */

Bit Init_DS18B20 (vacío)

{

Bit dat = 0

DQ = 1; //Reinicio de DQ

delayus 2x(5); //Un poco retrasado

DQ = 0; //El microcontrolador baja el DQ.

dela Yus 2x(200); //El retraso exacto es mayor que 480us y menor que 960us.

dela Yus 2x(200);

DQ = 1; //Tira del autobús alto

Dela Yus 2x(50); //15~ 60us. y luego recibe un pulso de presencia de 60-240us.

dat = DQ; //Si x=0, la inicialización es exitosa, si x=1, la inicialización falla.

Drayus 2x(25); //Devolución ligeramente retrasada

Devolución dat

}

/* -

p >

Leer un byte

- */

Carácter sin firmar ReadOneChar(void)

{

Ninguno Carácter firmado I = 0;

Carácter sin firmar dat = 0;

for(I = 8;i gt0;i-)

{

DQ = 0; //Da una señal de pulso

dat gt gt=1;

DQ = 1; //Da una señal de pulso

if(DQ)

dat | = 0x80

Drayus 2x(25);

}

retorno(dat );

}

/* -

Escribir un byte

- */

void WriteOneChar(datos de caracteres sin firmar)

{

Carácter sin firmar I = 0

for(I = 8; i gt0; i -)

{

DQ = 0;

DQ = fecha y hora; 0x 01;

Drayus 2x(25);

DQ = 1;

dat gt gt=1;

}

Drayus 2x(25);

}

/* -

Temperatura de lectura

- */

Temperatura de lectura de entero sin signo (nulo)

{

Carácter sin signo a = 0

Int sin signo = 0;

Entero sin signo t = 0;

init _ ds 18b 20(); (0x cc); //Omitir la lectura del número de secuencia y el número de columna.

WriteOneChar(0x 44); //Iniciar conversión de temperatura

retraso ms(10);

init _ ds 18b 20();

WriteOneChar(0x cc); //Omitir la lectura del número de secuencia y el número de columna.

WriteOneChar(0x be); //Lee el registro de temperatura (* * *se pueden leer 9 registros), los dos primeros son temperaturas.

a = ReadOneChar(); //bit bajo

b = ReadOneChar(); //bit alto

b lt lt=8;

t = a b;

Devolver (t);

}