文章目录

  • 串口基本认识
  • RS-232-C、RS-422与RS-485
  • 关于串口的电平
  • 串口通信
    • SCON
    • SBUF:串行数据缓冲器
    • PCON
    • IE
  • 波特率计算
    • 什么是波特率
      • 实例计算
    • 常用波特率及初值表
  • 编程实现串口通信(PC——单片机)
  • 结束

串口基本认识

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢.

  • 是设备间接线通信的一种方式
  • 数据一位一位地顺序传送
  • 双向通信,全双工
  • 传送速度相对较慢

关于电器标准和协议

串行接口按电气标准及协议来分包括RS-232-C、RS-422、RS485等。

RS-232-C、RS-422与RS-485

标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。
RS-232也称标准串口,最常用的一种[串行通讯接口,比如我们的电脑主机的9针串口 ,最高速率为20kb/s
RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其传送距离最大为约15米。所以RS-232适合本地设备之间的通信

RS-422
由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。

RS-422的最大传输距离为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比
RS-485
是从RS-422基础上发展而来的,无论四线还是二线连接方式总线上可多接到32个设备。

关于串口的电平

经常听说的UART
异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。
UART包含TTL电平的串口RS232电平的串口
RS232电平
逻辑1为-3~-15V的电压, 逻辑0为3~15V的电压
笔记本通过RS232电平和单片机通信

TTL电平
TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通信的标准技术。TTL电平信号应用广泛,是因为其数据表示采用二进制规定,

+5V等价于逻辑”1”,0V等价于逻辑”0”。
数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定:

  • 输出高电平>=2.4V,输出低电平<=0.4V;
  • 输入高电平>=2.0V,输入低电平<=0.8V

笔记本电脑通过TTL电平与单片机通信
TX发送线(端口)3.1
RX接收线 (端口)3.0

USB转TTL,使用ch340通信

串口通信

串口接线方式
RXD:数据输入引脚,数据接受;STC89系列对应P3.0口,上官一号有单独引出
TXD:数据发送引脚,数据发送;STC89系列对应P3.1口,上官一号有单独引出
接线方式


印象塑造
输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器
代码体现为: 想要接收数据 char data = SBUF 想要发送数据 SBUF = data

回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信速度,叫做波特率

对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写代码点点点配置什么,我们代码也要配置对应参数
相关寄存器的配置以及串口的工作模式

SCON

串行口控制寄存器SCON决定串行口通信工作方式,控制数据的接收和发送,并标示串行口的工作状态等,其位格式为:


SM0、SM1:串行口工作方式控制位,对应4种工作方式,如表7-1所示(fosc是晶振频率)。
SM2::多机通信控制位,主要用于工作方式2和工作方式3。若SM2=1,则允许多机通信。

多机通信规定:第9位数据位为1 (即TB8=1),说明本帧数据为地址帧:第9位数据为0(即TB8=0),则本帧数据为数据帧。

当从机接收到的第9位数据(在RB8中)为1时,数据才装入接收缓冲器SBUF,并置RI=1向CPU申请中断;如果接收到的第9位数据(在RB8中)为0,则不置位中断标志RL信息丢失。

当SM2=0时,则不管接收到第9位数据是否为1,都产生中断标志RI,并将接收到的数据装入SBUF。应用这一特点可以实现多机通信

串行口工作在方式0时,SM2必须设置为0;工作在方式1时,如SM2=1,则只有接收到有效的停止位时才会激活RI。

REN:允许接收控制位 。当REN=1时,允许接收;当REN=0时,禁止接收。此位由软件置1或清零。

TB8:在方式2和方式3中,此位为发送数据的第9位 ,在多机通信中作为发送地址帧或数据帧的标志。TB8=1,说明该发送帧为地址帧;TB8=0,说明该发送帧为数据帧。在许多通信协议中,它可作为奇偶校验位。此位由软件置1或清零在方式0和方式1中,此位未使用。

RB8: 接收数据的第9位 。在方式2和方式3中,接收到的第9位数据放在RB8中。它或是约定的奇/偶校验位,或是约定的地址/数据标志位。在方式2和方式3多机通信中,若SM2=1且RB8=1,说明接收到的数据为地址帧。

TI: 发送中断标志位 。在一帧数据发送完时置位。TI=1,申请中断,说明发送缓冲器SBUF已空,CPU可以发送下一帧数据。中断被响应后,TI不能自动清零,必须由软件清零。

RI:接收中断标志位 。在接收到一帧有效数据后,由硬件置位。RI=1.申请中断,表示一帧数据接收结束,并已装入接收缓冲器SBUF中,CPU响应中断,取走数据。RI不能自动清零,必须由软件清零。

串行口发送中断标志TI和接收中断标志RI共为一个中断源。因此,CPU接收到中断请求后,不知道是发送中断TI还是接收中断RI,必须用软件来判别。单片机复位后,控制寄存器SCON的各位均清零。

SBUF:串行数据缓冲器

串行口中有两个缓冲寄存器SBUF,上图也提到可以返回去看,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。

在物理结构上是完全独立的,但地址是重叠的。它们都是字节寻址的寄存器,字节地址均为99H。只要在编写程序时,用不同指令即可操作两个寄存器。

SBUF=A;这个是指将A的数据移入发送寄存器,然后发送寄存器再把数据发送出去。A=SBUF;则是指将接受寄存器中的数据赋值给A。

PCON


SMOD: 该位与串口通信有关。

  • SMOD=0; 串口方式1,2,3时,波特率正常。
  • SMOD=1; 串口方式1,2,3时,波特率加倍。

LVDF: 低电压检测标志位,同时也是低电压检测中断请求标志位

GF1,GF0: 两个通用工作标志位,用户可以自由使用

PD: 掉电模式设定位。

  • PD=0单片机处于正常工作状态。
  • PD=1单片机进入掉电(Power Down)模式 ,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断工作。在该模式下,只有硬件复位和上电能够唤醒单片机。

IDL: 空闲模式设定位。

  • IDL=0 单片机处于正常工作状态。
  • IDL=1 单片机进入空闲(Idle)模式,除CPU不工作外,其余仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。

IE


CPU能响应串口中断的条件:需要配置IE寄存器的
bit4:ES 允许串口中断
bit7:EA 中断总开关

  1. ES中断允许要置1一 ES= 1
  2. EA总中断要置一 EA = 1

了解相关寄存器配置之后就可以,计算波特率,实现双方对话了。

波特率计算

找到一篇好文章:https://blog.csdn.net/qq_40147893/article/details/106539081
可以参考学习

什么是波特率

1s中内可以传送多少bit叫做波特率,如常见的9600,就是1s内能传送9600个bit。

单片机中时钟频率得当可以产生波特率注意这里是时钟频率而不是机器周期
比如:11.0592MZH的晶振要产生9600的波特率,可以这么做

9600波特率传送1bit需要的时间:1/9600s

算出时钟频率,1/11.0592×106 s

时钟频率的秒数是执行一条语句的所需要的时间,如果这个执行时间与波特率传送1bit的时间相等,那么就可以产生波特率

显然目前是不相等的,所以把时钟频率的1 换成 x然后再让他们相等

那么公式变成:

  • x/11.0592×106 = 1/9600
  • 11.0592×106/9600 = x

这个x就是定时器执行x次需要溢出,得到x之后,使用单片机的定时器可以设置

  • TH0 = (65535-x)/256;
  • TL0 = (65535-x)%256;

理解上面之后,再来看这个图。

上图可以看到,方式有4种。
第一种和第三种是不可控制的。他波特率是由晶振频率确定的是固定的
第二种和第四种是可控的,他由定时器控制,但单片机内部分着12分频和6分频之类的,也就是单片机自带的机器周期,所以上面公式还需除以12或者6,如果工作在12分频则除以12,如果工作在6分频则除以6.为什么因为上面算的时候并没有算上机械周期,但单片机内部已经乘以12了已经算上机械周期了,所以需要除以12去掉让他变成时钟频率。

又加上和分析使用的定时器不一样,所以出现了以下公式

在这个公式变形:11.0592×106/9600 = x

变形之后为:11.0592×106/12/9600 = x

再优化一下:11.0592×106/12/x = 9600

x为定时器初值,又用了8位定时器重新装填。所以手册的公式为:

晶振频率/12(256-TH1) = 定时器溢出率* ,但光有这个是不够的,别忘了单片机有个蛋疼的地方,也是研究了好久,就是有个倍频位

如果SMOD = 1,则倍频,则需要上面在乘以一个倍频数值,这个值为 (2SMOD/32) 至于为什么是这个值我也不是很明白,应该是单片机里面自带的。又或许单片机是32位的原因?有高手看到可以留言解惑。

如果SMOD = 0,则不倍频也需要乘以这个值 (2SMOD/32)

上述基础上方式1和方式3还需要乘以 (2SMOD/32) 所以得出完整公式

  • 晶振频率/(12×(256-TH1)) = 定时器溢出率
  • 定时器溢出率 ×(2SMOD/32)

实例计算

写的丑了,勉强能看。

所以定时器8位重装的初值位250(十进制)转为16进制为(FA),就会产生9600的波特率,这个是倍频下的值,不倍频值会不一样

常用波特率及初值表

编程实现串口通信(PC——单片机)

定时器的相关知识参考这篇文章

/*
串口波特率9600
每隔一秒,单片机向PC发送一个字符串
PC上位机串口调试助手发送字母o点亮LED,发送字母c关闭LED
*/
#include "reg52.h"
#include "intrins.h"
sfr AUXR = 0x8E;
sbit D5 = P3^7;
char cmd;
void UartInit(void) //9600bps@11.0592MHz
{AUXR = 0x01;  //可以减少辐射好像SCON = 0x50;     //配置串口工作方式1,REN使能接收PCON = 0x80;TMOD &= 0x0F;TMOD |= 0x20; //定时器1工作方式位8位自动重装TH1 = 0xFA;       //将上述计算250转换为16进制TL1 = 0xFA;       //9600波特率的初值TR1 = 1;   //启动定时器EA = 1;     //开启总中断ES = 1;     //开启串口中断
}
void Delay1000ms() //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 8;j = 1;k = 243;do{do{while (--k);} while (--j);} while (--i);
}void sendByte(char data_msg)
{SBUF = data_msg;while(!TI);TI = 0;
}void sendString(char* str)
{while( *str != '\0'){sendByte(*str);str++;}
}void main()
{D5 = 1;//配置C51串口的通信方式UartInit();while(1){Delay1000ms();//往发送缓冲区写入数据,就完成数据的发送sendString("Strange_Head hello\r\n");}
}void Uart_Handler() interrupt 4
{if(RI)//中断处理函数中,对于接收中断的响应{RI = 0;//清除接收中断标志位cmd = SBUF;if(cmd == 'o'){D5 = 0;//点亮D5}if(cmd == 'c'){D5 = 1;//熄灭D5}}if(TI);
}

执行结果

Q1:上述例子用了T1定时器(为什么不用T0)?
A1:"t0"和串口冲突是因为串口通信和定时器0 (TIMER0) 使用相同的中断向量。这意味着如果在使用串口通信时启用了TIMER0,则可能会发生冲突,导致通信出错。为了避免这种情况,应该在使用串口通信时禁用TIMER0或使用其他定时器。

结束

希望对你有帮助,点个赞支持一下吧。
转载联系作者。

51单片机串口通信,及波特率计算相关推荐

  1. 51单片机C语言波特率十六进制,理解51单片机串口通信的波特率与USB转串口通信...

    RS232 在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口. 九针 ...

  2. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  3. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  4. 51单片机串口通信模板_51单片机串口通信

    51 单片机串口通信 51 单片机串口通信(转载) 2009-03-03 18:22 一.串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计 算机端,而且也能实现计算机对单 ...

  5. 51单片机串口通信【收集学习向】

    本篇整理了学习51串口通信过程中看到的一些比较好的文章,有很多的超链接.并根据自己遇到的情况分析了串口传输乱码的一些原因. 目录 1.原理知识 2.测试程序和虚拟仿真 3.电路设计与公母口连线 电路设 ...

  6. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

  7. 51单片机串口通信发送以及接收代码详解2

    #include <reg51.h> //实验现象:在电脑端没按下发送的时候,单片一直给电脑发送aaa字符串: //实验现象:在电脑端按下发送的时候,结束字符串aaa的发送代码,执行单片接 ...

  8. 51单片机~串口通信(讲解+代码)

    51单片机~串口通信 (一)计算机串行通信原理: 综上:所以在设置的时候,经常将SCON设置为0X50==0101 0000 ,使用方式1. (二)工作: 中断控制 led灯,每发送一条指令灯亮或灭( ...

  9. 51单片机-串口通信

    目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部 ...

  10. 51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)

    文章目录 前言 一.串行通信口的功能以及串行通信口的结构及原理 1.1 串行通信口的功能 1.2 51单片机串口的结构 二.串行通信口的控制寄存器 2.1 串行控制寄存器SCON 2.2 电源控制寄存 ...

最新文章

  1. [Spark][翻译]Spark 架构: Shuffle过程分析
  2. 【CV秋季划】人脸识别经典难题介绍,抗遮挡,跨年龄,异质源,少样本等
  3. 基于汇编语言及Proteus仿真的CPU8086水库水位监视系统
  4. l28n和开发版_Atmel之SAM4S Xplained开发板评测(二)
  5. 2022央视春晚电视端直播平均收视率达21.93%
  6. cms文章 mysql存储_MySQL存储引擎笔记
  7. PTA 2-1 列出连通集【DFS+BFS基础】
  8. ES6 Promise - 让我们解开的面纱(遵循Promise/A+规范)
  9. [OpenGL] opengl常见问题汇总
  10. Centos6.5 mysql折腾记
  11. 淘宝数据分析工具汇总
  12. 如何将两段音乐合并成一段?
  13. 如何彻底删除SQL Server2005
  14. 后门及持久化访问1----辅助功能镜像劫持
  15. python应用之Word生成
  16. 201224-MacOS使用Mounty非安全退出NFTS后磁盘无法加载
  17. 醉林疯的OJ 1055: 兔子繁殖问题
  18. 高级计划排程APS系统的十二个应用方法
  19. 镜子中的 Google
  20. 关于微信小程序的多选和全选实现

热门文章

  1. react antd TextArea 中文输入法 autoSize
  2. SAAS软件的成熟度模型总结
  3. 三年级信息技术用计算机打字教案,三年级下册信息技术教案-4.打字练习乐趣多|人教版(2015).doc...
  4. mongo db 练习语句
  5. 电脑蓝牙打电话-总结(三、千月Bluesoleil)
  6. 清除无效的隧道适配器
  7. 51单片机LCD1602温度时钟万年历带闹钟DS18B20实践制作DIY- GC0046-出租车计价器
  8. TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别作者:万一 来源:博客园 发布时间:2009-01-09 23:01
  9. 玩转人工智能(11)大数据的ETL和人工智能的EDA
  10. [系统安装] 装机员U盘安装原版系统