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 p>
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; p>
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(); p>
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 p>
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 p>
{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 p>
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]); p>
//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); p>
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++;
}
}