¡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
} p>
}
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
} p>
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 p>
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
{ p>
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 ) p>
{
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 p>
RetrasoMs(200);
}
}