历史上的今天
今天是:2024年10月19日(星期六)
2021年10月19日 | 51单片机的串口通信(一)
2021-10-19 来源:eefocus
随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。
通信方式
有并行通信和串行通信两种。
并行通信通常是将数据字节的各位用多条数据线同时进行传送 。

图一:并行通信
串行通信是将数据字节分成一位一位的形式在。

图二:串行同行
串行通信的传输方向
单工是指数据传输仅能沿一个方向,不能实现反向传输。
半双工是指数据传输可以沿两个方向,但需要分时进行。
全双工是指数据可以同时进行双向传输。
串行通信常见的错误校验
奇偶校验、循环冗余校验
传输速率(比特率):
比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。
80C51串行口的结构

图三:串口结构
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。
串行口的控制寄存器(SCON)(有点复杂,没咋整明白,以后用的时候再说)
用以设定串行口的工作方式、接收/发送控制以及设置状态标志:

图四:SCON
SM0和SM1为工作方式选择位,可选择四种工作方式:

图五:工作方式
SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。
REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。
RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。
PCON中只有一位SMOD与串行口工作有关 :

图六:PCON
SMOD(PCON.7) 波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
波特率的计算(用波特率计算器)
方式0的波特率 = fosc/12
方式2的波特率 =(2SMOD/64)· fosc
方式1的波特率 =(2SMOD/32)·(T1溢出率)
方式3的波特率 =(2SMOD/32)·(T1溢出率)
T1 溢出率 = fosc /{12×[256 -(TH1)]}
在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。

图七:波特率
串口如何使用
确定串行口控制(编程SCON寄存器);
确定T1的工作方式(编程TMOD寄存器);
计算T1的初值,装载TH1、TL1;
启动T1(编程TCON中的TR1位);
PC和单片机通信:
#include typedef unsigned char uchar; void Serial_comInit() { SCON=0X50; //设置为工作方式1 ,既然是方式一,自然要确定波特率,设置定时器1 TMOD=0X20;//8位重装载 PCON=0X80; TH1=0xF3;//波特率4800 TL1=0XF3; ES=1; //打开通信中断 EA=1; //打开总中断 TR1=1; //打开计数器 } void main(void) { Serial_comInit(); while(1); } void communication() interrupt 4 { uchar receiveData; receiveData=SBUF;//出去,接,收到的数据 RI = 0;//清除接收中断标志位 SBUF=receiveData;//将接收到的数据放入到发送寄存器 while(!TI); //等待发送数据完成 TI=0; //清除发送完成标志位 } 电脑发送数据到单片机: (来源:https://blog.csdn.net/u014453898/article/details/57123007) #include #define uchar unsigned char #define uint unsigned int uchar buf; #define led P2 void main(void) { SCON=0x50;//设定串口工作方式0101 0000 PCON=0x00; TMOD=0x20; EA=1; ES=1; TL1=0xfd;//波特率9600 TH1=0xfd; TR1=1; while(1); } //串行中断服务函数 void serial() interrupt 4 { ES=0; //暂时关闭串口中断 RI=0; buf=SBUF; //把收到的信息从SBUF放到buf中。 switch(buf) { case 0x31: led=0xfe;break; //二进制 0011 0001 十进制 49 控制字符 1 16进制 0X31 case 0x32: led=0xfd;break; //1111 1101 case 0x33: led=0xfb;break; case 0x34: led=0xf7;break; case 0x35: led=0xef;break; case 0x36: led=0xdf;break; case 0x37: led=0xbf;break; case 0x38: led=0x7f;break; } ES=1; //重新开启串口中断 SBUF=buf; while(!TI); TI=0; }
上一篇:51单片机双向通信实例
史海拾趣
|
现在,人们对自己的身体健康状况十分关注.都希望自己有一个好的身体。体温是人体的重要生理参数之一,对它的监测十分重要。市场上最流行的体温计是电子体温计,特别是非接触式红外体温计。目前国内开发的红外体温计主要有华中科技大学研制的“慧眼 ...… 查看全部问答> |
|
希望实现以下功能: 开机时,读取flash中的数据num,初始化程序 运行时,num的值会发生变化 运行结束时,将num的值存入flash中,共下次开机时使用 请教怎样才能将num的值存入flash中,并且可以读取 我使用的是周立功的easyram2131开发板, ...… 查看全部问答> |
|
我的板子上外扩了一片sdram,如果代码少于0x4000时装载正常,大于就会报data verification at address 0x41dc,please verify targe memory and memory map. 我的cmd文件如下: -stack 1024 -heap 2048 /*************** ...… 查看全部问答> |
|
假如我串口接收FIFO设置为7/8的深度 并设置接收FIFO中断 和 接收超时中断 当我的串口接受的数据长度正好为14的整数倍时,就不会进入超时中断,请问有什么好的解决方法吗?… 查看全部问答> |
|
配置引脚中断时,不能是数字输出模式,否则中断配置不成功。若想使用引脚内部上拉/下拉时,需配置为数字输出模式,否则上拉/下拉配置不成功。结论:引脚中断须外置上拉/下拉电路?… 查看全部问答> |
|
求教,有没有人遇到类似问题或解决方法~~~~~~~~~~~~~~~~~~~~~~~~~~~ 【问题】:编辑、编译正确,但下载出问题, 【解决1:】MDK422设置正常,包括debug、utilities,但正常工程和自建工程区别就在下面, 为什么?这个 ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 04:01 编辑 我们老师说黑龙江那个是9天的题,所以难。咱们5日开始的题目一样,而且是3天的,难度和2011年全国那个差不多。 不知道各位有没有什么消息 … 查看全部问答> |
|
帮忙分析下这两个电路中R1两端的电压大致的波形,幅值的变化范围大致是多少,Uo、R2两端的电压变化情况是什么? [ 本帖最后由 zheng522 于 2013-1-8 01:08 编辑 ]… 查看全部问答> |




