当前位置: 首页 > article >正文

[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为例子)

代码实现:

#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中的。


http://www.kler.cn/a/571552.html

相关文章:

  • 每日定投40刀BTC(6)20250227 - 20250302
  • 浅谈开发环境
  • 004build在设计页面上的使用
  • Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用
  • JAVA实战开源项目:安康旅游网站(Vue+SpringBoot) 附源码
  • 端到端自动驾驶——cnn网络搭建
  • Go语言--语法基础2--基本编程概念--语法单词说明
  • 基于RAG的法律条文智能助手
  • 增删改查 数据下载 一键编辑 删除
  • AI数据分析:deepseek生成SQL
  • nn.Identity 单位矩阵,同一矩阵
  • vue+elementui 实现上传文件/导入文件的功能
  • Golang的性能分析指标解读
  • Docker概念与架构
  • 【深入OpenCV图像处理:从基础到实战应用】
  • React 中 useState 的 基础使用
  • 医学图像处理开源库介绍:ITK、VTK 和 MITK
  • 【Java---数据结构】链表 LinkedList
  • CSS中各个元素的显示模式(块级/行内元素分类)
  • mysql唯一索引下插入数据死锁过程分析