/* --- STC12C5Axx Series MCU UART2 (8-bit/9-bit)Demo ---------------*/ #include "reg51.h" #include "intrins.h" typedef unsigned char BYTE; typedef unsigned int WORD; #define FOSC 11059200L //System frequency #define BAUD 115200 //UART baudrate /*Define UART parity mode*/ #define NONE_PARITY 0 //None parity #define ODD_PARITY 1 //Odd parity #define EVEN_PARITY 2 //Even parity #define MARK_PARITY 3 //Mark parity #define SPACE_PARITY 4 //Space parity #define PARITYBIT EVEN_PARITY //Testing even parity /*Declare SFR associated with the UART2 */ sfr AUXR = 0x8e; //Auxiliary register sfr S2CON = 0x9a; //UART2 control register sfr S2BUF = 0x9b; //UART2 data buffer sfr BRT = 0x9c; //Baudrate generator sfr IE2 = 0xaf; //Interrupt control 2 #define S2RI 0x01 //S2CON.0 #define S2TI 0x02 //S2CON.1 #define S2RB8 0x04 //S2CON.2 #define S2TB8 0x08 //S2CON.3 bit busy; void SendData(BYTE dat); void SendString(char *s); void main() { #if (PARITYBIT == NONE_PARITY) S2CON = 0x50; //8-bit variable UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) S2CON = 0xda; //9-bit variable UART, parity bit initial to 1 #elif (PARITYBIT == SPACE_PARITY) S2CON = 0xd2; //9-bit variable UART, parity bit initial to 0 #endif BRT = -(FOSC/32/BAUD); //Set auto-reload vaule of baudrate generator AUXR = 0x14; //Baudrate generator work in 1T mode IE2 = 0x01; //Enable UART2 interrupt EA = 1; //Open master interrupt switch SendString("STC12C5A60S2\r\nUart2 Test !\r\n"); while(1); } /*---------------------------- UART2 interrupt service routine ----------------------------*/ void Uart2() interrupt 8 using 1 { if (S2CON & S2RI) { S2CON &= ~S2RI; //Clear receive interrupt flag P0 = S2BUF; //P0 show UART data P2 = (S2CON & S2RB8);//P2.2 show parity bit } if (S2CON & S2TI) { S2CON &= ~S2TI; //Clear transmit interrupt flag busy = 0; //Clear transmit busy flag } } /*---------------------------- Send a byte data to UART Input: dat (data to be sent) Output:None ----------------------------*/ void SendData(BYTE dat) { while (busy); //Wait for the completion of the previous data is sent ACC = dat; //Calculate the even parity bit P (PSW.0) if (P) //Set the parity bit according to P { #if (PARITYBIT == ODD_PARITY) S2CON &= ~S2TB8; //Set parity bit to 0 #elif (PARITYBIT == EVEN_PARITY) S2CON |= S2TB8; //Set parity bit to 1 #endif } else { #if (PARITYBIT == ODD_PARITY) S2CON |= S2TB8; //Set parity bit to 1 #elif (PARITYBIT == EVEN_PARITY) S2CON &= ~S2TB8; //Set parity bit to 0 #endif } busy = 1; S2BUF = ACC; //Send data to UART2 buffer } /*---------------------------- Send a string to UART Input: s (address of string) Output:None ----------------------------*/ void SendString(char *s) { while (*s) //Check the end of the string { SendData(*s++); //Send current char and increment string ptr } }