¿Cómo controla el microcontrolador 51 el sensor ultrasónico? ¿Busca un programa en lenguaje C (debe ser utilizable) 100 adicionales?
//Módulo ultrasónico ME007 programa de visualización
//Oscilador de cristal=8M
//MCU=STC10F04XE
//P0. 0 -P0.6*** Pin de tubo digital Yang
//Trig = P1^0
//Echo = P3^2
#include < reg52.h> //Incluye un archivo de encabezado para el kernel estándar 52
#define uchar unsigned char //Defínelo para facilitar su uso
#define uint unsigned int
#define ulong unsigned long
//******************************** ********** ************
sfr CLK_DIV = 0x97 //Definición del microcontrolador STC, división de frecuencia del reloj del sistema
<; p> //Es el puerto IO del microcontrolador STC Establece la definición de direcciónsfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91 ;
sfr P1M0 = 0X92 ;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
//**** ************** *******************************
sbit Trig = P1^0; //Generar pin de disparo de pulso
sbit Echo = P3^2; //Pin de eco
sbit test = P1^1; /p>
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//Tubo digital 0-9
uint distancia[4]; //Mida la distancia desde el búfer de recepción
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i //Registro personalizado
bit Success_flag; //Indicador de éxito de la medición p>
//********Declaración de función
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();
void main(void) // Programa principal
{ uint Distance_data,a,b;
uchar CONT_1;
p>
CLK_DIV=0X03; //El reloj del sistema es un oscilador de cristal de 1/8 (pdf-45 páginas)
P0M1 = 0; /Configurar el puerto io como salida push-pull
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
bandera=0;
prueba =0; p>
Trig=0; //Primero baja los pines de entrada de pulso
TMO
D=0x11; //Temporizador 0, temporizador 1, modo de trabajo de 16 bits
TR0=1; //Iniciar temporizador 0
IT0=0; cambia a nivel bajo, activando una interrupción externa
ET0=1; //Activa la interrupción del temporizador 0
//ET1=1 //Activa la interrupción del temporizador 1<; /p> p>
EX0=0; //Desactivar interrupciones externas
EA=1; //Activar interrupción total 0
while(1) //Programa bucle
{
EA=0;
Trig=1;
delay_20us();
Trig =0; // Genera un pulso de 20us en el pin Trig
while(Echo==0); //Espera a que el pin Echo alcance nivel alto
Success_flag=0; // Borrar indicador de éxito de medición
EX0=1; //Activar interrupción externa
TH1=0; //Borrar temporizador 1
TL1=0; //Borrar temporizador 1
TF1=0; //
TR1=1; //Iniciar temporizador 1
EA=1;
while(TH1 < 30); //Esperando el resultado de la medición, el período es 65.535 milisegundos (se puede implementar mediante interrupción)
TR1=0 //Cerrar el temporizador 1
EX0=0; //Desactivar interrupciones externas
if(succeed_flag==1)
{
Distance_data=outcomeH; del resultado de la medición
distancia_data<<=8; //Coloque los 8 bits superiores de 16 bits
distancia_data=distance_data|outcomeL;//Fusionar con los 8 bits bajos para formar datos de resultado de 16 bits
p>
Distance_data*=12; //Porque el temporizador se divide por defecto entre 12
Distance_data/=58; microsegundos divididos por 58 son centímetros
} //Por qué divididos por 58 son centímetros, Y metros = (X segundos * 344) / 2
// X segundos = (2*Y metros) / 344 ==》X segundos = 0.0058*Y Metros==》Centímetros=microsegundos/58
if(succeed_flag==0)
{
distancia_data=0; //Borrar si no hay eco Cero
test = !test;
//Pruebe los cambios de luz
}
/// distancia[i]=distance_data; //Coloque los datos del resultado de la medición en el búfer
// / i++;
/// if(i==3)
/// {
/// distancia_datos=(distancia[0]+distancia [ 1]+distancia[2]+distancia[3])/4;
/// pai_xu();
/// distancia_data=distancia[1]; p >
a=distancia_datos;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
si (CONT_1>=3)
{ CONT_1=0;
b=a;
conversión(b);
}
/// i=0;
/// }
}
}
// * ************************************************** ************
//Interrupción externa 0, utilizada para determinar el nivel de eco
INTO_() interrupción 0 //La interrupción externa es No 0
{
resultH =TH1; //Obtener el valor del temporizador
resultL =TL1 //Obtener el valor del temporizador
Success_flag=1; //Marcar para medición exitosa
EX0=0; //Cerrar interrupción externa
}
//*** *** ********************************************** ** *********
//La interrupción del temporizador 0 se utiliza para la visualización
timer0() interrupción 1 //La interrupción del temporizador 0 es la número 1
{
TH0=0xfd; //Escribe el valor inicial del temporizador 0
TL0=0x77
switch(flag)
{caso 0x00:P0=ge; P2=0xfd;flag++;romper;
caso 0x01:P0=shi;P2=0xfe;flag++;romper;
caso 0x02 :P0=bai;P2=0xfb;flag=0;romper;
}
}
//******* *** ********************************************** ** ******
/*
//Interrupción del temporizador 1, utilizada para temporización de alcance ultrasónico
interrupción 3 del temporizador1() // Interrupción del temporizador 0 es el número 1
{
TH1=0;
>
TL1=0;
}
*/
//****************** ** ************************************************* ***
//Mostrar programa de conversión de datos
void conversion(uint temp_data)
{
uchar ge_data,shi_data,bai_data ;
p>
bai_data=temp_data/100;
temp_data=temp_data%100; //operación restante
shi_data=temp_data/10;
temp_data =temp_data%10; //Operación restante
ge_data=temp_data;
bai_data=SEG7[bai_data];
shi_data= SEG7[shi_data];
ge_data =SEG7[ge_data];
EA=0;
bai = bai_data;
shi = shi_data;
ge = ge_data
EA=1;
}
//********* ******* ******************************************* ******** *
void delay_20us()
{ uchar bt ;
for(bt=0;bt<100;bt++) ;
}
/*
void pai_xu()
{ uint t;
if (distancia [0]>distancia[1] )
{t=distancia[0];distancia[0]=distancia[1];distancia[1]=t;} /*Valores de intercambio
if(distancia[0 ]>distancia[2])
{t=distancia[2];distancia[2]=distancia[0];distancia[0]=t;} /* Valores de intercambio
if(distancia[1]>distancia[2])
{t=distancia[1];distancia[1]=distancia[2];distancia[2] =t;} /*Valores de intercambio
}
*/
Uno de mis procedimientos de ultrasonido
Tengo preguntas, por favor pregunte ~~
/ /Programa de visualización del módulo ultrasónico
#include
#include< intrins.h> //Incluye _nop_() Archivo de encabezado para la definición de función
#define uchar unsigned char //Defínelo por conveniencia
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3 //Generar pin de pulso
s;
bit Rx = P3^2; // pin de eco
sbit RS=P2^0; //Registra el bit de selección, define el bit RS como el pin P2.0
sbit RW =P2^1; // Lee y escribe el bit de selección, define el bit RW como el pin P2.1
sbit E=P2^2 // Habilita el bit de señal, define el bit E como P2. 2 pines
sbit BF=P0^7; //Bit de indicador de ocupado, define el bit BF como pin P0.7
cadena de código de caracteres sin firmar[]= {"CHAO SHENG BO "};
//código de caracteres sin firmar string1[ ]={"QUICK STUDY MCU"};
dígito de código de caracteres sin firmar[ ]={"0123456789" }; //Definir matriz de caracteres para mostrar números
//uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//Digital Pipe 0-9
uint Distance[4]; //Rango del buffer de recepción
uchar ge,shi,bai,temp,flag,outcomeH,outcomeL,i // Registro personalizado
bit Success_flag; //Indicador de medición exitosa
//********Declaración de función
Conversión nula (uint temp_data);
void delay_20us();
void pai_xu();
/********************* ** ********************************
Función de función: retardo 1ms
(3j+2)*i=(3×33+2)×10=1010 (microsegundo), que puede considerarse como 1 milisegundo
******** ** *****************************************/
nulo delay1ms()
{
unsigned char i,j
for(i=0;i<10;i++)
for(j=0;j<33;j++)
}
/************ ** ***************************************
Función función: Retardo durante un número de milisegundos
Parámetro de entrada: n
*************************** *** *************************/
retraso nulo (carácter n sin firmar)
{
carácter sin firmar i;
for(i=0;i delay1ms(); } /********************************************* *** ******* Función: Determina el estado de ocupado del módulo LCD Valor de retorno: resultado. resultado=1, ocupado; resultado=0, no ocupado ******************************* ***** *************************/ carácter sin firmar BusyTest(void) { resultado del bit; RS=0; //Según las regulaciones, cuando RS es de nivel bajo y RW es de nivel alto, se puede leer el estado RW=1; E=1; //E=1, se permite lectura y escritura _nop_(); //Sin operación _nop_ (); _nop_( ); _nop_(); //Cuatro ciclos de máquina sin operación para dar el tiempo de reacción del hardware result=BF ; //Asignar el nivel de indicador de ocupado al resultado E=0; //Restaurar E al nivel bajo devolver resultado; } /******** **************************************** ******* Función: escribir el comando de configuración del modo o mostrar la dirección en el módulo LCD Parámetro de entrada: dictar **** ************ *************************************/ p> void WriteInstruction (dictado de caracteres sin firmar) { while(BusyTest()==1); //Espera si está ocupado RS =0; // De acuerdo con las regulaciones, RS y R cuando /W tiene un nivel bajo al mismo tiempo, puede escribir instrucciones RW=0; E=0; /E se establece en un nivel bajo (de acuerdo con la Tabla 8-6, escriba instrucciones Cuando, E es un pulso alto, // Esto es para hacer que E haga una transición positiva de 0 a 1, entonces " Primero se debe configurar 0" _nop_(); _nop_(); //Dos ciclos de máquina de operación en vacío para darle tiempo de reacción al hardware P0 =dictar; //Enviar datos al puerto P0, es decir, escribir instrucciones o direcciones _nop_(); _nop_(); _nop_( ); _nop_(); //Sin operación durante cuatro ciclos de la máquina, lo que da tiempo de respuesta al hardware E=1 //E está configurado en nivel alto
_nop_();
_nop_();
_nop_(); //Cuatro ciclos de máquina sin operación para dar el tiempo de reacción del hardware
E=0; //Cuando E salta del nivel alto a Cuando el nivel es bajo, el módulo LCD comienza a ejecutar comandos
}
/*************************************************** **********
Función: Especificar la dirección real de visualización de caracteres
Parámetros de entrada: x
****** ************************************* *
***********/
void WriteAddress(unsigned char x)
{
WriteInstruction(x|0x80); /El método para determinar la posición de visualización es "80H+código de dirección x"
}
/****************** ** ********************************
Función función: convertir datos (ASCII estándar código de caracteres) escrito en el módulo LCD
Parámetro de entrada: y (constante de carácter)
******************** **********************************/
void WriteData(carácter sin firmar)
{
while(BusyTest()==1);
RS=1; //Cuando RS es de nivel alto y RW es de nivel bajo, los datos pueden escribir
RW=0;
E=0; //E se establece en un nivel bajo (según la Tabla 8-6, al escribir instrucciones, E es un pulso alto,
// Es para hacer que E haga una transición positiva de 0 a 1, por lo que primero se debe establecer "0"
P0=y //Enviar los datos al P0; puerto, es decir, escribir los datos en el módulo de cristal líquido p>
_nop_();
_nop_();
_nop_();
_nop_(); //Sin operación durante cuatro ciclos de la máquina, proporcione el tiempo de reacción del hardware
E=1; //Establezca E en nivel alto
_nop_();
_nop_();
_nop_();
_nop_(); //Cuatro ciclos de máquina sin operación para darle tiempo de reacción al hardware
E=0; //Cuando E salta del nivel alto Cuando pasa al nivel bajo, el módulo LCD comienza a ejecutar el comando
}
/**** ************************** ************************* ******
Función: Inicializar el modo de visualización LCD
p>********************* ************************** ******/
void LcdInitiate(void)
{
delay(15); //Retraso de 15 ms, debe usarse al escribir instrucciones por primera vez. Dale a la pantalla LCD un tiempo de respuesta más largo
WriteInstruction(0x38); //Configuración del modo de visualización: pantalla de 16 × 2, matriz de puntos de 5 × 7, interfaz de datos de 8 bits
delay( 5); //Retraso de 5 ms, dale al hardware algo de tiempo de reacción
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38); //Tres veces consecutivas para garantizar una inicialización exitosa
delay(5) );
WriteInstruction(0x0c); //Configuración del modo de visualización: visualización activada, sin cursor, cursor no parpadeante
retardo(5);
WriteInstruction( 0x06); //Configuración del modo de visualización: el cursor se mueve hacia la derecha, carácter
No mover
delay(5);
WriteInstruction(0x01); //Borrar instrucción de pantalla para borrar el contenido de la pantalla anterior
delay(5);
}
void main(void) // Programa principal
{ uint Distance_data,a,b;
uchar CONT_1; /p>
uchar k; //Defina la variable i para que apunte al elemento de la matriz de cadenas
LcdInitiate() //Llame a la función de inicialización de LCD
delay(10) ; // Retrasa 10 ms para darle al hardware algo de tiempo de reacción
WriteAddress(0x01); //Comienza a mostrar desde la fila 1 y la columna 3
k = 0; Tercera columna de la matriz de caracteres 1 elemento
while(string[k] != '\0')
{
WriteData(string[k]) ;
k++; //Apunta a un elemento de la matriz de caracteres inferior
}
i=0;
flag=0 ;
Tx=0; //Primero baja el pin de entrada de pulso
TMOD=0x10 //Temporizador 0, temporizador 1, modo de trabajo de 16 bits
<; p>// TR0=1 ; //Inicia el temporizador 0IT0=0; //Cambia del nivel alto al nivel bajo, activa una interrupción externa
//ET0=1; //Abrir interrupción del temporizador 0
EX0=0; //Desactivar interrupciones externas
EA=1; //Activar interrupción total 0
while( 1) // Bucle del programa
{
WriteAddress(0x41); //Comienza a mostrar desde la fila 2 y la columna 6
WriteData('J'); //Cambia los diez mil dígitos Escribe constantes de caracteres numéricos en LCD
WriteData('U'); //Escribe constantes de caracteres de 10,000 dígitos en LCD
WriteData('L') ; //Escribe constantes de caracteres numéricos en LCD Escribe constantes de caracteres con decenas de miles de dígitos en LCD
WriteData('I'); //Escribe constantes de caracteres con decenas de miles de dígitos en LCD
WriteData(':'); //Escribe constantes de caracteres con decenas de miles de dígitos en LCD
WriteData(digit[bai]); //Escribe constantes de caracteres con decenas de miles de dígitos en LCD
p>WriteData(digit[shi ]); //Escribe constantes de caracteres con miles de dígitos en LCD
WriteData('.'); //Escribe constantes de caracteres con decenas de miles de dígitos en LCD
WriteData( digit[ge]); //Escribe constantes de caracteres con centenas de dígitos en LCD
WriteData(' '); >
WriteData('C'); //Escribe constantes de caracteres con decenas de miles de dígitos en LCD
WriteData('M'); //Escribe constantes de caracteres con decenas de miles de dígitos en LCD
EA=0;
T
x=1;
delay_20us();
Tx=0; //Genera un pulso de 20us en el pin Tx
while(Rx== 0) ; //Esperar a que el pin de eco de Rx suba.
Success_flag=0; //Borrar el indicador de éxito de medición
EX0=1 //Activar la interrupción externa
p>
TH1=0; //Borrar el temporizador 1
TL1=0; //Borrar el temporizador 1
TF1=0; TR1=1; //Inicia el temporizador 1
EA=1;
while(TH1 < 30); //Esperando el resultado de la medición, el período es de 65,535 milisegundos (interrupciones disponibles). )
TR1=0; //Apagar el temporizador 1
EX0=0; //Apagar las interrupciones externas
if(succeed_flag==1 )
{
distancia_data=outcomeH; //8 bits altos del resultado de la medición
distancia_data<<=8; 16 bits bit
distancia_data=distance_data|outcomeL;//Combinado con los 8 bits inferiores para formar datos de resultado de 16 bits
distancia_data*=12;//Porque el temporizador está predeterminado en dividir por 12 p>
distancia_data/=58; //La unidad de microsegundos dividido por 58 es igual a centímetros
} //Por qué dividido por 58 es igual a centímetros, Y metros = (X segundos * 344)/2
// X segundos = (2*Y metros)/344 ==》 0)
{
distancia_datos=0; Borrar si no hay eco
}
Distance[i]=distance_data ; //Coloca los datos del resultado de la medición en el buffer
i++;
if(i==3)
{
distancia_datos=(distancia[0]+distancia[1]+distancia[2]+distancia[3])/ 4;
pai_xu();
distancia_datos=distancia[1] ;
a=distancia_datos;
si(b==a) CONT_1=0;
si(b!=a) CONT_1++;
si(CONT_1>=3)
{ CONT_1 =0;
b=a;
conversión(b);
}
i=0;
}
}
}
//************************ *****************************************
// Interrupción externa 0, utilizada para juzgar el nivel de eco
INTO_() interrupción 0 // La interrupción externa es el número 0
{
resultH =TH1 ; / /Obtener el valor del temporizador
resultL =TL1; //Obtener el valor del temporizador
Success_flag=1 //Marcar para medición exitosa
EX0 =0; //Desactivar interrupciones externas
}
//********************* ******* ****************************************
//Interrupción del temporizador 0, utilizada para visualización
interrupción 1 del timer0() // La interrupción del temporizador 0 es el número 1
{
// TH0 =0xfd; // Escribe el valor inicial del temporizador 0
// TL0=0x77
}
//Mostrar programa de conversión de datos
conversión nula (uint temp_data)
{
uchar ge_data,shi_data,bai_data ;
bai_data=temp_data/100 ;
temp_data=temp_data% 100; //Operación restante
shi_data=temp_data/10;
temp_data=temp_data%10; //Operación restante
ge_data= temp_data;
//bai_data=SEG7[bai_data];
//shi_data=SEG7[shi_data]&0x7f;
//ge_data =SEG7[ge_data] ; p>
EA=0;
bai = bai_data;
shi = shi_data;
ge = ge_data
<; p> EA =1;}
//*************************** *** *************************************
void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
si
(distancia[0]>distancia[1])
{t=distancia[0];distancia[0]=distancia[1];distancia[1]=t;}
if(distancia[0]>distancia[2])
{t=distancia[2];distancia[2]=distancia[0];distancia[0]=t;}
if(distancia[1]>distancia[2])
{t=distancia[1];distancia[1]=distancia[2];distancia[2]=t;} p>
}
El primero debe modificarse, ¡también puedes probar esto! Primero debes entender esto y modificar el pin... se mostrará como 1602