51单片机中断实现串口通信的问题

请问这段代码哪里有问题?怎么改?
/*中断实现串口通信 */
#include<reg52.h>
unsigned char flag;

void main()
{
void init();

init();
while(1)
{
while(!flag)
;
ES = 0;
P1 = SBUF;
flag = 0;
SBUF = P1;
while(!TI) //TI发送中断标志
;
TI = 0;
ES = 1;

}
}

void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1;
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}

void serial() interrupt 4
{
flag = 1;
RI = 0; //接收完数据后硬件将RI置1,必须软件归0
}

我的目的是发一个数据给单片机。然后把数据赋给P1口。。再把该数据传回来。
[code=C/C++]
void init()
{
TMOD = 0x20; //定时器1工作方式2自动重装8位计时器
TH1 = 0xfd; //波特率9600
TH0 = 0xfd;
SM0 = 0; //串行口工作方式1
SM1 = 1;
EA = 1;
ET1 = 1; //去掉这个语句就程序就正确了
TR1 = 1;
ES = 1;
REN = 1; //串行数据允许接收位
}

//ET1 = 1; //去掉这个语句就程序就正确了
为什么??
[/code]

ET1 = 1; 是允许定时器1中断, 但你没有写相应的中断函数, 中断时,程序指针跳到中断向量表后,会找不到程序入口,导致死机的.

用了自动重装方式就没必要开中断了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-05-24
初看没有问题,,等
第2个回答  2010-05-24
将void init();放在main()之前(外面);
相似回答