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

server/2025/3/6 10:16:41/

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; //  设置串口工作方式1PCON = 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.ppmy.cn/server/172842.html

相关文章

C++并发以及多线程的秘密

1.基础概念 并发&#xff08;Concurrency&#xff09; 并发是指在同一时间段内&#xff0c;多个任务看起来像是同时执行的。并发并不一定意味着真正的同时执行&#xff0c;它可以是通过时间片轮转等方式在多个任务之间快速切换&#xff0c;让用户感觉多个任务在同时进行。并发…

SQL经典题型

查询不在表里的数据&#xff0c;一张学生表&#xff0c;一张学生的选课表&#xff0c;要求查出没有选课的学生&#xff1f; select students.student_name from students left join course_selection on students.student_idcourse_selection.student_id where course_selecti…

如何将飞书多维表格与DeepSeek R1结合使用:效率提升的完美搭档

将飞书的多维表格与DeepSeek R1结合使用&#xff0c;就像为你的数据管理和分析之旅装上一台涡轮增压器。两者的合作&#xff0c;不仅仅在速度上让人耳目一新&#xff0c;更是将智能化分析带入了日常的工作场景。以下是它们如何相辅相成并改变我们工作方式的一些分享。 --- 在…

Linux:vim快捷键

Linux打开vim默认第一个模式是&#xff1a;命令模式&#xff01; 命令模式快捷键操作&#xff1a; gg&#xff1a;光标快速定位到最开始 shift g G&#xff1a;光标快速定位到最结尾 n shift g n G&#xff1a;光标快速定位到第n行 shift 6 ^&#xff1a;当前行开始 …

NUMA架构介绍

NUMA 架构详解 NUMA&#xff08;Non-Uniform Memory Access&#xff0c;非统一内存访问&#xff09; 是一种多处理器系统的内存设计架构&#xff0c;旨在解决多处理器系统中内存访问延迟不一致的问题。与传统的 UMA&#xff08;Uniform Memory Access&#xff0c;统一内存访问…

Android14 OTA差分包升级报Package is for source build

制作好差分包&#xff0c;使用adb线刷模式验证ota升级&#xff0c;出现E:Package is for source build错误 使用adb方式验证 进入recovery模式 adb reboot recovery稍等一会界面会提示 Now send the package you want to apply to the device with "adb sidelaod <…

蓝桥杯备考:bfs之马的遍历

像这种最短路径啊&#xff0c;我们一般都是用的bfs来求 像这道题&#xff0c;我们要定义dxdy两个方向向量 然后我们先把起点放在队列里面&#xff0c;然后把起点出队列&#xff0c;把最短路径是1的点放在队列里面&#xff0c;然后在再依次把最短路径是1的点出队列&#xff0c…

SpringMVC请求处理流程:DispatcherServlet工作原理

文章目录 引言一、DispatcherServlet概述二、DispatcherServlet初始化过程三、请求接收与处理器匹配四、请求参数绑定与处理器执行五、视图解析与渲染六、异常处理机制总结 引言 SpringMVC框架是Java Web开发中最流行的MVC框架之一&#xff0c;其核心组件DispatcherServlet作为…