51单片机(三) UART协议与串口通信实验

news/2025/1/23 21:55:14/

几个问题

  1. 串行通信与并行通信的优缺点。
    串行通信传输线少,占用引脚资源少,长距离传输时成本低,但通信控制更加复杂,速度比并行要慢。
    并行通信占用引脚资源多,长距离成本高,但速度快。

  2. 什么是比特率?什么是波特率?
    每秒传输一个bit的数量,就是比特率。
    每秒传输一个码元的数量,就是波特率。
    如果一个码元是只有二种表示,即高低电平,那么是此时比特率与波特率大小相等;
    如果一个码元是可以用四种状态来表示的,那么一个码元可以代码两个bit,那么波特率只有比特率的一半。
    波特率 / l o g 2 ( 码元状态数量 ) = 比特率 波特率 / log_2 (码元状态数量) = 比特率 波特率/log2(码元状态数量)=比特率

  3. 全双工、半双工、单工区别?
    单工是指数据传输仅能沿一个方向,不能实现反向传输。
    半双工是指数据传输可以沿两个方向,但需要分时进行。
    全双工是指数据可以同时进行双向传输。

  4. 异步通信与同步通信
    异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接
    收过程。
    同步通信时要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同
    步。

单片机>51单片机串口工作方式

  1. 方式 0 ,串行口为同步移位寄存器的输入输出方式。
    此时RXD接口作为数据输入输出接口,TXD接口作为同步时钟接口,发送和接收均为8位数据,低位在前,高位在后。
    波特率固定为 ( 主时钟频率 / 12 ) (主时钟频率 / 12) (主时钟频率/12)

  2. 方式 1, 10 位数据的异步通信口,1 位起始位,8 位数据位,1 位停止位;TXD 为数据发送引脚,RXD 为数据接收引脚
    波特率为 ( 2 S M O D / 32 ) ⋅ ( T 1 溢出率) (2^{SMOD}/32)·(T1 溢出率) 2SMOD/32T1溢出率), 其中 T1 溢出率 为 主时钟频率 / ( 12 × ( 0 x 100 - ( T H 1 ) ) ) 主时钟频率 / (12×(0x100-(TH1))) 主时钟频率/(12×(0x100(TH1)))

  3. 方式 2,11 位数据的异步通信口,1位起始,8位数据,1位RB8/TB8,1位停止位;TXD 为数据发送引脚,RXD 为数据接收引脚
    波特率为 ( 2 S M O D / 64 ) ⋅ 主时钟频率 (2^{SMOD}/64)· 主时钟频率 2SMOD/64主时钟频率

  4. 方式 3,11 位数据的异步通信口,1位起始,8位数据,1位RB8/TB8,1位停止位;TXD 为数据发送引脚,RXD 为数据接收引脚
    波特率为 ( 2 S M O D / 32 ) ⋅ ( T 1 溢出率) (2^{SMOD}/32)·(T1 溢出率) 2SMOD/32T1溢出率), 其中 T1 溢出率 为 主时钟频率 / ( 12 × ( 0 x 100 - ( T H 1 ) ) ) 主时钟频率 / (12×(0x100-(TH1))) 主时钟频率/(12×(0x100(TH1)))

一个简单的串口通信实验

定义uart驱动接口
uart.h

#ifndef __UART_H__
#define __UART_H__#include "types.h"void uart_init(uint8_t baud);
void uart_send_byte(byte dat);
void uart_send_cstr(const char* str);
byte uart_fetch_byte(void);#endif

uart.c

#include <REGX52.H>
#include "uart.h"byte recv_dat=0;void uart_init(uint8_t baud)
{TMOD|=0X20;	//设置计数器工作方式2SCON=0X50;	//设置为工作方式1PCON=0X80;	//波特率加倍TH1=baud;	//计数器初始值设置TL1=baud;ES=1;		//打开接收中断EA=1;		//打开总中断TR1=1;		//打开计数器
}byte uart_fetch_byte(void)
{return recv_dat;
}void uart_send_cstr(const char* str)
{while(*str){uart_send_byte((byte)*str);++str;}
}void uart_send_byte(byte dat)
{SBUF = dat;while(!TI);TI = 0;
}void uart_isr(void) interrupt SIO_VECTOR using 0
{if (RI){recv_dat = SBUF;RI = 0;}
}

主程序

#include "uart.h"int main(void)
{uart_init(0x33);while(1){uart_send_cstr("hello world!\r\n");}
}

波特率定为300
300 = 1 / 32 ⋅ 2 s m o d ⋅ ( 主时钟频率 / ( 12 ⋅ ( 256 − t h 1 ) ) ) 300 = 1/32 \cdot 2^{smod} \cdot (主时钟频率 / (12 \cdot (256 - th1))) 300=1/322smod(主时钟频率/(12(256th1)))
主时钟频率为11.8 MHz , 得出th1 为 51.138


http://www.ppmy.cn/news/1565590.html

相关文章

前沿技术对比:大模型技术为什么发展远快于区块链技术,中英对照解释

文章目录 前言1、技术复杂性与成熟度 / Technical Complexity and Maturity2.、应用场景与行业需求 / Application Scenarios and Industry Demand3、监管与法律问题 / Regulatory and Legal Issues4、去中心化与网络效应 / Decentralization and Network Effects5、能源消耗与…

Windows 配置 Tomcat环境

Windows配置Tomcat 1. 介绍 Tomcat是一个开源的、轻量级的Java应用服务器&#xff0c;在Java Web开发领域应用广泛。以下是关于它的详细介绍&#xff1a; 一、基本概念与背景 定义&#xff1a;Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;下…

高效安全文件传输新选择!群晖NAS如何实现无公网IP下的SFTP远程连接

文章目录 前言1. 开启群晖SFTP连接2. 群晖安装Cpolar工具3. 创建SFTP公网地址4. 群晖SFTP远程连接5. 固定SFTP公网地址6. SFTP固定地址连接 前言 随着远程办公和数据共享成为新常态&#xff0c;如何高效且安全地管理和传输文件成为了许多人的痛点。如果你正在寻找一个解决方案…

数据结构——实验五·图

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…

python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言 前序学习了5种阈值处理方法&#xff0c;包括(反)阈值处理、(反)零值处理和截断处理&#xff0c;还学习了一种自适应处理方法&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;三十三&#xff09;阈值处理-灰度图像-CSDN博客 python学o…

数据库性能优化(sql优化)_索引详解04_深入理解B+树_yxy)

数据库性能优化_深入理解B+树 1 通过代码方式解释B+树1.1 查找操作1.2 插入操作1.3 删除操作1.4 更新操作2 组合索引的查找逻辑2.1 等值查找2.1 范围查找1 通过代码方式解释B+树 B树索引在增删改操作时,底层结构会发生相应的变化,以保持树的平衡和有序性。 下面通过简单的伪…

【云南省乡镇界】面图层shp格式arcgis数据乡镇名称和编码+wgs84坐标无偏移内容测评

新2020年乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移。arcgis直接打开&#xff0c;单独乡镇界一个图层。品质高

如何优化企业的CRM流程管理?

一、了解你的客户&#xff1a;建立深度关系 首先&#xff0c;咱们得明白一点——企业与客户的每一次互动都是一次宝贵的沟通机会。就像我们跟朋友聊天一样&#xff0c;你不可能一开始就聊得很深吧&#xff1f;所以&#xff0c;在和新客户打交道的时候&#xff0c;千万别着急推…