本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!
> 发布人:@日月同辉,与我共生_单片机-CSDN博客
> 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。
系列专栏: CSDN-单片机串口通信学习系列🎁
> 我的格言是:“尽最大努力,做最好的自己!💪
要转载,请提前告知!!!
版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。
●目录
★相关文章大全:
一、初始化函数
通常,波特率设置为9600b/s。串口工作方式为工作1(8为异步通信),定时器选择定时器T1的工作方式2(8位自动重载)。
寄存器SCON:
M0 M1 M2 REN TB8 RB8 TI RI
寄存器SCON共8位(8位二进制)。
SM0、SM1决定串行口工作方式。具体情况如上图所示。
SM2:多机通信。=1,开启多机通信;=0,不使用多机通信。
REN:允许接收控制位。=1时,允许接收数据;=0时,不允许接收数据。
TB8:发送数据的第9位
RB8:接收数据的第9位。
TI:发送中断标志位。=0时,准备发送;=1时,发送完成。
RI:接收中断标志位。=0时,准备接收;=1,接收完成。
初值计算:
void UartInit(void) //9600bps@11.0592MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
ES=1;
EA=1;
TR1 = 1; //定时器1开始计时
}
二、接收一帧数据
RI=0,表示准备接收,当接收数据完成后(接收到的数据在接收缓冲区-接收SBUF),RI自动置1,RI=1的条件下触发接收中断,接收中断中要将RI=0,同时从SBUF中读取数据,让接收完成标志位置1,作为后续处理数据的依据。
void ES_timer() interrupt 4
{
if(RI) //接收中断
{
RI=0;//RI清0
recv_date=SBUF;//读取接收到数据
recv_flag=1;//接收完成标志位
}
}
三、接收一串数据
固定长度的数据接收。串口通信数据是一帧一帧接收的,不是一次性接收。
void ES_timer() interrupt 4
{
static unsigned char datecnt=0;
if(RI) //接收中断
{
RI=0;//RI清0
recv_date[datecnt++]=SBUF;//将接收到的数据赋给变量---SBUF--接收串行数据寄存器
if(recv_date==8)//固定8个字符
{
recv_flag=1;//中间变量置1
datecnt=0;
}
}
}
亲爱的读者敬请期待,下文更精彩!!!
一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生