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