51单片机开发之串口通信

发布者:素心轻语最新更新时间:2021-06-21 来源: eefocus关键字:51单片机开发  串口通信  传感器 手机看文章 扫描二维码
随时随地手机看文章

4.3 串口通信

4.3.1 通信的概念

通信一词按照传统的理解就是信息的传输与交换。

对于单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”;没有通信,单片机所实现的功能仅仅局限于单片机本身,就无法通过其它设备获得有用信息,也无法将自己产生的信息告诉其它设备。如果单片机通信没处理好的话,它和外围器件的合作程度就受到限制,最终整个系统也无法完成强大的功能,由此可见单片机通信技术的重要性。

 UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。

4.3.2 串口通信介绍

串口通信是按照位(bit)发送和接收,串口可以在使用一根线发送数据的同时用另一根线接收数据;这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

串口是计算机上一种非常通用的设备通信协议,大多数计算机(不包括笔记本电脑,主要是台式主机)包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-1 标准RS232串口

 

上面图中的串行接口叫做 RS232 接口,由于现在笔记本电脑都不带这种 9 针串口了,所以和单片机通信越来越趋向于使用USB协议虚拟的串口(就是使用USB转串口协议芯片,实现串口与USB协议互转,比如:CH340)。 标准的RS232接口里,2号引脚是接收数据口RXD,3号引脚是发送数据TXD,对于 RS232 标准来说,它的TXD 和 RXD 的电压, -3V~-15V 电压代表是 1, +3~+15V 电压代表是 0。因此电脑的 9 针 RS232串口是不能和单片机直接连接的,需要用一个电平转换芯片 MAX232 来完成,单片机上的电压是TTL标准,TTL电平信号规定,+5V等价于逻辑“1”,0V等价于逻辑“0”。

STC90C51RC/RD+系列单片机串口通信对应的专用管脚是P3.0/RxD和P3.1/TxD,由它们组成的通信接口就叫做串行接口,简称串口。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-2 两个单片机之间串口通信示意图

 

图中, GND 表示单片机系统电源的参考地, TXD 是串行发送引脚, RXD 是串行接收引脚。两个单片机之间要通信,首先电源基准得一样,所以要把两个单片机的 GND 相互连接起来,然后单片机1的TXD引脚接到单片机2 的 RXD 引脚上,即此路为单片机 1 发送而单片机 2 接收的通道,单片机 1 的 RXD 引脚接到单片机 2 的 TXD 引脚上,即此路为单片机 2 发送而单片机 1 接收的通道。这个示意图就体现了两个单片机相互收发信息的过程。

当单片机 1 想给单片机 2 发送数据时,比如发送一个 0xE4 这个数据,用二进制形式表示就是 0b11100100,在 UART 通信过程中,是低位先发,高位后发的原则,那么就让 TXD首先拉低电平,持续一段时间,发送一位 0,然后继续拉低,再持续一段时间,又发送了一位 0,然后拉高电平,持续一段时间,发了一位 1……一直到把 8 位二进制数字 0b11100100全部发送完毕。

这里就涉及到了一个问题,就是持续的这“一段时间”到底是多久?由此便引入了通信中的一个重要概念——波特率,也叫做比特率。

波特率就是发送二进制数据位的速率,习惯上用 baud 表示,即发送一位二进制数据的持续时间=1/baud。在通信之前,单片机 1 和单片机 2 首先都要明确的约定好它们之间的通信波特率,必须保持一致,收发双方才能正常实现通信。

约定好速度后,还要考虑第二个问题,数据什么时候是起始,什么时候是结束?不管是提前接收还是延迟接收,数据都会接收错误。在 UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止位。这样本来要发送一个字节的 8 位数据,而实际上一共发送了 10 位,多出来的两位其中一位起始位,一位停止位。而接收方,原本一直保持的高电平,一旦检测到了一位低平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。

下面图片展示了一个完整的串口数据发送接收过程:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-3 串口数据发送示意图

 

4.3.3 51单片机的串口寄存器介绍

STC90C51RC/RD+系列单片机内部集成有一个功能很强的全双工串行通信口(P3.0/RxD和P3.1/TxD),与传统8051单片机的串口完全兼容。设有2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。

串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,波特率由内部定时器/计数器产生。

4种工作模式,可通过软件编程对SCON中的SM0、 SM1的设置进行选择。其中模式1、模式2和模式3为异步通信,每个发送和接收的字符都带有1个起始位和1个停止位。

发送缓冲器只能写入而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。

串口相关的配置寄存器如下:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-4

完成基本串口通信主要使用的寄存器有4个:

SCON: 串行控制寄存器 (可位寻址)

PCON: 电源控制寄存器 (不可位寻址)

IE : 中断允许寄存器 (可位寻址)

SBUF: 发送/接收缓冲区(双向的)

4.3.4 串行控制寄存器SCON

串行控制寄存器SCON用于选择串行通信的工作方式和某些控制功能,其格式如下:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-5

 

TI: 数据发送完成中断请求标志位,由内部硬件自动置位(TI=1),必须用软件复位(TI=0)。

RI: 数据接收完成中断请求志位,由内部硬件置位,即RI=1,必须由软件复位,即RI=0。

SCON的所有位在复位之后全部为"0"。

REN:允许/禁止串行接收控制位。 由软件置位REN,即REN=1为允许串行接收状态,可启动串行接收器RxD,开始接收信息。软件复位REN,即REN=0,则禁止接收。

SM0/FE:当PCON寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-6

 

SCON寄存器主要配置串口的工作方式,启动串口的接收功能,常用的工作模式是方式1(8位UART)。

串口工作在方式1时,波特率是可变的,可变的波特由定时器/计数器1或独立波特率发生器产生。


示例:

SCON=0x50;          //设置为工作方式1,允许串口接收


4.3.5 电源控制寄存器PCON

电源控制寄存器PCON格式如下:

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-7

 

SMOD: 波特率选择位。当SMOD=1,则使串行通信方式1、 2、 3的波特率加倍;复位时SMOD=0。

SMOD0: 帧错误检测有效控制位,当SMOD0=0时,与SCON寄存器中的SM0/FE位一起指定串行口的工作方式。复位时SMOD0=0。

配置示例:

PCON=0x80;          //波特率加倍

 

4.3.6 串行口数据缓冲寄存器SBUF

STC90C51RC/RD+系列单片机的串行口缓冲寄存器(SBUF)的地址是99H,实际是2个缓冲器,写SBUF的操作完成待发送数据的加载,读SBUF的操作可获得已接收到的数据。两个操作分别对应两个不同的寄存器,1个是只写寄存器,1个是只读寄存器。

示例:

u8 Rx_Byte;Rx_Byte = SBUF;  //接收到的数据保存到变量中SBUF = Rx_Byte; //将变量保存的数据发送出去


4.3.7 波特率设置

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-8

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-9

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

图4-3-10 常见的波特率设置

 

4.3.8 配置串口实现数据收发示例(波特率不加倍)

下面代码配置串口的波特率为9600,波特率不加倍,当前运行代码的单片机晶振是: 11.059200MHZ。

单片机工作在12T模式下(在12T架构下一个机器周期是12个时钟周期,也就是 12/11059200 秒)

主函数里1秒钟向串口发送一个字符串,串口开启了接收中断,如果收到数据就原样将数据再发送出去。

波特率的配置方法,在STC芯片参考手册的串口章节有示例代码(P199),可以参考修改。

示例代码:

(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

#include /*串口初始化函数*/void UART_Init(void){    PCON=0x00;    //波特率不加倍    SCON=0x50;    //配置串口工作在模式1(8位数据模式)    EA=1;         //打开总中断    ES=1;         //打开接收中断    TMOD&=0x0F;   //清零T1的控制位    TMOD|=0x20;   //配置T1为模式2 (8位自动重装载)    TL1=TH1=256-(11059200/12/32/9600); //计算 T1 重载值 28800    //TH1= TL1=256-(FOSC/12/32/BAUD);  //计算公式  FOSC表示晶振频率  BAUD表示波特率    TR1=1;        //启动 T1}/*串口接收中断*/void UART_IRQHandler(void) interrupt 4{    u8 Rx_Byte;    if(RI)  //接收到字节    {        RI=0;//手动清零接收中断标志位        Rx_Byte=SBUF;  //接收到的数据保存到变量中        UART_SendOneByte(Rx_Byte); //再发回给电脑端    }}/*发送一个字符*/void UART_SendOneByte(u8 c){    SBUF = c;    while(TI==0){}    TI = 0;}/*发送字符串*/void UART_SendString(u8 *p){    while(*p++!='')    {        UART_SendOneByte(*p);    }}int main(){    UART_Init();    while(1)    {        UART_SendString("12345欢迎学习51单片机开发.rn");        DelayMs(1000);    }}


4.3.9 配置51单片机的串口支持printf函数

下面代码中重写了putchar函数支持了标准的printf函数,因为printf函数底层会调用putchar函数进行字节发送。Keil软件上不需要做任何其他设置。putchar函数原型在stdio.h文件中有原型声明。

如果要支持scanf函数,重写getchar函数即可。

示例代码:

(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

#include /*串口初始化函数*/void UART_Init(void){    PCON=0x00;    //波特率不加倍    SCON=0x50;    //配置串口工作在模式1(8位数据模式)    //EA=1;       //打开总中断    //ES=1;       //打开接收中断    TMOD&=0x0F;   //清零T1的控制位    TMOD|=0x20;   //配置T1为模式2 (8位自动重装载)    TL1=TH1=256-(11059200/12/32/9600); //计算 T1 重载值  11956000    //TH1= TL1=256-(FOSC/12/32/BAUD);  //计算公式  FOSC表示晶振频率  BAUD表示波特率    TR1=1;        //启动 T1}/*发送一个字符*/void UART_SendOneByte(u8 c){    SBUF = c;    while(TI==0){}    TI = 0;}/*重写putchar函数为了支持printf函数*/char putchar(char c){    UART_SendOneByte(c);    return c;}int main(){    u8 str[]="我是字符串";    u32 data1=123456;    float data2=123.456;    int data3=0x12345;    UART_Init();    while(1)    {        printf("字符串:%srn",str);        printf("data1:%ldrn",data1); //这里的u32是typedef unsigned long u32;        printf("data2:%frn",data2);        printf("十六进制:%#xrn",(int)data3);        DelayMs(1000);    }}


4.3.10 配置串口实现数据收发(12M晶振、波特率加倍)

下面代码配置串口的波特率为4800,单片机晶振的频率为12MHZ。

示例代码:

(硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

#include int main(){    u8 key;    UART_Init();    while(1)    {        key=Array_Scan();        if(key)        {            UART_SendString("12345欢迎学习51单片机开发.rn");        }    }}/*串口初始化函数单片机采用了12M的晶振*/void UART_Init(void){    PCON=0x80;    //波特率加倍    SCON=0x50;    //配置串口工作在模式1(8位数据模式)    EA=1;         //打开总中断    ES=1;         //打开接收中断    TMOD&=0x0F;   //清零T1的控制位    TMOD|=0x20;   //配置T1为模式2 (8位自动重装载)    TL1=TH1=0xF3;    //TH1=TL1=256-(FOSC/12/32/BAUD);  //计算公式  FOSC表示晶振频率  BAUD表示波特率    TR1=1;        //启动 T1} /*串口接收中断*/void UART_IRQHandler(void) interrupt 4{    u8 Rx_Byte;    if(RI)  //接收到字节    {        RI=0;//手动清零接收中断标志位        Rx_Byte=SBUF;  //接收到的数据保存到变量中        UART_SendOneByte(Rx_Byte); //再发回给电脑端    }} /*发送一个字符*/void UART_SendOneByte(u8 c){    SBUF = c;    while(TI==0){}    TI = 0;}/*发送字符串*/void UART_SendString(u8 *p){    while(*p++!='')    {        UART_SendOneByte(*p);    }} /*重写putchar函数为了支持printf函数*/char putchar(char c){    UART_SendOneByte(c);    return c;}

关键字:51单片机开发  串口通信  传感器 引用地址:51单片机开发之串口通信

上一篇:51单片机开发之中断
下一篇:51单片机开发之矩阵键盘

推荐阅读最新更新时间:2024-11-17 18:11

机器视觉一路升温,安防企业吹响号角
最近几年,机器视觉作为人工智能的一个分支备受业内人士的高度关注,纵观机器视觉在工业自动化市场上的表现,其产品增速持续趋居高位,呈蓬勃发展的态势。国机器视觉联盟主席潘津接受采访时表示:“国内的机器视觉技术开始较晚,但是发展进程很快,国内的视觉产业发展十分迅速,短短十几年时间就追赶上国际水准。”据该联盟的统计数据显示:2015年机器视觉产业创造30多亿的产值,工业智能化的大趋势促使机器视觉产业在2017年创造了60多亿的产值,短短两年,产值翻了一番。 机器视觉在安防领域的应用 智能视觉分析技术是指计算机图像视觉分析技术,计算机图像视觉技术是人工智能(AI,Artificial Intelligent)研究的分支之一,它能够在图像及
[安防电子]
HAL+Cube MX 学习之UART串口通信
一、UART’s Configuration 在Connectivity的USART1配置中,Mode选择为Asynchronous(异步通信),Cube MX已经配置好了相关的引脚,下面的波特率没有特别要求,需要跟串口助手的波特率一致,常用的波特率是9600和115200,然后生成代码。 二、Coding in MDK 可以直接用printf来打印,打印的内容会在串口调试助手上显示,但是用printf需要添加头文件和函数, /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN
[单片机]
HAL+Cube MX 学习之UART<font color='red'>串口通信</font>
单片机串口通信UART与USART的区别
UART与USART都是单片机上的串口通信,他们之间的区别如下: 首先从名字上看: UART:universal asynchronous receiver and transmitter通用异步收/发器 USART:universal synchronous asynchronous receiver and transmitter通用同步/异步收/发器 从名字上可以看出,USART在UART基础上增加了同步功能,即USART是UART的增强型,事实也确实是这样。但是具体增强到了什么地方呢? 其实当我们使用USART在异步通信的时候,它与UART没有什么区别,但是用在同步通信的时候,区别就很明显了:大家都知道
[单片机]
电阻传感器谐振频率的测量--数字波形发生器
可变电阻传感器可以将一个固定的直流激励电压或电流变换成一个被测量直接函数的电流或电压。在另一类传感器中,移动物体或流体可以通过改变一个LC电路的电感值或电容值来产生一个传感器信号。图1示出了一个基本的交流驱动调谐电路接近式传感器(即L和C)以及采样电阻器R。在静态条件下,L和C谐振并在某一频率下具有最大阻抗。当一个物体接近该传感器时,L或C值发生变化并改变电路的谐振频率。只要用一个固定频率来激励传感器,并测量输出电压V2相对于激励电压V1的相位或幅度变化,就可以推导出该物体的位置。不过,这种方法会限制传感器的动态范围和分辨率。 作为一种替代方法,可以使用一个跟踪传感器谐振频率变化的扫频交流电源来驱动传感器。图2示出了一种
[测试测量]
电阻<font color='red'>传感器</font>谐振频率的测量--数字波形发生器
微阵列加速度传感器的设计理论
 建立引信系统环境识别(如多向加速度)与参数估计的多维信息处理理论产生新的引信原理是当前重要的研究方向。如对硬目标的侵彻或贯穿装甲所使用的巡航导弹、激光制导炸弹等,都存在多向加速度的探测问题。因此大量程的能测量105 g微加速度计具有非常重要的应用价值。目前微阵列式加速度计发展非常迅速,它对提高武器作战水平,改进武器性能起着十分重要作用。另外汽车上的安全气囊,在微机器人中,执行器动作的运动速度、加速度和力的大小的检测都需要微阵列式加速度传感器。因此微阵列式加速度传感器的应用范围广,前景十分看好。   随着集成电路平面加工工艺技术日趋成熟,微加工中的三维加工工艺不断地发展,使微传感器、微马达、微泵等制造已成为现实。文献 曾提出了传感
[电源管理]
微阵列加速度<font color='red'>传感器</font>的设计理论
用单片机实现的脉冲编码传感器
引 言   随着社会的发展,出租车成为人们生活中非常方便且较普遍的交通工具,但出租车计价器却相对较为落后。在过去,出租车采用机械式计价器,用齿轮比的方式来计算出租车所跑的里程数,并由里程数来换算车费。但是机械齿轮体积较大,计算不是很准确,而且容易磨损。后来又采用了传感器方式,利用传感器接收车的跑动信息,从而计算里程数和车费。但此方法通常使干扰信号也能产生计数脉冲,所以也不完善。笔者引用单片机技术,使用编码和解码信息传递方式来完成计价器计数脉冲的形成。单片机可以很精确的检测到传感器信号,这样计价就会非常准确。完成此装置所需器件简单,成本非常低,技术上也容易实现。 1 系统原理   系统框图如图1所示,本文主要介绍虚线框内模块的设计
[单片机]
利用光纤传感器监控腐蚀状态
通过使用光纤 传感器 测量管壁厚度,气体管道工作人员可以追踪并监控管道腐蚀的速度。将传感器与网络控制仪表相连,可使工作人员远程完成工作。 正确追踪腐蚀速率的变化对于天然气管道操作员来说是个严峻的挑战。如果被测的腐蚀速率超过2密尔/年,操作工人就会被要求采取措施以减轻腐蚀或进行修复。尽管许多经过验证的技术(如腐蚀取样管和电阻探针)可以用于测量腐蚀,但绝大多数技术测量的是气体的腐蚀,而不是管道壁的变化。由于这些方法只能间接地推算出管道线路的腐蚀速率,固此测量的精度受到多种因素的影响。 针对这个问题。Fiber Optic systems Technology公司(FOX-TEK)开发出的一个解决方案,是将非常灵敏的FT光纤壁厚
[传感器]
利用光纤<font color='red'>传感器</font>监控腐蚀状态
数字视频监控芯片市场成快速增长(2)
  Lytle说,Stretch希望凭借其器件能够实现压缩和分析的能力介入这个领域。随着越来越来多的分析功能转移到IP数字视频摄像机,Stretch解决方案变得“更增值”。   新创公司往往急于将增长的市场涂上美丽的色彩,而市场老兵则提供了一个不同的角度。   Petkevich说:“当在2007年到处出售其解决方案时,德州仪器意识到“大多数的模拟闭路电视摄影机公司对于如何建立一个IP摄影机没有头绪。我们希望能够向顾客演示我们芯片能够提供的很好的图像管道能力以及其他最优性质,但是我们却不能顺利通过第三方监视摄影机的图像质量问题。”   这个经验使得德州仪器在上周与美光科技的Aptina成像部门合作,制作高清晰度IP网络摄影机
[焦点新闻]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved