各位大侠们!
1. 串口通信TI=1时,还可以继续进行串口通信发送功能吗?
2. 认为1不能发送,假设开始ES=0,它还会进入中断服务程序吗?
3. 课本中说ES=0,关闭了中断串口中断入口,实验中发现,下面程序可以正常运行!注释语句添不添加都无所谓!这究竟是为什么啊 !
ES=0;
flag=0;
send(fog);
while(!TI);
// TI=0; 这里我注释了
send(dat);
while(!TI);
// TI=0; 这里我注释了,不参与编译
ES=1;
void series() interrupt 4
{
if(RI==1)
{
dat=SBUF;
RI=0;
flag=1;
}
if(TI==1)
TI=0;
}
此帖出自
小平头技术问答
1 TI=1的时候,如果串口中断又打开的话,会一直进行中断的。你的series() interrupt 4里面已经有TI=0了,前面的TI=0就不用了。TI不清零也是可以发数据的,TI为1只是表示一帧数据的发送完毕,用来判断的。如果不清零,无法判断下一个数据是否发送完毕。如果在第一个数据没法送完毕再继续发送下一个数据,就会乱掉。
2 ES为0就关闭了串口中断,不会进入串口中断程序的
3 ES关了只能发不能收了吧
1 串口接收用中断是很有用并且很必须的事情——我怎么知道你什么时候给我发东西,难道我是海边的望夫石啊,天天等着老婆回来啊?所以,中断,实现了随机接收的功效。
至于发送,就像5L兄弟说的。我要发就发,发多少个我心里清楚,啥时候发我说了算,还中断干啥?中断多了,还会互相干扰,还要重新安排优先级,最糟糕的是,串口的收发还是同一个SBUF,诶哟喂,要命。
2 LZ的主要问题:
如ddllxxrr兄弟的回答那样——看到他的回答我基本就没有回帖欲望了,因为都让他说完了。
其实事情很简单,串口收发跟串口中断没有必然联系。那个TI标志只是用来告诉你收发完成,于是乎开启中断的时候,它摇身一变就成了串口中断,其实它来来去去就是个报站的兄弟:串口发送完成了,接受完成了....回家吃饭了。(中断来了)
那么,没有这个标志,会怎样呢?
也许你会觉得,不知道就不知道,管他呢,反正东西出去了......
问题在于,我很不幸地告诉你,51的串口缓冲,额,也就是你们说的SBUF只有一个字节,所以,也就是说,如果你根本不知道你接收了多少个数据.......并且你不知道你到底什么时候接收到一个数据,,,,,那么,曾小贤说,你懂的!
3 最后一个问题,关于TI的硬件清零和软件清零
书上说的是,当我们启动了中断,TI可以自动硬件清零,如果是没有开启中断,就要软件清零,这句话其是没什么好说,事情就是这样。
问题是它为啥要这么做呢,事情其实很简单,就在前面的第二点里,因为中断的情况下,一般的做法,我们会在串口中断里读出SBUF的数值,这个时候,它爱清不清,我管不着。如果不是的话,就需要给程序一个标志,直到我们读取出这个数值才清除标志。然后再次启动SBUF,就是给SBUF赋值。
不过,PS:貌似大家都养成了一种习惯,不仅查询TI RI标志的查询法以后,要请调TI RI,就是中断,也这么做,其实这是个好习惯,因为,确定了其状态。
“当我们启动了中断,TI可以自动硬件清零”
这个我还真不知道呢
的确TI仅仅是一个标志而已,今天有个新的问题,
在串口通信工作方式0,工作下,课本中说发送数据引脚是3.0,发送同步时钟是3.1 TXD,可是我用示波器看到3.1是同步脉冲,跟程序写的频率是一样的,但是3.0 RXD脚一直是高电平,没有跳变的地方,我又想了好久,没找到结果。。。
还有我觉得 TI 标志还是只有软件清零,硬件清零做不到,在中断中删除掉 TI=0,程序就乱了。
在这里,我还想说一下下,在五个中断请求标志位中(其它四个再TCON中),IE0,IE1,TF0,TF1(其中TF0,TF1也可以软件清零)都是硬件置位,硬件清零。但是在串口中断中,SCON中,TI和RI是硬件置位,软件清零
一周热门 更多>