#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
{ p>
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) p>
{
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 -) p>
{
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);
}