51单片机串口中断哪里有错?为什么上电就会就去中断服务程序?

#include<reg52.h>
unsigned char a,k;

void init()
{
TMOD=0x20; //设定定时器1的工作方式为方式2
TH1=0xfd; //T1定时器装初值
TL1=0xfd; //T1定时器装初值
TR1=1; //打开定时器1

REN=1; //允许串行接收
SM0=0; //选择串口工作方式为方式1
SM1=1;
EA=1; //开总中断
ES=1; //开串口中断;
RI=0;
k=1;
}
void main()
{
init();
while(1);
}

void ser() interrupt 4
{
RI=0;
P0=0x01;
switch(k)
{
case 1:
{
k++;
P0=0xaa;//P0口 的灯就会隔一个亮一个
return ;
}
case 2:
{
k++;
P1=0xaa;
return ;
}
case 3:
{
P0=0xaa;
k=1;
}

}
}

上电后P0口的灯就会亮。

很简单的问题吗~~
并不是直接进中断,是因为定时时间太短,导致你没反应过来就已经近中断了,你可以在主程序中
设定 P0=0xaa然后演示一段时间,就能看出来了:
原因如下:
TH1=0xfd; //T1定时器装初值
TL1=0xfd; //T1定时器装初值
定时时间太短~~可长一点追问

时间短能进入串口中断吗? 串口中断只有串口接收到数据才可以进入的 TH1 TL1都是对波特率的设置

追答

请清楚buff

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-26
你的测试程序似乎不够好。第一P0口的初始状态是什么样儿?第二在主程序里并未改变P0口的状态,你如何知道是进入中断呢。就只因为P0口的灯吗?建议你先写通串口发送程序。如果串口可以正常发送你想要的数据,这样证明波特率和串口相关寄存器之类的设置正确。如果发送都发送不了,就不要谈中断接收了。中断接收可以看做两个东西,一个是中断,一个是接收。如果发送正常。那么就不用用P0口的状态来看你程序是否正确了。直接用串口发送相应错误的状态字节就OK了。比如初始化结束的时候串口发送0x55.。进中断发送一个0xaa等等。这样你就知道你的程序跑到哪里了。希望我的建议你能采纳。追问

串口是可以正常发送和接收的,数据也正确。关键是现在我不明白的就是:如果我让case 1里面的P0=0x01;case 2的P0=0x02;case 3的P0=0x03;我上电后P0会亮0x01,接收到第一个数据的时候就会进入case 2,第二个数据就会进入case 3,这样循环下去。
谢谢啊

第2个回答  2011-11-26
与case配套使用的是break来推出内层循环体,而不是函数返回return
将SM0 = 0;去掉就能解决问题,或是将REN = 1;放在SM1 =1;后面也能解决问题追问

我就是想接受一次数据就跳出中断服务程序 我把REN = 1;放在SM1 =1;后面把问题解决了 把SM0 = 0;去掉不行。 谢谢你啊

本回答被提问者采纳
第3个回答  2011-11-26
P0口的灯是8个还是1个,如果是1个,是哪一位控制?是1亮,还是0亮?
你的串口是和电脑连接吗,看不出来你的硬件环境。
第4个回答  2011-11-26
灯亮证明不了就是进中断,最简单的测试方法就是你在中断程序中,不同的case处让不同的灯亮,再看看是不是上电的灯亮和你程序中的灯一样!
相似回答