×
单片机 > 单片机程序设计 > 详情

c51单片机上的发送中断标志位

发布时间:2020-08-21 发布时间:
|

对于一些大多数单片机,他有一个专门的标志位来给串口的发送或接受数据做判断。


比如c51中,TIx和RIx。


TIx标识数据缓冲区的数据是否发送完毕,TIx = 1,表示发送完毕,TIx= 0,表示还没发送结束。


所以一个很简单的发送程序:


for(i=0;i

{  

    while(!TI0);  

    TI0=0;  

    SBUF0 = s_data[i];        

}  


像上面程序这样来发送数据。

但是,上面程序有可能出现问题,有时你会发现单片机一直发送不了数据,或发送的数据有些问题。


断点调试下你就会发现,单片机不发送数据的原因就是一直停留在while(!TI0)语句中。还好只是这样,如果是复杂的应用,导致数据错位或其他的,要找到原因还真麻烦啊。


问题原因很简单,就是如果程序在这之前没通过串口发送过数据呢?


比如下面的初始化:


void UART0_Init()  

{  

    unsigned char SFRPAGE_SAVE = SFRPAGE;  

  

    SFRPAGE = UART0_PAGE;  

    SCON0   = 0x50;         // SCON0: mode 1, 8-bit UART, enable RX  

    SSTA0   = 0x15;  

    SFRPAGE = TMR2_PAGE;  

    TMR2CN  = 0x00;  

    TMR2CF  = 0x08;  

    RCAP2L   = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 ));  

    RCAP2H    = (-((unsigned int)(SYSCLK / BAUDRATE) >> 4 )>>8);  

    TMR2L    = RCAP2L;  

    TMR2H    = RCAP2H;  

    TR2     = 1;  

    SFRPAGE = SFRPAGE_SAVE;  

}  

看起来都没问题,但是,TI呢?

TI默认0,没错,因为压根没发送数据,哪有发送完成。可巧好我们需要的条件是发送完成...


于是,很简单:



for(i=0;i

{  

    while(!TI0);  

    TI0=0;  

    SBUF0 = s_data[i];        

}  


关键字:c51  单片机  中断标志位 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义