出于一些特殊原因(帮学弟做个课设),需要用到STC89C52,用都用到了,记录一下过程吧。
串口
#include <reg52.h> #include <stdio.h> typedef unsigned char uint8_t ;typedef unsigned int uint16_t ;enum { BufEmpty = 0 , BufOverflow, BufReady, WaitInput } Buf_Flag; #define BufSize 32 #define R_SYM '\r' #define N_SYM '\n' void uart_P3_init (void ) ;void uart_init (void ) ;void send_char (uint8_t ch) ;void send_string (uint8_t *str) ;void delay (uint16_t i) ;uint8_t RXD_Buf[BufSize] = {0 };void main () { uint8_t i = 0 ; Buf_Flag = BufEmpty; uart_P3_init(); uart_init(); ES = 0 ; send_string("I am AT89C51 Serial COM1!\r\n" ); ES = 1 ; while (1 ) { if (Buf_Flag == BufEmpty) { ES = 0 ; send_string("\r\nPlease input form Serial Assistant(<32Bytes)!\r\n" ); ES = 1 ; Buf_Flag = WaitInput; } else if (Buf_Flag == BufReady) { ES = 0 ; send_string("Your Input: " ); send_string(RXD_Buf); i = 0 ; while (i < BufSize) { RXD_Buf[i++] = 0 ; } Buf_Flag = BufEmpty; ES = 1 ; } else if (Buf_Flag == BufOverflow) { ES = 0 ; send_string("ERROR:RXD_Buf is full!\r\n" ); delay(2000 ); i = 0 ; while (i < BufSize) { RXD_Buf[i++] = 0 ; } Buf_Flag = BufEmpty; ES = 1 ; } } } void delay (uint16_t i) { uint8_t j; for (; i > 0 ; i--) for (j = 0 ; j < 125 ; j++) ; } void uart_init (void ) { TMOD = 0x20 ; SCON = 0x40 ; REN = 1 ; TH1 = 0xFD ; TL1 = 0xFD ; PCON = 0x00 ; IE = 0x90 ; PS = 0 ; TR1 = 1 ; } void uart_P3_init (void ) { P3 = 0x0F ; } void send_char (uint8_t ch) { SBUF = ch; while (!TI) ; TI = 0 ; } void send_string (uint8_t *str) { while (*str != '\0' ) { send_char(*str); str++; } } void uart_interrupt (void ) interrupt 4{ static uint8_t n = 0 ; if (TI == 1 ) { TI = 0 ; return ; } if (RI == 1 ) { RI = 0 ; ES = 0 ; if (n < BufSize - 1 ) { RXD_Buf[n++] = SBUF; if (((RXD_Buf[n - 2 ] == R_SYM) && (RXD_Buf[n - 1 ] == N_SYM)) \|| ((RXD_Buf[n - 2 ] == N_SYM) && (RXD_Buf[n - 1 ] == R_SYM))) { Buf_Flag = BufReady; RXD_Buf[n] = '\0' ; n = 0 ; } } else { Buf_Flag = BufOverflow; n = 0 ; } ES = 1 ; } }