问个51单片机串口通信的特别简答的问题= =!!

#include<reg52.h>unsignedchara,flag;voidmain(){REN=1;//串口允许接收MOD=0x20;//设置定时器1为工作方式2T... #include<reg52.h>
unsigned char a,flag;
void main() {
REN=1;//串口允许接收
MOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;//给T1 赋初值
TL1=0xfd;
TR1=1;//TCON中的TR1位置1
SM0=0;//设置SCON寄存器,设为方式1
SM1=1;
EA=1;//开总中断
ES=1;//开串口中断
while(1)
{
if(flag==1)
{
flag=0;
SBUF=a;//把a送给SBUF,调用接收缓存器,两个SBUF物理地址 //相同,但是意义不同
while(!TI); //发送完TI会置1,要手动清零
TI=0; //TI发送中断标志位
}
}
}
void ser() interrupt 4
{
RI=0;//一旦收到数据了,清零RI(接收中断标志位),必须软件清零
P1=SBUF;//从串口读入数据 SBUF赋给P1口
a=SBUF;//使用发送缓存器
flag=1;
}

1、是不是单片机在收到程序时RI就会自动置1?

2、while(!TI); //发送完TI会置1,要手动清零
TI=0; //TI发送中断标志位
程序里面的这部分。为什么发送完会自动置1?也就是说一开始TI是0,那为什么不用先赋值让TI=1就直接写SBUF=a
第二问把"为什么"去掉= =
应该是
发送完TI会自动置1?也就是说一开始TI是0,那为什么不用先赋值让TI=1就直接写SBUF=a?
展开
 我来答
伽罗林克
2013-08-18 · TA获得超过2632个赞
知道小有建树答主
回答量:931
采纳率:0%
帮助的人:1176万
展开全部
1,是的,只要接收缓冲池满则置1;
2,这个等待上一次发送完毕,再更新SBUF的值,毕竟串口的速度还是比较慢的,9600波特率,要1ms才发完一个字节,1ms单片机(12MHZ)执行了近100条指令,不等不行。
追问
谢谢。但是= =
第2问~~你没理解我问的意思= =,我问的是~为什么这个程序前面没有TI=1,就可以直接写SBUF=a; 发送数据时不是要先打开发送数据端吗·也就是TI=1~为什么都没有~?
追答
TI不是发送控制位,而是发送结束标志,51单片机串口只要打开时钟,一往缓冲池送数据,它就发送了,所以不需要TI = 1;
madaraii
2013-08-18 · TA获得超过668个赞
知道小有建树答主
回答量:842
采纳率:41%
帮助的人:282万
展开全部
1 RI会被硬件在接收到一字节后置1
2 TI会被硬件在发送完一字节后置1,此循环功能为判断TI的值是否为1的死等待。TI为0时死等,TI为1时才向下走,下行把TI清零。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式