[51 单片机] --串口编程

1,通讯方式基本概念

复制代码
1,按照 --> 数据传送方式
    串行通讯:使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度,
    串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。
    并行通讯:将数据字节的各位用多条数据线同时进行传送,通常是 8位、16 位、32 位等数据一起传输
    并行通信的特点:控制简单、传输速度快;由于传输线较多,长距离传送时成本高且接收方的各位同时接收存在困难,抗干扰能力差。

2, 按照 --> 通信的数据同步方式
    异步通讯:发送的双方使用各自的时钟控制数据的发送和接收过程,为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。
    异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加 2~3 位用于起止位,各帧之间还有间隔,因此传输效率不高。
    
    同步通讯:要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同
步
3, 按照 --> 数据的传输方向
    单工通信:指数据传输仅能沿一个方向,不能实现反向传输
    半双工通讯:数据传输可以沿两个方向,但需要分时进行
    全双工通讯:数据可以同时进行双向传输

2,串口通讯简介
串口通信的接口标准有很多,有 RS-232C、 RS-232、 RS-422A、 RS-485 等。
常用的是 RS-232 和 RS-485。RS-232 其实是 RS-232C 的改进,原理是一样的。
这里我们就以 RS-232C 接口进行讲解。

衡量通信性能的一个非常重要的参数就是通信速率,通常以 比特率 (Bitrate)。比特率是每秒钟传输二进制代码的位数,单位是:位/秒( bps)
在后面会遇到一个"波特率"的概念,它表示每秒钟传输了多少个码元。而码元是通信信号调制的概念,通信中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

RS232 的通信协议比较简单,通常遵循 96-N-8-1 格式。

96: 波特率为9600

N:无检验(校验方法有奇校验 (odd)、偶校验(even)、0 校验(space)、1 校验(mark)以及无校验(noparity)。)

8:表示数据位为8位,当然数据位数还可以为 5、6、7 位长度。

1:表示停止位位1,数据包的停止信号可由 0.5、1、1.5 或 2 个逻辑 1 的数据位表示,只要双方约定一致即可。

3,51单片机串口的内部结构

理解:

TH1和TL1,以及SMOD控制着串口的时钟,即产生稳定的波特率,在单片机中,TH1和TL1为定时器的初始化值寄存器,使用稳定的时钟信号是靠定时器产生的。

当RXD接收到数据时,1位起始位会在移位寄存器最左边,然后紧跟着数据位8位,1位校验位,1位停止位,收到停止位时,将触发RI中断(注意这里是RI不是R1),同时将数据放入SBUF中。

4,串口相关寄存器

SMO~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,可以实现多机通信。
REN
允许串行接收位。由软件置 REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。
TB8:
在方式 2 或方式 3 中,是发送数据的第 9 位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式 0 和方式 1 中,该位未用到。
RB8:
在方式 2 或方式 3 中,是接收到数据的第 9 位,作为奇偶校验位或地址帧/数据帧的标志位。在方式 1 时,若 SM2=0,则 RB8 是接收到的停止位。

5,串口编程

计算波特率:

定时器工作方式为2(8位自动重装载定时器),SMOD为1,表示倍频

当TL0溢出时,产生中断,并将TH0中的值重新写入TL0,实现重装载(实际是使用的定时器2,TH1和TL1,这里以定时器1为例子)

代码实现:

cpp 复制代码
#include <reg52.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit LED1 = P2^0;

u8 is_used = 0;

void delay_10us(u16 time)
{
	while(time--);
}

void init_uart_serial(u8 baud)
{
	TMOD |= 0x20; //  定时器1工作方式2		 8位自动转载
	SCON = 0x50; //  设置串口工作方式1
	PCON = 0x80; //  0x80 倍频
	TH1 = baud;	  // 计数器初值
	TL1 = baud;
	ES = 1;		   // 打开串口中断
	EA = 1;			//打开总中断
	TR1 = 1;		// 打开定时器(定时器产生波特率)
}

void uart_run() interrupt 4
{
	u8 recv_val = 0;

	RI = 0; //中断清零

	recv_val = SBUF;

	SBUF = recv_val;

	while(!TI); //TI 等待发送完成

	TI = 0;

	is_used = 1;
}

void main()
{
	init_uart_serial(0xFA);
	LED1 = 1;

	while(1){
	
		if(is_used == 1)
		{
			LED1 = 0;
			delay_10us(1000);
			is_used = 0;
			LED1 = 1;
		}
	}
}

以上:验证使用sscom验证,能发送单个字符和多个字符

6,总结

串口通讯时,使用定时器1作为稳定的信号发送器,需要将其配置为模式2,同时需要知道,程序中配置的串口是一位一位bit发送的数据,收数据也是一字节收写入到sbuf中的。

相关推荐
XINVRY-FPGA几秒前
XCKU035-2FBVA676I AMD Xilinx Kintex UltraScale FPGA
arm开发·嵌入式硬件·网络安全·fpga开发·硬件工程·信号处理·fpga
崇山峻岭之间40 分钟前
单片机USB虚拟串口实验
单片机·嵌入式硬件
崇山峻岭之间1 小时前
单片机USB U盘实验
单片机·嵌入式硬件
点灯小铭1 小时前
基于单片机的锅炉压力与温度监测报警系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
环境倒逼我学习1 小时前
无人机地面站之第13章 Mission Planner 入门与界面总览
单片机·嵌入式硬件·无人机
大阳1231 小时前
ARM.8(ADC,SPI)
单片机·嵌入式硬件·adc·spi
hoiii1872 小时前
基于 STM32 的标准遥控器架构与源码
stm32·嵌入式硬件·架构
少年、潜行2 小时前
STM32 ISP 升级体验
stm32·嵌入式硬件·isp升级·系统编程区域
杨连江2 小时前
一种三模式可调气隙式双侧定子滑移可变磁通轴向永磁电机
单片机·嵌入式硬件
Aaron158811 小时前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理