Red de conocimiento informático - Descarga de software - Utilice el microcontrolador 8051 para la adquisición y visualización de la temperatura (tubo digital LED). Cómo escribirlo en lenguaje C.

Dame una rutina

Utilice el microcontrolador 8051 para la adquisición y visualización de la temperatura (tubo digital LED). Cómo escribirlo en lenguaje C.

Dame una rutina

#include // Incluye el archivo de encabezado, generalmente no es necesario cambiarlo, el archivo de encabezado contiene la definición de registros de funciones especiales

#include

#include "18b20.h"

#include "1602.h"

#include "delay.h"

bit ReadTempFlag; //Definir marca de tiempo de lectura

void Init_Timer0(void); //Inicialización del temporizador

/*--------------- ----------------------------------

Inicialización de comunicación serie

-- ------------------------------------------------------ -----*/

void UART_Init(void)

{

SCON = 0x50 // SCON: Modo 1, UART de 8 bits, habilitar recepción

TMOD |= 0x20; // TMOD: temporizador 1, modo 2, reinstalación de 8 bits

TH1 = 0xFD; // TH1: valor de reinstalación del oscilador de cristal de velocidad de 9600 baudios 11.0592MHz

TR1 = 1; // TR1: temporizador 1 activado

//EA = 1 //Activar interrupción total

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

TI=1;

}

/*------------- --------- --------------------------

Función principal

-------- ----------------------------------------* /

void main (void)

{

int temp;

temperatura de flotación;

char displaytemp [16];//definir el área de visualización Matriz de almacenamiento temporal

LCD_Init(); //Inicializar LCD

DelayMs(20); //El retraso ayuda a la estabilidad

LCD_Clear(); / /Borrar pantalla

Init_Timer0();

UART_Init();

Lcd_User_Chr() //Escribir caracteres personalizados

p>

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

LCD_Write_Char(13,1,0x01);//Escribe la temperatura en el punto de la esquina superior derecha

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

while (1) // Bucle principal

{

si(ReadTempFlag==1)

{

ReadTempFlag=0;

temp=ReadTemperature();

temperatura=(float)temp*0.0625;

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

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

}

}

}

/*------------------------ - -----------------------

Subrutina de inicialización del temporizador

-------- - ---------------------------------------*/

void Init_Timer0 (void)

{

TMOD |= 0x01; //Usa el modo 1, temporizador de 16 bits, el uso del símbolo "|" no puede verse afectado cuando se usan múltiples temporizadores Impacto

//TH0=0x00; //Valor inicial dado

//TL0=0x00;

EA=1; //La interrupción total está activada

p>

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

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

}

/ * ----------------------------------------

Interrupción del temporizador subrutina

--------------------------------- --------- ------*/

void Timer0_isr(void) interrupción 1

{

static unsigned int num ;

TH0 =(65536-2000)/256; //Reasignar 2ms

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: 2009.5

Modificación: Ninguna

Contenido:

La definición de pin es la siguiente: 1- VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-NEGRO

------------- ------- ----------------------*/

#include "1602.h "

#include "delay.h"

sbit RS = P2^4; //Definir puerto

sbit RW = P2^5;

sbit EN = P2 ^6;<

/p>

#define 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

#define DataPort P0

/*--- ------------------------------------------------

Función de evaluación de ocupado

----------------------------------- ------ -*/

bit LCD_Check_Busy(void)

{

DataPort= 0xFF <; /p>

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

retorno (bit )(DataPort & 0x80);

}

/*-------------------- ------ -----------------------

Función de comando de escritura

---- ------ -------------------------------------------- ---*/

void LCD_Write_Com( unsigned char com)

{

// while(LCD_Check_Busy()); //Espera si está ocupado

DelayMs(5);

RS_CLR;

RW_CLR;

EN_SET;

DataPort=

p>

_nop_();

EN_CLR;

}

/*-------------- ------------------ ------------------

Función de escritura de datos

-------------- --------------------------------- -*/

void LCD_Write_Data(unsigned char Data)

{

// while(LCD_Check_Busy() //Espera si está ocupado

);

DelayMs(5);

RS_SET;

RW_CLR;

EN_SET;

DataPort=Datos;

_nop_();

EN_CLR;

}

/*----------------- ----------------- ---------------

Función de borrar pantalla

- ----------------- -----------------------*/

void LCD_Clear(void)

{

LCD_Write_Com(0x01

DelayMs(5);

} <

/p>

/*------------------------------------------ --- ------

Función de escritura de cadena

------------------------ -----------------------*/

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

{

if (y == 0)

{

LCD_Write_Com(0x80 + x); //Indica la primera línea

}

else

{

LCD_Write_Com(0xC0 + x); //Indica la segunda línea

}

mientras (*s)

{

LCD_Write_Data( *s)

s ++; > }

}

/*------------------------------- --- ------------------

Función de escritura de caracteres

------------ --- ----------------------------------*/

void LCD_Write_Char(sin firmar char x,char sin firmar y,char sin firmar Datos)

{

if (y == 0)

{

LCD_Write_Com( 0x80 + x) ;

}

más

{

LCD_Write_Com(0xC0 + x

); }

LCD_Write_Data( Datos

}

/*--------------------); ---- ---------------------

Función de inicialización

--------- -----------------------------------------------*/

void LCD_Init( void)

{

LCD_Write_Com(0x38); /*Configuración del modo de visualización*/

DelayMs(5)

LCD_Write_Com( 0x38);

RetrasoMs(5);

LCD_Write_Com(0x38);

RetrasoMs(5); /p>

LCD_Write_Com(0x38)

LCD_Write_Com(0x08); /*pantalla apagada*/

LCD_Write_Com(0x01); >

LCD_Write_Com(0x06); /*Mostrar configuración de movimiento del cursor*/

DelayM

s(5);

LCD_Write_Com(0x0C); /*Visualización activada y configuración del cursor*/

}

/*------- -----------------------------------------

Configuración Dos caracteres personalizados La dirección de los caracteres personalizados en LCD1602 es 0x00--0x07.

Puede definir 8 caracteres

Aquí configuramos un carácter personalizado en Posición. 0x00 (000),

El otro se coloca en la posición 0x01 (001)

-------------------- - ---------------------*/

void Lcd_User_Chr(void)

{ / /El primer carácter personalizado

LCD_Write_Com(0x40); //"01 000 000" Dirección de la línea 1 (¿D7D6 es el formulario 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 la fila de caracteres (0--7))

LCD_Write_Data(0x00); //"XXX 11111" Primera fila de datos (D7D6D5 es XXX, expresado como cualquier número (generalmente 000), D4D3D2D1D0 es datos de línea de caracteres (1 activado, 0 desactivado)

LCD_Write_Com(0x41); //"01 000 001" dirección de línea 2

LCD_Write_Data(0x04); 10001" Datos de la línea 2

LCD_Write_Com(0x42); //"01 000 010" Dirección de la línea 3

LCD_Write_Data(0x0e); //"XXX 10101 " Datos de la línea 3

LCD_Write_Com(0x43); //"01 000 011" Dirección de la línea 4

LCD_Write_Data(0x0e); //"XXX 10001" Datos de la línea 4

LCD_Write_Com( 0x44); //"01 000 100" dirección de la quinta línea

LCD_Write_Data(0x0e); //"XXX 11111" datos de la quinta línea

LCD_Write_Com(0x45); 000 101" Dirección de la sexta línea

LCD_Write_Data(0x1f); //"XXX 01010" Datos de la sexta línea

LCD_Write_Com(0x46); //"01 000 110" Dirección de la séptima línea

LCD_Write_Data(0x04); //"XXX 11111" datos de la séptima línea

LCD_Write_Com(0x47); //" 01 000 111" dirección de la octava línea

LCD_Write_Data (0x00); //"XXX 00000" datos de la octava línea

//Segundo carácter personalizado

LCD_Write_Com(0x48); //"01 001 000" dirección de la línea 1

LCD_Write_Data(0x03); //"XXX 00001" datos de la línea 1

LCD_Write_Com(0x49); //"01 001 001" dirección de la segunda línea

LCD_Write_Data(0x03); ); //"XXX 11011" datos de la segunda línea

LCD_Write_Com(0x4a);

/"01 001 010" Dirección de la tercera línea

LCD_Write_Data(0x00); //"XXX 11101" Datos de la tercera línea

LCD_Write_Com(0x4b); //"01 001 011 " Línea 4 dirección

LCD_Write_Data(0x00); //"XXX 11001" Datos de la línea 4

LCD_Write_Com(0x4c); //"01 001 100" Dirección de la línea 5

LCD_Write_Data(0x00); //"XXX 11101" datos de la línea 5

LCD_Write_Com(0x4d); //"01 001 101" dirección de la línea 6

LCD_Write_Data(0x00); //"XXX 11011" línea 6 datos

LCD_Write_Com(0x4e); //"01 001 110" línea 7 dirección

LCD_Write_Data(0x00 ); 7 datos

LCD_Write_Com(0x4f); //"01 001 111" dirección de línea 8

LCD_Write_Data(0x00); //" XXX 00000" datos de línea 8

}

#include "delay.h"

#include "18b20.h"

/*---------- --------------------------------------

Inicialización 18b20

---------------------------------- ------------ --*/

bit Init_DS18B20(void)

{

bit dat=0;

DQ = 1; reset

DelayUs2x(5); //Ligero retraso

DQ = 0; //MCU baja el DQ

DelayUs2x(200); el retraso es mayor que 480us y menor que 960us

DelayUs2x(200);

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

p>

DelayUs2x(50); //Recibimos un pulso de presencia de 60-240us después de 15~60us

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

DelayUs2x(25); //Regreso con un ligero retraso

return dat;

}

/*---- - ----------------------------------------------

Leer un byte

------------------------------------- --*/

carácter sin firmar ReadOneChar(void)

{

carácter sin firmar i=0;

dat de carácter sin firmar = 0;

for (i=8;i>0;i--)

{

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

dat>>=1;

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

if(DQ)

dat|=0x80;

DelayUs2x(25) ;

}

return(dat);

}

/*------------ ------------------------------------

Escribe un byte

p>

--------------------------------------------- ---*/

void WriteOneChar(unsigned char dat)

{

unsigned char i=0;

para (i =8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

DelayUs2x( 25);

DQ = 1;

dat>>=1;

}

DelayUs2x(25);

}

/*------------------------------------ ------------

Leer temperatura

--------------------- - -------------------------*/

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20(); p>

WriteOneChar(0xCC); // Saltar lectura del número de serie

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

DelayMs(10) ;

Init_DS18B20();

WriteOneChar(0xCC); //Omitir la operación de lectura del número de serie

WriteOneChar(0xBE); //Leer registros de temperatura, etc. ***9 registros legibles) Los dos primeros son temperatura

a=ReadOneChar(); //bits bajos

b=ReadOneChar() //bits altos

;

b<<=8;

t=a+b;

retorno(t);

}