欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 請(qǐng)教關(guān)于單片機(jī)串口通信,RI標(biāo)志 [打印本頁(yè)]

作者: teninnet    時(shí)間: 2012-8-1 16:25
標(biāo)題: 請(qǐng)教關(guān)于單片機(jī)串口通信,RI標(biāo)志

單片機(jī)用的是AT89S52,以下程序能正常運(yùn)行,且用串口調(diào)試助手觀察,每發(fā)送一個(gè)數(shù)據(jù),發(fā)回這個(gè)數(shù)據(jù)+1的值,其余時(shí)間均在while(RI==0)處等待,真是不明白其中為什么RI位硬件沒(méi)有自動(dòng)置1,似乎是僅僅在接收的時(shí)候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();
 }
}


作者: yeyuxiang1990    時(shí)間: 2012-8-1 17:22

你這個(gè)肯定不對(duì)了啊。都沒(méi)有中斷函數(shù)。void UART——receive()改為中斷函數(shù)。這么寫(xiě)

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

}大小寫(xiě)我沒(méi)有注意,你看看吧。


作者: teninnet    時(shí)間: 2012-8-1 17:25
可問(wèn)題是,目前我的程序能正常運(yùn)行,我想知道為什么這樣編能運(yùn)行,RI標(biāo)志是怎么變化的
作者: yeyuxiang1990    時(shí)間: 2012-8-1 17:48

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


作者: teninnet    時(shí)間: 2012-8-1 17:59

程序中并沒(méi)有RI=0的清零語(yǔ)句,可RI還是會(huì)自動(dòng)清零,程序能在while(RI==0)處等待下一個(gè)數(shù)據(jù)的接收,就這里奇怪


作者: rgwan    時(shí)間: 2012-8-2 09:00
 RI標(biāo)志確實(shí)檢查后是自動(dòng)清零的(STC單片機(jī))。
但是為了安全起見(jiàn)建議還是手動(dòng)清零。
另外就是,RI標(biāo)志在收到一個(gè)byte后置1.
還有最重要的一點(diǎn)。就是你沒(méi)開(kāi)串口中斷(ES=1;)。





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1