问个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? 展开
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? 展开
2个回答
展开全部
1,是的,只要接收缓冲池满则置1;
2,这个等待上一次发送完毕,再更新SBUF的值,毕竟串口的速度还是比较慢的,9600波特率,要1ms才发完一个字节,1ms单片机(12MHZ)执行了近100条指令,不等不行。
2,这个等待上一次发送完毕,再更新SBUF的值,毕竟串口的速度还是比较慢的,9600波特率,要1ms才发完一个字节,1ms单片机(12MHZ)执行了近100条指令,不等不行。
追问
谢谢。但是= =
第2问~~你没理解我问的意思= =,我问的是~为什么这个程序前面没有TI=1,就可以直接写SBUF=a; 发送数据时不是要先打开发送数据端吗·也就是TI=1~为什么都没有~?
追答
TI不是发送控制位,而是发送结束标志,51单片机串口只要打开时钟,一往缓冲池送数据,它就发送了,所以不需要TI = 1;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询