单片机用的是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();
}
}
你这个肯定不对了啊。都没有中断函数。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++;
}大小写我没有注意,你看看吧。
你看看你的主函数中while(!RI);只要你写数,那么RI就为1了。然后你接着就把SBUF值付给NUM。自加后赋给SBUF,这是TI的值变为1了,发送出去。当然可以运行,但没有用到中断。
程序中并没有RI=0的清零语句,可RI还是会自动清零,程序能在while(RI==0)处等待下一个数据的接收,就这里奇怪
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |