关闭串口中断,也可以利用串口发送和接收数据?

ensky. 2014-03-07 03:05:15
程序如下

#include<reg52.h>
char a;
void main()
{
EA=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
ET1=0;
TR1=1;

ES=0;//stop the serial interrupt
REN=1;
SM0=0;
SM1=1;
while(1)
{
if(RI==1)
{
RI=0;
a=SBUF;
P1=a;
SBUF=a;
}
else if(TI==1)
TI=0;
}
}

我把串口中断ES=0了,中断都被关闭了。我还是可以发送和接收数据。所以我认为,ES只是作用于“中断服务程序,也就是 void Serial_interrupt_function() interrupt 4 ”只有在void Serial_interrupt_function() interrupt 4,ES才有绝对控制权。

中断的目的是获得CPU的响应。既然我们可以不用中断就可以获得CPU的响应,那用中断的意义就没了,就像上面的程序一样,while(1)可以一直占用CPU,CPU就可以直接处理While(1)中的代码指令。CPU直接响应发送和接收数据了。

串行通信有TXD和RXD,这两根线是物理连接P3.0和P3.1口的。所以物理上是通路。只要REN=1,就允许接收和发送。

ES是用于获得CPU响应的,串行通信的硬件电路和ES应该没关系?
...全文
1137 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathletboy 2014-03-08
  • 打赏
  • 举报
回复
定时器还是轮询啊,轮询次数是比死循环少,但是还是比打开串口中断占用的CPU多,而且你定时器也用到了中断,所以何必呢?
ensky. 2014-03-08
  • 打赏
  • 举报
回复
引用 4 楼 pathletboy 的回复:
定时器还是轮询啊,轮询次数是比死循环少,但是还是比打开串口中断占用的CPU多,而且你定时器也用到了中断,所以何必呢?
明白了,谢谢您的回复
ensky. 2014-03-07
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
通常发生是不用中断的。 接受 用中断 是 因为 不知道 字符 什么时候 会来, 你 不用中断 就得 查询, 而查询 会 占 cpu 大量时间。
这是我重新调试的程序,利用定时器1,发送和接收数据,程序可以正常运行 #include<reg52.h> #define uint unsigned int #define uchar unsigned char void delay(int z); char a,flag; void main() { EA=1; TMOD=0x20; TH1=0xfd; TL1=0xfd; ET1=1; TR1=1; ES=0; REN=1; SM0=0; SM1=1; while(1); } void Time1_interrupt()interrupt 3 { if(RI) { RI=0; P1=SBUF; a=SBUF; SBUF=a; } if(TI) { TI = 0; } }
ensky. 2014-03-07
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
通常发生是不用中断的。 接受 用中断 是 因为 不知道 字符 什么时候 会来, 你 不用中断 就得 查询, 而查询 会 占 cpu 大量时间。
是的,如果使用查询就会占用CPU大量的时间。上面的程序使用了一个While(1),会非常占用时间了。如果使用串口中断,那就不会一直占用CPU了。这样的或,使用定时器中断也可以“发送,接收串口数据了”。 使用定时器中断和串口中断的本质区别是?
schlafenhamster 2014-03-07
  • 打赏
  • 举报
回复
通常发生是不用中断的。 接受 用中断 是 因为 不知道 字符 什么时候 会来, 你 不用中断 就得 查询, 而查询 会 占 cpu 大量时间。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧