(基于江协科技)51单片机入门:6.串口

目录

电平标准

专业术语的解释

UART模式1

串口模式图

串口相关的寄存器

定时器8位定时重装模式

[STC - ISP 波特率计算](#STC - ISP 波特率计算)

[STC - ISP 串口助手使用](#STC - ISP 串口助手使用)

[1.串口向电脑每秒发送递增数据 代码:](#1.串口向电脑每秒发送递增数据 代码:)

[2.电脑通过串口控制LED 代码:](#2.电脑通过串口控制LED 代码:)

波特率计算流程


2个小项目的的现象:

1.串口向电脑发送数据

2.通过电脑向单片机发送数据,控制P2的亮灭,返回电脑向单片机发送的数据给电脑

51单片机内部自带UART(通用异步发收器)可实现单片机的串口通信

简单的双向串口通信有两根通信线(发送端TXD和接收端RXD)

电平标准

电平标准就是 规定什么电压是0什么电压是1

TTL电平:5V表示1,0V表示0

RS232电平:-3V ~ -15V 表示1,3v ~ 15V 表示0

RS485电平:两线压差+2 ~ +6V表示1,-2V ~ -6V表示0(差分信息)

TTL 和 RS232 电平受电线长度影响最大范围只有几十米

RS485 也受电线长度影响但由两线电压的差值决定数据,所以最长范围有千米

专业术语的解释

全双工:通信双方可以在同一时刻互相传输数据

半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

单工:通信只能有一方发送到另一方,不能反向传输

异步:通信双方各自约定通信速率

同步:通信双方靠一根时钟线来约定通信速率

总线:链接各个设备的数据传输线路

UART模式1

51单片机的UART有4种工作模式

最常用的模式是:模式1,8位UART,波特率可变

波特率:串口通信的速率(发送和接收各数据位的间隔时间)

检验位:用于数据检验

停止位:用于数据帧间隔

数据位几位就是UART几位

9位UART,在8为UART上,最后多一位,用于校验

例如:发送数据为 0000 0011 根据数据中的1的个数继续判断最后一位补什么

奇校验:保证数据中1的个数为奇数 0000 0011 补1

偶校验:保证数据中1的个数为偶数 0000 0011 补0

数据的发送

例如:发送 0000 0011 由后向前发送 发送顺序为 1100 0000

串口模式图

串口相关的寄存器

将SM0 和SM1配置为 0 1 就是UART模式1

REN:控制串口接收 1为允许接收 0为禁止接收

TI 和 RI 分别为 判断发送完成和接收完成的标准

SMOD控制UART的时钟,记数速度

当TI 等于 0 时,串口发送信息完成后,TI会被自动赋值为1,然后向中断发送请求,TI不会自动赋值回0,所以在中断中需要重新赋值为0

RI类似

SCAN初始化 为 0101 0000(0x50) 或者0100 0000(0x40)第一个向电脑发送数据不需要接收

UART利用的是定时器1,这里计时需要用上8位定时重装

定时器8位定时重装模式

重装模式说的是先前利用 16位模式 计算器每1毫秒发送一次中断,在中断赋值这个操作,重装模式自己附带了

STC - ISP 波特率计算

生产代码后将第3行和第4行删除

初始化函数:

cpp 复制代码
void UartInit(void)		//4800bps@11.0592MHz
{
	PCON &= 0x7F;		//波特率不倍速
	SCON = 0x50;		//8位数据,可变波特率
	TMOD &= 0x0F;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xFA;		//设定定时初值
	TH1 = 0xFA;		//设定定时器重装值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
}

STC - ISP 串口助手使用

波特率和程序波特率一致

由于金振的原因,波特率太高会丢失数据,所以常用4800

1.串口向电脑每秒发送递增数据 代码:

cpp 复制代码
#include <REGX52.H>
#include "Delay.h"

void UART_Init()
{
	SCON = 0x50;
	PCON |= 0x80;
	
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xF4;		
	TH1 = 0xF4;		
	ET1 = 0;
	TR1 = 1; 
}

void UART(unsigned char num)
{
	SBUF = num;
	while(TI == 0);
	TI = 0;
}

int main()
{
	unsigned int i = 0;
	UART_Init();
	while(1)
	{
		UART(i);
		i++;
		Delay(1000);
	}
	return 0;
}

2.电脑通过串口控制LED 代码:

cpp 复制代码
#include <REGX52.H>

void UART_Init()            //11.0592MHz 4800
{
	SCON = 0x50;
	PCON |= 0x80;
	
	TMOD &= 0x0F;
	TMOD |= 0x20;
	TL1 = 0xF4;		
	TH1 = 0xF4;		
	ET1 = 0;
	TR1 = 1; 
	EA = 1;
	ES = 1;
	
}

void UART_Cpy(unsigned char num)
{
	SBUF = num;
	while(TI == 0);
	TI = 0;
}

int main()
{
	UART_Init();
	while(1)
	{
		;
	}
	return 0;
}

void UART_Routine() interrupt 4
{
	if(RI == 1)
	{
		RI = 0;
		P2 = SBUF;
		UART_Cpy(SBUF);
	}
}

波特率计算流程

这里计算11.0592MHz的波特率

256(定时器单个计数器最大值) - F4(244)(赋给计数器的值) = 12

每计算12次就溢出一次

这里计算11.0592MHz 每微妙计算几次:

11.092 除 12 = 0.9216

0.9216 除 12 = 0.0768(溢出率)

由于 PCON 赋值为 0x80; 其中第八位 SMOD0 = 1;所以 SMOD0指向1

0.0768(溢出率) 除 1 = 0.0768

0.0768 除 16 乘 1000 000 (因为单位是MHz) = 4800

相关推荐
Axis tech42 分钟前
无标记点动作捕捉 vs 惯性动作捕捉:专业从业者需要了解这些要点
科技·机器人
周洲08302 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元2 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡3 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
听你说324 小时前
推进具身智能安全评测:丈八科技与季华实验室达成战略合作
人工智能·科技·安全
Kuakewei8884 小时前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
ACP广源盛139246256734 小时前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
z20348315204 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
nanoscientific6 小时前
微气泡气液分散体系(MBGLS)协同空气/H₂O₂/Na₂S₂O₈ 同步脱除烟气 NO 与 SO₂
科技·微纳米气泡
国科安芯6 小时前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构