前言
本篇文章属于STC89C52单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。
一、串口介绍
二、串口硬件电路
TXD:transmit exchange data
RXD:receive exchange data
当设备1和设备2都有独立供电时,VCC可以不接
假如设备2是1个没有独立供电的模块,就要接上VCC让设备1给设备2供电进行工作
四、电平标准
单片机使用的就是TTL电平
TTL电平和RS232电平的传输距离很有限,可能传输十几米数据就出现错误了
RS485电平可以传输1000米以上的距离
差分信号 --> 是两根线的压差,不是一根线对地的压差
五、接口及引脚定义
标准九针接口,更多的线实现流控,使发射信号的频率可调整,防止出现数据传输过快,处理不过来的情况
但51单片机不支持流控
六、常见通信接口的比较
相关术语:
七、该单片机的UART
1.四种工作模式
2.串口参数及时序图
3.串口模式图
4.串口和中断系统
5.串口相关寄存器
八、实例一(串口向电脑发送数据)
1.要配置的寄存器
(1)串口控制寄存器SCON和PCON
①SCON
将SM0、SM1配置为01,选择方式1:8位UART,波特率可变(常用)
REN为1,串口允许接收信息;REN为0,串口禁止接收信息
发送数据结束后TI自动会置1,进入中断系统,中断系统执行完后,要自己手动将T1置为0
接受数据接受后RI自动会置1,进入中断系统,中断系统执行完后,要自己手动将R1置为0
初始化配置如图,即SCON=0x40;
②PCON
SMOD对应这个位置
而SMOD0默认为0,使SCON寄存器中的SM0/FE位用于SM0功能,不需要配置
(2)中断有关寄存器
2.代码演示
UART.c
#include <REGX52.H>
/**
* @brief 串口初始化,4800bps@11.0592MHz
* @param 无
* @retval 无
*/
void UART_Init()
{
SCON=0x40;
PCON|=0x80;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
}
/**
* @brief 串口发送一个字节数据
* @param Byte 要发生的一个字节数据
* @retval 无
*/
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=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(1000);
}
}
九、实例二(电脑通过串口控制LED)
1.代码演示
void main()
{
UART_Init();
while(1)
{
}
}
void UART_Routine() interrupt 4
{
if(RI==1)
{
P2=~SBUF;
UART_SendByte(SBUF);
RI=0;
}
}
另外,UART初始化函数要启用中断系统
void UART_Init()
{
SCON=0x50;
PCON|=0x80;
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xF4; //设定定时初值
TH1 = 0xF4; //设定定时器重装值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
EA = 1;
ES = 1;
}
十、波特率的计算(以12MHz为例进行计算)
初值为0xF3,二进制下为243,定时器在256时溢出
则要计的数是256-244=13
即13us溢出一次
溢出频率(T1的溢出率)就为1/13=0.0769230769230769MHz
0.0769230769230769MHz/16=0.0048076923076923MHz=4,807.692307692308Hz
误差率(4,807.692307692308-4800)/4800=0.16025641025641%
十一、数据显示模式
Char就是文本模式
Dec和Hex就是HEX模式