标题: 请教关于单片机串口通信,RI标志 [打印本页]

作者: teninnet    时间: 2012-8-1 16:25
标题: 请教关于单片机串口通信,RI标志

单片机用的是AT89S52,以下程序能正常运行,且用串口调试助手观察,每发送一个数据,发回这个数据+1的值,其余时间均在while(RI==0)处等待,真是不明白其中为什么RI位硬件没有自动置1,似乎是仅仅在接收的时候RI才是1啊,如果这样的话,中断服务程序怎么编啊,求助啊。

#include<reg52.h>
unsigned char num;
void UART_init()
{
 SCON=0x50;
 TMOD|=0x20;
 TMOD&=0xef;
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
}
void UART_receive()
{
 while(RI==0);
 num=SBUF;
 num++;
 SBUF=num;
}
void main()
{
 UART_init();
 while(1)
 {
    UART_receive();
 }
}


作者: yeyuxiang1990    时间: 2012-8-1 17:22

你这个肯定不对了啊。都没有中断函数。void UART——receive()改为中断函数。这么写

#include<reg52.h>
unsigned char num,FLAG;
void UART_init()
{
 SCON=0x50;
 TMOD|=0x20;
 TMOD&=0xef;
 TH1=0xfd;
 TL1=0xfd;
 TR1=1;
}
void main()
{
 UART_init();
 while(1)
 {

IF(FLAG==1)

{

SBUF=NUM;

WHILE(!TI);

TI=0;

}
     }

void ser() interrupt 4

{

RI=0;

FLAG=1;

NUM=SBUF;

NUM++;

}大小写我没有注意,你看看吧。


作者: teninnet    时间: 2012-8-1 17:25
可问题是,目前我的程序能正常运行,我想知道为什么这样编能运行,RI标志是怎么变化的
作者: yeyuxiang1990    时间: 2012-8-1 17:48

你看看你的主函数中while(!RI);只要你写数,那么RI就为1了。然后你接着就把SBUF值付给NUM。自加后赋给SBUF,这是TI的值变为1了,发送出去。当然可以运行,但没有用到中断。


作者: teninnet    时间: 2012-8-1 17:59

程序中并没有RI=0的清零语句,可RI还是会自动清零,程序能在while(RI==0)处等待下一个数据的接收,就这里奇怪


作者: rgwan    时间: 2012-8-2 09:00
 RI标志确实检查后是自动清零的(STC单片机)。
但是为了安全起见建议还是手动清零。
另外就是,RI标志在收到一个byte后置1.
还有最重要的一点。就是你没开串口中断(ES=1;)。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1