找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8679|回复: 5
收起左侧

请教关于单片机串口通信,RI标志

[复制链接]
ID:35705 发表于 2012-8-1 16:25 | 显示全部楼层 |阅读模式

单片机用的是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();
 }
}

回复

使用道具 举报

ID:43522 发表于 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++;

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

回复

使用道具 举报

ID:35705 发表于 2012-8-1 17:25 | 显示全部楼层
可问题是,目前我的程序能正常运行,我想知道为什么这样编能运行,RI标志是怎么变化的
回复

使用道具 举报

ID:43522 发表于 2012-8-1 17:48 | 显示全部楼层

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

回复

使用道具 举报

ID:35705 发表于 2012-8-1 17:59 | 显示全部楼层

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

回复

使用道具 举报

ID:43499 发表于 2012-8-2 09:00 | 显示全部楼层
 RI标志确实检查后是自动清零的(STC单片机)。
但是为了安全起见建议还是手动清零。
另外就是,RI标志在收到一个byte后置1.
还有最重要的一点。就是你没开串口中断(ES=1;)。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表