Red de conocimiento informático - Conocimiento de la instalación - Ayúdenme a responder esta pregunta. Soy nuevo aquí y no tengo ningún punto. Por favor, está programado con MSC51.

Ayúdenme a responder esta pregunta. Soy nuevo aquí y no tengo ningún punto. Por favor, está programado con MSC51.

#include

#include

#define uchar unsigned char

#define uint int sin firmar

código uchar tab2[]="00:00:00 000";

código uchar tab3[]="temp: . ";

int tab5[]={0,0,00};

sbit DQ = P2^4;

pestaña de código de caracteres[4][4]={ {1,4, 7,10},

{2,5,8,0},{3,6,9,11},{12,13,14,15}};

uchar a,miao,shi,fen,tt,key1n,key3n,key2n,nian,yue,r,nianb,speak,wendu,wendu1,wendu3,miao1,shu,shu1,wendu4;

carácter sin firmar código punto código[167]={0,6,12,19,25,31,37,44,50,56,62,69,75,81,87,94};

sbit rs= P2^5;sbit en=P2^7;sbit rw=P2^6;

#define yh 0x80 //Posición inicial de la primera línea

#define er 0x80x40 //Posición inicial de la segunda línea

sfr DBPort = 0x80;

unsigned char tt,tt1;

unsigned char t[2],*pt;

retraso nulo(uint z)

{uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

//Defina el pin DQ como P3.4

/************subfunción de retardo ds18b20 (oscilador de cristal 12MHz)************/

/******* *****Par DS18B20 El requisito de tiempo es muy estricto, pero solo puede ser más largo y no más corto

****************** Es también está bien bajo 11.0592M, porque el tiempo es más largo******* /

void delay_18B20(unsigned int i)

{ while(i--);

}

/**** ******función de inicialización ds18b20************************ **/

void Init_DS18B20(void)

{

carácter sin signo x=0;

DQ = 1; //DQ reset

delay_18B20(8); //Ligero retraso

DQ = 0; //El microcontrolador baja el DQ

delay_18B20(80); el retraso exacto es mayor que 480us

DQ = 1; //Tire alto del autobús

delay_18B20(14);

x=DQ; retraso, si x=0, la inicialización es exitosa y si x=1, la inicialización falla

delay_18B20(

20);

}

/****************ds18b20 lee un byte*********** ***/

carbón sin firmar ReadOneChar(void)

{carbón sin firmar i=0;

carbón sin firmar dat = 0;

for (i =8;i>0;i--)

{

DQ = 0; // Da señal de pulso

dat>>= 1;

DQ = 1; //Da señal de pulso

if(DQ)

dat|=0x80;

delay_18B20( 4);

}

return(dat);

}

/********** *******ds18b20 escribe un byte******************/

void WriteOneChar(dat de carácter sin firmar)

{

carácter sin firmar i=0;

para (i=8; i>0; i--)

{

DQ = 0;

DQ = dat&0x01;

delay_18B20(5);

DQ = 1;

dat>>= 1;

}

}

/***************Leer la temperatura actual de ds18b20**** ********/carácter sin firmar *ReadTemperature()

{

carácter sin firmar tt[2];

Init_DS18B20();

WriteOneChar(0xCC); // Salta la operación de lectura del número de serie

WriteOneChar(0x4E); // // Escribe el comando "escribir registro temporal", modifica TH, TL. y registro de configuración de resolución

//Escribe TH primero, luego TL y finalmente el registro de configuración

WriteOneChar(100); //Escribe el límite superior de alarma de temperatura que deseas configurar

WriteOneChar(4); //Escribe el límite de alarma de temperatura inferior que deseas configurar

WriteOneChar(0x7f); //Escribe el registro de configuración, el formato es 0 R1 R0 1, 1 1 1 1

//R1R0 =00 la resolución es de 9 bits, R1R0=11 la resolución es de 12 bits

delay_18B20(80); // este mensaje es muy importante

Init_DS18B20();

WriteOneChar(0xCC); // Saltar lectura del número de serie

WriteOneChar(0x44); // Iniciar conversión de temperatura

delay_18B20(80); // este mensaje es muy importante

Init_DS18B20();

WriteOneChar(0xCC); //Omitir la operación de lectura del número de serie

WriteOneChar(0xBE); / /Leer registros de temperatura, etc. (***Se pueden leer 9 registros) Los dos primeros son temperatura

delay_18B20(80);

tt[0]=ReadOneChar(); / /Leer el bit bajo del valor de temperatura

tt[1]=ReadOneChar();

>

return(tt);

}

void covert1(void) //Convierte la temperatura a datos de la pantalla LCD

{

carácter sin firmar TH=110,TL=-20;

carácter sin firmar x=0x00,y=0x00;

pt=ReadTemperature();

t[0]=*pt;pt++;t[1]=*pt;

if(t[1]>0x07) //Juzga las temperaturas positivas y negativas

{ wendu3=1; //0x2d es el código ASCII de "-"

t[1]=~t[1] /*Las siguientes oraciones describen el complemento de números negativos*/

;

t[0]=~t[0]; /* Convertir a valor absoluto*********/

x=t[0]+1; ** *******************/

t[0]=x /************** ** *******/

if(x>255) /************************/

t[1]++; /************************/

}

else wendu3= 0; //0xfe es el código ASCII de "+"

t[1]<<=4 //Desplaza el byte alto hacia la izquierda 4 bits

t[1] =t[1]&0x70; //Saca los 3 dígitos significativos del byte alto

x=t[0] //Almacena temporalmente t[0]; para usarlo

x>>=4; //Desplazar 4 bits a la derecha

x=x&0x0f //Y las dos oraciones anteriores son para eliminar los cuatro bits superiores de t[0]

x=t[1]|x; //Deletrea la parte entera del valor válido de los bytes alto y bajo en un byte

wendu=x;

t[0]=t[0]&0x0f; //Tomar dos decimales válidos

x=t[0];

wendu1=dotcode[ x]; // percentiles separados

}

unsigned char LCD_Wait(void)

{rs=0;

rw=1 ; delay (1);

en=1; delay(1);

// while(DBPort&0x80);// Cuando utilice la simulación de Proteus, preste atención a proteger esta declaración y llamando a GotoXY(), entrará en un bucle infinito.

//Quizás al escribir la palabra de control, el módulo no devolvió el comando de escritura completo, es decir, DBPort&0x80==0x80

// Abra esta declaración cuando utilice hardware real

en=0;

return DBPort;

}

void LCD_Write (estilo de bit, entrada de carácter sin firmar)

{en=0;rs=style;

rw=0; _nop_();

DBPort=input; _nop_();// Presta atención al orden

en=1; _nop_(); // Presta atención al orden

en=0; p>

LCD_Wait();

}

void GotoXY(carácter x sin firmar, carbón sin firmar

y)

{

si(y==0)

LCD_Write(0,0x80|x);

si(y ==1)

LCD_Write(0,0x80x4x);

}

//sbit s4=P0^3;

uchar num,count,flag,flag1,flag2,flag3,s1num,j;

voidkeyscan();

write_1602com(uchar com)//Comando de escritura LCD Función

{en=0;

rs=0;//Establecer como comando de escritura

rw=0;_nop_();P0=com; Enviar datos

_nop_();

en=1;//Tire del terminal de habilitación hacia arriba

_nop_();

es =0;//Pulso alto completo

_nop_();LCD_Wait();

}

write_1602dat(uchar dat)

{en=0;

rs=1;//Establecer para escribir datos

rw=0;_nop_();P0=dat;//Enviar datos

_nop_();

es=1;_nop_();es=0;

_nop_();

LCD_Wait( );

}

void write_sfm(uchar add,uchar dat)//tiempo de escritura minutos y segundos

{uchar gw,sw;

gw= dat%10;

sw=dat/10;

write_1602com(add+er);

write_1602dat(0x3sw);

p >

write_1602dat(0x3gw);

}

void write_nyr(uchar add,uchar dat)//tiempo de escritura minutos y segundos

{ uchar gw,sw;

gw=dat%10;

sw=dat/10;

write_1602com(add+yh);

write_1602dat(0x3sw);

write_1602dat(0x3gw);

}

void write(uchar add)//tiempo de escritura minutos y segundos

{write_1602com(add+yh);

write_1602dat(58);

}

void init()

{write_1602com(0x38);//Configurar el modo de funcionamiento de la pantalla LCD

write_1602com(0x0c);//Enciende la pantalla sin mostrar el cursor

write_1602com(0x06) ;//No muevas toda la pantalla, el puntero aumenta en uno

write_1602com(0x01);

write_1602com(yh);//La posición donde está escrito el carácter

for(a=0;a< 16;a++)

{write_1602dat(tab3[a]);

//delay(3);

}

write_1602com (er+2);

for(a=0;a<16;a++)

{

write_1602dat(tab2[a]);

//delay(3);

}

}

clave

s()

{unsigned char hang,lie,key;

if(P3!=0x0f)

delay(5);

if(P3!=0x0f)

{cambiar(P3&0x0f)

{case 0x0e:lie=0;break;

caso 0x0d:lie= 1;romper;

caso 0x0b:lie=2;romper;

caso 7:lie=3;romper;

}

P3=0xf0;

P3=0xf0;

cambiar(P3&0xf0)

{caso 0xe0:hang=0;romper;

caso 0xd0:hang=1;break;

caso 0xb0:hang=2;break;

caso 0x70:hang=3;break;

}

P3=0x0f;

mientras(P3!=0x0f)

P1_1=1;

P1_1=0;clave=tab [colgar][mentir];

else

key=20;

hablar=0;

return(key);

}

char kbscan() //Escaneo de teclado

{int key;key=keys();

if(key= =10)

{key1n++;

if(key1n==6)

key1n=0;

}

si(clave==12)

{

clave3n++;

si(clave3n==2)

clave3n= 0;

}

if(clave==11)

{

clave2n++;

si( clave2n==6)

clave2n=0;

}

mientras(clave1n!=0)

{

clave=claves();

si(clave==10)

{

clave1n++;

si(clave1n ==7)

clave1n=0;

}

interruptor(clave1n)

{

caso 1: TR1=0;//Apaga el temporizador

//TR1=0;

write_1602com(er+0x02);//Escribe la posición del cursor

write_1602com(0x0f);//Establece el cursor para parpadear

break;

caso 2: write_1602com(er+3);//fen

// write_1602com(0x0f);

break;

caso 3: write_1602com(er+5);//shi

//write_1602com(0x0f);

romper;

caso 4: write_1602com(er+6);//fen

//write_1602com(0x0f)

romper ;

caso 5: write_1602com(er+8);//shi

//write_1602com(0x0f);

romper;

caso 6: write_1602com(er+9);//fen

//write_1602com(0x0f);

romper;

caso 0:

write_1602com(0x0c);//Configura el cursor para que no parpadee

TR1=1;//Enciende el temporizador

break;

}

if(clave<10)

{

write_1602dat(0x3clave);

cambiar (key1n)

{

caso 1: shi=shi%1key*10;break;

caso 2: shi=shi/10*10 +tecla;

romper;

caso 3: fen=fen%1tecla*10;

romper;

caso 4 : fen= fen/10*1clave;

romper;

caso 5: miao=miao%1clave*10;

romper;

caso 6: miao=miao/10*1key;

romper;

caso 0:

write_1602com(0x0c); //configuración El cursor no parpadea

TR1=1;//Enciende el temporizador

descanso;

}

}

mientras(key2n!=0)

{key=keys();speak=0;

if(key==11)

{key2n++;

if(key2n==4)

key2n=0;

}

cambiar(key2n)

{caso 1: TR1=0;//Apagar el temporizador

//TR1=0;

write_1602com(er+13);// Escribe la posición del cursor

write_1602com(0x0f);//Establece el cursor para que parpadee

break;

caso 2: write_1602com(er+14);/ /fen

>write_1602com(0x0f);

break;caso 3: write_1602com(er+15);//shi

//write_1602com(0x0f );

break;

caso 0:

write_1602com(0x0c);//Configura el cursor para que no parpadee

TR1= 1;//Enciende el temporizador

break;

}

if(key<10)

{write_1602dat(0x3 clave);

interruptor (key2n)

{

caso 2: shu=shu%1clave*10;

romper ;

caso 3: shu=shu/10*1key;

romper;

caso 1: shu1=key*100;

break;

caso 0:

write_1602com(0x0c);//Configurar el cursor para que no parpadee

TR1=1;//Activar el cronómetro

se rompe;

}

miao1=shu;r=1;

}

p>

}

}

main()

{nian=0;nianb=20;

yue=0 ;miao1=1;

init();

TMOD = 0x10;

TH1 = 0xFF;

TL1 = 0x0E0;

EA = 1;

ET1 = 1;

TR1 = 1;

P1=0X00;

encubierto1();

P3=0X0F;

mientras(1)

{kbscan() ;

encubierto1();

if(miao1==0)

wendu4=wendu;

write_sfm(8,miao);

write_sfm(5,fen );

write_sfm(2,shi);

write_nyr(5,wendu);

write_nyr(8,wendu1);

if(key3n==1)

write_nyr(12,wendu4);

else

{write_1602com(yh+12);//Ubicación de escritura del carácter

write_1602dat(' ');

write_1602dat(' ');}

}

}

void timer1() interrupción 3{

TH1 = 0x3c;TL1 = 0x0b0;

tt++;

if(tt==20)

{tt=0;miao++;

if(r==1)

miao1--;

}

si (miao==60)

{miao=0;fen++;}

if(fen==60)

{fen=0;

shi++;

}

}