串口通信20230721

串口通信

介绍

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

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

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

硬件电路

发送端TXD(transmit exchange data)

接收端RXD(receive ecxhange data)

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

·TXD和RXD要交叉连接

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

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

电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系

串口常用的电平标准有有如下三种:

1.TTL电平(单片机所使用):+5V表示1,0V表示0

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

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

接口及引脚定义

九针串口

流控(流控制)

常见通信接口比较

·此外还有:CAN,USB等

相关术语

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

·半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

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

···

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

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

···

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

51单片机的UART

·STC89C52有一个UART

·STC89C52的UART有四种工作模式:

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

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

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

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

P3.0 / RXD P3.1 / TXD

串口参数及时序图

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

·校验位:用于数据验证

·停止位:用于数据间隔

串口模式图

虚线左侧都在MCU内

·SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

串口和中断系统

串口相关寄存器

写代码

stc - isp 波特率计算器直接生成c代码
void UART_Init(void)		//4800bps@12.000MHz
{
	PCON |= 0x80;		//使能波特率倍速位SMOD  (最高位置1,波特率加倍)
	SCON = 0x40;
    /*
	串行控制寄存器SCON中REN:40接收不使能,50接收使能
	REN:允许/禁止串行接收位。REN=1为允许串行接收状态,可启动串行接收器RXD,开始接受信息。REN=0则禁止接收
	SCON = 0x50;		//8位数据,可变波特率
	
	89C52中无该寄存器
   	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	*/
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xF3;		//设定定时初值
	TH1 = 0xF3;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断  (不需要中断函数,但是只要计数有溢出就可以生成波特率)
	TR1 = 1;		//启动定时器1
}
发送的子函数
void UART_SendByte(unsigned char Byte)
{
	SBUF = Byte; //SBUF被赋值(写入,发送寄存器)
	while(TI == 0); //检测完成 TI:发送中断请求标志位
	TI = 0;
}
串口向电脑发送数据
#include <REGX52.H>
#include "Delay.h"
#include "UART.h" // SCON = 0x40(REN = 0)

unsigned char Sec;

void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(Sec);
		Sec ++;
		Delay(1000);
	}
}
电脑通过串口控制LED
#include <REGX52.H>
#include "Delay.h"
#include "UART.h" // SCON = 0x50(REN = 1)

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

void UART_Routine() interrupt 4 //中断服务子函数,当串口中断(中断号4)产生时,就会跳转到该函数中
{
	if(RI == 1)//如果是接收中断
	{
		P2 =~ SBUF;
		UART_SendByte(SBUF);
		RI = 0;
	}	
}

数据显示模式

·HEX模式/十六进制模式/二进制模式:以原始数据的形式显示

·文本模式/字符模式:以原始数据编码后的形式显示(用ASCII码编码)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值