//该模拟串口为半双工模式, 2400/8/N/1 //如需不同波特率改变T2定时器的时间便可 //作者: wangjxy QQ: 4183782 //广州 2007-06-08 #pragma vector = TIMER2_OVF_vect __interrupt void T2time139us(void) { static unsigned char bit; static unsigned char count; static unsigned char stat_flag; static unsigned char tmp; static unsigned char recv_byte; TCNT2 = 152; if((Uart1_RX_overtimer != 0) && (Uart1_RX_overtimer != 0xff)){ Uart1_RX_overtimer--; } if( Uart1_RX_overtimer == 0 ){ asm("sei"); return; } if(Uart1_send_haveframe == NONE) { if(Uart1_recv_haveframe != NONE) { asm("sei"); return; } if(stat_flag == 0xa5){ stat_flag = 0; bit = 1; count = 0; tmp = 0; recv_byte = 0; asm("sei"); return; } if(bit == 0) { if(!(IORxd_PIN & (1<= 2) stat_flag = 0xa5; } else{ count = 0; stat_flag = 0; } asm("sei"); return; } if(bit == 9) { if(!(IORxd_PIN & (1<= 3 ){ bit = 0; count = 0; Uart1_recv_buf[Uart1_recv_pt++] = recv_byte; if(Uart1_recv_pt>=63) Uart1_recv_pt = 62; Uart1_RX_overtimer = 100; } asm("sei"); return; } tmp = tmp << 1; if((IORxd_PIN & (1<= 3){ recv_byte = recv_byte >> 1; if( (tmp==3) || (tmp>4) ) recv_byte |= 0x80; tmp = 0; count = 0; bit ++; } } else { count++; if(count >= 3) { count = 0; if(bit == 0){ IOTxd_PORT &= ~(1<= Uart1_neet_send){ Uart1_send_haveframe = NONE; } } else { if((Uart1_send_buf[Uart1_send_pt] & (1<<(bit-1))) == 0) IOTxd_PORT &= ~(1<= 9) bit = 0; else bit ++; } } asm("sei"); }