Red de conocimiento informático - Conocimiento informático - ¡Ayude a escribir un programa de telémetro ultrasónico, tanto en C como en lenguaje ensamblador!

¡Ayude a escribir un programa de telémetro ultrasónico, tanto en C como en lenguaje ensamblador!

El siguiente es un programa de telémetro ultrasónico como referencia:

#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]]

}

cambiar(posit)

{

caso??:?W1=0;W2=1;W3=1;W4=1;?break;

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=

}

}

/****************************************** ******* ******************************************* ******** ********** **/

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