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

相关推荐
沐欣工作室_lvyiyi10 小时前
基于单片机的智能路灯(论文+源码)
单片机·嵌入式硬件·毕业设计
Yyq1302086968210 小时前
SIT1050 5V 供电,±40V 接口耐压,1Mbps 高速 CAN 总线收发器
单片机·嵌入式硬件
云伴枫轻舞11 小时前
我对 OTA 的理解随记,附GD32/STM32例程
stm32·单片机·嵌入式硬件
Aczone2812 小时前
硬件(五) 存储、ARM 架构与指令系统
arm开发·嵌入式硬件·架构
LS·Cui12 小时前
单片机按键示例功能
单片机
【ql君】qlexcel12 小时前
MCU上电到运行的全过程
单片机·嵌入式硬件·mcu·启动过程
搞一搞汽车电子12 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
pQAQqa13 小时前
FreeRTOS项目(2)摇杆按键检测
stm32·单片机·嵌入式硬件·freertos
小莞尔14 小时前
【51单片机】【protues仿真】基于51单片机停车场的车位管理系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
一川月白70915 小时前
51单片机---硬件学习(跑马灯、数码管、外部中断、按键、蜂鸣器)
单片机·学习·51单片机·外部中断·蜂鸣器·数码管·跑马灯