51单片机串口通信问题1

高手们,我有几点不明白,先看一个简单的程序:
#include<reg52.h>
void main()
{
TMOD=0x20;

TH1=0xfd;

TL1=0xfd;

TR1=1;

REN=1;

SM1=1;
SM0=0;

EA=1;
ES=1;

while(1)

{
if(flag=1)

{
........

}

}
........

}

void ser() inturrupt 4
{
RI=0;

a=SUBF;

flag=1;

}

有几点不明白,应该是越学越湖涂了,第一什么时候进那个中断服务函数,是定时器给的初值上计数产生溢出时进入吗?还是RI或TI=1时进入中断,如果是RI或TI=1进入,那我就不明白那个定时器溢出有什么作用了,难道是只是为了设 定传送速度吗?第二,当进入中断第一条语句是RI=0;说明接收到了数才将RI=0;,什么时候接收的数呢?上面主函数中是发送数的,所以没写,a=SUBF;接收数据,单片机接收到的这个数是谁发给它的,电脑吗?那SUBF的内容是什么?有点糊涂,望高手指点指点,详细点更好,万分感谢。

第一,要进入中断服务程序必然是发生了相应的中断,void ser() inturrupt 4是串口中断服务程序,ES=1是开启串口中断,所以只有当串口接收或发送数据成功后才进入中断服务程序。定时器中断没有开启,所以定时器溢出时不会产生中断,况且也没有相应的中断服务程序供它使用。定时器装载初值是为了设定串口通讯速率。
第二,串口接收到数据产生中断这个就是硬件层面的问题,写软件暂时可以不用考虑这个问题。至于谁发送给单片机的数据就要看单片机串口和谁连接的了,SUBF中肯定是你串口接收到的数据,此数据表示什么就要看你通讯协议里是怎么规定的了。追问

通讯协议我还真不知道,我主要是想搞明白刚接的数内容是什么呢,

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-21
一个一个问题回答:
1、是在一个字节接收成功或一个字节发送成功以后进入中断程序(不过,一般在发送时是将中断关闭的,也就不进入中断了)。此时,定时器的作用就是为了设定串口速率,因为单片机的速度和串口的速度不是一个数量级的,所以一定要有个变速箱。
2、数据的接收是由硬件控制的,其实,数据的接收发送都是有一个过程的,硬件只在成功时才通知你,这样就大大提高了程序的整体效率。接受的内容是在单片机RX引脚上的电平变化,单片机是不去管这是谁发的,它只管检测电平,所以,电脑啊,其他单片机啊,外围设备啊都有可能。
3、SBUF有两个,发送和接受都叫SBUF,其中存放的就是你想发送的数据和中断发生时硬件中接收到的数据。本回答被提问者采纳
第2个回答  2013-04-21
第一什么时候进那个中断服务函数,是定时器给的初值上计数产生溢出时进入吗?
还是RI或TI=1时进入中断,如果是RI或TI=1进入,
那我就不明白那个定时器溢出有什么作用了,难道是只是为了设 定传送速度吗?
是在RI或TI=1进入。
确实是为了设定传送速度。
---------------
第二,当进入中断第一条语句是RI=0;说明接收到了数才将RI=0;,什么时候接收的数呢?
对方发送、本机接收,收齐了各个位的时候,RI就为1了。
---------------
上面主函数中是发送数的,所以没写,a=SUBF;接收数据,单片机接收到的这个数是谁发给它的,电脑吗?
是《对方》发送的,对方,是什么都行。电脑、单片机...,都行
---------------
那SUBF的内容是什么?
是对方发送的,内容究竟是什么,要看事先的约定。追问

你所说的事先约定是什么意思,怎么个约定法呢?

追答

双方通信,必定要先商量好,什么字节数,代表什么意思。

约定之后,上位机、下位机,就可以由两个人来分别编写程序。

按照约定,收发,按照约定,进行各种处理

通信时,可能有干扰,收到的,可以是约定之外的数据。
这时,接收方,看不懂了,就可以不理它,也可以向对方发信,请求重新发送。

就像日常对话,你和你的同学、同事,也可以约定一些《暗语》,就是这个意思。

本回答被网友采纳
第3个回答  2013-04-21
你这是0分感谢啊...
这个中断函数是串口中断
定时器溢出是设置与电脑或其它机通信的波特率的,在这里与中断无关
单片机接到一个数据则使RI=1,进入中断函数,再使他置0,读数据
估计你还没学串口通信,往后学吧...不然跟讲不明白的
郭天祥视频中这个还是讲清了的 第几课来着第5.6.7课吧
相似回答