Solicitud de uso del microcontrolador 74LS273 para diseñar el informe de diseño del curso de reloj de computadora LED
He utilizado cristales líquidos ds1302 y 1602 combinados con un sensor de temperatura ds18b20. Los tres botones se pueden usar para ajustar la hora, el año, el mes y el día, que se simulan en proteus.
Los resultados experimentales se muestran en la figura
¿El código del lenguaje C es el siguiente? #include
sbit?ES=P1^1;
sbit?clk=P3^2;
sbit ?IO=P3^7;
sbit?reset=P3^0;
sbit?key1=P1^4;
sbit ?key2=P1^ 5;
sbit?key3=P1^6;
sbit?DQ=P1^7;
void?key();
void?delay(uchar?z) //Retraso 4ms
{
uchar?x,y;
for(x =0;x for(y=0;y<110;y++); } void?delayus(uchar? z)// 10us { uchar?i; for(i=0;i { _nop_(); } } fecha nula(uchar?dat) { ?RS=1; ?P2=dat; ?EN=1; ?delay(1); ?ES=0; ?delay(1);? } void?write_com(uchar?com) { ?RS=0; ?P2=com; ?ES=1; ?retraso(1 ); ?ES=0; ?retraso(1); } void?init( ) { uchar?i; ?EN=0; write_com(0x38); write_com(0x0c ); write_com(0x06); write_com(0x01); write_com(0x80); for(i=0;i< 11;i++) { fecha(x[i]); } write_com(0x80x40); for(i=0;i<11;i++) { fecha(x1[i]); } clk=0; IO=0; reset=0; } void?write1 (uchar?x ) ?//Escribe un bit { IO=x; clk=0; clk= 1; } uchar?read1() //Leer un dígito { uchar?x; p> clk =1; clk=0; _nop_(); x=IO; return?x; } void?writebyte(uchar?date) //Escribe un byte { uchar?i,x; for(i=0;i<8;i++) { x=fecha%2; fecha=fecha>>1; p > write1(x); } } uchar?readbyte()?//Leer un byte { uchar?i,x,date; fecha=0; for(i=0;i<8;i++) p> { x=read1(); x=x< fecha=fecha+x; } regreso?fecha; } uchar?read(uchar?addr) { uchar?fecha; reset=1; writebyte(addr); fecha=readbyte(); reset= 0; retorno?fecha; } void?write(uchar?addr,uchar?date) { p> restablecer=1; escribirbyte(dirección); escribirbyte(fecha); restablecer=0; } void?key() { uchar?gewei,shiwei,x; if(key1= =0 ) { delay(3);//Retraso de rebote del software de 12 ms if(key1==0) { pushtime++; while(key1==0); } } cambiar(pushtime) { case?0: romper; case?1: //Modificar puntos escribir(0x80,0x80); escribir_com(0x80x47); escribir_com(0x0f); if(key2= =0) { retraso(3); if(key2==0) { gewei= fen&0x0f ?//Obtener el dígito de las unidades shiwei=(fen&0x70)>>4 //Obtener el dígito de las decenas x=gewei+10* shiwei; x++; if(x==60) { x=0; } gewei=x%10; shiwei=x/10; fen=(shiwei<<4)+gewei; //Recuperar los puntos write(0x82,fen ?//Modificar los puntos en 3102 write_com(0x80x40) +6);//Modificar los minutos en pantalla date(shiwei+0x30);? write_com(0x80x47); fecha (gewei+0x30); while(key2==0 } } if(key3==); 0 ) { retraso(3); if(key3==0) { gewei=fen&0x0f ?//Obtener el dígito de las unidades shiwei=(fen&0x70)>>4; //Obtener el dígito de las decenas x=gewei +10*shiwei; x--; si(x==255) { x=59; } gewei=x%10; shiwei=x/10; fen=(shiwei<<4)+gewei ; //Recuperar minutos write(0x82,fen ?//Modificar el minuto en 3102 write_com(0x80x46);//Modificar la dirección del minuto date(shiwei+0x30);?//Modificar la puntuación write_com(0x80x47);//Modificar la subdirección fecha (gewei+0x30); // Modificar puntuación while(key3==0 } } break; case ?2: ?//Modificar hora write_com(0x80x44); if(key2==0) { retraso(3); if(key2==0) { gewei=xiaoshi&0x0f; //Obtener las unidades de la hora shiwei=(xiaoshi&0x30)>>4; //Obtener las decenas de la hora x=gewei+10*shiwei; x++; si(x==24) { x=0; } gewei=x%10; shiwei=x/10; xiaoshi=(shiwei<<4)+gewei; //Obtener la hora nuevamente write(0x84,xiaoshi); ?//Modificar la hora en 3102 write_com(0x80x43);//Modificar la hora en pantalla fecha(shiwei+0 x30);? write_com(0x80x44); fecha(gewei+0x30); while(key2==0); /p> } } if(key3==0) { retraso(3); if(key3==0) { gewei=xiaoshi&0x0f ?//Obtener el dígito de las unidades de la hora shiwei =( xiaoshi&0x30)>>4; //Obtener las decenas de la hora x=gewei+10*shiwei; x--; if(x= =255) { x=23; } gewei=x%10; shiwei=x/10; xiaoshi=(shiwei<<4)+gewei; //Obtener la hora nuevamente write(0x84,xiaoshi ?/ /Modificar en 3102 Hora write_com(0x80x43);//Modificar la dirección de la hora date(shiwei+0x30);?//Modificar la puntuación write_com( 0x80x44);//Modificar dirección de hora date(gewei+0x30); //Modificar puntuación while(key3==0) } } descanso; caso?3: write_com(0x810) ;//Fecha de modificación if(key2==0) { retraso(3); if(key2= =0) { gewei=ri&0x0f;//Obtener el dígito de las unidades del día shiwei=(ri&0x30)>>4; Obtén las decenas del día x=gewei+10*shiwei; x++; if(x==32) { x=0; } gewei=x%10; shiwei=x/10; p> ri=(shiwei< <4)+gewei; //Obtener el día nuevamente write(0x86,ri ?//Modificar el día en 3102 write_com(0x89);//Modificar el día en la pantalla date(shiwei+0x30);? write_com(0x810); fecha(gewei+0x30); while(key2==0 } } if(key3); ==0) { retraso( 3); if(key3==0) { gewei=ri&0x0f;//Obtener el dígito de las unidades del día shiwei=(ri&0x70)>>4; //Obtener el décimo dígito del día x=gewei+10*shiwei; x--; if(x==255) { x=31; } gewei=x%10 ; shiwei=x/10; ri=(shiwei<<4)+gewei; //Recupera el día write(0x86,ri ?//Modificar el día en 3102 write_com(0x89);//Modificar la dirección del día date(shiwei+0x30);?//Modificar los minutos y días write_com(0x810);//Modificar la dirección del día date(gewei+0x30); //Modificar el número del día while (clave3==0); } } descanso; caso?4: write_com(0x87);//Modificar mes if(key2==0) { delay(3); if(key2==0) { gewei=yue&0x0f ?//Obtener el dígito de las unidades del mes shiwei=(yue&0x10) >>4; //Obtener las decenas del mes x=gewei+10*shiwei; x++; if(x==13 ) { x=0; } gewei=x%10; shiwei= x/10; yue=( shiwei<<4)+gewei; //Obtener el mes nuevamente write(0x88,yue);//Modificar el mes en 3102 write_com(0x86);/ /Modificar el mes en pantalla date(shiwei+0x30);? write_com(0x87) ; fecha(gewei+0x30); while(key2==0 } } if(key3==0) { retraso(3); if(key3==0) { gewei=yue&0x0f;// Obtener el dígito de las unidades del mes shiwei=(yue&0x10)>> //Obtener el dígito de las decenas del mes x=gewei+10*shiwei; x--; if(x==0) > { x=12; } gewei=x%10; shiwei=x/10; yue=(shiwei<<4)+gewei; //Obtener el mes nuevamente write(0x88,yue ?//Modificar el mes en 3102 write_com (0x86);//Modificar la dirección mensual date(shiwei+0x30);?//Modificar el número de meses write_com(0x87);/ /Modificar la dirección mensual date(gewei+0x30); //Modificar el número de meses while(key3==0); } } break; case?5: write_com(0x84);//Modificar año if(key2== 0) { retraso(3); if(key2==0) { gewei=nian&0x0f;//Obtener las unidades del año shiwei=(nian&0x70)>>4;/Obtener las decenas del año x=gewei+10*shiwei ; x++; if(x==100) { x=0; } gewei=x%10; shiwei=x/10; nian=(shiwei< <4)+gewei; //Obtener el año nuevamente write(0x8c,nian ?//Modificar el año en 3102 write_com(0x83);// Modificar los minutos en pantalla date(shiwei+0x30);? write_com(0x84); date(gewei+0x30); mientras(clave2==0) } } si(clave3==0) { retraso(3) ; if(key3==0) { gewei=nian&0x0f; Obtener el dígito de las unidades del año shiwei =(nian&0x70)>>4 //Obtener el décimo dígito del año x=gewei+10*shiwei; x--; si( x==255) { x=99; } gewei=x%10; shiwei=x/10; nian=(shiwei<<4)+gewei; //Obtener el año nuevamente write(0x8c,nian); ?//Modificar 3102 El año intermedio wr ite_com(0x83);//Modificar la dirección del año date(shiwei+0x30);?//Modificar el año write_com(0x84);//Modificar la dirección del año date(gewei+0x30); //Modificar el número de años while(key3==0 } } descanso; caso?6: pushtime=0; write_com(0x0c); p> escribir (0x80,0x00); romper; } } void?resettem() { DQ=1;//restablecimiento de temperatura _nop_(); _nop_(); DQ=0; demoraus(60); //Retraso 480-960us 600us DQ=1; demoraus(6);//15 -60us retraso(20);//tiempo de respuesta hasta 80ms DQ=1; _nop_(); _nop_(); } void?temwrite1(uchar?x) { DQ=0; _nop_( ); _nop_();//2us DQ=x; delayus(7);//70us DQ =1; _nop_(); _nop_(); } void?temwritebyte(uchar ?fecha) p> { uchar?i,x; for(i=0;i<8;i++) { x=fecha%2; fecha=fecha>>1; temwrite1(x); } p> } uchar?temread1() { uchar?x; DQ=0; p> _nop_(); _nop_();//2us DQ=1; _nop_(); _nop_() ; _nop_();//3us x=DQ; delayus(6);//60us DQ= 1; _nop_(); _nop_();//2us return?x; } uchar?temreadbyte() { uchar?i,date,x; date=0; para (i=0;i<8;i++) { x=temread1(); x=x< fecha=fecha+x; } retorno?fecha; } nulo? main() p> { uchar?gewei,shiwei; init (); escribir_com(0x815); fecha(0xdf); escribir(0x84,0x10); while(1) { if(pushtime==0) { /*Medir el tiempo*/ miao=read(0x81);?//Cuenta regresiva gewei=miao&0x0f; shiwei=miao&0x70; shiwei=shiwei>>4 ; write_com(0x80x49);//Modificar la dirección de segundos date(shiwei+0x30); //Modificar los segundos write_com ( 0x80x410); //Modificar segunda dirección date(gewei+0x30); //Modificar segundos fen=read(0x83); /p> gewei=fen&0x0f; shiwei=fen&0x70; shiwei=shiwei>>4; write_com(0x80x46) ;//Modificar la subdirección date(shiwei+0x30); //Modificar la puntuación write_com(0x80x47);//Modificar la subdirección date(gewei+0x30); //Modificar la puntuación xiaoshi=read(0x85); //Leer la hora gewei=xiaoshi&0x0f; shiwei =xiaoshi&0x30; shiwei=shiwei>>4; write_com(0x80x43);//Modificar la dirección horaria date(shiwei+0x30 ); //Modificar la hora write_com(0x80x44);//Modificar la dirección de la hora date(gewei+0x30) ; //Modificar la hora nian=read(0x8d); //Leer el año gewei=nian&0x0f; shiwei=nian&0xf0; shiwei=shiwei>>4 ; write_com(0x83);//Modificar la dirección del año date(shiwei+0x30); //Modificar el año write_com(0x84 ); //Modificar la dirección del año date(gewei+0x30); //Modificar el año yue=read( 0x89); //Leer el mes gewei=yue&0x0f; shiwei=yue&0xf0; shiwei=shiwei>>4; write_com(0x86);//Modificar dirección mensual p> date(shiwei+0x30); //Modificar el número de meses write_com(0x87);// Modificar la dirección del mes fecha(gewei+0x 30); //Modificar el número de meses yue=read(0x87); //Leer el día gewei=yue&0x0f; shiwei=yue&0xf0 ; p> shiwei=shiwei>>4; write_com(0x89);//Modificar la dirección del día date(shiwei+0x30); /Modificar el número de días write_com(0x810);//Modificar la dirección del día date(gewei+0x30); //Modificar el número de días /*Medir temperatura*/ resettem(); temwritebyte(0xcc); temwritebyte(0x44); while(DQ==0); resettem(); temwritebyte(0xcc); temwritebyte(0xbe); lsb=temreadbyte(); msb=temreadbyte(); tem=(lsb>>4)+(msb<<4); gewei=tem%10; shiwei=tem/10; write_com(0x814); fecha(gewei+0x30); p> write_com(0x813); fecha(shiwei+0x30); } clave(); p> } }