单片机每次发送或者接受完数据(8位数据将保存在缓冲区中),会自动触发接受或者发送中断。因此只需要中断置位以后再缓冲区中读数据(或者发送数据)。
1 /************************************************* 2 *receive code(HEX) 3 * $ P M T K 1 8 0 * 3 B \n \r 4 * 24 50 4D 54 4B 31 38 30 2A 33 42 0D 0A 5 *************************************************/ 6 7 unsigned char code CmdData[dataMax] = {0x24,0x50,0x4D,0x54,0x4B,0x31,\ 8 0x38,0x30,0x2A,0x33,0x42,0x0D,0x0A}; 9 10 11 /************************************************* 12 * UART interrupt subroutine 13 *********************************/ 14 void UART_ISR (void) interrupt 4 //interrupt address is 0x0023 15 { 16 17 if (RI) //check Tx or Rx interrupt 18 { 19 RI = 0; //clear RI by software for next reception 20 21 if((TmpData = SBUF) == CmdData[index]) 22 { 23 index++; 24 if(index == 13) 25 { 26 index = 0; 27 recv_flag = 1; 28 EA = 0; //disable global interrupt 29 } 30 31 } 32 else 33 { 34 index = 0; 35 } 36 } 37 } 38 /************************************************* 39 * Initial Timer 1 40 **************************************************/ 41 void Timer1_Init (void) 42 { 43 TMOD = 0x20; //configure Timer 1 as auto-reload 8-bit mode 44 PCON |= 0x80; //double baud rate enable 45 TL1 = TH1 = U8BAUD_TIMER1; //baud rate 9600bps@22.1184MHz 46 TR1 = 1; //Timer 1 run 47 } 48 49 /************************************************* 50 * Main function 51 **************************************************/ 52 void main (void) 53 { 54 55 P0OR |= 0x01; //enable P0 internal pull-up 56 57 #if BAUD_SOURCE 58 Timer2_Init(); 59 #else 60 Timer1_Init(); 61 #endif 62 63 SCON = 0x52; /*initial UART as mode 1, receive enable, 64 TI should be set before using "printf"*/ 65 ES = 1; //enable UART interrupt 66 EA = 1; //enable global interrupt 67 delay_ms(700); // >= 700ms 68 while(1) 69 { 70 while(recv_flag) 71 { 72 recv_flag = 0; 73 P00 = 0; //with reset contrl 74 delay_ms(300); // >= 300mS 28/November/2014 75 P00 = 1; 76 delay_ms(100); 77 EA = 1; 78 } 79 //stop_key(); 80 while(!P10); 81 } 82 }