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 */ p>
/*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()
{ p>
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)
{ p>
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*/ p>
/*************************************** ********** *************************/
ReadOneChar(void)
{
char sin firmar i = 0 ;
char dat sin firmar = 0 ;
para (i = 8 ; i > 0 ; i- -)
{ p>
DQ = 0; // Da señal de pulso
dat >>= 1;
DQ = 1; // Da señal de pulso
if(DQ)
dat |= 0x80 ;
Delay(4) ;
} p>
return (dat) ; p>
}
/* 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*/ p >
/********************************************* *** *************************/
Read_Temperature(void)
{ p>
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 () p>
{
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 p>
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')
{ p>
lcd_wdat(cdis4[m]); //Mostrar caracteres
m++;
}
}
/ * Función principal*/
/************************************/ p>
void main()
{
Ok_Menu () ;
hacer
{
Read_Temperature() ;
Disp_Temperature() ;
}
while(!presencia) ;
Error_Menu () ;
p>
hacer
{
Init_DS18B20() ;
pitido() ;
}
mientras(presencia) ;
}