Los resultados experimentales se muestran en la figura.
El código del lenguaje c es el siguiente
# include & ltreg52.h & gt
# include & ltintrins.h & gt
#Definición? ¿Uchar? ¿No firmado? Té
Uchar? Plántulas, puntos, guijarros, días, meses, años, tem, lsb, msb, pushtime
Uchar? codex[]= "?20//";
Uchar? ¿Código? x1[]= "?::"?;
sbit? rs=p1^0;
sbit? es=p1^1;
sbit? clk=p3^2;
sbit? io=p3^7;
sbit? reset=p3^0;
sbit? clave1=p1^4;
bit? key2=p1^5;
bit? key3=p1^6;
bit? dq=p1^7;
¿No es válido? clave();
¿No es válido? Retraso (uchar?z)//Retraso 4 milisegundos
{
Uchar?z? x, y;
for(x = 0; x & ltz; x++)
for(y = 0; y & lt110;y++);
}
¿Nulo? Drayus(Uchar?z)//10us
{
Uchar? i;
for(I = 0;i<z;i++)
{
_ nop _();
} p>
}
¿Anulado? Fecha (uchar?dat)
{
? RS = 1;
? P2 = dat;
? ES = 1;
? Retraso(1);
? ES = 0;
? retraso(1);?
}
¿Anulado? write_com(uchar?com)
? RS = 0;
? P2 = com;
? ES = 1;
? Retraso(1);
? ES = 0;
? Retraso(1);
}
¿Anulado? Inicializar()
{
Uchar? Yo;
? EN = 0;
write_com(0x 38);
write_com(0x0c);
write_com(0x 06);
write_com (0x06);
write_com(0x06); p>
write_com(0x 01);
write_com(0x 80);
para(I = 0;i<11;i++)
{
Fecha(x[I]);
}
escribir _ com(0x 80x 40);
for(I = 0;i<11;i++)
{
fecha(x 1[I]);
}
clk = 0;
IO = 0;
Restablecer = 0;
¿No es válido? escribir1(uchar?x)? //Escribe un poco
{
IO = x;
clk = 0
clk = 1;
}
¿Uchar? Leer 1()//Leer un bit.
{
¿Uchar? x;
clk = 1
clk = 0
_ nop _(); >
¿Volver? x;
}
¿No es válido? writebyte(uchar?date)//Escribe un byte.
{
¿Uchar? I, x;
for(I = 0;i<8;i++)
{
x = fecha % 2;
fecha = fecha & gt& gt1;
escribe 1(x);
}
}
Uchar? Readbyte()//Leer un byte.
{
¿Uchar? I, x, fecha;
fecha = 0;
for(I = 0;i<8;i++)
{
x = leer 1();
x = x & lt& lti;
fecha=fecha+x;
}
¿Volver? Fecha;
}
Uchar? Lectura (uchar? Dirección)
{
Uchar? fecha;
reinicio = 1
escribir byte(addr);
fecha = leer byte(); ;
¿Volver? Fecha;
}
¿No es válido? escribir(uchar? addr, uchar? fecha)
{
reset = 1;
escribir byte(addr);
writebyte (fecha);
Restablecer = 0;
}
¿No es válido? Clave()
{
Uchar? Ge Wei, Shi Wei, x;
if(key1==0)
{
Retraso (3); //Retraso de rebote del software de 12 ms
p>if(clave1==0)
{
pushtime++;
mientras(clave 1 == 0);
}
}
Cambiar (tiempo de publicación)
{
¿Caso? 0:
Rotura;
¿Caso? 1: ?//Punto de modificación
Escribir (0x80, 0x 80
escribir _ com (0x 80x 47); _ com(0x0f);
if(key2==0)
{
Retraso(3);
if(key2 ==0)
{
Min&0x0f//Obtiene la unidad de minuto.
Shiwei =(fen & amp; 0x70)>& gt4;//Obtener el dígito de las decenas de la puntuación
x = grid + 10 * dígito de las decenas;
x++;
Si (x==60)
{
x = 0;
}
gewei = x % 10;
Shiwei = x/10;
fen = (Shiwei <<4)+gewei;? //Obtener puntos otra vez
Escribir (0x82, fen);? //Modifica el punto en 3102
write _ com (0x 80x 46); //Modifica el punto en la pantalla
Fecha (décima dimensión + 0x 30) ;
escribir _ com(0x 80x 47
Fecha (cuadrícula + 0x 30);
mientras(clave 2 = = 0); );
}
}
if(key3==0)
{
Retraso(3 );
if(key3==0)
{
Min & amp0x0f//Obtiene la unidad de minutos.
Shiwei =(fen & amp; 0x70)>& gt4;//Obtener el dígito de las decenas de la puntuación
x = grid + 10 * dígito de las decenas
<; p>x-;si (x==255)
{
x = 59
}
gewei = x % 10;
Shiwei = x/10;
fen = (Shiwei <<4)+gewei;? //Obtener puntos otra vez
Escribir (0x82, fen);? //Modifica el punto en 3102
write _ com (0x 80x 46); //Modifica la subdirección
Fecha (décima dimensión + 0x 30); // Modificar puntuación
write _ com(0x 80x 47); //Modificar subdirección
Fecha (grid+0x 30); /p >
mientras(clave 3 = = 0);
}
}
Romper;
¿Caso? 2://Modificar el número de horas
write _ com(0x 80x 44);
if(key2==0)
{
Retraso (3);
if(key2==0)
{
小石&0x0f//Obtener la unidad horaria
Shiwei =(Xiaoshi & amp; 0x30)>& gt4;//Obtener el dígito de las decenas de la hora
x = cuadrícula + 10 * dígito de las decenas;
x++;
Si (x==24)
{
x = 0;
}
gewei = x % 10;
Shiwei = x/10;
小石=(Shiwei<<4)+gewei;? //Recuperar tiempo
Escribir (0x84, Xiaoshi);? //Modifica la hora en 3102
write _ com (0x 80x 43); //Modifica la hora en pantalla
Fecha (décima dimensión + 0x 30) ;
escribir _ com(0x 80x 44
Fecha (cuadrícula + 0x 30);
mientras(clave 2 = = 0); );
}
}
if(key3==0)
{
Retraso(3 );
if(key3==0)
{
小石&0x0f//Obtener la unidad horaria
Shiwei =( Xiaoshi & 0x30)>& gt4;//Obtener el dígito de las decenas de la hora
x = grid + 10 * decenas;
x-;
Si (x==255)
{
x = 23
}
gewei = x % 10;
p >Shiwei=x/10;
Xiaoshi=(Shiwei<<4)+Gewei;? //Recuperar tiempo
Escribir (0x84, Xiaoshi);? //Modificar la hora en 3102
write _ com (0x 80x 43); //Modificar la dirección de la hora
Fecha (décima dimensión + 0x 30); / Modificar puntuación
write _ com(0x 80x 44); //Modificar dirección de hora
Fecha (grid + 0x 30); //Modificar puntuación
mientras(tecla 3 = = 0);
}
}
Romper;
¿Caso? 3:
>write_com(0x 810); //Fecha de modificación
if(key2==0)
{
Retraso(3);
if(key2==0)
{
gewei = ri & amp0x0f//Obtiene la unidad del día.
Shiwei =(ri & amp; 0x30)>& gt4;//Obtiene los diez dígitos de la fecha.
x = cuadrícula + 10 * lugar de las decenas
x++
If (x==32)
{ p; >
x = 0;
}
gewei = x % 10;
Shiwei = x/10;
ri =(Shiwei<<4)+Gewei;? //Retíralo.
Escribir(0x86,ri);? //Modifica la fecha en 3102
write_com (0x 89); //Modifica la fecha en pantalla
Fecha (décima dimensión + 0x 30); p >
escribir _ com(0x 810);
Fecha (cuadrícula + 0x 30);
mientras(clave 2 = = 0);
}
}
if(key3==0)
{
Retraso(3);
if(key3==0)
{
gewei = ri & amp0x0f//Obtiene la unidad del día.
Shiwei =(ri & amp; 0x70)>& gt4;//Obtiene el dígito de las decenas de la fecha.
x = cuadrícula + 10 * lugar de las decenas
x-
If (x==255)
{< / p>
x = 31;
}
gewei = x % 10;
Shiwei = x/10; ri =(Shiwei<<4)+Gewei;? //Retíralo.
Escribir(0x86,ri);? //Modificar la fecha en 3102
write _ com (0x 89); //Modificar la dirección del día
Fecha (décima dimensión + 0x 30); minuto y fecha.
write _ com(0x 810); //Modificar la dirección del día
Fecha (grid + 0x 30); //Modificar el número de días
mientras (tecla 3 = = 0);
}
}
Romper;
¿Caso? 4:
write _ com(0x 87); //Modificar mes
if(key2==0)
{
Delay(3);
if(key2==0)
{
Yue&0x0f//Saca la unidad del mes.
Shiwei=(Yue& amp0x10)>& gt4;//Obtener las decenas del mes
x = grid + 10 * decenas
x++;
if(x==13)
{
x = 0;
}
gewei = x % 10;
Shiwei = x/10;
Yue=(Shiwei<<4)+gewei;? //Obtener el mes
Escribir (0x88, Yue);? //Modificar el mes en 3102
write_com (0x 86); //Modificar el mes en pantalla
Fecha (décima dimensión + 0x 30); p >
escribir _ com(0x 87);
Fecha (cuadrícula + 0x 30);
mientras(clave 2 = = 0);
}
}
if(key3==0)
{
Retraso(3);
if(key3==0)
{
Yue& amp0x0f//Saca la unidad del mes.
Shiwei=(Yue& amp0x10)>& gt4;//Obtener las decenas del mes
x = grid + 10 * decenas
x-; ;
Si (x==0)
{
x = 12;
}
gewei = x % 10;
Shiwei = x/10;
Yue=(Shiwei<<4)+gewei;? //Obtener el mes
Escribir (0x88, Yue);? //Modificar el mes en 3102
write _ com (0x 86); //Modificar la dirección del mes
Fecha (décima dimensión + 0x 30); número de meses
write _ com (0x 87); //Modificar dirección del mes
Fecha (cuadrícula + 0x 30); //Modificar número de mes
while(clave 3 = = 0);
}
}
Romper;
¿Caso? 5:
write _ com(0x 84); //Modificar año
if(key2==0)
{
Delay(3);
if(key2==0)
{
Año&0x0f//Obtiene la unidad del año.
Diez sabor=(año& amp0x70)>& gt4;//Obtener el dígito de las decenas del año
x = grid + 10 * dígito de las decenas;
x++;
Si (x==100)
{
x = 0;
}
gewei = x % 10;
Shiwei = x/10;
nian = (Shiwei <<4)+gewei;? //Devuelve el año
Escribe (0x8c, año);? //Modifica el año en 3102
write _ com (0x 83); //Modifica el punto en la pantalla
Fecha (décima dimensión + 0x 30); p >
escribir _ com(0x 84);
Fecha (cuadrícula + 0x 30);
mientras(clave 2 = = 0);
}
}
if(key3==0)
{
Retraso(3);
if(key3==0)
{
Año&0x0f//Obtiene la unidad del año.
Diez sabor=(año& amp0x70)>& gt4;//Obtener el dígito de las decenas del año
x = grid + 10 * dígito de las decenas;
x-;
si (x==255)
{
x = 99
}
gewei = x % 10;
Shiwei = x/10;
nian = (Shiwei <<4)+gewei;? //Devuelve el año
Escribe (0x8c, año);? //Modificar el año en 3102
write _ com (0x 83); //Modificar la dirección del año
Fecha (décima dimensión + 0x 30); número de años
write _ com(0x 84); //Modificar la dirección del año
Fecha (grid + 0x 30); //Modificar el año
mientras(tecla 3 = = 0);
}
}
Romper;
¿Caso? 6:
tiempo de pulsación = 0;
escribir _ com(0x0c);
escribir (0x80, 0x 00);
Romper;
}
}
¿Nulo? resettem()
{
DQ = 1 //Restablecimiento de temperatura
_ nop _();
_ nop _( );
DQ = 0;
Drayus(60); //Retraso 480-960 us 600 us
DQ = 1;
drayos(6); //15-60us
delay(20); //hasta 80ms de tiempo de respuesta
DQ = 1; nop _();
_ nop _();
}
¿No es válido? temwrite1(uchar?x)
{
DQ = 0
_ nop _()
_ nop _(); ; //2us
DQ = x;
Drayus(7); //70us
DQ = 1;
_ nop _();
_ nop _();
}
¿No es válido? temwritebyte(uchar? fecha)
{
Uchar? I, x;
for(I = 0;i<8;i++)
{
x = fecha % 2;
fecha = fecha & gt& gt1;
temwrite 1(x);
}
}
Uchar? temread1()
{
¿Uchar? x;
DQ = 0
_ nop _();
_ nop _(); = 1;
_ nop _();
_ nop _();
_ nop _(); //3us
x = dq;
draius(6); //$60
dq = 1;
_nop_();
_ nop _(); //2us
¿Volver? x;
}
Uchar? temreadbyte()
{
Uchar? Yo, fecha, x;
Fecha = 0
for(I = 0; i<8;i++)
{
x; = tema
leer 1();
x = x & lt& lti;
fecha = fecha+x;
}
¿Volver? Fecha;
}
¿No es válido? Señor()
{
Uchar? El formato es, el mundo es;
init();
write _ com(0x 815);
Fecha (0x df);< /p >
Escribir(0x84, 0x 10);
mientras(1)
{
si(tiempo de inserción==0) p>
{
/*Tiempo de medición*/
Miao = read(0x 81); //Cuenta atrás
Miao&0x0f
Miao& amp0x70
shiwei = shiwei & gt& gt4;
write _ com(0x 80x 49); //Modifica la segunda dirección
Fecha (diez dimensiones + 0x 30); //Modifica los segundos
write _ com (0x 80x 410); //Modifica la segunda dirección
Fecha ( grid + 0x 30); //Modificar segundos
fen = read(0x 83);? //Leer puntos
Min& amp0x0f
Min& amp0x70
shiwei = shiwei & gt& gt4;
escribir _ com( 0x 8 0x 46); //Modificar subdirección
Fecha (décima dimensión+0x 30); //Modificar puntuación
escribir _ com(0x 80x 40 +7 ); //Modificar subdirección
Fecha (cuadrícula +0x 30); //Modificar puntuación
Pequeña piedra = read(0x 85);? //Tiempo de lectura
小石&0x0f
小石&0x30
shiwei = shiwei & gt& gt4;
write _ com(0x 8 0x 43); //Modificar dirección de hora
Fecha (décima dimensión +0x 30); //Modificar hora
escribir _ com(0x 80x 4 4) ; //Modificar la dirección de la hora
Fecha (grid + 0x 30); //Modificar la hora
nian = read(0x8d);? //Año de estudio
Año& amp0x0f
Año& amp0xf0
shiwei = shiwei & gt& gt4;
write _ com(0x 8 3); //Modificar dirección del año
Fecha (décima dimensión + 0x 30); //Modificar número del año
escribir _ com (0x 84); dirección
Fecha (grid + 0x 30); //Modificar el año
Yue = read(0x 89);? //Leer la luna
Yue& amp0x0f
Yue& amp0xf0
shiwei = shiwei & gt& gt4;
escribir _ com(0x 80 +6); //Modificar dirección del mes
Fecha (décima dimensión + 0x 30); //Modificar número de mes
escribir _ com (0x 87); dirección del mes
Fecha (cuadrícula + 0x 30); //Modificar número de mes
Yue = read(0x 87);? //Día de lectura
Yue& amp0x0f
Yue& amp0xf0
shiwei = shiwei & gt& gt4
;
write _ com(0x 89); //Modifica la dirección del día
Fecha (décima dimensión +0x 30); //Modifica el número de días
>write_com(0x 810); //Modificar la dirección del día
Fecha (grid + 0x 30); //Modificar el número de días
/*Medición temperatura*/ p>
resettem();
temwritebyte(0x cc);
temwritebyte(0x 44);
mientras(DQ = = 0);
resettem();
temwritebyte(0x cc);
temwritebyte(0x ser
LSB); = temreadbyte();
msb = temreadbyte();
tem =(LSB>>4)+(msb<<4);
gewei = tem % 10;
Shiwei = tem/10;
escribir _ com(0x 814);
Fecha (cuadrícula+0x 30);
escribir _ com (0x 813);
Fecha (décima dimensión + 0x 30);
}
clave();?
}
}