Cambiar los valores del puerto dentro del bucle (8051)

Estoy usando un módulo RX/TX y ht12d/e para mi proyecto. Seré breve, en mi programa estoy haciendo un paquete de datos y enviándolo y el receptor lo está recibiendo sincrónicamente. El receptor está configurado de manera que espera el valor 0x0a del transmisor, cuando se recibe, espera 0x05, cuando se recibe, espera otro 0x05 y entre 0x05 hay datos de 2 bits contenidos en nibble. después de recibir 0x05, espera otro 0x05 y entre 0x05 obtiene la información. hay 16 información en un paquete. El problema comienza aquí, cuando envío el paquete de manera controlada, es decir, presionando un botón, se envía un 0x05 y al quitar el botón, se envía 0x00, de esta manera, el paquete completo se recibe con éxito, pero cuando transmito el paquete usando una función , no pasa nada, no hay indicación de que el paquete haya recibido o esté recibiendo. Nota: el valor en el PUERTO 1 se transmite, el microcontrolador 8051 se usa usando el lenguaje c. La transmisión es de sólo 4 bits en paralelo.

while(1){
        if(highh==0 )
        {P1=0x0a;while(highh==0);}
        if(loww==0 )
        {P1=0x05;while(loww==0);} 
        P1=00;
    }

el código anterior funciona, en el que highh y loww representan 3.7 y 3.6 pines de 8051. Los presiono a modo de envío de paquetes.

void transmit()
{   
    for(i=0;i<i2;i++)P1 = 0x0a;  
    for(i=0;i<i2;i++)P1 = 0;   
    for(i=0;i<i2;i++)P1 = 0x05;     
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05;  
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0;  
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05;
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    ///////
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0;  
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    for(i=0;i<i2;i++)P1 = 0; 
    for(i=0;i<i2;i++)P1 = 0x05; 
    P1=00;
}

Lo anterior es la función que estoy usando, que no funciona. He usado P1=0 como información. El receptor espera dieciocho valores 0x05 y un 0x0a al inicio. i2 es variable para la duración del retardo. He comprobado un retraso de duración diferente. ¿Cómo puedo hacer que la función funcione? ¿Es esta la razón por la que los valores del puerto deben cambiarse una vez en el bucle del programa principal? Lo que realmente estoy haciendo es; 1; recoger datos de diferentes sensores. 2; dividir cada byte de datos en 2 bits. 3; transmitir 0x0a 4; transmitir 0x05 5; transmitir información (que contiene esos 2 bits que se reciben de los sensores pero que en realidad son 4 bits). 6; transmitir 0x05 de nuevo, 7; ir de manera similar. hasta que se envíe un total de 16 nibbles de información.

y el receptor obtiene información después de que 0x05 haya terminado de recibir.

¿Cuál es el valor más grande de i2 que ha probado y qué tiempo de retraso da?
1275 da 1 ms de retraso, lo he intentado hasta 2000.

Respuestas (1)

Es posible que no esté esperando lo suficiente entre "presiones de botón". El HT12E siempre repite cada paquete de palabras (bits de dirección + bits de datos) al menos 4 veces, incluso si la transmisión solo está habilitada momentáneamente. Si intenta enviar demasiado rápido, se perderán algunas de las "pulsaciones de botón".

A su frecuencia de oscilador recomendada de 3 KHz, el HT12E tarda aproximadamente 70 ms en enviar las 4 palabras, por lo que debe demorar más que eso (por ejemplo, 100 ms) entre transmisiones.

si retraso mucho más, mi comunicación será muy lenta. y no creo que la duración de la demora sea un problema, porque, para fines de depuración, solo envié 0x0a y luego 1 ms de demora y luego 0x05 y luego 1 ms de demora usando la función de transmisión, que funcionó bien.