Red de conocimiento informático - Conocimiento del nombre de dominio - ¡Se necesita con urgencia el "programa fuente para alcance ultrasónico basado en cx20106", que utiliza una pantalla 1602 y programación en lenguaje C de 51 microcontroladores! ! ! Gracias

¡Se necesita con urgencia el "programa fuente para alcance ultrasónico basado en cx20106", que utiliza una pantalla 1602 y programación en lenguaje C de 51 microcontroladores! ! ! Gracias

#include lt;reg52.hgt;

#include lt;intrins.hgt;

#definir uchar unsigned char

# definir uint unsigned int

//================================= Definición de interfaz LCD1602 == = ==================

//Definir pines

#define LCM_Data P0 //Interfaz de datos

#define Busy 0x80 //Se utiliza para detectar el logotipo de Ocupado en la palabra de estado de LCM

sbit LCM_RW = P2^1 //Leer y escribir terminal de entrada de control

sbit LCM_RS; = P2 ^0; //Registrar terminal de entrada de selección

sbit LCM_E = P2^2; //Habilitar terminal de entrada de señal

void WritEDAtaLCM (uchar WDLCM);

void WriteCommandLCM (uchar WCLCM, BuysC);

uchar ReadDataLCM (void);

uchar ReadStatusLCM (void); uchar Y, uchar ASCII);

void DisplayListChar (uchar X, uchar Y, uchar delayms, uchar code *DData);

void DisplayCursorPos (uchar X, uchar Y);

p>

void LCMInit (void);

void DisplayIntData (uchar X, uchar Y, int ZhengShu, uchar Digit, uchar XiaoShu

void DisplayCharData (); uchar X, uchar Y, uchar ZiFu);

//================================ = Definición del módulo ultrasónico ========================

sbit RemPin = P3^2 // Receptor (esto no se puede modificar) porque es un pin de interrupción externa (INT0)

sbit TxPin = P3^5; // Extremo del transmisor

uint length = 0 // Longitud de alcance 0.00M

uchar flag = 0 // El indicador de alcance tiene recepción de señal = 1;

void DelayUs(uint us)

{

while(us-- )

}

void DelayMs(uint Ms)

{

uint i, TempCyc

para (i=0; ilt; Sra; i )

{

TempCyc = 250;

while(TempCyc--

< p); > }

}

//=============================== LCD1602 mostrar subrutina=================================================== ==

void WritEDAtaLCM(unsigned char WDLCM)

{

ReadStatusLCM(); //Detectar ocupado

LCM_Data = WDLCM;

LCM_RS = 1;

LCM_RW = 0;

LCM_E = 0; // Si la velocidad del oscilador de cristal es demasiado alta, puede agregar un pequeño retraso. después de esto

LCM_E = 0; //Retraso

LCM_E = 1;

}

void WriteCommandLCM(unsigned char WCLCM, BuysC ) //Ignorar la detección de ocupado cuando BuysC es 0

{

if (BuysC) ReadStatusLCM(); //Detectar ocupado según sea necesario

LCM_Data = WCLCM;

p>

LCM_RS = 0

LCM_RW = 0;

LCM_E = 0

LCM_E = 0;

LCM_E = 1;

}

carácter sin firmar ReadDataLCM(void)

{

LCM_RS = 1; >

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1; LCM_Data);

}

carácter sin firmar ReadStatusLCM(void)

{

LCM_Data = 0xFF

LCM_RS = 0;

>

LCM_RW = 1;

LCM_E = 0;

LCM_E = 0;

LCM_E = 1; LCM_Data amp; Busy); //Detecta señal de ocupado

return(LCM_Data);

}

void DisplayOneChar( carácter X sin signo, carácter Y sin signo, sin signo char ASCII)

{

/p>

if (X) Y |= 0x40 //Cuando se mostrará la segunda línea, el código de dirección es 0x40;

Y |= 0x80; //Calcula el código de instrucción

WriteCommandLCM(Y, 0); //Aquí no se detecta señal de ocupado, se envía el código de dirección

WritEDAtaLCM(ASCII);

}

void DisplayListChar( uchar > X amp; = 0x1;

Y amp; = 0xF; //El límite ') //Salir si se llega al final de la cadena

{

if (Y lt; = 0xF) //La coordenada X debe ser menor que 0xF

{

DisplayOneChar(X, Y, DData[ListLength]); //Mostrar un solo carácter

ListLength

Y

DelayMs( delayms); //Retraso de cadena de visualización

}

else

break; //Saltar del bucle

}

}

void DisplayCursorPos( carácter X sin signo, carácter Y sin signo)

{

X amp = 0x1;

Y amp;= 0xF; //El límite Y no puede ser mayor que 15, X no puede ser mayor que 1

if (X) Y |= 0x40; se va a mostrar la línea, el código de dirección es 0x40;< /

p>

Y |= 0x80; // Calcula el código de comando

WriteCommandLCM(Y, 1); //Aquí no se detecta la señal de ocupado y se envía el código de dirección

}

void LCMInit(void)

{

LCM_Data = 0;

WriteCommandLCM(0x38, 0); Tres configuraciones de modo de visualización, No detectar señales de ocupado

DelayMs(5);

WriteCommandLCM(0x38, 0)

DelayMs(5); p>

WriteCommandLCM (0x38, 0);

DelayMs(5);

WriteCommandLCM(0x38, 1); //Configuración del modo de visualización, comienza a requerir detección de señal de ocupado cada vez; time

WriteCommandLCM(0x08, 1); //Cerrar la pantalla

WriteCommandLCM(0x01, 1); //Borrar la pantalla

WriteCommandLCM(0x06, 1); //Mostrar el cursor Configuración móvil

WriteCommandLCM(0x0C, 1); // Mostrar el cursor y configuración

DelayMs(100);

}

void DisplayIntData(uchar X, uchar Y, int ZhengShu, uchar Digit, uchar XiaoShu)

{

uchar i=0, k=0, BCD[5]={0} ;

if(Digitgt;5) Dígito=5;

if(ZhengShult;0)

{

k=1; //Bit de indicación de número negativo

ZhengShu=-ZhengShu;

}

BCD[4] = ZhengShu / 10000; //Encontrar los datos de decenas de miles

ZhengShu = ZhengShu 10000;

BCD[3] = ZhengShu / 1000 //Encontrar los datos de mil dígitos

ZhengShu = ZhengShu 1000;

BCD[2] = ZhengShu / 100; //Encuentra los datos de cien dígitos

ZhengShu = ZhengShu 100;

BCD [1] = ZhengShu / 10; //Buscar datos de diez dígitos

BCD[0] = ZhengShu 10; //Encuentra los datos de un solo dígito

for(i=0; ilt; Digit; i)//Envía el valor mostrado

{

if((i==XiaoShu)amp;amp;(0!=XiaoShu))

{

DisplayOneChar(X, Y-i, '.'); //Salida del punto decimal

Y= Y-1

}

DisplayOneChar(X, Y-i, BCD[i] 0x30); carácter

}

if(k==1)

DisplayOneChar(X, Y-1, '-'); //Salida de carácter negativo

p >

}

void DisplayCharData(uchar X, uchar Y, uchar ZiFu)

{

uchar i=0; p > uchar ValueBCD[3];

ValueBCD[0] = ZiFu / 100 //Encuentra los datos de las centenas

ZiFu = ZiFu 100;

ValueBCD [1] = ZiFu / 10; //Encuentra los datos de los dígitos de las decenas

ValueBCD[2] = ZiFu 10; //Encuentra los datos de los dígitos de las unidades

for(i=0; ; ilt; 3; i )// Muestra el valor mostrado

{

DisplayOneChar(X, Y i, ValueBCD[i] 0x30); >

}

}

//============================= == =Subrutina de prueba del módulo ultrasónico============================================ === ====

void delay25us_40KHz(unsigned char us)

{

while(us--)

{

TxPin = 0;

_nop_(); _nop_();

_nop_(); ); _nop_ ();

_nop_(); _nop_();

_nop_(); _nop_();

_nop_();

TxPin = 1

_nop_(); p> _nop_(); _nop_();

}

TxPin = 1

}

void init0int() interrupción 0;

{

uint timer_us = 0;

TR0=0; //Apagar temporizador 0

timer_us = TH0*256 TL0 ;

if(timer_usgt;190)timer_us=timer_us-180; //Distancia de alcance correcta

length = ((unsigned long)(340)*timer_us)/2000; La longitud del cálculo se expande 100 veces

flag = 0;

EA = 0 //Deshabilitar todas las interrupciones

}

void; timer0int (void) interrupción 1

{

TR0=0; //Cerrar temporizador 0

length = 0; //Visualización del tiempo de medición excedido Visualización 0

flag = 1; //

EA = 0; //Deshabilitar todas las interrupciones

}

void main(void )

{

LCMInit(); //inicialización 1602

EX0 = 1; //Habilitar interrupción total, habilitar interrupción externa INT0

ET0 = 1;

TMOD=0x11; //Establece T0 como un temporizador de 16 bits y configura T1 como un temporizador de 16 bits

DisplayOneChar( 1, 11 , 'M' );

DisplayListChar(0, 2, 0, "Telémetro "); //Mostrar cadena

while(1)

{

DisplayIntData(1, 10, longitud, 5, 3); //Mostrar distancia de medición

TH0=0x00

TL0=0x00; TL0=0x00;

p>

TR0=1; //Iniciar temporizador 0

EA = 1; //Permitir todas las interrupciones

delay25us_40KHz( 15); //Enviar señal de pulso

RetrasoMs(200);

}

}