精华内容
下载资源
问答
  • 利用串行口发送数据时
    千次阅读
    2021-01-07 18:25:47

    编写程序利用串口调试助手通过串口给实验板发送数据(数据范围0x00-0xfe),单片机将接受到的数据加1后再发送给PC机。

    在这里插入图片描述

    程序:
    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int
    uchar temp;
    int main(void)
    {
    SCON=0x50;
    PCON=0X00;
    TMOD=0X20;
    EA=1;
    ES=1;
    TH1=0XFD;
    TL1=0XFD;
    TR1=1;
    while(1);
    }
    void int1(void) interrupt 4
    {
    if(RI)
    {
    RI=0;
    temp=SBUF;
    SBUF=temp+1;
    }
    if(TI)
    TI=0;
    }

    更多相关内容
  • 本设计通过模拟开关CD4053将一路单片机串行口收发信号,分转换成两路串行口,然后使用不同的接口芯片,实现了RS232和485总线同在一个系统下分完成了通信工作。
  • 绍:串行口是单片机与外界进行信息交换的工具。8051单片机的通信方式有两种:并行通信:数据的各位同时发送或接收。 串行通信:数据一位一位次序发送或接收。
  • AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器SBUF(属于特殊功能寄存器),可同时发送、接收数据发送缓冲器只能写入不能读出,接收缓冲器只能读出不能写入,两个缓冲器共用一...
  • 本文介绍了利用EDA技术设计出一种功能和通信协议与MCS-51系列单片机的串行口相兼容,性能有大幅提高的串行口控制器的IP核,并经过验证获得了满意的效果。 1 引言  随着集成电路的深亚微米制造技术和eda技术的迅猛...
  • 80C51串行口通信

    2020-08-10 20:03:21
    TXD 是80C51单片机的P3.1,RXD 是80C51单片机的P3.0,T1 溢出率 是定时器1 的溢出率 SMOD 是发送速率倍频的 16分频 T1每溢出一次发送一位,里面复杂咱们不管,每次发送完后TI 申请中断,就是串口每次发送完一个...
  • 【课题7】利用8251实现串行口自发自收,并显示。 二、课程设计任务与目标 设计要求: 1. 按“A”键:清除数码管显示,并通过小键盘输入四位16进制数,同时显示在右侧四个数码管上。 2. 按“B”键:执行串行发送,...
  • MCS-51的串行通信

    2020-08-17 16:06:58
    MCS-51单片机内部有一个全双工的串行通信,即串行接收和发送缓冲器(SBUF),这两个在物理上独立的接收发送器,既可以接收数据也可以发送数据
  • 串行口实验

    2014-04-12 21:37:00
    本实验要求单片机U1通过其串行口TXD向计算机发送一个数据“oxab”。利用集成电路MAX232将单片机的输出信号转化成计算机能够识别的信号。针对发送的实例,再设计一个单片机接受计算机送出数据的过程
  • 本文为大家详细介绍MCS-51的串行通信问题。
  • 本文中先容的串行口控制器是一种功能和通讯协议与MCS-51系列单片机的串行口相兼容,性能有大幅进步的数据通讯部件,其往往于低速低本钱的微机与下位机的通讯中,并答应在串行链路上进行全双工的通讯。通过IP核重用...
  • 在用单片机开发各种嵌入式应用系统,异步串行通信是经常要用到的一种通信模式,很多应用中还要求实现多路异步串行通信。大家平时熟悉的各种厂家的单片机,绝大部分片上只提供一个硬件UART模块,利用它可以方便实现...
  • 在用单片机开发各种嵌入式应用系统,异步串行通信是经常要用到的一种通信模式,很多应用中还要求实现多路异步串行通信。本文主要介绍PIC 单片机软件异步串行口实现技巧。
  • 在以单片机为核心的测控系统中.微控制器往往需要两个或两个以上的串行口与其他主机或外设进行通讯,如何使系统具备多个串行接口,是一个具有普遍性的问题。
  • 在用单片机开发各种嵌入式应用系统,异步串行通信是经常要用到的一种通信模式,很多应用中还要求实现多路异步串行通信。大家平时熟悉的各种厂家的单片机,绝大部分片上只提供一个硬件UART模块,利用它可以方便实现...
  • 摘要:S2067是AMCC公司生产的具有双向接收和发送功能的高速串行数据传输芯片。它内含两个独立的收发器,可用于高速数据...S2067有两个用于接收和发送串行I/O,这两个串行I/O利用光信号或电信号进行数据传输
  • 51单片机(七)串行口通信

    千次阅读 2021-03-20 19:12:57
    一、并行与串行通信 1、并行通信 将数据每一字节的各位用多条数据线同时进行传送。每个字节8位,由8条数据线同时传送一位,同一时间总共传送1...由于只需要一条数据线,在长途通信中成本不会很高,并且可以利用电话网等

    一、并行与串行通信

    1、并行通信

    将数据每一字节的各位用多条数据线同时进行传送。每个字节8位,由8条数据线同时传送一位,同一时间总共传送1个字节。除了8条数据线外,还有一条信号线和若干控制线。

    由于发送设备和接收设备之间需要的接线较多,采用长途信号传送使得成本激增,所以并行通信一般用于短途通信。
    在这里插入图片描述

    2、串行通信

    将数据的一个字节分成8位,一位一位的在一条传输线上传送,数据线只需要一条即可,此外还需一条公共信号地线和若干控制信号线。由于只需要一条数据线,在长途通信中成本不会很高,并且可以利用电话网等现有的设备。
    在这里插入图片描述

    3、并行通信和串行通信优缺点

    1)并行通信

    优点:控制简单,相对传输速度快
    缺点:长距离传输时成本高,一个字节的8位同时发送和接收存在困难,较串行通信抗干扰能力弱

    2)串行通信

    优点:传输线少,长距离传输成本低,可利用现有设备进行传输,较并行通信抗干扰能力强
    缺点:控制比较复杂,较并行通信控制更复杂

    4、异步串行通信、同步串行通信

    1)异步串行通信

    通信的接收方、发送方使用各自的时钟控制数据的接收和发送。(为使双方收发协调,要求发送和接收设备的时钟尽可能一致)
    在这里插入图片描述

    2)异步串行通信的俩个指标——字符帧格式、波特率

    异步串行通信中数据通常以字符或者字节为单位组成字符帧传送。字符帧在发送设备逐帧发送,接收设备逐帧接收。发送端和接收端由各自的时钟控制,俩个时钟互不影响、彼此独立。

    字符与字符之间的间隔是任意的。任一字符内部的每一位之间的间隔是固定的。

    波特率之后着重讲解

    3)异步串行通信的常用总线类型

    ①RS-232
    通常 RS-232 接口以9个引脚(DB-9) 或是25个引脚 (DB-25) 的型态出现

    在这里插入图片描述
    在这里插入图片描述

    S232接口电平值较高,其任何一条信号线的电压均为负逻辑关系。即:逻辑“1”为-3V ~ -15V;逻辑“0”为+3V ~ +15V

    RS232与TTL电平不兼容,故需要使用电平转换器才能让RS232与TTL电路连接。如MAX232把TTL电平从0V和5V转换到3V~15V或-3V ~ -15V

    RS232传输距离较短,若距离过长,会导致信号失真、抗干扰能力较差。

    ②RS-485

    在要求通信距离为几十米到上千米时,广泛采用RS-485串行总线。RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度,能检测低至200mV的电压,故传输信号能在千米以外得到恢复。

    RS-485采用半双工工作方式,所以收、发双方不能同时进行收和发,同一时间只有一方在发送、另一方在接收。

    USB转RS485:
    在这里插入图片描述

    ③USB(通用串行总线)

    4)异步串行通信的特点

    不要求收发双方时钟严格一致,实现容易,设备开销小,但每个字符需要附加2~3位用于起始位、校验位、停止位,各帧之间还有间隔,因此传输效率不高。

    单片机与单片机、单片机与计算机之间的通信,都为异步串行通信方式

    5)同步串行通信

    要建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间距”的整数倍,同时传送的字符间不留间隙即保持字符同步关系。

    同步分为外同步和自同步。

    外同步:
    在这里插入图片描述

    自同步:
    在这里插入图片描述

    6)串行通信的奇偶校验

    发送数据时,在数据位后面尾随的一位是奇偶校验位。
    奇校验时,数据中的1的个数+奇偶校验位中1的个数=奇数,若不为奇数,说明数据传输中出现错误。
    偶校验时,数据中的1的个数+奇偶校验位中1的个数=偶数,若不为偶数,说明数据传输中出现错误

    还想进一步了解的朋友可以去参考《通信原理》的【差错控制编码】——>【奇偶监督码】和【二维奇偶监督码】

    二、MAX232实现RS232电平与TTL电平转换(板子嵌用)

    中文参考手册:

    在这里插入图片描述

    单片机原理图:

    在这里插入图片描述

    图一可知:T1in与T2in为TTL电平输入,T1out、T2out为RS232输出。R1in与R2in为RS232电平输入,R1out与R2out为TTL电平输出。

    所以MAX232可以将TTL电平转为RS232电平,也可以将RS232电平转为TTL电平

    图二可知,单片机芯片P30接单片机R1out,为MAX232芯片的TTL电平输出引脚,单片机P31接T1in,为MAX芯片的TTL电平输入引脚。

    信号流程:
    单片机通过P31引脚发送信号,到MAX232的T1in引脚,经过转为,变为RS232电平,传输到其他设备,完成信号传送。
    其他设备传送的信号,送入MAX232,进过转换,从R1out输出TTL电平,进入单片机P30引脚,单片机接收到其他设备的信号。

    所以单片机P30是信号接收引脚,P31是信号发送引脚。

    在这里插入图片描述

    打开8051芯片,发现P30的确是接收引脚,P31的确是发送引脚。

    再看MAX232的单片机原理图(上图二):

    注:J1是焊接在板子上的接口,我的板子是公口,外插母口进行信号传送

    J1的2引脚接R1in,为RS232电平的输入引脚,所以外接的母口的对应2引脚为其他设备的信号输出端。(指另一端设备备接口转换器的输出端)

    J1的3引脚接T1out,为RS232电平的输出,所以J1的3引脚接外接母口的对应3引脚,接其他设备的输人端。(指另一端设备备接口转换器的输入端)

    总结:
    .
    发送:单片机P31引脚——>MAX232的T1in引脚——>经转换在MAX232的T1out引脚输出——>J1公口的3引脚——>外插母口的3引脚——>其他设备的接口转换器输入端(若接口也为MAX232,则接R1in或R2in)

    接收:其他设备的接口转换器输出端(若接口也为MAX232,则为T1out或T2out)——>外接母口引脚2——>本单片机J1的2引脚——>MAX232的R1in——>经转换后MAX232的R1out输出——>单片机P30引脚

    三、波特率与定时器初值

    之前总结异步串行通信的俩个指标——字符帧格式与波特率时,未对波特率进行总结,现总结波特率以及与定时器初值的关系

    1、波特率

    单片机或计算机在串口通信时的速率用波特率表示,它表示每秒传输二进制代码的位数,即1波特=X位/秒,单位是bps(位/秒)。如当异步串行传输包含1个起始位、1个停止位、8位数据位,每秒传输200个字符,则此时的波特率为10×200=2000bps。

    《通信原理》中将传信率(又称比特率)Rb,表示传输的信息速率,单位是比特/秒,b/s或bps。传码率RB表示码元传输速率,单位为波特(Baud),简记B,有兴趣的朋友可以去了解一下。

    2、波特率计算

    在串行通信中,收发双方的波特率需要约定使用同一波特率。通过编程可对单片机串行口设定工作方式,从而指定波特率。

    四种工作方式的波特率:
    ①方式0:fosc/12
    ②方式1:(2SMOD/32)×(T1溢出率)
    ③方式2:(2SMOD/64)×fosc
    ④方式3:(2SMOD/32)×(T1溢出率)

    可以看出只有方式1的波特率是固定的

    上述式子中,fosc为系统时钟频率,一般为12MHZ或者11.0592MHZ(我的板子是11.0592MHZ)。SMOD是电源管理寄存器PCON的最高位(接下来总结)

    T1溢出率即定时器T1溢出的频率,即1s溢出多少次,如之前总结《(四)定时器中断》时,设置为每50ms溢出一次(和寄存器装载的初值有关系),则1s溢出20次,溢出率为20HZ。

    方式0的波特率为系统晶振的12分频,之前总结的+1计数器的时钟来源之一就是系统时钟的12分频。

    一般情况下,都是用方式1,其他几种方式几乎不会用。

    3、溢出率、波特率、定时器综合分析

    由上面的工作方式0、1、2、3的波特率计算公式可以得出工作方式1、3与计数器T1的溢出率有关系,由于实际应用中,常见的是工作方式1,现以工作方式1为例来分析。

    单片机通信时,一般需要很高的波特率,如常见的9600波特率,可以先选定通信的波特率,然后再求T1溢出率,而1/(T1溢出率)为T1定时器每中断溢出的时间Xms。通过以下公式:
    TH1=(65536-X)/256
    TL1=(65536-X)%256
    可以得出定时器的装载初值。这样,定时器中断的初值、溢出率、波特率都已解决。

    51单片机只能通过这种方式规定波特率,不像Arduino、openMV这些单片机,可以在程序中直接指定波特率。

    4、定时器工作方式选择——工作方式2

    通信的波特率很大——>T1溢出率很大——>定时器1的中断间隔很小——>定时器装载初值很大。因为中断间隔很小,若采用之前的定时器1工作方式1,每次中断都需要软件重新装载初值,执行装载初值语句会浪费一定的时间并且不太稳定,所以定时器的工作方式1在这里不合适。采用定时器的工作方式2,使用8位初值自动装载计数器/定时器,进入中断服务函数后,无需进行任何操作,使定时器溢出速率变得绝对稳定。

    使用工作方式2的8位自动重装载计数器/定时器1时,初值的计算公式也发生了变化,以波特率9600为例:(要区分定时器工作方式2和串口工作方式1)
    ①SMOD=0、12MHZ晶振
    串口工作方式1的波特率:9600bps
    SMOD=0(波特率不加倍)
    T1溢出率=9600×32=307200HZ
    中断间隔:1/307200=3255ms≈3.26us(即每3.26us中断一次)
    12MHZ晶振的一个机器周期1us(即每计一次数1us)
    每计3个数为3us
    所以每计三个数中断一次,初值:256-3=253

    ②SMOD=1、12MHZ晶振
    串口工作方式1的波特率:9600bps
    SMOD=1(波特率加倍)
    T1溢出率=9600×16=153600HZ
    中断间隔:1/153600≈6.5us(即每6.5us中断一次)
    12MHZ晶振的一个机器周期1us(即每计一次数1us)
    每计5个数为5us
    所以每计三个数中断一次,初值:256-5=251

    12MHZ晶振时有很大误差,毕竟9600波特率是针对11.0592MHZ晶振的

    ③SMOD=0、11.0592MHZ晶振
    串口工作方式1的波特率:9600bps
    SMOD=0(波特率不加倍)
    T1溢出率=9600×32=307200HZ
    中断间隔:1/307200=3255ms≈3.26us(即每3.26us中断一次)
    11.0592MHZ晶振的一个机器周期1.085us(即每计一次数1us)
    3.26÷1.085=3
    所以每计三个数中断一次,初值:256-3=253

    ④SMOD=1、12MHZ晶振
    串口工作方式1的波特率:9600bps
    SMOD=1(波特率加倍)
    T1溢出率=9600×16=153600HZ
    中断间隔:1/153600≈6.5us(即每6.5us中断一次)
    11.0592MHZ晶振的一个机器周期1.085us(即每计一次数1us)
    6.5÷1.085=6
    所以每计三个数中断一次,初值:256-6=250

    以上四个计算为了回顾之前博客总结的定时器内容,步骤都分开处理,使得中间公式产生约等于,导致最后结果有一点点误差,若省去中间公式,直接一个合公式导出初值,发现11.0592MHZ晶振时,SMOD=0,定时器初值为253,SMOD=1,定时器初值为250,没有误差。

    常见波特率:
    在这里插入图片描述

    串口通信的波特率不能太大,否则会超过定时器的最短溢出时间,比如115200波特率就不能使用11.0592MHZ的晶振的串口通信。也正是为了使波特率为标准通信速率时计数器/定时器初值都为整数,才选用11.0592MHZ的晶振。

    四、电源管理寄存器PCON与串行口控制寄存器SCON

    1、电源管理寄存器PCON(Power Control)

    电源管理寄存器用来管理单片机的电源部分,包括上电复位检测、掉电模式、空闲模式等,单片机复位时PCON全部清0。

    电源管理寄存器:

    位序号D7D6D5D4D3D2D1D0
    位符号SMOD(SMOD0)(LVDF)(POF)GF1GF0PDIDL

    D7——SMOD与波特率有关。SMOD=0:串口方式1、2、3波特率正常;SMOD=1,:串口方式1、2、3波特率加倍。(只需记D7位)

    D6——(SMOD0):与SCON寄存器的SM0有关,为帧错误检测有效控制位,当SMOD0=1,SCON寄存器中的SM0/FE位用于FE(帧错误检测)功能;SMOD0=0,SCON寄存器中的SM0/FE位用于SM0功能,和SM1一起指定串行口的工作方式。单片机复位时SMOD0=0;

    D5——(LVDF):无效

    D4——(POF):上电复位标志,单片机停电后,上电复位标志为1,可由软件清零。

    察看STC89C52技术手册(了解即可):
    在这里插入图片描述D3——GF1、D2——GF0:俩个通用工作标志位,用户可以自由使用。

    D1——PD:掉电模式设定位。PD=0,单片机正常工作;PD=1:单片机进入掉电(Power Down)模式,可由外部中断低电平触发或由下降沿触发或者硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断继续工作

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

    打开52的头文件:
    在这里插入图片描述

    定义了PCON寄存器

    在这里插入图片描述

    但是PCON寄存器的每一位没有通过sbit进行位定义,所以程序中只能对寄存器操作,而不能操作单独某一位。

    若波特率不加倍,SMOD=0,程序:

    PCON=0; //00000000
    

    或者不用写上述语句,单片机上电后,PCON每一位都清零,默认SMOD=0。

    若波特率加倍,SMOD=1,程序:

    PCON=0x80; //10000000
    

    2、串行口控制寄存器SCON(Serial Control)

    51单片机的串行口是可编程全双工的通信接口,具有UART(通用异步收发器)的全部功能

    51单片机的串行口组成:俩个串行数据缓冲寄存器SBUF(一个发送缓冲寄存器,一个接收缓冲寄存器)、发送控制器、接收控制器、输入移位寄存器及若干控制门电路组成

    俩个SUBF数据缓冲寄存器共用一个地址,当执行写指令时,访问发送缓冲寄存器;当执行读指令时访问接收缓冲寄存器。从接收缓冲寄存器中读数据时,前一个字节还没有完全读出,就可以接收下一个字节,若第一个字节还没读出,下一个字节已经接收完毕,则会丢失第一个字节。

    位序号D7D6D5D4D3D2D1D0
    位符号SM0SM1SM2RENTB8RB8TIRI

    D7——SM0:工作方式选择位
    D6——SM1:工作方式选择位

    SM0、SM1设置串行口工作方式:

    SM0SM1方式功能说明
    000同步移位寄存器方式(通常用于扩展I/O口)
    01110位异步收发(8位数据),波特率可变(由定时器1的溢出率控制)
    01211位异步收发(9位数据),波特率固定
    11311位异步收发(9位数据),波特率可变(由定时器1的溢出率控制)

    D5——SM2多机通信控制位,主要用于方式2、3,暂时不用

    D4——REN——运行串行接收位,REN=1:运行串行口接收数据;REN=0:禁止串行口接收数据

    D3——TB8:方式2、3中发送数据的第9位(暂时不用)

    D2——RB8:方式2、3中接收数据的第9位(暂时不用),在方式1时,若SM2=0则接收数据时,停止位进RB8。

    D1——TI:发送中断标志位,在串行工作方式0时,当发送第8位结束时,或在其他方式,串行发送停止位开始时,由内部硬件使TI置1,向CPU发出中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。

    D0——RI:接收中断标志位,当串行工作方式0时接收第8位数据结束,或在其他方式,串行接收停止位开始时,由内部硬件使RI值1,向CPU发出中断申请,在中断服务程序中,必须用软件将其清0,取消此中断申请。

    打开52头文件:
    在这里插入图片描述

    可以看到SCON和SBUF寄存器都已经定义

    在这里插入图片描述
    SCON的每一位都已经定义,可以对每一位单独操作。

    五、串行口方式1+面向编程

    1、收、发时序图

    串行口方式1一帧数据共10位,1位起始位、8位数据位、1位停止位(起始位为0,终止位为1

    方式1数据发送时序图:
    在这里插入图片描述

    当数据写入SBUF后,单片机开始发送数据,起始位(0)、8位数据位、停止位(1)等10位数据依次发送,当发送停止位开始时,由内部硬件使TI置1,向CPU发出中断申请。在中断服务程序中,可以软件将其清0,取消此中断申请,也可以不清零,停止数据输出。

    方式1数据接收时序图:
    在这里插入图片描述
    首先需要串口接收允许,即REN=1(软件置1),当检测到RXD的电平发生负跳变,表示起始位已经开始,将其移入输入移位寄存器,并开始接收一帧的其他位(8位数据位、1位停止位),当接收到停止位时,将刚刚接收到的9位数据的前8位(即8位数据位)送入接收SBUF中,第9位(即停止位)进RB8(前提是SCON寄存器的SM2=0,之前总结过),并且RI=1,向CPU请求中断。

    2、实现流程

    ①确定定时器T1的工作方式(TMOD寄存器)
    T1计数器,所以低4位为0,高四位中,GATE=0,表示定时器开、关只收TR1控制;C/T=0,表示定时器;M1M0=10,表示工作方式2,8位自动重装载寄存器

    所以程序:

    TMOD=0x20;
    

    ②计算T1计数器的初值,转载TH1、TL1;
    前面第三部分总结过9600波特率时初值的方法,其他波特率计算方法相似。得出11.0592MHZ晶振波特率为9600,SMOD=0时初值为253,SMOD=1时初值为250。
    253——>11111101B——>0xfd
    250——>11111010B——>0xfa

    因为是八位寄存器,所以TH1和TL1只用到一个(不清楚用到哪个寄存器),TH1与TL1赋同样值就好了

    TH1=0xfd; //9600波特率  11.0592MHZ
    TL1=0xfd;
    

    这里不妨算一下串口通信的最大波特率,即当+1计数器每+1就中断,根据第三部分的计算方法:

    当SMOD=0时
    11059200/(X×32×12)=1,解之得:X=28800bps

    当SMOD=1时
    11059200/(X×16×12)=1,解之得:X=57600bps

    通过上述方法,可以得出可用的波特率(51全部可用波特率【全】)如下程序:

    /*   //11.0592MHZ晶振下
    //C51通用波特率配置定时器初值和PCON寄存器
    TH1=0xff; //SMOD=0  28800bps
    TL1=0xff; //SMOD=1  57600bps
    
    TH1=0xfe; //SMOD=0  14400bps
    TL1=0xfe; //SMOD=1  28800bps
    
    TH1=0xfd; //SMOD=0  9600bps
    TL1=0xfd;//SMOD=1   19200bps
    
    TH1=0xfa;//SMOD=0   4800bps
    TL1=0xfa;//SMOD=1   9600bps
    
    TH1=0xf4;//SMOD=0   2400bps
    TL1=0xf4;//SMOD=1   4800bps
    
    TH1=0xe8;//SMOD=0   1200bps
    TL1=0xe8;//SMOD=1   2400bps
    */
    

    ③启动T1计数器(TCON的TR1软件置1)
    当然启动T1之前需要打开全局中断允许位,即EA
    =1;打开串口中断允许位,即ES=1;

    EA=1//打开全局中断允许
    ES=1;//打开串口中断允许位
    TR1=1;//打开定时器1
    

    ④确定串行口工作方式(SCON寄存器)
    一般为工作方式1,即SM0=0;SM1=1;

    ⑤中断设置(发生中断后,需要处理什么?)

    六、经典例题

    例1:
    在上位机(上位机为电脑端,下位机为单片机)上用串口调试助手发送一个字符X,单片机收到后返回上位机“I get X”,串口波特率为9600bps
    分析:

    ①确定T1计数器工作方式

    TMOD=0x20;//工作方式2
    

    ②确定T1的初值

    TH1=0xfd;//SMOD=0
    TL1=0xfd;
    

    ③T1中断器配置

    EA=1;//打开全局中断允许
    ES=1;//打开定时器1中断允许
    TR1=1;//启动定时器
    

    ④确定串口工作方式

    SM0=0;
    SM1=1;//工作方式1
    REN=1;//允许串行口接收数据
    

    完整程序:

    #include <reg52.h>
    #define uchar unsigned char
    #define uint  unsigned int
    uchar flag,a,i;
    uchar code table[]="I get ";
    void main()
    {
    TMOD=0x20;//工作方式2
    TH1=0xfd;//SMOD=0
    TL1=0xfd;
    EA=1;//打开全局中断允许
    ES=1;//打开串口中断允许位
    TR1=1;//启动定时器
    SM0=0;
    SM1=1;//工作方式1
    REN=1;//允许串行口接收数据
    while(1)
    	{
    	if(flag==1)//表示接收缓冲区有数据
    		{
    			ES=0;//关闭串口中断,防止下次中断打断这次传送
    			for(i=0;i<6;i++)//table数组里的字符串末尾还有一个空格
    			{
    				SBUF=table[i];//单片机发送消息
    				while(!TI);//等待传送完成
    				TI=0;//一位一位的传送,分6次传送,每次传送完成T1都需软件置0
    			}
    			SBUF=a;
    			while(!TI);//等待传送完成
    			TI=0;
    			ES=1;
    			flag=0;
    		}
    	}
    }//注意是全双工,即同时收发,只要数据写入SBUF,单片机就开始传送数据
    
    void serial() interrupt 4//串行口中断,无论接收到数据还是发生数据,都调用
    {
    	RI=0;//接收数据完毕后发生中断,此时RI硬件置1,需在服务函数中软件置0
    	a=SBUF;
    	flag=1;//标志接收缓冲寄存器接收到一帧的数据
    }
    

    打开单片机的供电电路,发现单片机的引脚TXD与RXD即P31与P30接了USB接口,所以直接使用下载/供电的USB接口即可传送信号。当然也可以使用板子上的RS232接口,不过需要一个RS232转USB接电脑的USB接口。

    在这里插入图片描述
    下载完程序后,打开串口助手

    在这里插入图片描述在这里插入图片描述

    输入任何字符:

    在这里插入图片描述

    展开全文
  • 单片机-串行口.ppt

    2022-06-19 17:35:16
    单片机-串行口.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
  • 试编写一串行通信的数据发送程序,发送片内RAM的20H~2FH单元的16字节数据串行接口方式设定为方式2,采用偶校验方式。设晶振频率为6MHz。
  • 在开发微机控制系统的过程中,我们经常需要通过RS-232串行接口与外部设备进行通信。...在Windows下,Win32API提供了使用CreateFile/WriteFile等文件I/O函数进行串行口操作的方法,但是在实现上仍然是相当烦琐的。
  • 单片机的串行口及其应用..ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
  • 本文介绍了一种运用AT89C2051单片机实现异步串行数据再生,消除由于通信码速调整造成的异步串行数据波形畸变的方案,可应用于远程监控。
  • 工作数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,...

    方式0是外接串行移位寄存器方式。工作时,数据从RXD串行地输入/输出,TXD输出移位脉冲,使外部的移位寄存器移位。波特率固定为fosc/12(即,TXD每机器周期输出一个同位脉冲时,RXD接收或发送一位数据)。每当发送或接收完一个字节,硬件置TI=1或RI=1,申请中断,但必须用软件清除中断标志。

    实际应用在串行I/O口与并行I/O口之间的转换。

    2)方式1

    方式1是点对点的通信方式。8位异步串行通信口,TXD为发送端,RXD为接收端。一帧为10位,1位起始位、8位数据位(先低后高)、1位停止位。波特率由T1或T2的溢出率确定。

    在发送或接收到一帧数据后,硬件置TI=1或RI=1,向CPU申请中断;但必须用软件清除中断标志,否则,下一帧数据无法发送或接收。

    1f5f3d71343cc36382425a987cedd5f6.png

    (1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位1的左边全是0,检测电路检测到这一条件后,使控制电路作最后一次移位,/SEND和DATA无效,发送停止位,一帧结束,置TI=1。

    (2)接收:REN=1后,允许接收。接收器以所选波特率的16倍速率采样RXD端电平,当检测到一个负跳变时,启动接收器,同时把1FFH写入输入移位寄存器(9位)。由于接、发双方时钟频率有少许误差,为此接收控制器把一位传送时间16等分采样RXD,以其中7、8、9三次采样中至少2次相同的值为接收值。接收位从移位寄存器右边进入,1左移出,当最左边是起始位0时,说明已接收8位数据,再作最后一次移位,接收停止位。此后:

    A、若RI=0、SM2=0,则8位数据装入SBUF,停止位入RB8,置RI=1。

    B、 若RI=0、SM2=1,则只有停止位为1时,才有上述结果。

    C、若RI=0、SM2=1,且停止位为0,则所接数据丢失。

    D、若RI=1,则所接收数据丢失。

    无论出现那种情况,检测器都重新检测RXD的负跳变,以便接收下一帧。

    3)方式2、方式3

    方式2和方式3是9位异步串行通信,一般用在多机通信系统中或奇偶校验的通信过程。在通讯中,TB8和RB8位作为数据的第9位,位SM2也起作用。方式2与方式3的区别只是波特率的设置方式不同。

    (1)发送

    向SBUF写入一个数据就启动串口发送,同时将TB8写入输出移位寄存器第9位。开始时,SEND和DATA都是低电平,把起始位输出到TXD。DATA为高,第一次移位时,将‘1’移入输出移位寄存器的第9位,以后每次移位,左边移入‘0’,当TB8移到输出位时,其左边是一个‘1’和全‘0’。检测到此条件,再进行最后一次移位,/SEND=1,DATA=0,输出停止位,置TI=1。

    (2)接收

    置REN=1,与方式1类似,接收器以波特率的16倍速率采样RXD端。

    起始位0移到输入寄存器的最左边时,进行最后一次移位。在RI=0,SM2=0或接收到的第9位=1时,收到的一字节数据装入SBUF,第9位进入RB8,置RI=1;然后又开始检测RXD端负跳变。

    3、 多机通信

    在这里,多机系统是指‘一主多从’。51系列单片机中,利用第9位TB8/RB8来区分地址与数据信息,用位SM2确定接收方是否对地址或数据帧敏感。其原则是:

    1)发送方用第9位TB8=1标志地址帧,TB8=0标志数据帧。

    2)接收方若设置SM2=1,则只能接收到地址信息,若设SM2=0,则不管是地址还是数据帧,都能接收到。

    利用方式2、3的特点,在点对点的通讯中,在发送方可以用第9位TB8作为奇偶校验位。在接收方,SM2位必须清0。

    4、波特率

    1)方式0的波特率=fosc/12

    2)方式2的波特率=2^smod*fosc/64

    3)方式1、3的波特率由T1或T2的溢出率和SMOD位确定:

    (1)用T1:波特率=2^smod*T1定时器的溢出率/32,T1为方式2T1定时器溢出率=1/((12/fosc)*(256-X))例:已知fosc=6MHz,SMOD=0,设置波特率为2400,求T1的计数初值X。

    波特率=1/((12/fosc)*(256-X))/32=fosc/12*32(256-X)(256-X)=fosc/2400/384=6M/2400/384;256-X~=6.5104X~=250=FAH 只能近似计算。

    若fosc=11.0592MHz, 则256-X=11.0592M/2400/384=4068/384=12 X=F4H;可精确算出,对其它常用的标准波特率也是能正确算出。所以这个晶振频率是最常用的。

    如果SMOD=1,则同样的X初值得出的波特率加倍。

    (3)用T2:

    在52型单片机中,串口方式1、3的波特率发生器选择由TCLK、RCLK位确定是T1还是T2。若TCLK=1,则发送器波特率来自T2,否则来自T1。若RCLK=1,则接收器波特率来自T2,否则来自T1。

    由T2产生的波特率与SMOD无关。T2定时的最小单元=2/fosc。T2的溢出脉冲16分频后作为串口的发送或接收脉冲。

    波特率=(1/((2/fosc)(65536-X)))/16=fosc/(32(65536-X))例:已知fosc=11.0592MHz,求波特率=2400时的X2400=11059200/(32(65536-X)) 65536-X=144 X=65392=FF70H计数器初值寄存器:RCAP2H=0FFH,RCAP2L=70H。

    展开全文
  • 利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。发送方读入按键值,并发送给接收方,接收方收到数据后在LED上显示。
  • 单片机串行口.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~
  • 单片机的串行口及应用

    千次阅读 2019-12-18 21:51:06
    单片机的串行口及应用 通信方式: ​ 1.并行通信:数据的各位同时进行传送。速度快、效率高、成本高 ​ 2.串行通信:数据一位一位地按顺序进行传送。减少传输线、降低通信成本 按照数据传送方向: 单工、半双工、全...

    单片机的串行口及应用

    通信方式:

    ​ 1.并行通信:数据的各位同时进行传送。速度快、效率高、成本高

    ​ 2.串行通信:数据一位一位地按顺序进行传送。减少传输线、降低通信成本

    按照数据传送方向: 单工、半双工、全双工。一般情况下多数串行口工作在半双工,原因:用法简单。

    波特率: 每秒传送二进制属马的位数,单位pbs (位/秒),衡量的是数据的传输速率,常用的波特率有2400bps、4800bps、9600bps…等。接收端和发送端的比特率分别设置时,必须保证两者相同。

    串行通信的两种基本通信方式:

    1.异步通信;

    ​ 以字符(或字节)为单位组成的数据帧进行传送。一帧数据由 起始位、数据位、可编程校验位和停止位组成。
    在这里插入图片描述
    组成:起始位、数据位、可编程位、停止位。

    同步通信

    数据以块为单位连续进行的传送,在传送数据前首先通过同步信号保证发送和接收端同步(该同步信号一般由硬件实现)。然后连续传送整块数据。特点有同步时钟线。

    7.2 MCS-51 的串行口控制器

    串行口的内部结构

    MSC-51 内部有一个可编程的全算公共串行通信接口,可以作为通用异步就收/发送器(UART),也可作为同步移位寄存器,他的数据帧格式可分为 8位、10位、11位3 种。可设置多种不同的波特率。通过引脚RXD(P3.0)、TXD(P3.1)与外界进行通信。结构如图;
    在这里插入图片描述
    虚线框内部是串行口结构,包括 两个数据缓存器 SBUF 串行控制寄存器 SCON 发送和接受引脚。两个SBUF(发送/接收)在物理上是相互独立的,但是公用一个地址(99H),通过读写指令来区分到底是对那个SBUF进行操作。

    发送控制器的作用是在 门电路 和 定时器T1 的配合下将SBUF(发)的并行数据转换为串行数据并自动添加起始位、可编程位、停止位。这一过程结束可是发送中断请求标志位TI 自动置1,用于通知CPU已将数据发送到TXD引脚。

    接收控制器的作用是在 接收移位寄存器 和 定时器T1 的配合下将来自 RXD引脚 的串行数据转换为并行数据并自动过滤掉 起始位、可编程位、停止位。这一过程结束可是接收中断请求标志位RI 自动置1,用于通知CPU已将数据存入SBUF(收)。

    整体来看:发送的数据从SBUF(发)直接发出。接收的数据要先经过接收移位寄存器后才到达SBUF(收),接收完数据到SBUF(收)后接收端可通过接收移位寄存器立即接收下一帧数据。因此发送端为单缓冲结构,发送端为算换从结构,好处是避免在第二帧接受的数据到来时,CPU 未来得及接受地一帧数据而引起两针数据重叠错误。

    定时器T1的作用是产生用以接受过程中节拍控制的时钟信号(方波脉冲)。

    串行口控制寄存器

    两个:串行口控制寄存器SCON、电源控制俱存其PCON

    SCON串行口寄存器(98H)
    在这里插入图片描述
    SM2、TB8、RB8 主要用于多机通信.

    SM0SM1方式功能说明
    0008位同步移位寄存器方式
    01110位数据异步通信方式
    10211位数据异步通信方式
    11311位数据异步通信方式

    PCON电源控制寄存器(不可位寻址)
    在这里插入图片描述
    通信波特率的计算

    51单片机以定时器1作为波特率信号发生器,其溢出脉冲经过分频单元后送到手法控制器中,分频单元如图:

    波特率的计算公式:通讯时钟波特率 = fosc/(12*(2^n - a)) * 2^SMOD/32

    晶振频率 fosc 一定后波特率大小取决于 T1 的工作方式 你和计数初值 a,也取决于波特率选择为SMOD。

    7.3串行口工作方式0及其应用(8位同步移位寄存器方式)

    SM0 SM1 = 00 时为串口工作方式0状态,
    在这里插入图片描述
    ​ 串口方式0逻辑示意图

    数据帧8位为一帧,先传输低位,后传输高位。无起始位和停止位,都有P3.0引脚出入。通信固定频率为12分频晶振,出供给内部收发逻辑外还通过引脚P3.1输出,作为芯片接口的移位时钟信号。

    工作方式 0 并不用于串行通信,而是通过串并转换用于扩展单片机I/O口。方式0通常与移位寄存器芯片配合使用。

    实例1 二级管循环显示

    /*

    */

    7.4串行工作方式1及其应用(10位数据异步通信方式 )

    SM0 SM1 = 10 时为串行口工作方式1状态,与方式0相比方式1发生了如下变化

    1.通信时钟波特率是可变的,由软件设定为不同速率,其值为:

    ​ fosc/(12*(2^n - a)) * 2^SMOD/32

    因此,串行口工作方式一 初始化时要设置 TMOD(CATE、C/T、M1、M0)、PCON(SMOD),并确定计数器初值a。
    在这里插入图片描述
    2.发送数据由TXD(P3.1)接收数据RXD(P3.2).需经过接收移位寄存器换从输入,初始化时需设置SCON(RI,TI、REN、SM1,SM0).

    数据帧由十位组成,1位起始位 1位终止位 八位数据位。主要用于点对点串行通信

    7.5串行工作方式2及其应用(11位数据异步通信方式 )

    SM0 SM1 = 10 时为串行口工作方式2;

    1.与方式1相比,数据帧有11为组成,1位起始位、8位数据位、1位可编程位、1位停止位。在发送时 TB8 的值可以自动被添加到数据真的第 9 位并随数据帧一起发送。接收时 数据帧的第 9 位可自动被送入 RB8 中第九位数据可有用户安排,可以做为奇偶校验位也可做其他控制位。

    2.通信时钟频率是固定的,可由 SMOD 设置为 1/32或1/64晶振频率。即 2^SMOD/64 * fosc 。初始化时仅需要设置PCON。

    3.发送完成后(SBUF发 为空),TI自动置1 ;但接收完成后(SBUF收 为空),RI的状态要由 SM2 和 RB8 共同决定。若SM2 = 1,仅当 RB8 = 1 时接受逻辑单元才能使 RI置 1。 若此时RB8 = 0 则接收逻辑单元也无法使RI 置1.。 反之若 SM2 = 0 无论 RB8 为何值,接收逻辑单元都能使 RI 置 1.

    7.6 串行工作方式3及其应用(11位数据异步通信方式)

    SM0、SM1 = 11 时串行口工作在方式 3。与方式2相比 方式 3 的波特率是可变的。(其余都与方式 2 相同)

    fosc/(12 * (2^n - a)) * 2^ SMOD /64

    方式3 主要用于要求进行错误校验或者 主从式 系统通信的场合。 每个从机都有各自独立的地址00H、11H等,从机初始化都设置为串口方式 2 或 3,并使 SM2 = REN = 1(多机通信、允许接收),开放串口中断。主机向某从机发送命令时先发送目标从机的地址给所有从机,之后再发送数据或命令信息。主机发送的地址信息的第 9 位为 1 。数据或命令信息的第九位 为 0 .

    从机接受到地址信息后。从机接收到的第九位都为 1 ,都能激活中断。在中断函数里比对 本机地址与发来的地址对比相符使本机 SM2 为0 . 不相等继续保持为1。

    展开全文
  • 摘 要 阐述了利用调频立体声基带传送数据的技术原理,介绍了信息发送/接收系统的配置及实现方法,重点介绍了最新研制成功的、在系统中起关键作用的FM-RE602编码器和RDS信息接收卡。关键词 调频立体声 广播数据...
  • 该接口电路不仅能同时进行数据发送和接收,也可作为一个同步移位寄存器使用。当以此类型单片机构成分布式多级应用系统,器件本身的串口资源就不够用了。笔者在实际开发中,查阅了有关资料,总结出如下两种常用而...
  • 用串行口扩展并行输... 掌握利用串行口和移位寄存器扩展并行接口的方法 二、实验内容 打开ISIS 7 Professional,参照图8.1设计仿真电路原理图 编写程序实现: (1)用查询TI方式,在7段BCD数码管显示器上循环显...
  • 20.串行口通信原理及操作流程

    千次阅读 2020-09-20 20:53:57
    第六章:串行口通信原理及操作流程 6.1并行与串行基本通行方式 单片机通信是指单片机与计算机或单片机与单片机之间的信息交换,后者的通信通常用的较多。 通信有并行和串行龄种方式,在单片机系统以及现代单片机测控...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,911
精华内容 7,164
关键字:

利用串行口发送数据时