51单片机通过串口向电脑发送数据
声明:本人跟随b站江科大学习,我的所有文章仅记录我的学习总结,以防我以后忘了,有地方回忆,况且江科大的资料都是开源的。我也希望大家多多去看江科大的视频,讲的是真的好,我的文章仅限看过视频学习过的,过段时间有些地方不清楚又懒得再看视频,可以快速查看知识点的。
一、串口的介绍
串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
51单片机内部自带UART (Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现 单片机的串口通信。
二、硬件电路

三、电平标准
电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
四、常见的通信接口比较
此外还有:CAN总线、USB等
同步的一般都带有时钟线SCL/SCLK,异步的一般不带有时钟线 ;异步的一般都是双方预定好通信速率,设备发送10和1100,不同的通信速率,可能会导致接收的数据错误。比如设备A一秒发送一个数据,设备B却0.5秒进行一次采样,就会出现数据传输错误。
五、51单片机的UART
模式0:同步移位寄存器
模式1: 8位UART,波特率可变(常用)
模式2: 9位UART,波特率固定
模式3: 9位UART,波特率可变
六、串口参数及时序图
七、串口模式图
中间T1定时器模式为8位自动重装载(自动重装载时间更精确),靠定时器约定通信速率即波特率,设置波特率时SMOD为1是加倍。
波特率计算:
删除AUXR,波特率倍速一定要用
这里的F3十进制是243,算的是T1的溢出率,8位的计数器到256进行一次溢出,256-243=13,即
13us进行一次溢出,1/13us=0.07692MHz,0.07692MHz/16=0.00480769MHz=4807.69Hz,即波特率
八、串口和中断系统
当接收、发送完成产生中断进入中断系统
九、串口相关寄存器
十、代码
UART.c
#include <REGX52.H>
/**
* @brief 串口初始化
* @param 无
* @retval 无
*/
void UART_Init()//UART串口用的T1定时器,模式是8位自动重装载,//4800bps@12.000MHz
{
SCON=0x40;
PCON|= 0x80; //使能波特率倍速位SMOD
TMOD &= 0x0F; //清除定时器1模式位
TMOD |= 0x20; //设定定时器1为8位自动重装方式,当溢出时将TH1存放的值自动重装
//载入TL1
TL1 = 0xF3; //设定定时初值
TH1 = 0xF3; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/**
* @brief 串口发送一个字节数据
* @param Byte 要发送的一个字节数据
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);//这里是在等数据发送完,当数据发送完TI由硬件置1就会跳出循环
TI=0; //此时再由软件置0
}
main.c
#include <REGX52.H>
#include "Delay.h"
#include "UART.h"
unsigned char Sec;
void main()
{
UART_Init();
while(1)
{
UART_SendByte(Sec);
Sec++;
// Delay(1); //由于晶振的原因,波特率产生的误差,发的太快了就会出现错误,可以延时函数延时一下
Delay(1000);
}
}