¡Ayude a escribir un programa de telémetro ultrasónico, tanto en C como en lenguaje ensamblador!
#include?lt;reg52.Hgt;//Archivo de configuración del dispositivo
#include?lt;intrins.hgt;< / p>
//Interfaz del sensor
sbit?RX?=?P3^2;
sbit?TX?=?P3^3;
/Declaración de clave
sbit?S1?=?P1^4;
sbit?S2?=?P1^5;
sbit?S3?= ? P1^6;
//Zumbador
sbit?Feng=?P2^0;
sbit?W1=P1^0;
p>
sbit?W2=P1^1;
sbit?W3=P1^2;
sbit?W4=P1^3;
/Declaración de variable
unsigned?time=0;
unsigned?int?timer=0;
unsigned?char?posit=0;
unsigned?long?S=0 ;
unsigned?long?BJS=50; //Distancia de alarma 80CM
//¿Modo?Modo normal? Ajuste
char?Mode=0;
bit?flag=0;
bit?flag_KEY=0;
unsigned?char ?const?discode[]?={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, 0xff/*-*/}; //código de visualización del tubo digital 0123456789- y sin visualización
//unsigned?char.const.positon[4] ={0xfd, 0xfb, 0xf7, 0xfe}; //selección de bits
unsigned.char.disbuff[4] = {0, 0, 0, 0}; ?//Matriz de información de distancia
unsigned?char?disbuff_BJ[4] ={0, 0, 0, 0} //Información de alarma
void?Display();
//Retraso 20 ms (impreciso)
void?delay(void)
{
unsigned?char?a, b, c;
for(c=2;cgt;0;c--)
for(b=38;bgt;0; b--)
for(a=60; agt; 0; a--);
}
/ //escaneo de claves
void?Key_()
{
if(flag_KEY==0)
{
if(Mode!= 0)
{
//
si(S1==0)
{
retraso( ); //retraso en la eliminación de fluctuaciones
if(S1==0)
{
BJS ?//alarm valu;
e más
flag_KEY=1;
if(BJSgt;=151)?//max 151
{
BJS=0 ;
}
// mientras(S1==0)
// Mostrar();
}
}
//-
if(S2==0)
{
retraso();
if(S2==0)
{
BJS--;//Valor de alarma restado
flag_KEY=1;
p>if(BJSlt;=1) ?//valor mínimo 1
{
BJS=150;
}
// while(S2==0)
// Mostrar();
}
}
}< / p>
Modo=0
}
// mientras(S3==0)
// Mostrar ();
}
}
}
if((P1amp;0x70)==0x70)
{
flag_ KEY=0
}
}
/**********; ** ************************************************* *** **************************************** ******/
//tubo digital de escaneo
void?Display(void)?
{
//Visualización normal
if( Mode==0)
{
P0=0x00 ?//Apagar la pantalla
if(posit==1)// El punto decimal del tubo digital
{
P0=(discode[disbuff[posit]])|0x80 // A través de OR bit a bit, el bit más alto se convierte en 1 y el decimal; se muestra el punto
}
else?if(posit= =0)
{
P0=~discode[11];
}
else
{
P0=discode[disbuff[posit]];
}
cambiar(positar)
{
caso??:?W1=0; W3=1;? /p>
caso?1?: ?W1=1;W2=0;W3=1;W4=1;?romper;
caso?2?: ?W1=1;W2= 1;W3=0;W4=1;? romper;
caso?2?:?W1=1;W2=1;W3=0;W4=1;?
caso?3?:?W1=1;W2 =1; W4=0;?break;
}
posit;
si (positgt;3) //Mostrar cada vez Agregar 1 a la función
posit=0;
Se borra cuando se alcanza 3
p> }
//Visualización de alarma
else
{
P0 =0x00;
if(posit===1)//El punto decimal del tubo digital
{
P0=(discode[disbuff_BJ[posit ]]) |0x80;
}
else?if(posit==0)
{
P0=0x76; /Mostrar letras
}
else
{
P0=discode[disbuff_BJ[posit]]
}; p>
cambiar(posit)
{
caso??:?W1=0;W2=1;W3=1;W4=1;?break; p>
caso?1?:?W1=1;W2=0;W3=1;W4=1;?romper;
caso?2?:?W1=1;W2=1 ;W3= 0; W4=1;?romper;
caso?3?:?W1=1;W2=1;W3=1;W4=0;?romper;
}
posit;
if(positgt; 3)
posit=
}
} p>
/****************************************** ******* ******************************************* ******** ********** **/
//Calcular
void?Conut(void)
{
time=TH0*256 TL0;// Leer el valor del temporizador de T0
TH0=0;
TL0=0; Borrar el temporizador
S=(tiempo*1.7)/100 ?
S=(tiempo*1.7) /100 ?
S=(tiempo) *1.7) /100;
S=(tiempo*1.7) /100; ?
S=(tiempo*1.7) /100; S=(tiempo*1.7) /100; ?
S=(tiempo*1.7) /100 ?
S=(tiempo*1.7) /100; >
S=( tiempo*1.7) /100; ?000,
//longitud=velocidad*tiempo, 340*tiempo/1000000, la unidad de datos de longitud es m. necesitas multiplicar por 100 para obtener 340*tiempo/10000
//Mueve el punto decimal dos lugares hacia la izquierda para obtener 3,4*tiempo/100 Debido a que la onda ultrasónica es de ida y vuelta, divídela. por 2 para obtener los datos de distancia (tiempo*1.7)/100
if (Mode==0)?
{
if((Sgt;= 700)||flag==1)?//Fuera del rango de medición, se muestra "-"
{
Feng=0;?//Alarma de zumbador
bandera=0;
disbuff[1]=10; //"- "
p>
disbuff[2]=10; //"-"
disbuff[3]=10;