51单片机串口通信问题1

高手们,我有几点不明白,先看一个简单的程序:#include<reg52.h>voidmain(){TMOD=0x20;TH1=0xfd;TL1=0xfd;TR1=1;R... 高手们,我有几点不明白,先看一个简单的程序:
#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的内容是什么?有点糊涂,望高手指点指点,详细点更好,万分感谢。
展开
 我来答
mengkunvip
2013-04-21 · 超过12用户采纳过TA的回答
知道答主
回答量:28
采纳率:100%
帮助的人:25万
展开全部
第一,要进入中断服务程序必然是发生了相应的中断,void ser() inturrupt 4是串口中断服务程序,ES=1是开启串口中断,所以只有当串口接收或发送数据成功后才进入中断服务程序。定时器中断没有开启,所以定时器溢出时不会产生中断,况且也没有相应的中断服务程序供它使用。定时器装载初值是为了设定串口通讯速率。
第二,串口接收到数据产生中断这个就是硬件层面的问题,写软件暂时可以不用考虑这个问题。至于谁发送给单片机的数据就要看单片机串口和谁连接的了,SUBF中肯定是你串口接收到的数据,此数据表示什么就要看你通讯协议里是怎么规定的了。
追问
通讯协议我还真不知道,我主要是想搞明白刚接的数内容是什么呢,
ghost4063
2013-04-21 · TA获得超过6522个赞
知道大有可为答主
回答量:2940
采纳率:75%
帮助的人:2774万
展开全部
一个一个问题回答:
1、是在一个字节接收成功或一个字节发送成功以后进入中断程序(不过,一般在发送时是将中断关闭的,也就不进入中断了)。此时,定时器的作用就是为了设定串口速率,因为单片机的速度和串口的速度不是一个数量级的,所以一定要有个变速箱。
2、数据的接收是由硬件控制的,其实,数据的接收发送都是有一个过程的,硬件只在成功时才通知你,这样就大大提高了程序的整体效率。接受的内容是在单片机RX引脚上的电平变化,单片机是不去管这是谁发的,它只管检测电平,所以,电脑啊,其他单片机啊,外围设备啊都有可能。
3、SBUF有两个,发送和接受都叫SBUF,其中存放的就是你想发送的数据和中断发生时硬件中接收到的数据。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2013-04-21 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
第一什么时候进那个中断服务函数,是定时器给的初值上计数产生溢出时进入吗?
还是RI或TI=1时进入中断,如果是RI或TI=1进入,
那我就不明白那个定时器溢出有什么作用了,难道是只是为了设 定传送速度吗?
是在RI或TI=1进入。
确实是为了设定传送速度。
---------------
第二,当进入中断第一条语句是RI=0;说明接收到了数才将RI=0;,什么时候接收的数呢?
对方发送、本机接收,收齐了各个位的时候,RI就为1了。
---------------
上面主函数中是发送数的,所以没写,a=SUBF;接收数据,单片机接收到的这个数是谁发给它的,电脑吗?
是《对方》发送的,对方,是什么都行。电脑、单片机...,都行
---------------
那SUBF的内容是什么?
是对方发送的,内容究竟是什么,要看事先的约定。
追问
你所说的事先约定是什么意思,怎么个约定法呢?
追答
双方通信,必定要先商量好,什么字节数,代表什么意思。

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

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

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

就像日常对话,你和你的同学、同事,也可以约定一些《暗语》,就是这个意思。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
在灵通山的卡嘉莉
2013-04-21
知道答主
回答量:28
采纳率:0%
帮助的人:12.6万
展开全部
你这是0分感谢啊...
这个中断函数是串口中断
定时器溢出是设置与电脑或其它机通信的波特率的,在这里与中断无关
单片机接到一个数据则使RI=1,进入中断函数,再使他置0,读数据
估计你还没学串口通信,往后学吧...不然跟讲不明白的
郭天祥视频中这个还是讲清了的 第几课来着第5.6.7课吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式