51 tesis de graduación de microcontroladores
#include "DS18B20_3.h"
#Definir entero uint sin signo
#Definir carácter uchar sin signo
p>uchar a, plántula, piedra, minuto, día, mes, año, semana, bandera, key1n, temp
//flag se utiliza para leer el valor de temperatura en el archivo de encabezado y mostrarlo el valor de la temperatura.
#Define YH 0x 80 //La posición inicial de la primera línea de la pantalla LCD, porque el primer bit D7 de la dirección de caracteres LCD1602 es constante 1 (10000000 = 80).
# definer 0x 80 0x40//Posición inicial de la segunda línea de la pantalla LCD (porque la dirección de posición del primer carácter de la segunda línea es 0x 40)
La pantalla LCD está conectada al C51 Definición de pin (muestra que la línea de datos está conectada al puerto P0 de C51)
sbit rs=p1^0;
sbit en=p1^2;
sbit rw=p1 ^1; // Si rw está basado en el hardware, no es necesario escribir esta oración y rw=0.
sbit led=p3^7; //Interruptor de retroiluminación LCD
//Chip de reloj DS1302 y definición de conexión de pin C51
sbit io=p2^2;
sbit sclk=p2^1;
sbit rst=p2^2;
sbit acc0=acc^0;
sbit acc7=acc^7;
/************************************ ****** *************************
ACC acumulador=A
Aceleración 0=E0H p>
ACC.0 es el bit 0 de ACC. Acc puede ser direccionable por bits.
El acumulador ACC es una unidad de almacenamiento de 8 bits que se utiliza para almacenar datos. Sin embargo, este mueble de almacenaje tiene su lugar especial.
Es una unidad muy crítica en el microcontrolador, y muchas operaciones deben realizarse a través de ACC. Cuando aprenda instrucciones en el futuro,
generalmente se usa para representar el acumulador. Pero hay algunas excepciones. Por ejemplo, en la instrucción PUSH, se debe utilizar el nombre ACC.
En términos generales, A representa el contenido del acumulador y ACC representa la dirección del acumulador.
********************************************* *** **********************/
//Clave de calibración de tiempo y definición de conexión de pin C51
sbit key1=p2 ^4; //Establecer clave
sbit key2=p2^5; //Control de claves
sbit key3=p2^6; //Restauración de claves
sbit buzzer=p2^0; //Zumbador, impulsado por el transistor 9012, respuesta del puerto de bajo nivel.
/****************************************** ***********************/
pestaña de código uchar 1[]= { " 20--" }; visualización de caracteres del año
pestaña de código uchar 2[]= { "::" } // Caracteres fijos para la visualización de la hora
// Función de retardo, a menudo llamada más tarde.
void delay(uin TMS)//Función de retardo, función de parámetro
{
uint x, y;
for(x = xms;x gt0;x -)
for(y = 120;y gt0;y-);
}
/* * * * * * * * La función de comando de escritura LCD y la función de escritura de datos se pueden llamar * * * * * * * * * */
/*En este programa, las funciones relacionadas con la escritura de cristal líquido estarán en la función DS1302 , por lo que el programa LCD debe colocarse al frente */
write _ 1602 com (uchircom)/* * * * Función de comando de escritura LCD * * * *
{ p >
RS = 0; //Selección de datos/instrucción establecida en instrucción.
rw = 0; // Selección de lectura y escritura configurada para escribir.
P0 = com//Enviar datos
Delay (1);
en = 1; // Tire del pin de habilitación hacia arriba, que es la caída válida. borde Esté preparado.
Delay (1);
en = 0; //en cambia de alto a bajo, se genera un flanco descendente y la pantalla LCD ejecuta el comando.
}
escribir _ 1602 dat(uchardat)/* * * Función de escritura de datos LCD* * * *
{
RS = 1; //Selección de datos/comando establecida en datos
rw = 0; //Selección de lectura y escritura configurada para escribir.
P0 = dat//Enviar datos
Retraso (1);
en = 1; //en está configurado en nivel alto, que es la caída. borde Esté preparado.
Delay (1);
en = 0; //en cambia de alto a bajo, se genera un flanco descendente y la pantalla LCD ejecuta el comando.
}
LCD_init()/* * *Función de inicialización de LCD* * * *
{
write_1602 com (0x 38); //Establece el modo de funcionamiento de la pantalla LCD, es decir: pantalla de 16*2 líneas, matriz de puntos de 5*7, datos de 8 bits.
write _ 1602 com(0x0c); //Enciende la pantalla, pero no muestra el cursor
write _ 1602 com(0x 06); no se mueve, el cursor se mueve automáticamente a Mover a la derecha.
write _ 1602 com(0x 01); //Borrar la pantalla
write _ 1602 com(yh 1); //El calendario muestra el símbolo fijo después del primer dígito en la primera línea comienza a mostrarse.
for(a = 0; a lt14; a )
{
escribir _ 1602 dat(tab 1[a]); La parte del símbolo fijo está escrita en la pantalla LCD.
//delay(3);
}
write _ 1602 com(er 2); //La hora muestra la posición de escritura del símbolo fijo, comenzando desde la salida de dos posiciones.
for(a = 0; a lt8; a )
{
write _ 1602 dat(tab 2[a]); //Escribe un fijo Símbolo que muestra la hora, dos dos puntos.
//retraso(3);
}
}
/************ ********más de******************/
/* * * * * * * * * * * * Sub relacionado con DS1302 -función * * * * * * * * * * * * * *
Void write_byte(uchar dat)//Escribe un byte.
{
ACC = dat
RST = 1
for(a = 8; a gt0; respuesta-) p>
p>
{
IO = ACC0
SCLK = 0
SCLK = 1; ACC = ACC gt gt1 ;
}
}
Uchar read_byte()//Leer un byte.
{
RST = 1;
for(a = 8; a gt0; respuesta-)
{
ACC7 = IO
SCLK = 1;
SCLK = 0;
ACC = ACC gt gt1;
}
Retorno (ACC);
}
// -
Voidwrite _ 1302 (uchar add, uchar dat)//Hacia 1302 El chip escribe una función para especificar la dirección de escritura y los datos.
{
RST = 0;
SCLK = 0;
RST = 1; Agregar);
Escribir byte (dat);
SCLK = 1
RST = 0
} p>;
uchar Read _ 1302(uchar add)//Función de lectura de datos desde 1302, especifique la dirección de origen de los datos leídos.
{
temperatura de agua
RST = 0
SCLK = 0
RST = 1; ;
escribir_byte(agregar);
temp=read_byte().
SCLK = 1;
RST = 0;
Retorno (temporal); BCD _ decimal (uchar BCD) // Código BCD a función decimal, entrada BCD, retorno decimal.
{
uchar decimal;
Decimal = bcd gt gt4;
return(Decimal = Decimal * 10 (BCD amp;= 0x0F));
}
// -
void DS 1302 _ init()//Subfunción de inicialización del chip 1302 (2010-01-07 , 12:00:00, Semana 4)
{
RST = 0
SCLK = 0
write_1302 (0x8e; , 0x 00); // Permitir escritura, deshabilitar protección contra escritura.
write_1302(0x80, 0x 00); //Escribe los segundos datos iniciales 00 en el segundo registro de escritura 80H en DS1302.
write_1302(0x82, 0x 00); //Escribe los subdatos iniciales 00 en el subregistro de escritura 82H en DS1302.
write_1302(0x84, 0x 12); //Escribe los datos de la hora inicial 12 en el registro de hora de escritura 84H en DS1302.
write_1302(0x8a, 0x 04); //Escribe los datos de la semana inicial 4 en el registro de escritura de la semana 8aH en DS1302.
write_1302(0x86, 0x 07); //Escribe los datos de fecha inicial 07 en el registro de fecha de escritura 86H en DS1302.
write_1302(0x88, 0x 01); //Escribe los datos del mes inicial 01 en el registro de escritura del mes 88H en DS1302.
write_1302(0x8c, 0x 10); //Escribe los datos del año inicial 10 en el registro de año de escritura 8cH en DS1302.
write_1302(0x8e, 0x 80); //Activar protección contra escritura
}
// -
//Visualización de temperatura subfunción
Voidwrite_temp (uchar add, uchar dat)//Escribe datos de temperatura en la pantalla LCD y especifica la posición de visualización.
{
uchar gw, SW;
GW = dat 10 //Obtiene el dígito único.
SW = dat/10; //Obtiene el dígito de las decenas
write _ 1602 com(er add); //er es el valor 0x80 0x40 especificado en el archivo de encabezado.
write _ 1602 dat(0x 30 SW); //El número 30 obtiene el código de visualización LCD1602 del número.
write _ 1602 dat(0x 30 GW); //El número 30 obtiene el código de visualización LCD1602 del número.
write _ 1602 dat(0x df); //El símbolo circular pequeño que muestra la temperatura, 0xdf es el código de dirección del símbolo en la biblioteca de caracteres LCD.
write _ 1602 dat(0x 43); //Mostrar símbolo "C", 0x43 es el código de dirección de la C mayúscula en la biblioteca de caracteres LCD.
}
// -
//Mostrar subfunciones en minutos y segundos.
Voidwrite _ SFM (UCHAR ADD, UCHAR DAT) //Al escribir en la pantalla LCD, hay dos parámetros: posición de visualización más datos actuales.
{
uchar gw, SW;
GW = dat 10 //Obtiene el dígito único.
SW = dat/10; //Obtiene el dígito de las decenas
write _ 1602 com(er add); //er es el valor 0x80 0x40 especificado en el archivo de encabezado.
write _ 1602 dat(0x 30 SW); //El número 30 obtiene el código de visualización LCD1602 del número.
write _ 1602 dat(0x 30 GW); //El número 30 obtiene el código de visualización LCD1602 del número.
}
// -
//Subfunciones de visualización de año, mes y día.
Voidwrite _ nyr (uchar add, uchar dat)//Escribe el año, mes y día en la pantalla LCD. Hay dos parámetros: mostrar el sumando de posición y mostrar datos.
{
uchar gw, SW;
GW = dat 10 //Obtiene el dígito único.
SW = dat/10; //Obtiene el dígito de las decenas
write _ 1602 com(yh add); //Establece la posición de visualización en la primera posición add
write _ 1602 dat(0x 30 SW); //El número 30 obtiene el código de visualización LCD1602 del número.
write _ 1602 dat(0x 30 GW); //El número 30 obtiene el código de visualización LCD1602 del número.
}
// -
Void write_week(uchar semana)//Escribir función de semana
{
write _ 1602 com(yh 0x0c); //Muestra la posición del carácter del día de la semana
Cambiar (semana)
{
caso 1 : escribir _ 1602 dat(' M '); //Cuando el número de semana es 1, mostrar.
escribir _ 1602 dat(' O ');
escribir _ 1602 dat(' N '); Caso 2: escribir _ 1602 dat(' T '); //Se muestra cuando los datos de la semana son 2.
escribir _ 1602 dat(' U ');
escribir _ 1602 dat(' E ');
Romper
Caso 3: escribir _ 1602 dat(' W '); //Se muestra cuando los datos de la semana son 3.
escribir _ 1602 dat(' E ');
escribir _ 1602 dat(' D '); Caso 4: escribir _ 1602 dat(' T '); //Muestra los datos semanales de 4.
escribir _ 1602 dat(' H ');
escribir _ 1602 dat(' U '); Caso 5: write_1602 dat(' F '); //Se muestra cuando los datos de la semana son 5.
escribir _ 1602 dat(' R ');
escribir _ 1602 dat(' I ');
Romper
Caso 6: write_1602 dat(' S '); //Se muestra cuando los datos de la semana son 6.
escribir _ 1602 dat(' T ');
escribir _ 1602 dat(' A '); Caso 7: write_1602 dat(' S '); //Se muestra cuando los datos de la semana son 7.
escribir _ 1602 dat(' U ');
escribir _ 1602 dat(' N '); }
}
//* * * * * * * * * * * * * *Funciones relacionadas con el escaneo del teclado* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.
void key scan()
{
Si (key1 == 0)/ - key1 es una tecla de función (tecla de configuración) -.
{
Retraso (9); //Retraso, utilizado para eliminar la fluctuación
If(key1==0)//Después de un período de retraso, confirmar Pulse la tecla nuevamente.
{
Buzzer = 0; //El timbre suena una vez.
retraso(20);
zumbador = 1;
mientras(!tecla 1);
tecla 1n;
if(key1n==9)
key 1n = 1; //Botón de configuración * * *Hay ocho ciclos de función: segundos, minutos, horas, semanas, días, meses, año, devolver.
Interruptor (tecla 1n)
{
Caso 1: TR0 = 0; //Cerrar temporizador
//tr 1 = 0;
write _ 1602 com(er 0x 09); //Presione la tecla de configuración una vez, el cursor se muestra en segundos.
write_1602 com(0x0f); //Configura el cursor para que parpadee.
temp=(Miao)/10*16 (Miao) 10; //Los datos por segundo se escriben en DS1302.
write_1302(0x8e, 0x 00);
write_1302(0x80, 0x 80 | temp); // plántulas
write_1302(0x8e, 0x 80);
Pausa;
Caso 2: escribir _ 1602 com(er 6); //Haga clic en la posición fen dos veces para mostrar el cursor.
//write _ 1602 com(0x0f);
Romper
Caso 3: write _ 1602 com(er 3); , piedra
//write_1602 com(0x0f);
Descanso;
Caso 4: write_1602 com(yh 0x0e);//Cada 4 veces por semana
//write _ 1602 com(0x0f);
Pausa;
Caso 5: write _ 1602 com(yh 0);/ /Presiona 5 veces , ri
//write _ 1602 com (0x0f);
Break;
Caso 6: write _ 1602 com (yh 0x 07); Presione 6 veces, diga
//write _ 1602 com (0x0f
Break
Caso 7: write _ 1602 com( yh 0x 04); ; //Presiona 7 veces, año
//escribe _ 1602 com(0x0f);
Pausa;
Caso 8:
p>write _ 1602 com(0x0c); //Presione por octava vez para configurar el cursor para que no parpadee.
TR0 = 1; //Abrir temporizador
temp=(Miao)/10*16 (Miao) 10;
write_1302(0x8e, 0x 00 ) ;
write_1302(0x80, 0x 00 | temp); //Escribe los datos de las plántulas en DS1302.
write_1302(0x8e, 0x 80);
Romper;
}
}
} p>
p>
// - Pulsar la tecla 2.
if(key1n!=0)//Cuando se presiona la tecla 1. Es válido presionar las siguientes teclas (el número de pulsaciones no es igual a cero)
{
If(key2==0) // Tecla Arriba
{
Retraso(10);
if(key2==0)
{
Zumbador = 0; El timbre suena una vez.
retraso(20);
zumbador = 1;
mientras(!tecla 2);
interruptor(tecla 1n )
{
Caso 1: Miao; //Presiona el botón de configuración una vez para ajustar los segundos.
If (seedlings == 60)
seedlings = 0; //Si los segundos exceden 59, suma cero a 1.
write_sfm(0x08, Miao); // Hace que la pantalla LCD muestre el número de segundos establecido con el "signo más" en la posición correcta.
temp=(Miao)/10*16 (Miao) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x80, temp); //Escribe el segundo código BCD de datos ajustado en el segundo registro de escritura 80H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(er 0x 09); //Porque el modo LCD está configurado para escribir datos automáticamente. para mover el cursor hacia la derecha, por lo que es necesario especificar el retorno.
//write _ 1602 com(0x0b);
Pausa;
Caso 2: fen;
Si (fen== 60)
fen = 0;
write_sfm(0x05, fen); //Deja que la pantalla LCD muestre los subdatos de configuración del "signo más" en la posición correcta.
temp=(minutos)/10*16 (minutos) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x82, temp); //Escribe el código BCD de subdatos ajustado en el registro de subescritura 82H de DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(er 6); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, en este caso se volverá a escribir en la ubicación original.
Pausa;
Caso 3: Shi;
if(shi==24)
Shi = 0;
write_sfm(2, Shi); //Hace que la pantalla LCD muestre el "signo más" en la posición correcta para configurar los datos de la hora.
temp=(石)/10*16 (石) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x84, temp); //Escribe el código BCD de datos de hora ajustados en el registro de hora de escritura 84H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(er 3); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Descanso;
Caso 4: Semana;
if(semana==8)
Semana = 1;
write_1602 com(yh 0x0C); //Especifique la posición de visualización de los datos semanales después del "signo más"
write_week(week); //Especifique el contenido de visualización de los datos semanales.
temp=(week)/10*16 (week) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x8a, temp); //Escribe el código BCD de datos semanales ajustados en el registro semanal 8aH en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 0x0e); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Rotura;
Caso 5: ri;
Si (ri==32)
ri = 1;
write_nyr(9, ri); //Hace que la pantalla LCD muestre los datos de fecha de configuración del "signo más" en la posición correcta.
temp =(ri)/10 * 16 (ri) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x86, temp); //Escribe el código BCD de datos de fecha ajustados en el registro de fecha de escritura 86H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 10); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Descanso;
Caso 6: Yue;
if(Yue==13)
Yue = 1;
write_nyr(6, Yue); // Hace que la pantalla LCD muestre los datos mensuales establecidos por el "signo más" en la posición correcta.
temp=(Yue)/10*16 (Yue) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x88, temp); //Escribe el código BCD de datos del mes ajustado en el registro de escritura del mes 88H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 7); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Pausa;
Caso 7: año;
if(año==100)
Año = 0;
write_nyr(3, año); // Hace que la pantalla LCD muestre los datos del año establecido del "signo más" en la posición correcta.
temp=(year)/10*16 (year) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x8c, temp); //Escribe el código BCD de datos del año ajustado en el registro de año 8cH en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 4); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Descanso;
}
}
}
// - clave3. Consulte la anotación "Clave" para conocer la función de cada oración.
if(key3==0)
{
Retraso (10); //Ajuste de retardo y eliminación de jitter
if ( key3==0)
{
Zumbador = 0; //El zumbador suena una vez.
retraso(20);
zumbador = 1;
mientras(!tecla 3);
interruptor(tecla 1n )
{
Caso 1: Miao-;
if (Miao==-1)
Miao = 59; // Cuando el El segundo dato se restaura a -1, automáticamente se convierte en 59.
write_sfm(0x08, Miao); //Muestra los nuevos segundos cambiados en la posición correcta en la pantalla LCD.
temp=(Miao)/10*16 (Miao) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x80, temp); //Escribe el segundo código BCD de datos ajustado en el segundo registro de escritura 80H en DS1302.
write_1302(0x8e, 0x 80); //Activa la protección contra escritura
write_1602 com(er 0x 09); //Debido a que el modo LCD está configurado para escribir datos, el puntero Agregará uno automáticamente, en cuyo caso volverá a escribir en la posición original.
//write _ 1602 com(0x0b);
Pausa;
Caso 2: fen-;
if(fen= =-1)
fen = 59
write_sfm(5, fen);
temp=(minutos)/10*16 (minutos) 10;/ /ds 1302 requiere conversión decimal a código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x82, temp); //Escribe el código BCD de subdatos ajustado en el registro de subescritura 82H de DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(er 6); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, en este caso se volverá a escribir en la ubicación original.
Descanso;
Caso 3: Shi-;
if(shi==-1)
Shi= 23; p>
p>
write_sfm(2,Shi);
temp=(石)/10*16 (石) 10 //Convierte el decimal requerido por ds 1302 en código DCB .
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x84, temp); //Escribe el código BCD de datos de hora ajustados en el registro de hora de escritura 84H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(er 3); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Descanso;
Caso 4: Semana -;
if(semana==0)
Semana = 7;
write _ 1602 com (yh 0x0C); //Especifique la posición de visualización de los datos semanales después del "signo más"
write_week(week); //Especifique el contenido de visualización de los datos semanales.
temp=(week)/10*16 (week) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x8a, temp); //Escribe el código BCD de datos semanales ajustados en el registro semanal 8aH en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 0x0e); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Rotura;
Caso 5: ri-;
Si (ri==0)
ri = 31;
write_nyr(9,ri);
temp =(ri)/10 * 16 (ri) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x86, temp); //Escribe el código BCD de datos de fecha ajustados en el registro de fecha de escritura 86H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 10); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Descanso;
Caso 6: Yue-;
Si (Yue==0)
Yue = 12;
write_nyr (6, Yue);
temp=(Yue)/10*16 (Yue) 10; //Convierte el decimal requerido por ds 1302 en código DCB.
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x88, temp); //Escribe el código BCD de datos del mes ajustado en el registro de escritura del mes 88H en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 7); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Pausa;
Caso 7: año -;
if(año==-1)
Año = 99; p>
p>
write_nyr(3, año);
temp=(año)/10*16 (año) 10 //Convierte el decimal requerido por ds 1302 en código DCB .
write_1302(0x8e, 0x 00); //Se permite la escritura, la protección contra escritura está prohibida.
write_1302(0x8c, temp); //Escribe el código BCD de datos del año ajustado en el registro de año 8cH en DS1302.
write_1302(0x8e, 0x 80); //Activar la protección contra escritura
write _ 1602 com(yh 4); //Debido a que el modo LCD está configurado para escribir datos, el El puntero aumentará automáticamente Uno, por lo que el cursor debe retroceder.
Descanso;
}
}
}
}
}
// -
Void init() //Temporizador, función de configuración del contador
{
TMOD = 0x 11; el modo de funcionamiento del temporizador/contador como 3.
TH0 = 0; //Los cuatro bits de orden superior del temporizador T0 =0
TL0 = 0; //Los cuatro bits de orden inferior del temporizador T0 =0 p>
EA = 1; //El sistema permite activar las interrupciones.
ET0 = 1; //Habilitar interrupción T0
TR0 = 1; //Habilitar interrupción e iniciar temporizador.
}
//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
//************************************ ***** ****************
void main()
{
LCD _ init (); // Llama a la subfunción de inicialización de LCD.
ds 1302 _ init(); //Llama a la subfunción de inicialización del reloj DS1302.
init(); //Llama a la subfunción de configuración del contador del temporizador.
led = 0; //Enciende la retroiluminación del LCD.
Buzzer = 0; //El timbre suena una vez.
Delay(80);
Buzzer = 1;
While(1) //Bucle infinito siguiente declaración:
{
key scan(); //Llama a la subfunción de escaneo del teclado.
}
}
Void timer0() interrupción 1 //Obtiene y muestra el calendario y la hora.
{
//Init _ ds 18b 20(); //La subfunción de inicialización del sensor de temperatura DS18b2 está en el archivo de encabezado.
flag = read Temperature(); //Envía el resultado de la función devuelto al ejecutar el archivo de encabezado 18b2 a la variable FLAG para su visualización.
//Lee siete datos de semana, mes, año y año en segundos (el registro de lectura del DS1302 es diferente del registro de escritura):
Miao = BCD _ Decimal(lectura _ 1302(0x 81));
fen = BCD _ Decimal(leer _ 1302(0x 83));
Shi = BCD _ Decimal(leer _ 1302(0x 85)) );
ri = BCD _ Decimal(leer _ 1302(0x 87));
yue = BCD _ Decimal(leer _ 1302(0x 89));
nian = BCD _ Decimal(leer _ 1302(0x8d));
semana = BCD _ Decimal(leer _ 1302(0x8b));
//Mostrar temperatura, Datos de segundos, horas y minutos:
write_temp(12, flag); //Muestra la temperatura, comenzando desde el carácter 12 de la segunda línea.
write_sfm(8,Miao); // Segundos, comenzando desde la octava palabra de la segunda línea (muestra la subfunción una vez por segundo cuando se llama)
write_sfm(5, fen ); //Minutos, comenzando desde el quinto carácter de la segunda línea.
write_sfm(2, Shi); //Hora, comenzando desde el segundo carácter de la segunda línea.
//Mostrar datos de fecha, mes y año:
write_nyr(9, ri); //Fecha, mostrada después del noveno carácter en la segunda línea.
write_nyr(6, Yue); //El mes se muestra después del sexto carácter en la segunda línea.
write_nyr(3, año); //Año, comenzando desde el tercer carácter de la segunda línea.
write_week(semana);
}