我一直都坚信51单片机的串口是全双工的,但是一个简单的程序,我却解释不通! 代码如下: #include <at89c51RC2.h>
/*******************************************************/
/* define */
sbit work_led = P1^5;
/* end define */
/*******************************************************/
/* declare functions */
void init_uart_t0(void);
//void it_uart(void) interrupt 4;
void it_t0(void);
/* end declare functions */
/*******************************************************/
/* declare global variable */
unsigned char counter_50ms = 0
unsigned char uart_data = 0;
bit flag_500ms = 0;
/* end declare global variable */
/******************************************************/
/* start main function */
void main(void) { init_uart_t0();
while(1) { if(flag_500ms) { flag_500ms = 0;
work_led = ~work_led; } } } /* end main function */
/*****************************************************/
void init_uart_t0(void) { SCON = 0x50; // uart in mode 1 (8 bit), REN=1
TMOD = TMOD | 0x20 ; // Timer 1 in mode 2
TMOD &= 0xF0; // Timer 0 mode 1 with software gate
TMOD |= 0x01; // GATE0=0; C/T0#=0; M10=0; M00=1;
TH0 = 0x4c; //init values t=(2$16-th0tl0)*11.0592MHz*12=50ms
TL0 = 0x00;
TH1 = 0xFD; // 9600 Bds at 11.0592MHz
TL1 = 0xFD; //9600 Bds at 11.0592MHz
ET0 = 1; // enable timer0 interrupt
ES = 1; // Enable serial interrupt
EA = 1; // Enable global interrupt
TR0=1; // timer0 run
TR1 = 1; // Timer 1 run }
/************************************************/
void it_uart(void) interrupt 4 { if (RI) { RI = 0;
uart_data = SBUF; // Read receive data SBUF = uart_data; } else TI = 0; } /***************************************************/
void it_t0(void) interrupt 1 /* interrupt address is 0x000b */ { TH0 = 0x4c; //init values t=(2$16-th0tl0)*11.0592MHz*12=50ms
TL0 = 0x00; counter_50ms ++;
counter_tx50ms ++;
if(counter_50ms >= 10) { counter_50ms = 0;
flag_500ms = 1; } } /***********************************************/ //all program end
这样能过串口调试助手向单片机连续发送数据,不同数据组间隔几百毫秒,单片机返回的数据数量总是小于发送给它的数据数量,也就是说有丢包现象!将串口的发送与接收分时操作,即改成半双工模式,未现问题!!
请大侠指点迷津!小弟多谢! |