找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9361|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

請教關(guān)于單片機(jī)串口通信,RI標(biāo)志

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:35705 發(fā)表于 2012-8-1 16:25 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

單片機(jī)用的是AT89S52,以下程序能正常運(yùn)行,且用串口調(diào)試助手觀察,每發(fā)送一個數(shù)據(jù),發(fā)回這個數(shù)據(jù)+1的值,其余時間均在while(RI==0)處等待,真是不明白其中為什么RI位硬件沒有自動置1,似乎是僅僅在接收的時候RI才是1啊,如果這樣的話,中斷服務(wù)程序怎么編啊,求助啊。

#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();
 }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:43522 發(fā)表于 2012-8-1 17:22 | 只看該作者

你這個肯定不對了啊。都沒有中斷函數(shù)。void UART——receive()改為中斷函數(shù)。這么寫

#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++;

}大小寫我沒有注意,你看看吧。

回復(fù)

使用道具 舉報

板凳
ID:35705 發(fā)表于 2012-8-1 17:25 | 只看該作者
可問題是,目前我的程序能正常運(yùn)行,我想知道為什么這樣編能運(yùn)行,RI標(biāo)志是怎么變化的
回復(fù)

使用道具 舉報

地板
ID:43522 發(fā)表于 2012-8-1 17:48 | 只看該作者

你看看你的主函數(shù)中while(!RI);只要你寫數(shù),那么RI就為1了。然后你接著就把SBUF值付給NUM。自加后賦給SBUF,這是TI的值變?yōu)?了,發(fā)送出去。當(dāng)然可以運(yùn)行,但沒有用到中斷。

回復(fù)

使用道具 舉報

5#
ID:35705 發(fā)表于 2012-8-1 17:59 | 只看該作者

程序中并沒有RI=0的清零語句,可RI還是會自動清零,程序能在while(RI==0)處等待下一個數(shù)據(jù)的接收,就這里奇怪

回復(fù)

使用道具 舉報

6#
ID:43499 發(fā)表于 2012-8-2 09:00 | 只看該作者
 RI標(biāo)志確實(shí)檢查后是自動清零的(STC單片機(jī))。
但是為了安全起見建議還是手動清零。
另外就是,RI標(biāo)志在收到一個byte后置1.
還有最重要的一點(diǎn)。就是你沒開串口中斷(ES=1;)。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表