Utilice LCD1602 y DS18B20 para mostrar la temperatura y el tiempo. Programa en lenguaje C.

Estudie el siguiente programa y luego podrá agregar la función de tiempo. Cuanto más haga, más aprenderá.

Compruebe el DS18B20 cuando lo encienda. DS18B20 detecta una anomalía, LCD1602 muestra:

ERROR DE DS18B20

COMPRUEBE

Alarma sonora.

La detección de DS18B20 es normal, LCD1602 muestra:

DS18B20 OK

TEMP: 100,8 ℃

Si el bit alto del valor de temperatura es 0, no lo mostrará.

Puede comprobar la función de detección de DS18B20 desconectando y conectando DS18B20.

/* Programa de demostración del sistema de desarrollo del microcontrolador ME300B: pantalla de temperatura DS18B20*/

/* Pantalla LCD1602*/

/* Autor: gguoqing */

/*Copyright(C)Weina Electronics www.willar.com Todos los derechos reservados */

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

#include < reg51.h >

#include < intrins.h

#define uchar unsigned char

#define uint unsigned int

sbit DQ = P3^3; //Definir puerto DS18B20 DQ

sbit BEEP=P3^7; //Línea de accionamiento del zumbador

presencia de bits;

sbit LCD_RS = P2^0

sbit LCD_RW = P2^1 ;

sbit LCD_EN = P2^2 ;

uchar código cdis1[ ] = {" DS18B20 OK "} ;

código uchar cdis2[ ] = {" TEMP: . C "} ;

código uchar cdis3[ ] = {" DS18B20 ERR0R "} ;

código uchar cdis4[ ] = {" COMPRUEBE "} ;

datos de caracteres sin firmar temp_data[2] = {0x00,0x00} ;

p >

visualización de datos de caracteres sin firmar[5] = {0x00,0x00,0x00,0x00,0x00} ;

código de caracteres sin firmar ditab[16] = {0x00,0x01,0x01,0x02,0x03, 0x03,0x04,0x04,

0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09} ;

pitido nulo()

sin firmar código de carácter mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;

#define delayNOP() {_nop_() ;_nop_() ;_nop_() ; ;_nop_() ;} ;

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

retraso nulo1(int ms)

{

carácter sin firmar;

<

p> while(ms--)

{

for(y = 0; y<250; y++)

{

_nop_() ;

_nop_() ;

_nop_() ;

_nop_() ;

}

}

}

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

/* Verifique el estado de ocupación de la pantalla LCD* /

/*Cuando lcd_busy es 1, ocupado, esperando. Cuando lcd-busy es 0, está inactivo y puede escribir instrucciones y datos. */

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

bit lcd_busy()

{

resultado de bits ;

LCD_RS = 0 ;

LCD_RW = 1 ;

LCD_EN = 1 ;

retardoNOP( )

resultado = (bit)(P0&0x80) ;

LCD_EN = 0 ;

retorno(resultado)

}<; /p >

/*Escribe datos de comando en la pantalla LCD */

/*RS=L, RW=L, E=pulso alto, D0-D7=código de comando. */

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

void lcd_wcmd(uchar cmd)

{

while(lcd_busy()) ;

LCD_RS = 0 ;

LCD_RW = 0 ;

LCD_EN = 0 ;

_nop_() ;

_nop_()

P0 = cmd ;

retardoNOP() ;

LCD_EN = 1 ;

retardoNOP() ;

LCD_EN = 0

}

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

/*Escribir datos de visualización en LCD */

/*RS=H, RW=L, E=pulso alto, D0-D7 =datos.

*/

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

void lcd_wdat(uchar dat)

{

while(lcd_busy()) ;

LCD_RS = 1 ;

LCD_RW = 0 ;

LCD_EN = 0 ;

P0 = dat ;

retardoNOP() ;

LCD_EN = 1 ;

retardoNOP() ;

LCD_EN = 0

}

/* Configuración de inicialización de LCD*/

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

void lcd_init()

{

delay1(15)

lcd_wcmd(0x01) //Borrar el contenido de la pantalla LCD <; /p>

lcd_wcmd(0x38) ; //Pantalla de 16*2, matriz de puntos de 5*7, datos de 8 bits

retardo1(5) ;

lcd_wcmd(0x38) )

retraso1(5)

lcd_wcmd(0x38)

retraso1(5)

lcd_wcmd(0x0c); //Mostrar el cursor encendido y apagado

delay1(5) ;

lcd_wcmd(0x06) ; //Mover el cursor

delay1(5) ;

lcd_wcmd(0x01); //Borrar el contenido de la pantalla LCD

delay1(5);

}

/* Configurar la pantalla posición* /

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

void lcd_pos(uchar pos)

{

lcd_wcmd(pos | 0x80); //Puntero de datos=8variable de dirección

}

/*Escribe caracteres personalizados en CGRAM */

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

void writetab()

{

cap sin firmar

ar i ;

lcd_wcmd(0x40) ; //Escribe CGRAM

para (i = 0; i< 8; i++)

lcd_wdat(mytab[ i ])

}

/*función de retardo a nivel estadounidense*/

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

retraso nulo(unsigned int num)

{

while( --num );

}

/*Inicializar ds1820 */

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

Init_DS18B20(void )

{

DQ = 1; //Reinicio de DQ

Retraso(8); //Ligero retraso

DQ = 0 ; //El microcontrolador baja DQ

Delay(90); //El retraso exacto es mayor que 480us

DQ = 1 //Sube el bus

Retraso( 8) ;

presencia = DQ ; //Si =0, la inicialización es exitosa =1, entonces la inicialización falla

Retraso(100) ;

DQ = 1 ;

return(presencia); //Señal de retorno, 0=presencia, 1= sin presencia

}

/* Leer un byte*/

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

ReadOneChar(void)

{

char sin firmar i = 0 ;

char dat sin firmar = 0 ;

para (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 ;

Delay(4) ;

}

return (dat) ;

}

/* Escribe un byte*/

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

>

WriteOneChar(dat de carácter sin firmar)

{

carácter sin signo i = 0 ;

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

{

DQ = 0 ;

DQ = dat&0x01 ;

Retraso(5) ;

DQ = 1 ;

dat>>=1 ;

}

}

/* Leer temperatura*/

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

Read_Temperature(void)

{

Init_DS18B20() ;

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

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

Init_DS18B20() ;

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

WriteOneChar(0xBE) //Leer el registro de temperatura

temp_data[0] = ReadOneChar(); //La temperatura es 8 bits más baja

temp_data[1] = ReadOneChar() //La temperatura es 8 bits más alta

}

/* Conversión de datos y visualización de temperatura*/

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

Disp_Temperature ()

{

display[4]=temp_data[0]&0x0f;

display[0]=ditab[display[4]]+0x30; //Buscar la tabla Obtener el valor decimal

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;

mostrar[3]=mostrar[4]/100x30 ;

mostrar[1]=mostrar[4]%100 ;

mostrar[2] =display[1]/ 10x30 ;

display[1]=display[1]%10x30 ;

if(display[3]==0x30) // El bit alto es 0, no se muestra

{

display[3]=0x20

if(display[2]==0x30) //El el siguiente bit más alto es 0, no se muestra

display[2]=

0x20 ;

}

lcd_pos(0x48)

lcd_wdat(display[3]) ; //Pantalla de cientos de dígitos

lcd_pos (0x49)

lcd_wdat(display[2]) ; // Visualización de decenas de dígitos

lcd_pos(0x4a)

lcd_wdat(display[1 ]) ; //Mostrar dígitos individuales

lcd_pos(0x4c)

lcd_wdat(display[0]) //Mostrar dígitos decimales

}

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

/* El timbre suena una vez*/

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

void beep()

{

carácter sin firmar y ;

p>

for (y=0;y<100;y++)

{

Retraso(60) ;

BEEP=!BEEP ; /Negación de BEEP

}

BEEP=1 ; //Apaga el timbre

Delay(40000) ;

}< / p>

/* DS18B20 OK Mostrar menú*/

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

anular Ok_Menu ( )

{

uchar m ;

lcd_init() ; //Inicializar LCD

lcd_pos(0) //Establecer pantalla El la posición es el primer carácter de la primera línea

m = 0;

while(cdis1[m] != '\0')

{ / / Caracteres de visualización

lcd_wdat(cdis1[m]);

m++;

}

lcd_pos(0x40); //Configuración la posición de visualización es el primer carácter de la segunda línea

m = 0;

while(cdis2[m] != '\0')

{

lcd_wdat(cdi

s2[m]) ; //Mostrar caracteres

m++ ;

}

writetab() //Escribir caracteres personalizados en CGRAM

delay1(5) ;

lcd_pos(0x4d) ;

lcd_wdat(0x00) ; //Mostrar caracteres personalizados

}

/* Menú de visualización de ERROR DS18B20*/

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

void Error_Menu ()< / p>

{

uchar m ;

lcd_init() ; //Inicializar LCD

lcd_pos(0) //Establecer la posición de visualización; al El primer carácter de una línea

m = 0;

while(cdis3[m] != '\0')

{ //Display caracteres

lcd_wdat(cdis3[m]) ;

m++ ;

}

lcd_pos(0x40) //Configura la pantalla; posición en El primer carácter de la segunda línea

m = 0;

while(cdis4[m] != '\0')

{

lcd_wdat(cdis4[m]); //Mostrar caracteres

m++;

}

}

/ * Función principal*/

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

void main()

{

Ok_Menu () ;

hacer

{

Read_Temperature() ;

Disp_Temperature() ;

}

while(!presencia) ;

Error_Menu () ;

p>

hacer

{

Init_DS18B20() ;

pitido() ;

}

mientras(presencia) ;

}