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处让不同的灯亮,再看看是不是上电的灯亮和你程序中的灯一样!

请问51单片机中所有的中断源什么引起进入中断服务函数,然后这些中断...
由于串口中断是发送完成和接收完成共用一个中断源,因此需要专门指令来清除中断标志,其余4个中断标志均由硬件自动清0。

51单片机串口无法连续发送
串口中断服务interrupt函数错了, else TI = 0;这两句删掉就对了。 当SBUF一旦发送数据完毕,就会TI=1,产生一次串口中断,这个时候中断发生优先级比进入你while(!TI);这句要高(快),即进入串口中断函数,走else这里直接把TI=0了,然后回到主函数永远卡在while(!TI);了,所以你就只能发送一个字...

51单片机 串口中断用T1定时器设定波特率,ET1=0,ES=1;在不发送任何信息的...
进入中断后中断请求标志位RI没有清零,另外中断进去为什么不读取缓冲器内的信息?

51单片机关于中断优先级和中断优先权是如何规定的?
通过这样的设置,当温度传感器和串口同时发出中断请求时,CPU会首先处理温度传感器的中断,确保系统的安全性和稳定性,而串口通信的中断则会在CPU空闲时得到处理。综上所述,51单片机的中断优先级和中断优先权是通过结合中断优先级寄存器和中断使能触发器的设置来共同实现的。这种机制为嵌入式系统设计师提供了...

51单片机串口通信问题
1、是在一个字节接收成功或一个字节发送成功以后进入中断程序(不过,一般在发送时是将中断关闭的,也就不进入中断了)。此时,定时器的作用就是为了设定串口速率,因为单片机的速度和串口的速度不是一个数量级的,所以一定要有个变速箱。2、数据的接收是由硬件控制的,其实,数据的接收发送都是有一个...

C51单片机串口通信中断的问题
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。

51单片机串口通讯(模式1)问题:发送内容前半部分出错,后半部分正确。错...
ET1=1;此语句是罪魁祸首,定时器1已经作为串口波特率发生器了,就不能做其他用途了,此时定时必须禁止中断,而你程序中恰恰相反,来了句ET1=1;开启了定时器1中断,导致串口波特率发生混乱。那当然串口通信会有问题了,删掉ET1=1;该语句即可。

51单片机串口接收中断连续接收字符串,中断一直占有CPU时间直到字符串...
1楼的说法明显不对,串口接收时有标志位RI,当串口接收到一个字符(8位)时,RI会自动被置1,此时CPU会从主程序转去执行串行中断,普通单串口51单片机一般为 interrupt 4 子程序,当执行完时会自动回到主程序继续执行,因此自 interrupt 4子程序结尾要把RI清零,以接受下一个中断,否则无法再接收下一...

C51单片机的中断操作,与直接在主函数内写入中断服务程序有什么区别?
可通过两种方式决定是否执行中断服务程序:1开中断,此时中断服务程序只能写在中断函数中;2采用查询中断标志位,此时中断服务程序可写在任何地方,当然也可以写在主函数中。P0口当作普通IO口使用时,为漏极开路,必须外接上拉电阻。关于何为漏极开路,请参阅数字电子的集电极开路与非(OC)门。

51 单片机 主函数的while循环中检测到外部中断1 的标志位后用串口发送...
中断是一个独立并有高优先权的系统,MAIN中的程序不能影响中断

相似回答