普中51单片机:串口通信原理与应用指南(八)

07-16 405阅读

普中51单片机:串口通信原理与应用指南(八)

文章目录

  • 引言
  • 接口及引脚定义
  • 硬件电路
  • 电平标准
  • 常见通信接口比较
  • 51单片机的UART
    • 工作模式
    • 串口参数及时序图
      • 波特率(Baud Rate)
      • 数据位(Data Bits)
      • 校验位(Parity Bit)
      • 串口相关寄存器
        • 串口控制寄存器SCON
        • 电源控制寄存器PCON
        • 串口数据缓冲寄存器SBUF
        • 中断产生流程
        • 如何计算波特率
        • 串口初始化步骤
        • 代码演示——单片机发送数据
          • 效果示例
          • 代码演示——接收数据控制LED

            引言

            串口是一种应用十分广泛的通讯接口,具有成本低、使用简便、通信线路简单等优点,可以实现两个设备之间的互相通信。51单片机内部自带UART(通用异步收发器),可实现单片机与其他设备的串口通信,从而极大地扩展了单片机的应用范围。

            接口及引脚定义

            在电脑端和单片机通信时可以使用USB转串口,串口的标准接口是DB9接口,DB9接口通常用于连接计算机设备的串行端口。在计算机的串行端口上使用RS232协议进行数据传输时,需要利用DB9接头来进行连接。

            普中51单片机:串口通信原理与应用指南(八)

            进一步了解串口UART和RS232通信协议:

            • 浅谈串口UART通信原理
            • RS232与RS485串行通信协议详解

              硬件电路

              简单双向串口通信只需两根通信线(发送端TXD和接收端RXD),发送端与接收端交叉连接即可。当只需单向的数据传输时,可以直接用一根通信线;当电平标准不一致时,需要加电平转换芯片。

              普中51单片机:串口通信原理与应用指南(八)

              如果设备1和设备2都有独立电源进行供电,那么只需要三根线即可:TXD、RXD、GND。

              电平标准

              电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系、串口常用的电平标准有如下三种:

              1. TTL电平:+2.4V到+5V表示1,0V到0.8V表示0。
              2. RS232电平:+5V到+15V表示0,-5V到-15V表示1
              3. RS485电平:两线间的电压差为-2V到-6V表示0;两线间的电压差为+2V到+6V表示1(差分信号)。

              这里只对电平标准简单描述,上面提供的两个博客链接,提供了详细说明。

              常见通信接口比较

              名称引脚定义通信方式特点
              UARTTXD、RXD全双工、异步点对点通信
              IICSCL、SDA半双工、同步可挂在多个设备
              SPISCLK、MOSI、MISO、CS全双工、同步可挂在多个设备
              1-WireDQ半双工、异步可挂在多个设备

              此外还有:CAN、USB等。

              • CAN:一种多主网络通信协议,主要用于汽车和工业环境中,以实现电子控制单元(ECU)之间的通信。它是一个局域网,允许多个设备共享同一通信线路。
              • USB:一种广泛使用的串行通信协议,主要用于计算机和各种外设之间的连接和数据传输。

                51单片机的UART

                博主所使用的是STC89C51RC/RD+系列,此单片机内部集成有一个功能很强的全双工串行通信口,与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。

                • 发送缓冲器:用于暂存即将发送数据的存储区域。它允许数据源以自己的速率生成数据,而不必等待接收方立即处理。可以比作是邮局中的包裹分拣中心。当你准备寄送邮件或包裹时,邮局工作人员会先将它们收集起来,暂时存放在分拣中心。这样做的好处是,邮局可以集中处理一大批邮件,然后统一分发,而不是每收到一个包裹就立即发送,这样效率会更高。
                • 接收缓冲器:用于暂存已接收但尚未被接收方处理的数据的存储区域。它允许数据接收方以自己的速率处理数据,而不受发送方速率的限制。可以比作是你家里的信箱。当邮件或包裹到达时,它们首先被放入信箱中,你可以随时去取。这样,即使邮递员投递的速度很快,你也不会错过任何邮件,因为你的信箱可以暂时存储它们。

                  工作模式

                  串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

                  1. 模式0:同步移位寄存器。
                  2. 模式1:8位UART,波特率可变(常用)。
                  3. 模式2:9位UART,波特率固定。
                  4. 模式3:9位UART,波特率可变

                  STC89C51RC/RD+系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。

                  STC89C51RC/RD+系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多个并行VO口,或作串一并转换,或用于扩展串行外设等。

                  普中51单片机:串口通信原理与应用指南(八)

                  串口参数及时序图

                  串口通信参数包括波特率、校验位、停止位等,这些参数需要在通信双方之间匹配,以确保数据的正确传输。

                  波特率(Baud Rate)

                  波特率是串口通信中数据传输的速率,通常以比特每秒(bps)为单位。常见的波特率有9600、19200、38400、57600、115200等。波特率越高,数据传输速度越快,但同时也可能增加通信错误的概率。

                  数据位(Data Bits)

                  数据位是每次传输中包含的位数,常见的数据位有7位和8位。数据位越多,每次传输的信息量越大,但数据传输的速率会降低。

                  校验位(Parity Bit)

                  校验位用于错误检测。在数据位之后添加一个校验位,使得数据位加上校验位的总和为奇数(奇校验)或偶数(偶校验)。这可以帮助检测数据在传输过程中是否发生了错误。如果没有错误检测的需求,可以选择无校验位。

                  普中51单片机:串口通信原理与应用指南(八)

                  注意:9位数据格式相比8位数据格式多了一位校验位;数据传输时先发送低位,再发送高位。

                  串口相关寄存器

                  串口控制寄存器SCON

                  串口控制器寄存器SCON用于选择串口通信的工作方式和某些控制功能。

                  普中51单片机:串口通信原理与应用指南(八)

                  普中51单片机:串口通信原理与应用指南(八)

                  普中51单片机:串口通信原理与应用指南(八)

                  RB8与SM2相关联,当SM2为1时候,RB8控制的是是否读取数据,为1读取,为0不读取;当SM2为0时候,不管RB8是0还是1,均可以使用收到的数据进入数据缓冲寄存器SBUF。

                  电源控制寄存器PCON

                  用于设置方式1、方式2、方式3的波特率是否加倍。

                  普中51单片机:串口通信原理与应用指南(八)

                  该寄存器有八位,主要用到高位SMOD(第七位)。当用软件置位当SMOD位设置为1时,外部机器周期(机器周期是CPU执行指令所需的时间)的时间加倍。这意味着单片机的外部操作速度减半,但内部操作速度保持不变。这种配置允许单片机在较低频率的时钟下运行,同时保持内部操作的效率。这通常用于降低功耗或适应外部设备的低速要求。当SMOD位设置为0时,外部机器周期保持正常,不加倍。这是单片机的默认状态,此时单片机按照其标称的时钟频率运行。

                  串口数据缓冲寄存器SBUF

                  物理上是两个独立的寄存器,但占用相同的地址(99H)。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器。由于接收通道内设有输入移位寄存器和SBUF缓冲器,从而能使一帧接收完将数据由移位寄存器装入SBUF后,可立即开始接收下一帧信息,主机应在该帧接收结束前从SBUF缓冲器中将数据取走,否则前一帧数据将丢失。SBUF以并行方式送往内部数据总线。

                  普中51单片机:串口通信原理与应用指南(八)

                  中断产生流程

                  串行通信的中断请求:当一帧发送完成,内部硬件自动置位T,即TI=1,请求中断处理;当接收完一帧信息时,内部硬件自动置位RI,即RI=1,请求中断处理。由于TI和RI以“或逻辑”关系向主机请求中断,所以主机响应中断时事先并不知道是TI还是RI请求的中断,必须在中断服务程序中查询T和RI进行判别,然后分别处理。因此,两个中断请求标志位均不能由硬件自动置位,必须通过软件清0,否则将出现一次请求多次响应的错误。关于中断详解在此博客链接:普中51单片机:中断系统与寄存器解析(六)

                  如何计算波特率

                  方式0和方式2的波特率是固定的,方式1和方式3是可变的。

                  普中51单片机:串口通信原理与应用指南(八)

                  计算波特率通常需要以下步骤:

                  1. 确定时钟频率:首先,你需要知道单片机的时钟频率(F),通常以赫兹(Hz)为单位。
                  2. 确定机器周期:然后,你需要知道单片机的机器周期(T),它等于时钟周期的倒数(1/F)。
                  3. 考虑SMOD位的影响:如果SMOD位设置为1,机器周期将加倍,因此需要将计算出的机器周期乘以2。
                  4. 计算波特率:波特率(Baud Rate)是串口通信中数据传输的速率,通常以比特每秒(bps)为单位。波特率可以通过以下公式计算:

                    波特率 = 波特率= 波特率= 时钟频率 机器周期 \frac{时钟频率}{机器周期} 机器周期时钟频率​ × \times × 数据位 数据位 数据位 其中,数据位通常为8位或9位(如果包括校验位和停止位)

                  例如,如果单片机的时钟频率为12MHz,SMOD位设置为0,那么波特率的计算将是:

                  波特率 = 波特率= 波特率= 12 , 000 , 000 H z 1 / 12 , 000 , 000 s \frac{12,000,000Hz}{1/12,000,000s} 1/12,000,000s12,000,000Hz​ × \times × 96 , 000 b p s 96,000bps 96,000bps

                  如果SMOD位设置为1,机器周期加倍,波特率将减半,变为48,000bps。

                  SMOD=1:当SMOD位设置为1时,外部机器周期的时间加倍。这意味着如果单片机的时钟频率是12MHz,那么在没有设置SMOD的情况下,机器周期是1/12MHz = 约83.33ns。当SMOD设置为1时,机器周期变为2倍,即166.67ns。这对于降低功耗非常有用,因为可以在较低的频率下运行单片机,同时保持内部操作速度不变。SMOD=0:当SMOD位设置为0时,外部机器周期的时间是单倍,即单片机的时钟周期。这是SMOD位的默认状态,通常用于需要最高性能的场合。

                  串口初始化步骤

                  1. 确定定时器寄存器TMOD的工作方式(用于产生波特率)。
                  2. 确定串口工作方式(SCON寄存器)。
                  3. 计算T1的初值(设定波特率),装载TH1、TL1。
                  4. 启动T1(TCON中的TR1位)。
                  5. 如果使用中断,则需要开启串口中断控制位(IE寄存器)。

                  串口通信的波特率(即每秒传输的比特数)可以通过定时器来控制。定时器设置为波特率对应的时间间隔,从而控制数据位的发送和接收。波特率是串口通信中每秒传输的比特数。例如,9600波特率意味着每秒传输9600个比特。

                  计算可以使用软件进行计算,无需在不必要的地方浪费时间。

                  代码演示——单片机发送数据

                  这里使用软件计算的是波特率4800,程序运行之后,单片机间隔一段时间向PC发送0x66数据。波特率发生器采用的是定时器1(8位自动重载)。

                  #include 
                  void DelayXms(unsigned int xms)	//@12.000MHz
                  {
                  	unsigned char data i, j;
                  	
                  	while(xms)
                  	{
                  		i = 2;
                  		j = 239;
                  		do
                  		{
                  			while (--j);
                  		} while (--i);
                  		xms--;
                  	}
                  }
                  void Uart1_Init(void)	//4800bps@12.000MHz
                  {
                  	PCON |= 0x80;		//使能波特率倍速位SMOD
                  	SCON = 0x40;		//8位数据,可变波特率
                  	TMOD &= 0x0F;		//设置定时器模式
                  	TMOD |= 0x20;		//设置定时器模式
                  	TL1 = 0xF3;			//设置定时初始值
                  	TH1 = 0xF3;			//设置定时重载值
                  	ET1 = 0;			//禁止定时器中断
                  	TR1 = 1;			//定时器1开始计时
                  }
                  void Uart_Send(unsigned char byte)
                  {
                  	SBUF = byte;
                  	while(TI == 0);//发送标志位为1的时候发送完成
                  	TI = 0;
                  }
                  void main()
                  {
                  	Uart1_Init();
                  	while(1)
                  	{
                  		Uart_Send(0x66);
                  		DelayXms(1000);
                  	}
                  }
                  

                  效果示例

                  普中51单片机:串口通信原理与应用指南(八)

                  代码演示——接收数据控制LED

                  串口接收数据,通过接收的16进制数据,控制LED灯。开发板实物图:LED八个灯连接P2引脚。

                  #include 
                  void DelayXms(unsigned int xms)	//@12.000MHz
                  {
                  	unsigned char data i, j;
                  	
                  	while(xms)
                  	{
                  		i = 2;
                  		j = 239;
                  		do
                  		{
                  			while (--j);
                  		} while (--i);
                  		xms--;
                  	}
                  }
                  void Uart1_Init(void)	//4800bps@12.000MHz
                  {
                  	PCON |= 0x80;		//使能波特率倍速位SMOD
                  	SCON = 0x40;		//8位数据,可变波特率
                  	TMOD &= 0x0F;		//设置定时器模式
                  	TMOD |= 0x20;		//设置定时器模式
                  	TL1 = 0xF3;			//设置定时初始值
                  	TH1 = 0xF3;			//设置定时重载值
                  	REN = 1;			//开启串口接收
                  	ET1 = 0;			//禁止定时器中断
                  	TR1 = 1;			//定时器1开始计时
                  	ES = 1;				//打开串口中断
                  	EA = 1;				//打开总中断
                  }
                  void Uart_Send(unsigned char byte)
                  {
                  	SBUF = byte;
                  	while(TI == 0);//发送标志位为1的时候发送完成
                  	TI = 0;
                  }
                  unsigned char Uart_Reception()
                  {
                  	unsigned char reception_value = SBUF;
                  	while(RI == 0);//接收标志位为1,表示接收成功,软件清0
                  	RI = 0;
                  	return reception_value;
                  }
                  void Uart_ISR(void) interrupt 4
                  {
                      // 中断处理代码
                  	if(RI == 1)
                  	{
                  		P2 = Uart_Reception();//这个函数对RI进行处理了
                  		Uart_Send(0x66);//0x66表示操作成功
                  	}
                  }
                  void main()
                  {
                  	Uart1_Init();
                  	while(1)
                  	{
                  	}
                  }
                  

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]