El microcontrolador STC89C52 utiliza lenguaje C para programar la alarma de temperatura.
Un calendario perpetuo es sólo un cronómetro. Agregue una pantalla LCD para visualización.
Todos deberían estar en línea. Puedes buscarlo.
Busqué un programa de calendario perpetuo para ti.
1. Algoritmo del calendario solar
Para conocer el algoritmo específico, consulte la función void get_solar_day_date(void) para determinar la disposición semanal del calendario solar.
Tabla 1:
Definición de variable:
Pública:
Unsigned int temp_total_day
Carácter sin firmar gc_solar_calendar_year
Carácter sin firmar gc_solar_calendar_month
Carácter sin firmar gc_solar_calendar_date
Carácter sin firmar gc_lunar_calendario_año
Carácter sin firmar gc_lunar_calendario_ mes
Carácter sin signo gc _ lunar _ calendario _ fecha
Carácter sin signo inicio _ día _ de la _ semana
Descripción: Las variables de entrada de la función get_solar_day_date( void) son gc_solar_calendar_year y gc_solar_calendar_month.
Variables de salida: start_day_of_week y temp_total_day
Void get_solar_day_date (no válido)
{
Temperatura de carácter sin firmar 01;
/* - Calcula el día de la semana para el año, mes y día actual. ¿Lunes ~ domingo? - */
/*La inicialización condicional se ejecuta dos veces para reducir la cantidad de datos de operación.
temp_total_day es una variable entera*/
inicio _ día _ de _ semana = 2; temp _ total _ día = 0; cálculo _ temperatura = 1; ;99)
{ start_day_of_week = 6;calculate_temperature=100;}
for(temp 01 = calcular_temp ;temp 01<gc _solar calendar_year;temp01++)
{ if(temp 01% 4 = = 0){ inicio_dia_de_semana+= 2; temp_total_dia_día+= 366 }
else { inicio_dia_de_semana+= 1; temp _ total _ día+= 365; }}
for(temp 01 = 1; temp 01 & lt ;gc_solar_month;temp01++)
{cambiar (temperatura 01)
{caso 1, 3, 5, 7, 8, 10, 12: inicio_día_de_semana+= 3;temp_total_day+= 31;descanso;
Caso 2: if ((GC_solar_calendar_year% 4)==0); & amp(gc_solar calendar_year! = 200))
{ inicio_día_de_semana+= 1; temperatura total_día+= 29; >else { inicio_día_de_semana+= 0; temp_total_día+= 28;
Caso 4, 6, 9, 11: inicio_día_de_semana+= 2; temp_total_dia+= 30; roto ;}}
inicio_dia_de_semana % = 7;
/*-Después de calcular el día de la semana (Mon~ ¿Sol?) y el número total de días-*/
}
2. Algoritmo del calendario lunar
El año 2000 requiere 200 × 2 = 400 bytes. La tabla de datos comprimidos del calendario lunar lunar_calendar_month_table[] es la siguiente.
const charlunar_calendario_mes_tabla[]= {//De 1900 a 2100 en el calendario lunar.
/*Puntero al número total de días de cada mes*/
Mes 123456789 1011112
Año bisiesto 31 29 31 30 31 30 31 31 30 31
31 28 31 3031 3031 31 3031 en años no bisiestos.
/*De 1901~2100*/
/*(0110)11000001(0110) mes bisiesto, 11000001
Total de días del mes lunar: 1: 29 0 :30*/
0x00, 0x04, 0xad, 0x08, 0x5a, 0x01, 0xd5, 0x54, 0xb4, 0x09, 0x64, 0x05, 0x59, 0x45,
0x95, 0, 0xa6, 0x04, 0x55, 0x24, 0xad, 0x08, 0x5a, 0x62, 0xda, 0x04, 0xb4, 0x05, 0xb4, 0x55, 0x52, 0x0d, 0x94, 0, 0x4a, 0x2a, 0x56 , 0x02 , 0x6d, 0x71, 0x6d, 0x01,
0xda, 0x02, 0xd2, 0x52, 0xa9, 0x05, 0x49, 0x0d, 0x2a, 0x45, 0x2b, 0x09, 0x56, 0x01, >
0xb5, 0x20, 0x6d, 0x01, 0x59, 0x69, 0xd4, 0, 0xa8, 0x05, 0xa9, 0x56, 0xa5, 0x04,
0x2b, 0x09, 0x9e, 0x38, 0xb6, 0x08, 0xec, 0x74,0x6c,0x05,0xd4,0,0xe4,0x6a,
0x52,0x05,0x95,0,0x5a,0x42,0x5b,0x04,0xb6,0x04,0xb4,0x22,0x6a,0x05 ,
0x52, 0x75, 0xc9, 0, 0x52, 0x05, 0x35, 0x55, 0x4d, 0, 0x5a, 0x02, 0x5d, 0x31,
0xb5, 0x02, 0x6a, 0x8a , 0x68 ,0x05,0xa9,0,0x8a,0x6a,0x2a,0x05,0x2d,0x09,
0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25, 0x75, 0x95, 0,
0x96, 0x04, 0x4d, 0x54, 0xad, 0x04, 0xda, 0x04, 0xd4, 0x44, 0xb4, 0x05, 0x54, 0x85,
0x52, 0x0d, 0x92, 0, 0x56, 0x6a, 0x56, 0x02, 0x6d, 0x02, 0x6a, 0x41, 0xda, 0x02,
0xb2, 0xa1, 0xa9, 0x05, 0x49, 0x0d, 0x6d, 0x2a , 0x09 , 0x56, 0x01, 0xad, 0x50,
0x6d, 0x01, 0xd9, 0x02, 0xd1, 0x3a, 0xa8, 0x05, 0x29, 0x85, 0xa5, 0x0c, 0x2a, 0x09,
0x96, 0x54, 0xb6, 0x08, 0x6c, 0x09, 0x64, 0x45, 0xd4, 0, 0xa4, 0x05, 0x51, 0x25,
0x95, 0, 0x2a, 0x72, 0x5b, 0x04, 0xb6, 0x04,0xac,0x52,0x6a,0x05,0xd2,0,
0xa2,0x4a,0x4a,0x05,0x55,0x94,0x2d,0,0x5a,0x02,0x75,0x61,0xb5,0x02 ,
0x6a, 0x03, 0x61, 0x45, 0xa9, 0, 0x4a, 0x05, 0x25, 0x25, 0x2d, 0x09, 0x9a, 0x68,
0xda, 0x08, 0xb4, 0x09 , 0xa8 , 0x59, 0x54, 0x03, 0xa5, 0, 0x91, 0x3a, 0x96, 0x04,
>
0xad, 0xb0, 0xad, 0x04, 0xda, 0x04, 0xf4, 0x62, 0xb4, 0x05, 0x54, 0x0b, 0x44, 0x5d,
0x52, 0, 0x95, 0x04, 0x55, 0x22 , 0x6d, 0x02, 0x5a, 0x71, 0xda, 0x02, 0xaa, 0x05,
0xb2, 0x55, 0x49, 0x0b, 0x4a, 0, 0x2d, 0x39, 0x36, 0x01, 0x6d, 0x80, 0x6d, 0x01,
0xd9, 0x02, 0xe9, 0x6a, 0xa8, 0x05, 0x29, 0x0b, 0x9a, 0x4c, 0xaa, 0x08, 0xb6, 0x08,
0xb4, 0x38, 0x6c, 0x09, 0x54, 0x75, 0xd4, 0, 0xa4, 0x05, 0x45, 0x55, 0x95, 0,
0x9a, 0x04, 0x55, 0x44, 0xb5, 0x04, 0x6a, 0x82, 0x6a, 0xd2 0x31, 0x73, 0xa9, 0, 0x4a, 0x05, 0x2d, 0x55, 0x2d, 0x09, 0x5a, 0x01, 0xd5, 0x48,
0xb4, 0x09, 0x68, 0x89, 0x54, 0x0b, 0xa4, 0 , 0xa5, 0x6a, 0x95, 0x04, 0xad, 0x08,
0x6a, 0x44, 0xda, 0x04, 0x74, 0x05, 0xb0, 0x25, 0x54, 0x03,};
A Algoritmo para determinar la correspondencia entre días solares y lunares:
Para cualquier otra correspondencia entre días solares y lunares, el resultado se puede obtener mediante el siguiente algoritmo. El algoritmo específico se implementa mediante, por ejemplo, get_lunar_day(void):
Descripción: las variables de entrada de la función get_lunar_day(void) son gc_solar_calendar_year y gc_solar_calendar.
Variables de salida: gc_lunar_calendar_year, gc_lunar_calendar_month y gc_lunar_calendar_date.
Void get_lunar_day(void)/*Calcular el año y mes solar de entrada, correspondiente al primer día del mes solar en tiempo, año, mes y día lunar*/
{Temperatura de carácter sin firmar _ mes bisiesto
Temperatura de carácter sin firmar _ bandera
Calcular carácter sin firmar _ temp
Carácter sin firmar mc _ tpumenus _ temp _ loop p>
Carácter sin firmar MC_TPU menus_temp_01;
temp_leap mes = 0; temp_flag = 1;
// La condición se inicializa dos veces, reduce la cantidad de datos computacionales.
if(GC_solar_calendar_year>99)
{ gc_lunar_calendar_year=99gc_lunar_calendar_month=11;
gc_lunar_calendar_date=25temp_total_day+=25;calculate_temperature=100;}
Otro
{ GC_lunar_calendar_year = 0;gc_lunar_calendar_month=11;
gc_lunar_calendar_date=11;temp_total_day+=11;calculate_temperature=1;}
if(GC_solar_calendar_year> calcular_temp| | GC_solar_calendar_month>1)
{ for(MC_TPU menus_temp_loop = 1; mc _ tpumenus _ temp _ loop & gt0;){
temp _ total _ día-= calendario _ calcular _ mes _ lunar _ día _ total()
temp_salto _ mes = menús de TPU _ calendario _ lunar _ mes _ tabla[2 * GC _ calendario _ lunar _ año+
temp _mes bisiesto=(temp _ mes bisiesto>>4)& amp ;0x0F
if(GC_lunar_calendar_month==temp_leap_month)
{switch(gc_lunar_calendar_year)
{Caso 6, 14, 19, 25, 33, 36, 38, 41, 44, 52, 55, 79, 117,
136,147,150,155,158,185,193:
if(temp _ total _ día & lt; 31 ){ GC _ lunar _ calendario _ fecha = temp _ total _ día
MC _ TPU menús _ temp _ loop = 0; p>
else temp _total_day-= 30;
Break; //Mes actual: temp_leap_month
Valor predeterminado:
if(temp_total_day< 30)
{ GC _ lunar _ calendario _ fecha = temp _ total _ día; MC _ menús TPU _ temp _ loop = 0
temp _ flag = 0; : temp_leap_month*/ }
else temp _ total _ day-= 29; break }}
if(temp _ flag){ GC _ lunar _ calendario _ mes++; p>
if(GC_lunar_calendario_mes == 13){ GC_lunar_calendario_mon
th = 1;
gc _lunar_calendar_year++;}
if(temp_total_day<61)//if temp_total_day& gt; 60. Ignorar comparación
{ MC _ TPU menus _ temp _ 01 = calendario _ calcular _ lunar _ mes _ total _ día();
if(temp _ total _ día <(MC_tpumenus_temp_01+1))
{ MC_TPU menus_temp_loop = 0;GC_lunar_calendar_date = temp_total_day;
} }
} } }
gc_lunar_leap mes=(temp_flag<<4)|temp_leap mes;/*Establecer salto mes Bandera */
Descripción: La función Calendario _ Calcular _ Lunar _ Mes _ Total _ Día (void) calcula los días lunares correspondientes basándose en las variables de entrada gc_lunar_calen y gc_lunar_calendar_month, combinadas con la tabla de datos comprimidos lunar_calendar_month_table .
Carácter sin firmar calendar_calculate_lunar_month_total_day(vacío)
{
Carácter sin firmar MC_TPU menus_temp_01 ;
Carácter sin firmar mc_tpumenus_temp_02
if(GC_lunar_calendar_month<9)
{ MC_tpumenus_temp_01 = lunar_calendario_mes_tabla [2 * GC_lunar_calendario_año];
MC_tpumenus_ temp_02 = GC_lunar_calendario_mes-1 }
En caso contrario {
MC_tpumenus_temp_01 = lunar_calendario_mes_tabla[2*GC _ lunar _ calendario _ año+1];
MC_TPU menus_temp_02 = GC_lunar_calendar_month-9;}
if((MC_TPU menus_temp_01>>MC_TPU menus_temp_02) & 0x01) Regresar (29
En caso contrario devolver (30); }
Correspondencia entre los días del calendario solar y los términos solares lunares
Tabla de datos de términos solares comprimidos:
Se pueden obtener cuatro tablas de datos de acuerdo con las reglas (cada mes de término solar tiene dos términos solares y cada término solar requiere dos tablas de datos):
const unsigned char calendario _ solar _ término _ tabla _ 01[12][33]= {
{7, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 5, 5,6,6,5 ,5,5,5,5,5,5,5,4,5,5},//mes 1
{5,4,5,5,5, 4,4,5, 5,4,4,4,4,4,4,4,4,3,4,4,4,3,3,4,4,3,3,3}, //2
{6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5, 5,5,5, 4,5,5,5,5}, //3
{5,5,6,6,5,5,5,6,5,5,5, 5,4,5, 5,5,4,4,5,5,4,4,4,5,4,4,4,4,5}, //4
{6, 6,6,7, 6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5,5,5,4,5, 5,5,5} , //5
{6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6, 5,5,6, 6,5,5,5,6,5,5,5,5,4,5,5,5,5}, //6
{7,8, 8,8,7, 7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7,6,6,6, 7,7}, / /7
{8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7, 7,7,8, 7,7,7,7,6,7,7,7,6,6,7,7,7}, //8
{8,8,8, 9,8,8, 8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7, 7}, //9
{9,9,9,9,8,9,9,9,8,8,9,9,8,
8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,8}, //10
{8,8,8, 8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6,7,7, 7}, //11
{7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7, 7,7,6,6,7,7,6,6,6,7,7}, //12
};//Esta tabla de datos muestra el primer término solar de cada ley mensual.
const calendario de caracteres sin firmar _ solar _ término _ año _ 01[12][9]= {
{13, 49, 85, 17, 149, 185, 201, 250 , 250}, //Mes 1
{13,45,81,117,149,185,201,250,250}, //2
{13,48,84,112,148,184,200,201,250}, //3
{13,45,76,108,140,172,200,201,250}, // 4
{13,44,72,104,168,200,250}, // 5
{5, 33,68,96,152,188,200,2011 }, / / /6
{29,57,85,120,148,176,200,201,250}, //7
{13,48,76,104,132,168,196,200,201}, //8
{25,60 , 88,120,148,184,200,201,250}, //9
{16,44,76,108,144,172,200,201,250}, //10
{28,60,92,124,160,192,200,201,250}, //11
{ 17,53,85,124,156,188,200,201,250}, //12
};//Esta tabla de datos muestra el rango de años del calendario solar correspondiente al patrón de ocurrencia del primer término solar de cada mes.
const calendario de caracteres sin firmar _ solar _ término _ tabla _ 02[12][29]= {
{21,21,21,21,21,20,21,21 ,21,20,20,21,21,20,20,20,20,20,20,20,20,19,20,20,20,19,19
{20,19, 19,20,20,19,19,19,19,19,19,19,19,19,18,19,19,19,18, 18,19,19,18,18,18,18,18,18
{21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20,21,20,20 ,20,20,19,20,20
{20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20, 19,20,20,20,19,19,20,20,19,19,19
{21,22,22,22,21,21,22,22,21,21,21 ,22,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20
{22,22,22,22,21, 22,22,22,21,21,22,22,21,21,21,22,21,21,21,21,20,21,21,21,20,20,21
{23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23,22 ,22,22
{23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23,22,23,23, 23,22,22,23,23,22,22,22
{23,24,24,24,23,23,24,24,23,23,23,24,23,23 ,23,23,22,23,23,23,22,22,23,23,22,22,22
{24,24,24,24,23,24,24,24, 23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23,22,22,23
{23,23,23 ,23,22,23,23,23,22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22 p>
{22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22,21,21,22,22,21,21, 21,22,21,21,21
};//Esta tabla de datos muestra el patrón del segundo término solar de cada mes.
const calendario de caracteres sin firmar _ solar _ término _ año _ 02[12][8]= {
{13,45,81,113,149,185,201},{21,57,93,125,161,193,201}, {21,56,88,120,152,188,200,20
{21,49,81,116,144,176,200,201},{17,49,77,112,140,168,200,201},
{28,60,88,116,148,18 0, 200,201},{ 25,53 ,84,112,144,172,200,201},
{29,57,89,120,148,180,200,201},{17,45,73,108,140,168,200,201},
{28,60,92,124,160,1 92, 200,201},{16, 44,80,112,148,180,200,201},
{17,53,88,120,156,188,200,201},};
//Esta tabla de datos muestra el rango de años del calendario solar correspondiente al patrón de ocurrencia del segundo término solar de cada mes.
Las fechas de los dos términos solares correspondientes a cada mes solar se pueden realizar mediante las dos funciones siguientes según el algoritmo de ley condicional.
Calendario de caracteres sin firmar _ calcular _ solar _ término _ 1(void)
{
zpage unsigned char done_index
zpage unsigned char solar_term
done_index = 0;
while(GC_solar_calendar_year>= calendar_solar_term_year_01 [GC_solar_calendar_mon
[done_index]){ done_index++;}
solar_term = calendario_solar_term_table_01[GC_ solar_ calendario_ mes-1][4 * hecho_ind
GC_sol_calendario_año % 4];
if((GC_solar_ calendario _ año = = 121)&&(gc_solar_calendar_month == 4))solar term=5
if((GC_solar_calendar_year==132)&&(gc_solar_calendar_month==4 )) términos solares = 5
if((GC_solar_calendar_year==194)&&(gc_solar_calendar_month==6))solar Terms=6
retorno (término solar);
} //Calcular el primer término solar correspondiente al mes del calendario solar.
Calendario de caracteres sin firmar _ calcular _ solar _ término _ 2(void)
{
zpage unsigned char done_index
zpage unsigned char solar_term
done_index = 0;
while(GC_solar_calendar_year>= calendar_solar_term_year_02 [GC_solar_calendar_mon
[done_index]){ done_index++;}
solar_term = calendario_solar_term_table_02[GC_ solar_ calendario_ mes-1][4 * hecho_ind
GC_sol_calendario_año % 4];
if((GC_solar_ calendario _ año = = 171)&&(gc_solar_calendar_month == 3))solar term=2
if((GC_solar_calendar_year===181)&&(gc_solar_calendar_month==5 )) Término solar = 2
return(solar term);
}//Calcular el segundo término solar correspondiente al mes del calendario solar.
Lo anterior es el algoritmo completo del calendario perpetuo. Primero calcula el día de la semana correspondiente al primer día del mes del calendario solar y luego determina la fecha del calendario lunar correspondiente en función de los datos que se implementan mediante un algoritmo de ley condicional.