目录

一、串口介绍

1、定义和功能

2、硬件电路

3、电平标准

4、接口及引脚定义

5、常见通信接口比较

6、相关术语

7、51单片机的UART(串口通信)

8、串口参数及时序图

9、串口模式图

10、串口和中断系统

11、数据显示模式

(1)HEX模式

(2)文本模式

二、串口通信模块原理图

三、串口向电脑发送数据

1、计算定时器初值

(1)通过STC-ISP软件

(2)直接计算初值和波特率

2、编写程序

3、成果展示

四、电脑通过串口控制LED

1、编写程序

2、成果展示


一、串口介绍

1、定义和功能

定义:串口是一种应用十分广泛的通讯接口,串口成本低,容易使用、通信线路简单,可实现两个设备的相互通信。

功能:单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块相互通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。

51单片机内部自带UART(通用异步收发器),可实现单片机的串口通信。

2、硬件电路

简单双向串口通信有两根通信线(发送端TXD和接收端RXD);

TXD与RXD要交叉连接;

当只需单向的数据传输时,可以直接一根通信线;

当电平标准不一致时,需要加电平转换芯片。

3、电平标准

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

(1)TTL电平:+5V表示1,0V表示0;

(2)RS232电平:-3V ~ -15V表示1,+3V ~ +15V表示0;

(3)RS485电平:两线电压差+2V ~ +6V表示1,-2V ~ -6V表示0(差分信号)。

4、接口及引脚定义

5、常见通信接口比较

6、相关术语

全双工:通信双方可以在同一时刻互相传输数据;

半双工:通信双方可以互相传输数据,但必须分时复用(不同时间段传输不同的信号)一根数据线;

单工:通信只能有一方发送到另一方,不能反向传输;

异步:通信双方各自约定通信速率;

同步:通信双方靠一根时钟线来约定通信速率;

总线:连接各个设备的数据传输线路(类似于一条马路,把各个住户连接起来,使住户可以相互交流)。

7、51单片机的UART(串口通信)

STC89C52单片机有一个UART,共四种工作模式:

模式0:同步移位寄存器;

模式1:8位UART,波特率可变(常用);

模式2:9位UART,波特率固定;

模式3:9位UART,波特率可变。

8、串口参数及时序图

波特率:串口通信的速率(发送和接收各数据位的间隔时间);

检验位:用于数据验证;

停止位:用于数据帧间隔。

9、串口模式图

51单片机串行通信时发送数据和接收数据的过程:

(1)发送数据:首先将串行口控制寄存器SCON初始化,然后将数据送到串行数据缓冲器SBUF、从TXD(P3.1)发送数据,发送完一帧数据后,硬件自动将TI(发送数据中断标志位)置1,向CPU申请中断,最后用软件指令将TI清零。

(2)接收数据:将串行口控制寄存器SCON中REN接收位置1,启动接收过程,数据从RXD(P3.0)进入移位寄存器,再进入到串行数据缓冲器SBUF,当接收到一帧数据后,RI(接收数据中断标志位)置1,向CPU申请中断,最后用软件指令将RI清零。

SBUF寄存器:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。

写操作时,写入的是发送寄存器;读操作时,读出的是接收寄存器。

10、串口和中断系统

11、数据显示模式

(1)HEX模式

又称为十六进制模式、二进制模式,是以原始数据的形式显示。

(2)文本模式

又称为字符模式,是以原始数据编码后的形式显示。

ASCII码

选择文本模式后,再发送0x30,就会变成ASCII码上0x30对应的字符0。 选

发送字符'0'和发送0x30在文本模式下,都是显示0,在HEX模式下,都是显示30。


二、串口通信模块原理图

上面电路图的功能是将51单片机中的UART串口(TXD与RXD)与电脑的USB串口互相传输数据


三、串口向电脑发送数据

1、计算定时器初值

(1)通过STC-ISP软件

在STC-ISP软件中,有自带的波特率计算器,可以计算定时器的初值。

如果板子型号是89C52RC,则选择如下参数

系统频率:11.0592MHZ

波特率:4800

UART选择:串口1

UART数据位:8位数据

波特率发生器:定时器1(8位自动重载)

定时器时钟:12T(FOSC/12)

注意:在江科大视频中的板子系统频率是12MHZ,所以他选择了波特率倍速,来减小误差,但是89C52RC的频率是11.0592MHZ,因此不需要选择波特率倍速。

void UartInit(void)		//波特率计算器自动生成的串口初始化
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//这里打开了REN接收使能位

	AUXR &= 0xBF;		//89C52单片机中没有这项选择,更高级单片机才有
	AUXR &= 0xFE;		

	TMOD &= 0x0F;		//设置定时器工作方式
	TMOD |= 0x20;		
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}
void UART_Init()            //简化后的串口初始化
{
	SCON=0x40;				//0100 0000,SM0和SM1为0 1,采用方式1,REN位为0,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断

}

(2)直接计算初值和波特率

系统频率为11.0592MHz(80C52RC):

初值X=FAH,化成十进制为250,定时器T1采用方式2,8位自动重装初值,计数范围为0~255,因此每计数6次,就申请中断,由于89C52RC的系统频率为11.0592MHZ,机器周期为1.08us,计数6次就是6.48us,因此T1的溢出率=1/6.48us=15.43%;

由于SMOD为0,所以波特率=0.1543/2/16=0.0048225MHz=4822Hz。

若系统频率为12MHz: 

 初值=F3H,化成十进制为243,定时器T1采用方式2,8位自动重装初值,计数范围为0~255,因此每计数13次,就申请中断,由于89C52RC的系统频率为12MHz,机器周期为1us,计数13次就是13us,因此T1的溢出率=1/13us=7.692%;

由于SMOD为1,所以波特率=0.07692/16=0.004807MHz=4807Hz;

误差率=7.692/4807=0.16%。

2、编写程序

主函数

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

unsigned char Sec;


void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(Sec);
		Sec++;
		Delay(1000);
	}
}

UART串口通信模块

#include <REGX52.H>

/**
  * @brief  串口初始化,4800bps@11.0592MHz
  * @param  无
  * @retval 无
  */
  
void UART_Init()			//串口初始化
{
	SCON=0x40;				//0100 0000,SM0和SM1为0 1,采用方式1,REN位为0,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断

}

/**
  * @brief  串口发送的一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */

void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;				//赋值给SBUF会直接将数据通过串口发出
	while(TI==0);			//TI=0时循环,发送完一帧数据后,TI=1时,跳出循环
	TI=0;
}

Delay模块同之前一样。

3、成果展示

通过STC-ISP软件中的串口助手,同样选择波特率为4800,则可以查看到单片机通过串口通信发送到电脑的数据。

串口向电脑发送数据


四、电脑通过串口控制LED

1、编写程序

主程序

#include <REGX52.H>
#include "Delay.h"
#include "UART.h"

void main()
{
	UART_Init();
	while(1)
	{
		
	}
}

void UART_Routine() interrupt 4		//串口中断程序
{
	if(RI==1);
	{
		P2=~SBUF;					//将电脑发送到SBUF的值赋值给P2
		UART_SendByte(SBUF);		//将电脑发送到单片机的数据同时也发送到电脑
		RI=0;
	}

}

 UART串口通信模块

#include <REGX52.H>

/**
  * @brief  串口初始化,4800bps@11.0592MHz
  * @param  无
  * @retval 无
  */
  
void UART_Init()			//串口初始化
{
	SCON=0x50;				//0101 0000,SM0和SM1为0 1,采用方式1,REN位为1,其他位为0
	PCON &= 0x7F;			//第1位SMOD波特率倍增位置0,其他位保持不变
	
							//串行通信默认使用定时器T1的方式2,8位自动重装初值定时器
	TMOD &= 0x0F;			//高四位清零,低四位值不变
	TMOD |= 0x20;			//使TMOD高四位为0010,低四位保持不变。使用定时器T1的方式2
	
	TL1 = 0xFA;				//计算出定时器初值,转化成16进制,再赋值给TLx和THx
	TH1 = 0xFA;				//自动重装初值,计数溢出后,TH1的值会自动给到TL1
	
	TR1 = 1;				//定时器0开始计时
	ET1=0;					//这里不需要用到中断,所以关闭定时器T1中断
	EA=1;					//启动中断总允许位
	ES=1;					//启动串口中断
}

/**
  * @brief  串口发送的一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */

void UART_SendByte(unsigned char Byte)
{
	SBUF=Byte;				//赋值给SBUF会直接将数据通过串口发出
	while(TI==0);			//TI=0时循环,发送完一帧数据后,TI=1时,跳出循环
	TI=0;
}

/*串口中断函数模板
void UART_Routine() interrupt 4
{
	if(RI==1);
	{
		RI=0;
	}
}
*/

Delay模块同之前一样。

2、成果展示

电脑通过串口控制LED

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐