找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10268|回复: 1
打印 上一主题 下一主题
收起左侧

基于89C51单片机串口通信程序的设计

[复制链接]
跳转到指定楼层
楼主
ID:104835 发表于 2016-2-4 04:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

        MCS-51系列单片机上有一个通用异步接收/发送器UART,通过引脚RXD[P3.O]和TXD[P3.1]可与外音B电路进行全双工的串行异步通信,发送数据时由TXD端送出,接收时数据由RXD端输入。本文将具体介绍单片机串口的特点和编程方法,并且在最后给出一个实用的单片机与计算机通过串口通信的程序。
   
    串行接口的基本特点



   
   
        MCS-51单片机的串行端口有4种基本工作方式,通过编程设置,可以使其工作在任一方式,以满足不同场合的需要。其中方式0主要用于外接移位寄存器,以扩展单片机的I/O电路;工作方式1多用于双机之间或与外设电路的通信;方式2、3除有方式1的功能外,还可以作多机通信,以构成分布式多微机系统。

       串行端口有两个控制寄存器SCON、PCON,用于设置工作方式、发送或接收的状态、特征位、数据传送波特率[每秒传送的位数]以及作为中断标志等。

   
       串行端口有一个数据寄存器SBUF[在特殊功能寄存器中的字节地址为99H],该寄存器为发送和接收所共用。发送时,只写不读;接收时,只读不写。在一定条件下,向SBuF写入数据就启动了发送过程;读SBuF就启动了接收过程。

       串行端口的波特率可以用程序来控制。在不同工作方式中,由时钟振荡频率的分频值或由定时器T1的定时溢出时间确定,使用十分方便灵活。
   
    串口控制寄存器
   
    1. 特殊功能寄存器SCON

    它用于定义串行口的工作方式及实施接收和发送控制。字节地址为98H,其各位定义如下表:



    SM0、SM1:串行口工作方式选择位,其定义如下:


   
SM2:多机通讯控制位,仅用于方式2和方式3。当发送数据时SM2必须有软件设置为1;接收数据时,如果SM2=1只有接收到的第9位数据为1时,RI才置位;如果SM2=0只要接收第9位数据,RI就置位。

    REN:接收允许控制位。由软件置位(REN=1)才允许接收,又由软件清O(REN=0)来禁止接收。

   
TB8:是要发送数据的第9位。在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。例如。可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。

   
RB8:接收到的数据的第9位。在方式0中不使用RB8。在方式1中,若(SM2)=O,RB8为接收到的停止位。在方式2或方式3中,RB8为接收到的第9位数据。

   
TI:发送中断标志。发送数据前必须软件清0,发送过程中TI一直为0,当发送完一帧数据后,由硬件自动置1。如果要再发送,必须用软件再清0。在编写串行通信程序的时候,可以使用软件查询TI的方法获得数据是否已发送完毕。

   
RI:接收中断标志位。接收数据前必须软件清0,接收过程中RI一直为0,当接收完一帧数据后,由硬件自动置1。如果要再接收,必须用软件再清0。在编写串行通信程序的时候,可以使用软件查询RI的方法获得数据是否已接收完毕。

    2. 特殊功能寄存器PCON

    PCON的字节地址为87H,它的第7位SMOD是与串口的波特率设置有关的选择位。


    SMOD:波特率加倍位。在计算串行方式1、2、3的波特率时SMOD=0波特率不加倍;SMOD=1波特率加倍。
   
    MCS-51单片机的串行的工作方式
   
    MCS-51单片机的全双工串行口可编程为4种工作方式,现分述如下:

    1方式O

    方式0为移位寄存器输入/输出方式。可外接移位寄存器以扩展I/O口,也可以外接同步输入/输出设备。波特率固定为fosc/12,其中fosc为时钟频率。

    8位串行数据是从RXD输入或输出,TXD用来输出同步脉冲。

   
输出:串行数据从RXD引脚输出,TXD引脚输出移位脉冲。CPU将数据写入发送寄存器SBUF时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后。发送完一帧数据后,发送中断标志TI由硬件置位。

   
输入:RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。当(R1)=0且(REN)=1时,开始接收。当接收到第8位数据时,将数据移入接收寄存器,并由硬件置位RI。


   
左面两图分别是方式0扩展输出和输入的接线图,74LS164/74LS165是移位寄存器,将单片机输出的串行数据变为8位并行数据,将外部输入的8位并行数据变成串行数据。

    2方式1

    方式1为波特率可变的10位异步通讯接口方式。发送或接收一帧信息,包括1个起始位0,8个数据位和1个停止位1。其中的起始位和停止位在发送时自动插入的。

    输出:当CPU执行一条指令将数据写入发送缓冲SBUF且TI=0时,就启动发送。串行数据从TXD引脚输出,发送完一帧数据后,就由硬件置位TI。

   
输入:在(REN)=1时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。只有当8位数据接收完,并检测到高电平停止位后,只有满足①(R1)=0;②(SM2)=0或接收到的第9位数据为1时,停止位才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志RI;否则信息丢失。所以在方式1接收时,应先用软件清零RI和SM2标志。

    3. 方式2

    方式2为固定波特率的11位uART方式。它比方式1增加了一位可程控为1或0的第9位数据。

   
输出:发送的串行数据由TXD端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。当CPu执行一条数据写入SuBF的指令且TI=0时,就启动发送器发送。发送一帧信息后,置位中断标志TI。

   
输入:在(REN)=1时,串行口采样RXD引脚,当采样到1至O的跳变时,确认是串行发送来的一帧数据的开始位0,从而开始接收一帧数据。在接收到附加的第9位数据后,当满足①(RI):0;②(SM2)=0或接收到的第9位数据为1时,第9位数据才进入RB8,8位数据才能进入接收寄存器,并由硬件置位中断标志Ri;否则信息丢失。且不置位RI。

    4. 工作方式3

    方式3为波特率可变的11位UART方式。除波特率外,其余与方式2相同。
   
    波特率的选择
   
   
如前所述,在串行通讯中,收发双方的数据传送率(波特率)要有一定的约定。在MCS-51串行口的四种工作方式中,方式0和2的波特率是固定的,而方式1和3的波特率是可变的,由定时器T1的溢出率控制。

    1.方式O

    方式0的波特率固定为主振频率  的1/12。

    2.方式2

   
方式2的波特率由PCON中的选择位SMOD来决定,可表示为:波特率=2sMoD×fosc/64也就是当SMOD=1时,波特率为1/32×fosc,当SMOD=0时,波特率为1/64×fosc。

    3.方式1和方式3

    定时器T1作为波特率发生器,其公式如下:

    波特率=2SMOD/32×定时器T1溢出率

    T1溢出率=T1计数率/产生溢出所需的周期数

   
式中T1计数率取决于它工作在定时器状态还是计数器状态。当工作于定时器状态时,T1计数率为fOSC门2:当工作于计数器状态时,T1计数率为外部输入频率,此频率应小于fOSC/24。产生溢出所需周期与定时器T1的工作方式、T1的预置值(×]有关。

    定时器T1工作于方式O:溢出所需周期数=8192-×

    定时器T1工作于方式1:溢出所需周期数=65536-X

    定时器T1工作于方式2:溢出所需周期数=256-X

    因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。这种方式下,T1的溢出率[次/秒]计算式可以表示为:

    T1溢出率=fsoc/12[256-X]

    于是波特率(位/秒)表达式为:


    当时钟频率选用11.0592MHz时,取易获得标准的波特率,所以很多单片机系统选用这个看起来“怪”的晶振就是这个道理。
左表列出了定时器T1工作于方式2常用波特率及初值。













分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:241196 发表于 2017-10-20 10:33 | 只看该作者
代码呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表