单片机原理与接口技术7课件.ppt_第1页
单片机原理与接口技术7课件.ppt_第2页
单片机原理与接口技术7课件.ppt_第3页
单片机原理与接口技术7课件.ppt_第4页
单片机原理与接口技术7课件.ppt_第5页
已阅读5页,还剩211页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 第七章89C51串行口及串行通信技术 7 1串行通信基本知识7 2串行口及应用7 3RS 232C标准接口总线及串行通信硬件设计7 489C51与89C51点对点异步通信7 589C51与PC机间通信软件的设计7 6PC机与多个单片机间的通信 2 7 0绪 如89C51与存储器 存储器与存储器 89C51与并行打印机之间的通信 89C51处理8位数据 至少需要8条数据线 计算机之间 计算机与其终端之间的距离有时非常远 此时 电缆线过多是不经济的 数据传送 并行方式 3 串行通信只用一位数据线传送数据的位信号 即使加上几条通信联络控制线 也用不了很多电缆线 串行通信适合远距离数据传送 如大型主机与其远程终端之间 处于两地的计算机之间采用串行通信就非常经济 串行通信要求有转换数据格式 时间控制等逻辑电路 这些电路目前已被集成在大规模集成电路中 称为可编程串行通信控制器 使用很方便 7 0绪 数据传送 串行方式 4 本章将介绍89C51串行口的结构及应用 一台PC机控制多台89C51前沿机的分布式系统 通信接口电路和软件设计 并给出设计实例 包括接口电路 程序框图 主程序和接收 发送子程序 7 0绪 5 7 1串行通信基本知识 7 1 1数据通信7 1 2串行通信的传输方式7 1 3异步通信和同步通信7 1 4串行通信的过程及通信协议 6 7 1 1数据通信 通信CPU与外设之间进行信息交换 多台计算机之间也往往要交换信息 所有这些信息交换均可称为通信 通信方式有两种 并行通信和串行通信 7 7 1 1数据通信 通常根据信息传送的距离决定采用哪种通信方式 例如 PC机与外部设备 如打印机等 通信时 如果距离小于30m 可采用并行通信方式 当距离大于30m时 则要采用串行通信方式 89C51单片机具有并行和串行二种基本通信方式 8 并行通信数据的各位同时进行传送 发送或接收 的通信方式 优点传送速度快 缺点数据有多少位 就需要多少根传送线 并行通信在位数多 传送距离又远时不合适 7 1 1数据通信 9 串行通信数据是一位一位按顺序传送的通信方式 优点只需一对传输线 利用电话线就可作为传输线 大大降低了传送成本 适用远距离通信 缺点传送速度较低 设并行传送N位数据所需时间位T 那么串行传送的时间至少为NT 实际上总是大于NT的 7 1 1数据通信 10 11 7 1 2串行通信的传输方式 串行通信的传送方式通常有三种 单向 或单工 半双向 或半双工 全双向 全双工 12 7 1 2串行通信的传输方式 单向 或单工 只允许数据向一个方向传送半双向 或半双工 允许数据向两个方向中的任一方向传送 但每次只能有一个站点发送全双向 全双工 允许同时双向传送数据 因此 全双工配置是一对单向配置 它要求两端的通信设备都具有完整和独立的发送和接受能力 13 串行通信中的数据传送方式 14 7 1 3异步通信和同步通信 串行通信两种基本方式 异步通信和同步通信1 异步通信数据是一帧一帧 包括一个字符代码或一字节数据 传送的 每一帧的数据格式如图所示 15 图异步通信数据格式 16 1 异步通信 在帧格式中 一个字符由四个部分组成 起始位 数据位 奇偶校验位 停止位首先是一个起始位 0 然后是5位 8位数据 规定低位在前 高位在后 接下来是奇偶校验位 可省略 最后是停止位 1 17 1 异步通信 起始位 0 信号只占用一位 用来通知接收设备一个待接收的字符开始到达 线路上在不传送字符时应保持为1 接收端不断检测线路的状态 若连续为1以后又测到一个0 就知道发来一个新字符 应马上准备接收 字符的起始位还被用作同步接收端的时钟 以保证以后的接收能正确进行 数据位 起始位后面紧接着是数据位 它可以是5位 6位 7位或8位 18 1 异步通信 奇偶校验 D8 只占一位 但在字符中也可以规定不用奇偶校验位 则这一位就可省去 也可用这一位 1 0 来确定这一帧中的字符所代表信息的性质 地址 数据等 停止位 用来表征字符的结束 它一定是高电位 逻辑1 停止位可以是1位 1 5位或2位 接收端收到停止位后 知道上一字符已传送完毕 同时 也为接收下一个字符做好准备 只要再接收到0 就是新的字符的起始位 若停止位以后不是紧接着传送下一个字符 则使线路电平保持为高电平 逻辑1 19 例如 规定用ASCII编码 字符为七位 加一个奇偶校验位 一个起始位 一个停止位 则一帧共十位 1 异步通信 20 2 同步通信 在数据开始传送前用同步字符来指示 常约定1个 2个 并由时钟来实现发送端和接收端同步 即检测到规定的同步字符后 下面就连续按顺序传送数据 直到通信告一段落 同步传送时 字符与字符之间没有间隙 也不用起始位和停止位 仅在数据块开始时用同步字符SYNC来指示 其数据格式如图所示 21 图同步通信数据格式 22 2 同步通信 同步字符的插入可以是单同步字符方式或双同步字符方式 如图所示 然后是连续的数据块 同步字符可由用户约定 按同步方式通信时 先发送同步字符 接收方检测到同步字符后 即准备接收数据 在同步传送时 要求用时钟来实现发送端与接收端之间的同步 为了保证接收正确无误 发送方除了传送数据外 还要同时传送时钟信号 同步传送可以提高传输速率 达56kb s或更高 但硬件比较复杂 23 3 波特率 Baudrate 波特率 即数据传送速率 表示每秒钟传送二进制代码的位数 它的单位是b s 波特率对于CPU与外界的通信是很重要的 假设数据传送速率是120字符 s 而每个字符格式包含10个代码位 1个起始位 1个终止位 8个数据位 这时 传送的波特率为 10b 字符 120字符 s 1200b s 24 3 波特率 Baudrate 每一位代码的传送时间Td为波特率的倒数 Td 1b 1200bs 1 0 833ms异步通信的传送速率在50b s 19200b s之间 常用于计算机到终端机和打印机之间的通信 直通电报以及无线电通信的数据发送等 25 7 1 4串行通信的过程及通信协议 1 串 并转换与设备同步两个通信设备在串行线路上成功地实现通信必须解决两个问题 一是串 并转换 即如何把要发送的并行数据串行化 把接收的串行数据并行化 二是设备同步 即同步发送设备与接收设备的工作节拍 以确保发送数据在接收端被正确读出 26 1 串 并转换串行通信是将计算机内部的并行数据转换成串行数据 将其通过一根通信线传送 并将接收的串行数据再转换成并行数据送到计算机中 27 在计算机串行发送数据之前 计算机内部的并行数据被送入移位寄存器并一位一位地输出 将并行数据转换成串行数据 如图所示 在接收数据时 来自通信线路的串行数据被压入移位寄存器 满8位后并行送到计算机内部 如图所示 在串行通信控制电路中 串 并 并 串转换逻辑被集成在串行异步通信控制器芯片中 28 29 30 2 设备同步 进行串行通信的两台设备必须同步工作才能有效地检测通信线路上的信号变化 从而采样传送数据脉冲 设备同步对通信双方有两个共同要求 一是通信双方必须采用统一的编码方法 二是通信双方必须能产生相同的传送速率 31 采用统一的编码方法确定了一个字符二进制表示值的位发送顺序和位串长度 当然还包括统一的逻辑电平规定 即电平信号高低与逻辑1和逻辑0的固定对应关系 通信双方只有产生相同的传送速率 才能确保设备同步 这就要求发送设备和接收设备采用相同频率的时钟 发送设备在统一的时钟脉冲上发出数据 接收设备才能正确检测出与时钟脉冲同步的数据信息 32 2 串行通信协议 通信协议是对数据传送方式的规定 包括数据格式定义和数据位定义等 通信双方必须遵守统一的通信协议 串行通信协议包括同步协议和异步协议两种 在此只讨论异步串行通信协议和异步串行协议规定的字符数据的传送格式 33 2 串行通信协议 1 起始位通信线上没有数据被传送时处于逻辑1状态 当发送设备要发送一个字符数据时 首先发出一个逻辑0信号 这个逻辑低电平就是起始位 起始位通过通信线传向接收设备 接收设备检测到这个逻辑低电平后 就开始准备接收数据位信号 起始位所起的作用就是设备同步 通信双方必须在传送数据位前协调同步 34 2 串行通信协议 2 数据位当接收设备收到起始位后 紧接着就会收到数据位 数据位的个数可以是5 6 7或8 89C51串行口采用8位或9位数据传送 这些数据位被接收到移位寄存器中 构成传送数据字符 在字符数据传送过程中 数据位从最低有效位开始发送 依次顺序在接收设备中被转换为并行数据 35 2 串行通信协议 3 奇偶校验位数据位发送完之后 可以发送奇偶校验位 奇偶校验用于有限差错检测 通信双方需约定已知的奇偶校验方式 如果选择偶校验 那么组成数据位和奇偶位的逻辑1的个数必须是偶数 如果选择奇校验 那么逻辑1的个数必须是奇数 36 2 串行通信协议 4 停止位在奇偶位或数据位 当无奇偶校验时 之后发送的是停止位 停止位是一个字符数据的结束标志 可以是1位 1 5位或2位的高电平 接收设备收到停止位之后 通信线路上便又恢复逻辑1状态 直至下一个字符数据的起始位到来 37 2 串行通信协议 5 波特率设置通信线上传送的所有位信号都保持一致的信号持续时间 每一位的信号持续时间都由数据传送速度确定 而传送速度是以每秒多少个二进制位来衡量的 这个速度叫波特率 如果数据以300个二进制位每秒在通信线上传送 那么传送速度为300波特 通常记为300b s 38 2 串行通信协议 6 挂钩 握手 信号约定 见本章7 4节实例 39 7 2串行口及应用 7 2 189C51串行口7 2 289C51串行口的工作方式及应用 40 7 2 189C51串行口 1 结构2 串行口控制字及控制寄存器3 串行通信工作方式4 波特率设计 41 1 结构 引脚RXD P3 0 串行数据接收端 引脚TXD P3 1 串行数据发送端 内部有两个物理独立的接收 发送缓冲器SBUF 占用同一地址99H 可同时发送 接收数据 发送缓冲器只能写入 不能读出 接收缓冲器只能读出 不能写入 串行发送与接收的速率与移位时钟同步 89C51用定时器T1作为串行通信的波特率发生器 T1溢出率经2分频 或不分频 后又经16分频作为串行发送或接收的移位脉冲 移位脉冲的速率即是波特率 42 图串行口内部结构示意简图 43 1 结构 接收器是双缓冲结构 在前一个字节被从接收缓冲器SBUF读出之前 第二个字节即开始被接收 串行输入至移位寄存器 但是 在第二个字节接收完毕而前一个字节CPU未读取时 会丢失移位寄存器的字节数据 串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读或写的 当向SBUF发 写 命令时 MOVSBUF A即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据 发送完便使发送中断标志位TI 1 44 1 结构 在满足串行口接收中断标志位RI SCON 0 0的条件下 置允许接收位REN SCON 4 1就会接收一帧数据进入移位寄存器 并装载到接收SBUF中 同时使RI 1 当发读SBUF命令时 MOVA SBUF便由接收缓冲器 SBUF 取出信息通过89C51内部总线送CPU 对于发送缓冲器 因为发送时CPU是主动的 不会产生重叠错误 一般不需要用双缓冲器结构来保持最大传送速率 45 2 串行口控制字及控制寄存器 89C51串行口是可编程接口 用到两个特殊功能寄存器 SCON 98H PCON 87H 电源控制寄存器 1 SCON 98H 89C51串行通信的方式选择 接收和发送控制以及串行口的状态标志等均由特殊功能寄存器SCON控制和指示 其控制字格式如图所示 46 图串行口控制寄存器SCON 47 2 串行口控制字及控制寄存器 SM0和SM1 SCON 7 SCON 6 串行口工作方式选择位 两个选择位对应4种通信方式 如表7 1所示 其中 fosc是振荡频率 48 2 串行口控制字及控制寄存器 SM2 SCON 5 多机通信控制位 主要用于方式2和方式3 若置SM2 1 则允许多机通信 当一片89C51 主机 与多片89C51 从机 通信时 所有从机的SM2位都置1 主机首先发送的一帧数据为地址 即从机机号 其中第9位为1 所有的从机接收到数据后 将其中第9位装入RB8中 各个从机根据收到的第9位数据 RB8中 的值来决定从机可否再接收主机的信息 若 RB8 0 说明是数据帧 则使接收中断标志位RI 0 信息丢失 若 RB8 1 说明是地址帧 数据装入SBUF并置RI 1 中断所有从机 被寻址的目标从机清除SM2以接收主机发来的一帧数据 其他从机仍然保持SM2 1 49 2 串行口控制字及控制寄存器 SM2 SCON 5 多机通信控制位 主要用于方式2和方式3 若SM2 0 即不属于多机通信情况 则接收一帧数据后 不管第九位数据是0还是1 都制RI 1 接收到的数据装SBUF 根据SM2这个功能 可实现多个89C51应用系统的串行通信 在方式1时 若SM2 1 则只有接收到有效停止位时 RI才置1 以便接收下一帧数据 在方式0时 SM2必须是0 50 2 串行口控制字及控制寄存器 REN SCON 4 允许接收控制位 由软件置1或清0 只有当REN 1时才允许接收 相当于串行接收的开关 若REN 0 则禁止接收 在串行通信接收控制过程中 如果满足RI 0和REN 1 允许接收 的条件 就允许接收 一帧数据就装载入接收SBUF中 51 2 串行口控制字及控制寄存器 TB8 SCON 3 发送数据的第9位 D8 装入TB8中 在方式2或方式3中 根据发送数据的需要由软件置位或复位 在许多通信协议中可用作奇偶校验位 也可在多机通信中作为发送地址帧或数据帧的标志位 对于后者 TB8 1 说明该帧数据为地址 TB8 0 说明该帧数据为数据字节 在方式0或方式1中 该位未用 52 2 串行口控制字及控制寄存器 RB8 SCON 2 接收数据的第9位 在方式2或方式3中 接收到的第9位数据放在RB8位 或是约定的奇 偶校验位 或是约定的地址 数据标识位 在方式2和方式3多机通信中 若SM2 1 如果RB8 1 说明收到的数据为地址帧 在方式1中 若SM2 0 即不是多机通信情况 RB8中存放的是已接收到的停止位 在方式0中 该位未用 53 2 串行口控制字及控制寄存器 TI SCON 1 发送中断标志 在一帧数据发送完时被置位 在方式0串行发送第8位结束或其他方式串行发送到停止位的开始时由硬件置位 可用软件查询 它同时也申请中断 TI置位意味着向CPU提供 发送缓冲器SBUF已空 的信息 CPU可以准备发送下一帧数据 串行口发送中断被响应后 TI不会自动清0 必须由软件清0 54 2 串行口控制字及控制寄存器 RI SCON 0 接收中断标志 在接收到一帧有效数据后由硬件置位 在方式0中 第8位数据发送结束时 由硬件置位 在其他三种方式中 当接收到停止位中间时由硬件置位 RI 1 申请中断 表示一帧数据接收结束 并已装入接收SBUF中 要求CPU取走数据 CPU响应中断 取走数据 RI也必须由软件清0 清除中断申请 并准备接收下一帧数据 55 2 串行口控制字及控制寄存器 2 PCON 87H 电源控制寄存器PCON中只有SMOD位与串行口工作有关 如图所示 图电源控制寄存器PCON 56 2 串行口控制字及控制寄存器 SMOD PCON 7 波特率倍增位 在串行口方式1 方式2和方式3时 波特率和SMOD成正比 亦即当SMOD 1时 波特率提高一倍 复位时 SMOD 0 57 3 串行通信工作方式 根据实际需要 89C51串行口可设置4种工作方式 可有8位 10位或11位帧格式 方式0以8位数据为一帧 不设起始位和停止位 先发送或接收最低位 其帧格式如下 58 方式1以10位为一帧传输 设有1个起始位 0 8个数据位和1个停止位 1 其帧格式为 3 串行通信工作方式 59 3 串行通信工作方式 方式2和方式3以11位为1帧传输 设有1个起始位 0 8个数据位 1个附加第9位和1个停止位 1 其帧格式为 附加第9位 D8 由软件置1或清0 发送时在TB8中 接收时送RB8中 60 同步移位寄存器输入 输出方式 常用于扩展I O口RXD 数据输入或输出端 TXD 输出移位时钟 作为外接部件的同步信号这种方式不适用于两个89C51之间的直接数据通信 但可以通过外接移位寄存器来实现单片机的接口扩展 1 串行口方式0 61 图方式0发送电路及时序 62 图方式0接收电路及时序 63 74LS164可用于扩展并行输出口 74LS165可用于扩展输入口 在这种方式下 收 发的数据为8位 低位在前 无起始位 奇偶校验位及停止位 波特率是固定的 64 发送过程中 当执行一条将数据写入发送缓冲器SBUF 99H 的指令时 串行口把SBUF中8位数据以fosc 12的波特率从RXD P3 0 端输出 发送完毕置中断标志TI 1 方式0发送时序如图所示 写SBUF指令在S6P1处产生一个正脉冲 在下一个机器周期的S6P2处数据的最低位输出到RXD P3 0 脚上 再在下一个机器周期的S3 S4 S5输出移位时钟为低电平 而在S6及下一个机器周期的S1 S2为高电平 就这样将8位数据由低位至高位一位一位顺序通过RXD线输出 并在TXD脚上输出fosc 12的移位时钟 在 写SBUF 有效后的第10个机器周期的S1P1将发送中断标志TI置位 65 接收时 用软件置REN 1 同时 RI 0 即开始接收 接收时序如图所示 当使SCON中的REN 1 RI 0 时 产生一个正脉冲 在下一个机器周期的S3P1 S5P2 从TXD P3 1 脚上输出低电平的移位时钟 在此机器周期的S5P2对P3 0脚采样 并在本机器周期的S6P2通过串行口内的输入移位寄存器将采样值移位接收 在同一个机器的S6P1到下一个机器周期的S2P2 输出移位时钟为高电平 于是 将数据字节从低位至高位一位一位地接收下来并装入SBUF中 在启动接收过程 即写SCON 清RI位 将SCON中的RI清0之后的第10个机器周期的S1P1 RI被置位 这一帧数据接收完毕 可进行下一帧接收 66 3 串行通信工作方式 2 串行口方式1真正用于串行发送或接收 为10位通用异步接口 TXD与RXD分别用于发送与接收数据 收发一帧数据的格式为1位起始位 8位数据位 1位停止位 共10位 低位在前 在接收时 停止位进入SCON的RB8 此方式的传送波特率可调 串行口方式1的发送和接收时序如图所示 67 图方式1发送和接收时序 68 数据从引脚TXD P3 1 端输出 当执行数据写入发送缓冲器SBUF的命令时 就启动了发送器开始发送 发送时的定时信号 也就是发送移位时钟 TX时钟 是由定时器T1送来的溢出信号经过16分频或32分频 取决于SMOD的值 而得到的 TX时钟就是发送波特率方式1的波特率是可变的 发送开始的同时 SEND变为有效 将起始位向TXD输出 此后每经过一个TX时钟周期产生一个移位脉冲 并由TXD输出一个数据位 8位数据位全部发送完后 置为位TI 并申请中断置TXD为1作为停止位 再经一个时钟周期 SEND失效 方式1发送时 69 数据从引脚RXD P3 0 端输入 接收是在SCON寄存器中REN位置1的前提下 并检测到起始位 RXD上检测到1 0的跳变 即起始位 而开始的 接收时 定时信号有两种 如图 b 所示 一种是接收移位时钟 RX时钟 它的频率和传送波特率相同 也是由定时器T1的溢出信号经过16或32分频而得到的 另一种是位检测器采样脉冲 它的频率是RX时钟的16倍 即在一位数据期间有16位检测器采样脉冲 为完成检测 以16倍于波特率的速率对RXD进行采样 方式1接收时 70 为了接受准确无误 在正式接受数据之前 还必须判定这个1 0跳变是否是干扰引起的 为此 在这位中间 即一位时间分成16等份 在第7 第8及第9等份 连续对RXD采样三次 取其中两次相同的值进行判断 这样能较好地消除干扰的影响 当确认是真正的起始位 0 后 就开始接受一帧数据 当一帧数据接受完毕后 必须同时满足以下两个条件 这次接受才真正有效 71 RI 0 即上一帧数据接收完成时 RI 1发出的中断请求已被响应 SBUF中数据已被取走 由软件使RI 0 以便提供 接收SBUF已空 的信息 SM2 0或收到的停止位为1 方式1时 停止位进入RB8 则将接收到的数据装入串行口的SBUF和RB8 RB8装入停止位 并置位RI 如果不满足 接收到的数据不能装入SBUF 这意味着该帧信息将会丢失 值得注意的是 在整个接收过程中 保证REN 1是一个先决条件 只有当REN 1时 才能对RXD进行检测 72 3 串行通信工作方式 3 串行口方式2和方式3两种方式操作是一样的 所不同的只是波特率 每帧11位异步通信格式 即1位起始位 8位数据位 低位在前 1位可编程的第9数据位和1位停止位 发送时 第9数据位 TB8 可以设置为1或0 也可将奇偶位装入TB8 从而进行奇偶校验 接收时 第9数据位进入SCON的RB8 发送 接收时序如图所示 73 图方式2 方式3发送和接收时序 74 发送前 先根据通信协议由软件设置TB8 如作奇偶校验位或地址 数据标志位 然后将要发送的数据写入SBUF 即可启动发送过程 串行口能自动把TB8取出 并装入到第9位数据位的位置 再逐一发送出去 发送完毕 使TI 1 接收时 使SCON中的REN 1 允许接收 当检测到RXD P3 0 端有1 0的跳变 起始位 时 开始接收9位数据 送入移位寄存器 9位 当满足RI 0且SM2 0 或接收到的第9位数据为1时 前8位数据送入SBUF 附加的第9位数据送入SCON中的RB8 置RI为1 否则 这次接收无效 也不置位RI 75 4 波特率设计 串行口的四种工作方式对应着三种波特率 由于输入的移位时钟来源不同 因此 各种方式的波特率计算公式也不同 76 方式0时 发送或接收一位数据的移位时钟脉冲由S6 即第6个状态周期 第12个节拍 给出 即每个机器周期产生一个移位时钟 发送或接收一位数据 因此 波特率固定为振荡频率的1 12 并不受PCON寄存器中SMOD位的影响 图串行口方式0波特率的产生 1 方式0的波特率 77 方式0波特率 fosc 12注意 符号 表示左面的表达式只是引拥右面表达式的数值 即右面的表达式是提供了一种计算的方法 78 2 方式2的波特率 SMOD 0时 波特率为fosc的1 64 SMOD 1时 波特率为fosc的1 32 方式2波特率取决于PCON中SMOD位的值波特率 2SMOD 64 fosc 图串行口方式2波特率的产生 79 3 方式1和方式3的波特率 方式1和方式3的移位时钟脉冲由定时器T1的溢出率决定波特率由定时器T1的溢出率与SMOD值同时决定 方式1 方式3波特率 T1溢出率 n 图串行口方式1 方式3波特率的产生 80 SMOD 0时 n 32SMOD 1时 n 16 所以 可用下式确定方式1和方式3的波特率 波特率 T1溢出速率 2SMOD 32其中 T1溢出速率取决于T1的计数速率 计数速率 fosc 12 和T1预置的处置 若定时器T1采用模式1时 波特率公式如下 波特率 2SMOD 32 fosc 12 216 初值 81 表7 2常用波特率与其他参数选取关系 表7 2列出了串行口方式1 方式3常用波特率及其初值 82 定时器T1用作波特率发生器时 通常选用定时器模式2 自动重装初值定时器 比较实用 要设置定时器T1为定时方式 计数速率为fosc 12注意应禁止T1中断 以免溢出而产生不必要的中断 先设定TH1和TL1定时即输初值为X 那么每过 28 X 个机器周期 定时器T1就会产生一次溢出 83 因此 T1溢出速率为T1溢出速率 fosc 12 28 X 于是 可得出定时器T1模式2的初始值X 84 例7 1 89C51单片机时钟振荡频率为11 0592MHz 选用定时器T1工作模式2作为波特率发生器 波特率为2400b s 求初值 解 设置波特率控制为 SMOD 0所以 TH1 TL1 F4H 85 系统晶体振荡频率选为11 0592MHz就是为了使初值为整数 从而产生精确的波特率 如果串行通信选用很低的波特率 可将定时器T1置于模式0或模式1 即13位或16位定时方式 但在这种情况下 T1溢出时 需要中断服务程序重装初值 中断响应时间和执行指令时间会使波特率产生一定的误差 可用改变初值的办法加以调整 86 7 2 289C51串行口的应用 89C51串行口的四种工作方式传送的数据位数叙述如下 方式0 移位寄存器输入 输出方式 串行数据通过RXD线输入或输出 TXD线专用于输出时钟脉冲给外部移位寄存器 方式0可用来同步输出或接收8位数据 最低位首先输出 波特率固定为fosc 12 87 方式1 10位异步接收 发送方式 一帧数据包括1位起始位 0 8位数据位和1位停止位 1 串行接口电路在发送时能自动插入起始位和停止位 在接收时 停止位进入特殊功能寄存器SCON的RB8位 方式1的传送波特率是可变的 可通过改变内部定时器的定时值来改变波特率 方式2 11位异步接收 发送方式 除了1位起始位 8位数据位 1位停止位之外 还可以插入第9位数据位 方式3 同方式2 只是波特率可变 7 2 289C51串行口的应用 88 1 串行口方式0的应用 方式0时是同步操作 外接串入 并出或并入 串出器件 可实现I O的扩展 数据传送可以采用中断方式 也可以采用查询方式 无论哪种方式 都要借助于TI或RI标志 在串行口发送时 或者靠TI置位后引起中断申请 在中断服务程序中发送下一组数据 或者通过查询TI的值 只要TI为0就继续查询 直到TI为1后结束查询 进入下一个字符的发送 在串行口接收时 由RI引起中断或对RI查询来决定何时接收下一个字符 无论采用什么方式 在开始串行通信前 都要先对SCON寄存器初始化 进行工作方式的设置 89 1 串行口方式0的应用 例7 2 用89C51串行口外接164串入 并出移位寄存器扩展8位并行口 8位并行口的每位都接一个发光二极管 要求发光二极管从左到右以一定延迟轮流显示 并不断循环 设发光二极管为共阴极接法 如图所示 解 设数据串行发送采用中断方式 显示的延迟通过调用延迟程序DELAY来实现 90 程序清单 ORG0023H 串行口中断入口AJMPSBR 转入串行口中断服务程序ORG2000H 主程序起始地址MOVSCON 00H 串行口方式0初始化MOVA 80H 最左一位发光二极管先亮CLRP1 0 关闭并行输出MOVSBUF A 开始串行输出LOOP SJMP 等待中断SBR SETBP1 0 启动并行输出ACALLDELAY 显示延迟一段时间CLRTI 清发送中断标志RRA 准备右边一位显示CLRP1 0 关闭并行输出MOVSBUF A 再一次串行输出RETI 中断返回 91 用方式0外加移位寄存器来扩展8位输出口时 要求移位寄存器带有输出控制 否则串行移位过程也会反映到并行输出口 另外 输出口最好再接一个寄存器或锁存器 以免在输出门关闭使 STB 0 输出又发生变化 用方式0加上并入 串出移位寄存器可扩展一个8位并行输入口 移位寄存器必须带有预置 移位的控制端 由单片机的一个输出端子加以控制 以实现先由8位输入口置数到移位寄存器 然后再串行移位从单片机的串行口输入到接收缓冲器 最后再读入到CPU中 92 例7 3 用89C51串行口外加移位寄存器165或166扩展8位输入口 输入数据由8个开关提供 另有一个开关K提供联络信号 当K 0时 表示要求输入数据 输入的8位为开关量 提供逻辑模拟子程序的输入信号 如图所示 74HC165并入串出寄存器的shift端口 shift为1 允许把外部的数据置入到74hc165中 shift为0开始串行移位到单片机sbuf中 93 START MOVSCON 10H 串行口方式0初始化JBP1 1 开关K未闭合 等待SETBP1 0 并行置入数据 CLRP1 0 开始串行移位 JNBRI 查询RI 完全移到sbuf后ri自动为1CLRRI 查询结束 清RIMOVA SBUF 读数据到累加器ACALLLOGSIM 进行逻辑模拟SJMPSTART 准备下一次模拟 94 2 串行口方式1的发送和接收 例7 4 89C51串行口按双工方式收发ASCII字符 最高位用来作奇偶校验位 采用奇校验方式 要求传送的波特率为1200b s 编写有关的通信程序 解 7位ASCII码加1位奇校验共8位数据 采用串行口方式1 奇偶校验位P是当累加器A中1的数目为奇数时 P 1 如果直接把P的值放入ASCII码的最高位 恰好成了偶校验 与要求不符 因此 要把P的值取反以后放入ASCII码最高位 才是要求的奇校验 95 2 串行口方式1的发送和接收 设发送数据区的首地址为20H 接收数据区的首地址为40H fosc为6MHz 通过查波特率初值 表7 2 可知定时器的初装值为F3H 定时器T1采用工作模式2 可以避免计数溢出后用软件重装定时初值的工作 96 主程序MOVTMOD 20H 定时器1设为模式2MOVTL1 0F3H 定时器初值MOVTH1 0F3H 8位重装值SETBTR1 启动定时器1MOVSCON 50H 设置为方式1 REN 1MOVR0 20H 发送数据区首址MOVR1 40H 接收数据区首址ACALLSOUT 先输出一个字符SETBESSETBEASJMP 等待中断 97 中断ORG0023H 串行口中断入口AJMPSBR1 转至中断服务程序 ORG0100HSBR1 JNBRI SEND TI 1 为发送中断ACALLSIN RI 1 为接收中断SJMPNEXT 转至统一的出口SEND ACALLSOUT 调用发送子程序NEXT RETI 中断返回 98 发送子程序SOUT CLRTIMOVA R0 取发送数据到AMOVC P 奇偶标识赋予CCPLC 奇校验MOVACC 7 CINCR0 修改发送数据指针MOVSBUF A 发送ASCII码RET 返回 99 接收子程序SIN CLRRIMOVA SBUF 读出接收缓冲区内容MOVC P 取出校验位CPLC 奇校验ANLA 7FH 删去校验位MOV R1 A 读入接收缓冲区INCR1 修改接收数据指针RET 返回 100 在主程序中已初始化REN 1 则允许接收 以上程序基本上具备了全双工通信的能力 但不能说很完善 例如 在接收子程序中 虽然检验了奇偶校验位 但没有进行出错处理 另外 发送和接收数据区的范围都很有限 也不能满足实际需要 但有了一个基本的框架之后 逐渐完善还是可以做到的 101 2 串行口方式1的发送和接收 例7 5 采用查询方式由串行口发送带奇偶校验位的数据块 由内部RAM单元20H 3FH取出ASCII码数据 在最高位上加奇偶校验位后由串行口发出 采用8位异步通信方式 波特率为1200b s fosc 11 059MHz 由要求可知 应把串行口设置为方式1 采用定时器1模式2作为波特率发生器 预置值 TH1 0E8H 102 主程序 MOVTMOD 20H 设置定时器1为模式2MOVTL1 0E8H 初值 波特率为1200b sMOVTH1 0E8HSETBTR1 启动T1运行MOVSCON 01000000B 设置串行口为方式1MOVR0 20HMOVR7 32 数据块长度LOOP MOVA R0ACALLSP OUTJNBP ERROR 传输出错处理 由SP OUT中 CPLC 结果决定INCR0DJNZR7 LOOP 103 串行口发送子程序 奇校验 SP OUT MOVC PSW 0 设置奇校验位 校验位P 1为奇校验CPLC 奇校验 无此指令位偶校验 MOVACC 7 C ACC 7补0或1MOVSBUF A 启动串行口发送过程JNBTI CLRTI 清TI标志 允许在发送RETERROR 略 104 例7 6 由串行口接收带奇偶校验位的数据块 解 采用查询方式 本例与上例相呼应 接收器把接收到的32B数据存放在20H 3FH单元内 波特率同上 若奇校验出错 则置进位位为1 程序清单 105 主程序 MOVSCON 01010000B 设串口方式1 允许接收MOVTMOD 20H 设置定时器T1为模式2MOVTL1 0E8H 初值 波特率为1200b sMOVTH1 0E8HSETBTR1 启动T1运行MOVR0 20HMOVR7 32 数据块长度LOOP ACALLSP IN 调接收一帧子程序JCERROR 由SP IN中 CPLC 结果决定MOV R0 A 存放接收的数据INCR0DJNZR7 LOOP 106 接收一帧子程序 SP IN JNBRI RI由硬件置位CLRRI 软件清除RIMOVA SBUFMOVC P 检查奇校验位CPLC 置C为主程序 JCERROR 用ANLA 7FH 去掉奇校验位RETERROR 略 107 例7 7 利用串行口和堆栈技术发送字符串常量 解 上面两个例子中 发送和接收的都是一些变量数据 且存放在内部RAM单元中 现说明如何利用堆栈技术发送存放在程序存储器内的字符串常量 下面的例子中 这些字符串是发送给CRT终端的 以回车符 CR 和换行符 LF 开始 以换码符 ESC 为结尾 下面是程序片断 108 CREQU0DH ASCII回车符LFEQU0AH ASCII换行符ESCEQU1BH ASCII换码符 MOVTMOD 20H 设置定时器T1为模式2MOVTL1 0FDH 设波特率位9600b s fosc 11 059MHz MOVTH1 0FDHSETBTR1 启动T1运行MOVSCON 01000000B 设置串行口方式1ACALLXSTRINGDBCR LFDB NU字符串常量DBESC 2020 1 29 109 可编辑 110 XSTRING POPDPH 把第1个字符的地址装入DPTRPOPDPLXSTR 1 CLRA 设偏移量为零MOVCA A DPTR 取第1个字符XSTR 2 MOVSBUF A 启动一帧发送过程JNBTI 等待发送一帧完CLRTIINCDPTR 指向下一字符CLRA 偏移量为0MOVCA A DPTR 取下一字符CJNEA ESC XSTR 2 读到ESC符时 停止发送MOVA 1JMP A DPTR 返回执行ESC符后 的一条指令 即接着 执行背景程序 111 说明 程序中采用了 ACALLXSTRING 指令 而实际上由XSTRING开始的程序段形式上并不构成一个子程序 因为子程序应由RET作为结尾 采用ACALL指令的目的在于利用子程序调用协议 即执行调用指令后 把一个单元 存放常量CR 的地址压入了堆栈 这样 XSTRING段的第1 2条指令执行后 就把放置字符常量CR的单元地址置入DPTR了 ESC后一个单元应是背景程序中送完字符串后要执行的那条指令 故执行完XSTRING程序段的最后2条指令 将继续执行背景程序 112 3 串行口方式2 方式3的发送和接收 串行口方式2与方式3基本一样 只是波特率设置不同 接收 发送11位信息 开始为1位起始位 0 中间8位数据位 数据位之后为1位程控位 由用户置SCON的TB8决定 最后是1位停止位 1 只比方式1多了一位程控位 113 例7 8 用第9个数据位作奇偶校验位 编制串行口方式2的发送程序 解 设计一个发送程序 将片内RAM50H 5FH中的数据串行发送 串行口设定为方式2状态 TB8作奇偶校验位 在数据写入发送缓冲器之前 先将数据的奇偶位P写入TB8 这时 第9位数据作奇偶校验用 方式2发送程序流程图如图所示 114 程序清单如下 TRT MOVSCON 80H 方式2设定MOVPCON 80H 取波特率为fosc 32MOVR0 50HMOVR7 10H 数据长度10H R7LOOP MOVA R0 取数据 AMOVC PSW 0 P TB8MOVTB8 CMOVSBUF A 数据 SBUF 启动发送WAIT JBCTI CONT 判断发送中断标志SJMPWAITCONT INCR0DJNZR7 LOOPRET 115 例7 9编制一个串行口方式2接收程序 并核对奇偶校验位 解 根据上面介绍的特点 在方式2 方式3的发送过程中 将数据和附加在TB8中的奇偶位一块发向对方 因此 作为接收的一方应设法取出该奇偶位进行核对 相应的接收程序段为 116 RRR MOVSCON 90H 选方式2 并允许接收 REN 1 LOOP JBCRI RECEIV 等待接收数据并清RISJMPLOOPRECEIV MOVA SBUF 将接收到的字符取出后 送到ACC 注意 传送指令影响PSW 产生接收端的奇偶值JBPSW 0 ONE 判断接收端的奇偶值JBRB8 ERR 判断发送端的奇偶值SJMPRIGHTONE JNBRB8 ERRRIGHT 接收正确 ERR 接收有错 117 当接收到一个字符时 从SBUF转移到ACC中时会产生接收端的奇偶值 而保存在RB8中的值为发送端的奇偶值 两个奇偶值应相等 否则接收字符有错 发现错误要及时通知对方重发 118 例7 10 编制一个发送程序 将片内RAM中50H 5FH的数据串行发送 串行口设定为工作方式2 TB8作奇偶校验位 解 在数据写入发送SBUF之前 先将数据的奇偶标志P写入TB8 此时 第9位数据便可作奇偶校验用 可采用查询和中断两种方式发送 119 1 采用查询方式的程序段ORG0000HAJMPMAIN 上电 转向主程序ORG0100H 主程序MAIN MOVSCON 80H 设工作方式2MOVPCON 80H 取波特率为fosc 32MOVR0 50H 首址50H送R0MOVR7 10H 数值长度送R7LOOP MOVA R0 取数据MOVC PSW 0 P CMOVTB8 C 奇偶标志送TB8MOVSBUF A 发送数据WAIT JBCTI CONTAJMPWAIT 等待中断标志TI 1CONT INCR0DJNZR7 LOOP 数值尚未发送完 继续发送下一个数据SJMP END 120 2 采用中断方式的程序段ORG0000HAJMPMAIN 上电 转向主程序ORG0023H 串行口的中断入口地址AJMPSERVE 转向中断服务程序ORG0100H 主程序MAIN MOVSCON 80HMOVPCON 80HMOVR0 50HMOVR7 0FH 中断方式中因为是先传一个数据 再进入中断SETBES 允许串行口中断SETBEA CPU允许中断MOVA R0MOVC PSW 0 P CMOVTB8 CMOVSBUF A 发送第一个数据SJMP 121 SERVE CLRTI 清除发送中断标志INCR0 修改数据地址MOVA R0MOVC PSW 0 P CMOVTB8 CMOVSBUF A 发送数据DJNZR7 ENDT 判断数据块发送完否 若未发送完 则转ENDTCLRES 若发送完 则禁止串行口中断ENDT RETI 中断返回END 122 例7 11 编制一个接收程序 将接收的16B数据送入片内RAM的5OH 5FH单元中 设串行口工作于方式3 波特率为2400b s 解 方式3为11位异步通信方式 波特率取决于TI的溢出率 可知 当晶振为11 059MHz 波特率为2400b s时 可取SMOD 0 123 源程序如下 MAIN MOVTMOD 20H 设TI工作于模式2MOVTH1 0F4H 赋循环计数初值MOVTL1 0F4H 赋计数值SETBTR1 启动定时器TIMOVR0 50H 首地址送R0MOVR7 10H 数据长度送R7MOVSCON 0D0H 串行口工作与方式3 可接收MOVPCON 00H 设SMOD 0WAIT JBCRI PR1 接收完一帧数据 清RI 转PR1SJMPWAIT 否则等待PR1 MOVA SBUF 读入数据JNBP PNP P 0 转PNPJNBRB8 PER P 1 RB8 0 转出错处理SJMPRIGHTPNP JBRB8 PER P 0 RB8 1 转出错处理RIGHT MOV R0 A 数据送内存INCR0 修改地址指针DJNZR7 WAIT 数据未接收完 继续接收下一个数据CLRPSW 5 置正确接收完毕标志F0 0RETPER SETBPSW 5RET 124 7 389C51与89C51点对点异步通信 7 3 1通信协议7 3 2波特率设置7 3 3通信程序举例 125 7 3 1通信协议 要想保证通信成功 通信双方必须有一系列的约定 比如 作为发送方 必须知道什么时候发送信息 发什么 对方是否收到 收到的有没有错 要不要重发 怎样通知对方结束等等 作为接收方 必须知道对方是否发送了信息 发的是什么 收到的信息是否有错 如果有错怎样通知对方重发 怎样判断结束等这种约定就叫做通信规程或协议 它必须在编程之前确定下来 126 7 3 1通信协议 要想使通信双方能够正确交换信息和数据 在协议中对什么时候开始通信 什么时候结束通信 何时交换信息等等都必须作出明确的规定 只有双方遵守这些规定才能顺利地进行通信 127 7 3 2波特率设置 波特率 它反映了串行通信的速率 也反映了对于传输通道的要求 波特率越高 要求传输通道的频带越宽 一般异步通信的波特率在50b s 9600b s之间 由于异步通信双方各用自己的时钟源 要保证捕捉到的信号正确 最好采用较高频率的时钟 一般选择时钟频率比波特率高16倍或64倍 若是时钟频率等于波特率 则频率稍有偏差便会产生接收错误 128 在异步通信中 收 发双方必须事先规定两件事 一是字符格式 即规定字符各部分所占的位数 是否采用奇偶校验以及校验的方式 偶校验还是奇校验 等通信协议 二是采用的波特率以及时钟频率和波特率的比例关系 89C51的串行通信的波特率由定时器T1的溢出率获得 仅指串行口方式1 方式3时 当串行口工作于方式1或方式3时 波特率为 129 其中 k为定时器1的位数定时器模式0 k 13 定时器模式1 k 16 定时器模式2和摸式3 k 8 130 若定时器T1工作于模式1 采用11 059MHz的晶振 要求利用定时器1产生1200b s的波特率 则令SMOD 0 可算得初值为那么 TH1的初值为0FFH TL1的初值为0E8H 131 有关的程序如下 MAIN SETBPT1 设定T1为高中断优先级SETBEA 开放CPU中断SETBET1 开放定时器T1中断MOVTMOD 01H 置定时器T1为模式1MOVTL1 0E8H 装入初值MOVTH1 0FFHMOVPCON 00H SMOD 0SETBTR1 启动T1运行 如果串行口工作于方式1 T1作为波特率发生器 需在T1溢出中断服务程序中重装初值 T1溢出中断服程序 MOVTL1 0E8H 重新装入初值MOVTH1 0FFHRETI 中断返回 132 由于T1模式2是定时器自动重装载的操作模式 当定时器T1工作于模式2时 可直接用作串行口的波特率发生器 与上例相同 算得重装

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论