51单片机串口中断和产生波特率的定时器中断为什么不能同时开启?

测试情况:利用51单片机的定时器1的溢出率产生波特率,初始化串口并设置中断使能位ES=1,然后对定时器1也做了相应的配置,无意中设置ET1=1了,利用串口调试助手调试的结果是连续不断的收到了*这个字符。。第二次实验的时候把ET1=0,就可以正常的收发了、、
请问:为什么串口中断和定时器1中断不能同时开启呢?

利用51单片机的定时器1的溢出率产生波特率,并不需要打开 T1 的中断。

如果打开了,你就应该编写相应的中断程序。

如果,你没有写中断程序,那么,它中断后,自然就会给你添乱。追问

能更加深入的说明么?T1中断程序没有写,不做任何操作、、为什么会产生影响呢?

追答

楼主并没有编写 T1 中断程序,你以为,单片机就不做任何操作?

你如果开放了 T1 的中断,那么,每当 T1 定时溢出后,必定就会到
001BH 处,去执行 T1 的中断程序。

不管你写没写,单片机,都会执行 001BH 处的程序,直到执行 RETI,
才会返回断点。

楼主没有编写 T1 中断程序,逻辑上,已经错了,单片机,就被你弄糊涂了。
它把主程序当做中断程序来执行,这会产生什么影响,只有天知道。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-06-12
如果串口也是用的T1,就不行。
如果不是,就可以。
第2个回答  2021-11-29
不知道解释对不对,可以参考。串口中断中定时器用的工作模式2,属于自动重装,如果再设置ET1=0,是不是就有冲突了?

51单片机串口中断和产生波特率的定时器中断为什么不能同时开启?
利用51单片机的定时器1的溢出率产生波特率,并不需要打开 T1 的中断。如果打开了,你就应该编写相应的中断程序。如果,你没有写中断程序,那么,它中断后,自然就会给你添乱。

51单片机波特率为115200时定时器中断能否同时使用
如果开启串口,且定时器就是波特率发生器,最好不要用同一个定时器做定时器并开中断,因为定时时间太短了,影响系统实效性。还是用其它定时器来开中断吧

51单片机中断精确定时和9600波特率的串口通讯能兼得吗?
想要兼得,就不要分开设置,参考如下:TMOD = 0x21; \/\/定时器1工作模式2,定时器0工作模式1 ………

51单片机的串口中断与定时
在串口收\/发数据时,要用定时器T1产生波特率,并不是用来定时的,也不能开定时器T1的中断。TH1和TL1的初值是决定串口波特率的,而且是根据晶振频率和串口波特率计算的。你接外部传感器,是用串口向单片机发送数据吗?波特率是多少?单片机串口接收的波特率必须与它相同才行的。并不是按定时器什么定时时间发送...

51单片机定时和串口冲突?
T0中断太频繁了,因为同级中断,T0优先,所以总抢占中断,串口被边缘话了。修改一下程序:void timer_init(){ TMOD=0x22;SCON=0X50;TH1=0xfd;TL1=0xfd;TR1=1;TH0=246;TL0=246;ET0=1;TR0=1;ES=1;EA=1;PS=1; } void timer0_int() interrupt 1 {time++;if(time<50)\/\/count为占空比...

关于单片机串口通信,定时器产生波特率的疑问?
1、需要设定定时但不需要中断。无需重新赋值 2、定时器同时开启的话 他们会按照T0 T1 T2的同级顺序中断,

51单片机串口通信不用设置IE开关吗?
你对51的串口部分了解还不够透彻。51的串口默认是使用Timer1作为波特率发生器的,利用8位自动重载模式产生串口波特率的32或16倍频。如果你开启了Timer1中断、又没有修改串口波特率发生器的选择,那么由于Timer1不停进入中断就会导致串口部分根本无法正常工作。简而言之,默认状况下,串口要吃掉Timer1。牢记。

STC51单片机同时使用定时器0定时器1和串口
用 T1 控制波特率,此期间,T1 就不能用来中断了。其实,想要实现定时,有一个 T0 足以满足各种需求。T1,就不应该用来做定时用。T2,是有的。

关于51单片机的串口和定时器共用冲突
串口需要定时器1或定时器2作为波特率发生器哦,这个定时器要工作在方式2,不能中断。按照你说的,应该没有这个问题,串口不会影响T0的。代码不完全,看不出来呢

51单片机3个定时器能否同时工作
当然可以同时工作,当然有优先的问题,不过你的问题不一定是优先级造成的,如果是C语言编制的话,有可能是工作寄存器造成的,试试不同的中断用不同的工作寄存器组。

相似回答