关于串口通信的问题
时间:10-02
整理:3721RD
点击:
先上程序
#include<reg52.h>
unsigned char flag,a;
void main()
{
TMOD=0x20; //方式2
TH1=0xfd; //初值
TL1=0xfd;
TR1=1;
REN=1; //接受允许
SM0=0;
SM1=1; //方式2
EA=1; //开总中断
ES=1; //串口中断
while(1)
{
if(flag==1)
{
ES=0; //关中断
flag=0;
P0=SBUF; //将接收到的值给P0,(我的板子中P0为LED)
TI=0; //发送停止,清0
ES=1; //开中断
}
}
}
void ser() interrupt 4
{
RI=0; //接受停止,清0
a=SBUF;
flag=1;
}
1:先想请问一下那个放大加粗的ES=1;,在我调程序的时候,去掉那句后LED无任何反映,而在加上时LED按照程序走,这是为什么?
2:放大的TI=0;,如果我没记错应该是发送完数据内部硬件将TI置1,进入中断,在中断中应该用软件将TI=0。但是这个程序中发送完数据后是否还进入了SER()中断?又为什么在主程序中TI=0。这部分程序是怎么跑的?
谢谢
#include<reg52.h>
unsigned char flag,a;
void main()
{
TMOD=0x20; //方式2
TH1=0xfd; //初值
TL1=0xfd;
TR1=1;
REN=1; //接受允许
SM0=0;
SM1=1; //方式2
EA=1; //开总中断
ES=1; //串口中断
while(1)
{
if(flag==1)
{
ES=0; //关中断
flag=0;
P0=SBUF; //将接收到的值给P0,(我的板子中P0为LED)
TI=0; //发送停止,清0
ES=1; //开中断
}
}
}
void ser() interrupt 4
{
RI=0; //接受停止,清0
a=SBUF;
flag=1;
}
1:先想请问一下那个放大加粗的ES=1;,在我调程序的时候,去掉那句后LED无任何反映,而在加上时LED按照程序走,这是为什么?
2:放大的TI=0;,如果我没记错应该是发送完数据内部硬件将TI置1,进入中断,在中断中应该用软件将TI=0。但是这个程序中发送完数据后是否还进入了SER()中断?又为什么在主程序中TI=0。这部分程序是怎么跑的?
谢谢
这些问题,你任何一本基础书籍看过应该都了解的。TI这个标志你记不清了应该回头看书籍呢,这是个串口发送寄存器发送完毕产生的一个标志位,即发送空中断申请条件。而我的印象这个是软件清零。
是软件清零没错啊。我提问中说的也是我用软件清0了啊。
问题是他内部硬件置1以后发出中断申请,是否进入下面的中断函数,这个过程有点小费解。
还有关于ES=1的问题也麻烦帮忙解答一下。
谢谢
ES是串口中断使能当然进入中断函数。不然你怎么修改“flag”标志。
请问你这个程序有发送数据吗?
按照我的理解,P0=SBUF;就是发送数据。不晓得这么理解对么。还望赐教,谢谢。
按照我的理解,P0=SBUF;是发送数据。那发送完了以后硬件将TI置1,但是之所以没有进入下面的那个中断函数是因为进入IF语句后我将ES=0;了是么?
还有,那这里这个加粗的ES=1是为下一次接收数据做准备的么?(求解释这个ES=1的作用)如果是的话,那就算我去掉这句对我之前的程序实现应该没有影响才对,那为什么去掉后P0的灯没有亮?
在输出是要关闭ES,就是串口中断,因为,如果不关闭串口中断,当发送完数据后,单片机同样会申请中断,便再次进入中断程序,flag又被置一,主程序检测到flag为1后,又回到这里再次发送,如此循环,我也是新手,不知道是不是这个原因