Solicitando un informe de diseño de curso sobre diseño de un reloj de computadora LED utilizando el microcontrolador 74LS273.

He utilizado una combinación de sensores de temperatura LCD ds1302 y 1602 y ds18b20. Se pueden utilizar tres botones para ajustar la hora, año, mes y día, simulados en proteus.

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 _();

}

}

¿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)

{

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);

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);

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);

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)

{

/*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*/

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();?

}

}