Notas de comunicación en serie de microcontroladores de simulación

La fórmula de cálculo velocidad de transmisión: 1,3 modo de velocidad en baudios = 1/32 o 1/16 * Timer tasa de 2 desbordamiento

        Velocidad de transmisión = 1/16 o 1/32 * (cristal de frecuencia / 12 * (256-TH1))

    

 

 

 

 1 de funcionamiento en modo serie, respectivamente T / C1 y T / C2 baudios tasas tabla valor inicial común es como sigue

 

 

 

 

 

 Sobre el método de ajuste de la velocidad de transmisión en serie puerto analógico:

9600b / s -> 104us -> Modo de operación del contador del temporizador 2, con el fin de lograr el tiempo de retardo 104us -> es decir, a una frecuencia de 104 cargos de 12MHZ

-> SCM + 1 se cuentan, el valor inicial se establece (256-104) -> Dado que las necesidades de función para consumir una cierta tiempo de funcionamiento, por lo que establecer el valor inicial

Está (256-99) para reducir el error

 

 

Microcontrolador contador de tiempo 51 en el modo de trabajo 4:

trabajo característica
0 Temporizador / contador operativo T0 en el modo 0, sólo el contador de 16 bits 13, es decir, TH0 altos 8 bits e inferior 5 bits de TL0, para formar un 13-bit de temporizador / contador.
1 trabajo del temporizador T0 y el trabajo 1 0 similares, la diferencia radica en el número de bits en el que el contador. Los trabajos necesarios para el trabajo 0 a conteo contador de 13 bits coloca un contador de 16 bits contados.
2

2 en el modo de temporizador T0 de operación, el contador de 16 bits en dos separada contador de 8 bits TH0 y TL0.

3 3 temporizador T0 sólo funciona con eficacia. Cuando el modo de trabajo del temporizador T0 3, el contador de 16 bits en dos separada contador de 8 bits TH0 y TL0.

Serie correspondiente registro:

 

 

 

 

Serial diagrama de comunicación de temporización:

 Diagrama de temporización de salida:

 

 Tiempo de entrada Diagrama:

 

 

REN conjunto software a 1, el receptor 16 a la velocidad de transmisión seleccionada muestreo veces el nivel pin RXD, detecta el nivel de entrada pin RXD a una transición negativa se produce, entonces el bit de inicio es válida, desplazado en el registro de desplazamiento de entrada, y empieza a recibir los bits restantes de la información de la trama. Recepción, los datos se transfieren desde el registro de desplazamiento de entrada a la derecha, cuando el bit de inicio izquierda desplaza al registro de desplazamiento de entrada, el circuito de control último turno. Cuando RI = 0, y SM2 = 0 (o el bit de parada recibida es 1), los primeros datos de 8 bits a datos de 9 bits recibidos se carga en el recibir SBUF, el noveno bit (bit de parada) en RB8, yuxtapuestas RI = 1, una petición de interrupción a la CPU.
----------------
Aviso: Este artículo es la versión original bloggers CSDN "To_dreams", y seguimiento 4.0 CC BY-SA acuerdo de derecho de autor, reproduce, por favor adjuntar el enlace de la fuente original y esta declaración. .
fuente original: https: //blog.csdn.net/to_dreams/java/article/details/7716678

 

Microcontrolador manera señal de interrupción:

 int0 Interrupción externa 0, bajo activo. pin P3.2 a través.
 INT1 Una solicitud de interrupción externa es baja activa. Por P3.3 pin
T0 Timer / Contador 0 desbordamiento petición de interrupción.
T1 Temporizador / contador 1 desbordamiento de solicitud de interrupción
TXD / RXD puerto serie petición de interrupción. Cuando la realización de un puerto serie para enviar o recibir datos, se solicita una interrupción.

 

Formulario sobre interrupción 51 microcontrolador y formato de lenguaje de programación C

anular la INT0 () de interrupción   0   el uso de   1 
{ 

} 
interrupción   0     indica interrupción externa 0 
de interrupción   de un     temporizador especificado de interrupción 0 
    . 
    . 
    . 
    . 

el uso de  0 es el grupo de orden cero registrar
 el uso de  1 es un grupo del primer registro

 

Por ejemplo:

/ *   Programa de interrupción externa * / 
void ISR_Key ( void ) de interrupción 0  el uso de  1. 
{ 
    Pl = Pl ~; // S3 una vez que se presiona el gatillo, P1 invierte una vez 
} 

/ *    de serie de interrupción programa   * / 
void UART_SER ( void ) de interrupción 4.  / / rutina de servicio de interrupción de serie 
{ 
    unsigned char temp; // definición de variables temporales 
    SI (la RI) // determina que se recibe una interrupción 
    { 
        la RI = 0 ; // bandera se borra y 
        la temp = SBUF; // leídos en el valor del tampón
        El temp = P1; // el valor P1 al puerto de salida para la visualización de 
        SBUF = Temp; // el valor recibido y luego de vuelta a la terminal de ordenador 
    }
     SI (TI) // si la marca de transmisión se borra 
    TI = 0 ; 
}

            

 

comunicación serie microcontrolador simulación Código:

#include " reg52.h " 
// transceptor pasadores byte define el número máximo de los datos recibidos
 // #include "stdio.h"
 // el sbit la RXD P3 ^ = 0; 


// . #define el TXD P3 ^ 1 

#define RECEIVE_MAX_BYTES 16 #define TIMER_ENABLE () {TH0 es TL0 =;. = TR0 1; fTimeouts = 0;} // permitir T / C #define TIMER_DISABLE () {TR0 = 0; fTimeouts = 0;} // prohibidos T / C #define TIMER_WAIT () {el mientras fTimeouts = 0 (fTimeouts!);} // esperar T / C de tiempo de espera 
sin signo de carbonilla fTimeouts = 0 ; // T / C bandera de tiempo de espera 
unsigned char recvbuf [ 16





]; // datos recibir tampón 
unsigned char RecvCount = 0 ; // recibir contador de datos 

// send byte 
vacío SendByte (unsigned char B) 
{ 
    unsigned char I = 8. ; 
    El TXD = 0 ; 
    TIMER_ENABLE (); 
    TIMER_WAIT (); 
    el tiempo (i-- ) 
    { 
            IF (& B 1. ) 
                el TXD = 1. ;
             el otro  
                el TXD = 0 ;
            TIMER_WAIT (); 
            b >> = 1 ; 
    } 
    
        TIMER_ENABLE (); 
    TIMER_DISABLE (); 
    
} 

// 接收字节 
sin firmar carbón RecvByte ( void ) 
{ 
    unsigned char i; 
    unsigned char b = 0 ; 

    TIMER_ENABLE (); 
    TIMER_WAIT (); 
    para (i = 0 ; i < 8 ; i ++ ) 
    { 
            si (RXD) 
                b | = ( 1 << i); 
            TIMER_WAIT (); 
            
    }
    
    TIMER_WAIT (); // espera para el final mordió 
    TIMER_DISABLE ();
     retorno B; 
    
} 
// cadena de impresión 
vacío PrintfStr ( Char * pstr) 
{ 
    el tiempo (pstr && * pstr) 
    { 
        SendByte ( * pstr ++ ); 
    } 
} 

// T / C inicialización 
void TimerInit ( void ) 
{ 
    el TMOD = 0x02 ; 
    TR0 = 0 ; 
    TF0 = 0 ; 
    TH0 es = ( 256 - 99 ); 
    TL0 = TH0 es; 
    el cultivo de referencia evapotranspiración = 1. ; 
    EA = 1. ; 
} 


// si no es el bit de inicio llega 
sin firmar carbón StartBitCome ( void ) 
{ 
    retorno (el RXD == 0 ); 
} 



// función principal 

vacío principal ( vacío ) 
{ 
    unsigned char I; 
    TimerInit (); 
    // printf ( "Hola 80C52 \ R & lt \ n-"); 
    el tiempo ( . 1 ) 
    { 
        IF (StartBitCome ())
        {
                Recvbuf [RecvCount ++] = RecvByte ();
            si (RecvCount> = RECEIVE_MAX_BYTES) 
            { 
                RecvCount = 0 ;
                para (i = 0 ; i <RECEIVE_MAX_BYTES; i ++ ) 
                { 
                    SendByte (recvbuf [i]); 
                } 
            } 
                
        } 
    } 
    
} 

// 定时器中断服务函数
void Timer0IRQ ( void ) interrumpir 1  usando  0 
{ 
    fTimeouts = 1 ;
}

 

fenómenos experimentales:

 Dado que la velocidad de transmisión se ha distorsionado razones no recomiendan usar un puerto analógico

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

Supongo que te gusta

Origin www.cnblogs.com/xwtstudio/p/12602745.html
Recomendado
Clasificación