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

几个问题

  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/32)⋅(T1溢出率), 其中 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/32)⋅(T1溢出率), 其中 T1 溢出率 为 主时钟频率 / ( 12 × ( 0 x 100 - ( T H 1 ) ) ) 主时钟频率 / (12×(0x100-(TH1))) 主时钟频率/(12×(0x100-(TH1)))

一个简单的串口通信实验

定义uart驱动接口

uart.h

c 复制代码
#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

c 复制代码
#include <REGX52.H>
#include "uart.h"

byte recv_dat=0;

void uart_init(uint8_t baud)
{
	TMOD|=0X20;	//设置计数器工作方式2
	SCON=0X50;	//设置为工作方式1
	PCON=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;
	}
}

主程序

c 复制代码
#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/32⋅2smod⋅(主时钟频率/(12⋅(256−th1)))

主时钟频率为11.8 MHz , 得出th1 为 51.138

相关推荐
hsjiasb1 天前
FreeRTOS学习(二十三)——消息缓冲区(Message Buffer)
stm32·单片机·嵌入式硬件·学习·freertos
我是海飞1 天前
杰理JL703N SSD1306 OLED(128x64) 点阵屏移植说明
单片机·算法·嵌入式·音频·杰理
沸速存储1 天前
CPU 和 GPU 核心差别在哪?为什么 AI 训练离不开 GPU
服务器·人工智能·科技·嵌入式硬件·电脑
wuyk5551 天前
2.队列:先进先出的线性数据结构
c语言·数据结构·stm32·单片机
我不会JAVA!1 天前
【无标题】
嵌入式硬件·h.264
芯岭技术郦1 天前
OM6625A芯片 Timer 定时器计数模式使用说明
stm32·单片机·嵌入式硬件
Dr.kangder1 天前
嵌入式面试总结(八)——大小端
嵌入式硬件·面试·职场和发展·架构·嵌入式
zlinear数据采集卡1 天前
D223的SRAM硬件记录仪:外部触发与瞬态波形捕获方案
arm开发·嵌入式硬件·fpga开发·开源
zcmodeltech1 天前
双碳沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的碳捕集-零碳园区-综合能源全场景联动方案
stm32·嵌入式硬件·能源·嵌入式实时数据库·多分类
LCG米1 天前
STM32零基础入门教程:从环境搭建到实战项目(点亮LED + 串口打印 + 呼吸灯)
stm32·单片机·嵌入式硬件