《51单片机串行通讯》由会员分享,可在线阅读,更多相关《51单片机串行通讯(41页珍藏版)》请在金锄头文库上搜索。
1、1 第七讲串行通讯 电气工程系E mail zhzhhe 2 本讲课程主要内容 1 串行通讯的基本概念及MCS 51串行口的SFR 2 串行口的工作方式 3 串行口波特率的制定 4 串行口的编程方法 5 多机通讯 3 串行通讯的基本概念 通讯的基本方式 串行通讯与并行通讯串行同步通讯 串行异步通讯单工 半双工和全双工串行通讯 4 并行通讯 串行通讯 并行通讯 数据各位同时传送串行通讯 数据一位一位顺序传送 5 串行异步通讯 串行同步通讯 异步通讯 每个数据都要用起始位和停止位作为传送数据开始和结束标志 同步通讯 具有数据端和时钟端 双方依靠时钟同步 6 单工 半双工 全双工串行通讯 单工 仅能
2、发送或接收半双工 能发送 接收 但发送与接收不能同时进行全双工 能够同时进行发送与接受 MCS 51可以进行全双工的串行通讯 7 MCS 51串行口的基本结构 发送器 将CPU送来的并行数据 通过发送移位寄存器变为串行数据逐位发送 并自动添加起始位 停止位和第9位数据 接收器 将接收到的串行数据 经接收移位寄存器变为并行数据 去掉起始位 停止位后 将正确数据送到接收数据缓冲器 供CPU读取 控制器 接收CPU送来的编程命令 按选定方式实现对串行接口的控制 主要控制参数有 传送波特率的选择 数据格式的选择等 另外还与CPU交换状态信号和中断信号 串行接口逻辑部件框图 8 串行口的基本结构 SCO
3、N为串行口控制 状态寄存器 通过编程写入SCON的控制位可选择串行口的工作方式 读出SCON的状态位可查询串行口的工作状态 定时 计数器T1可被用做串行口的波特率发生器 有可控分频电路影响数据传送波特率 串行口信息的发送 接收是通过写 读数据缓冲器SBUF来实现的 9 串行口的SFR 串行数据缓冲器SBUF 99H 串行口有两个8位数据缓冲器 一个是发送数据缓冲器SBUF 一个是接收数据缓冲器SBUF 它们共用一个地址99H 发送SBUF只能写入 而接收SBUF只能读出 通过指令区分 MOVSBUF AMOVA SBUF控制寄存器SCON 98H SM0SM1SM2RENTB8RB8TIRI节
4、电控制寄存器PCON 87H SMOD D7 复位后状态均为00H 10 串行口控制寄存器SCON SM0 SM1 串行口4种工作方式选择位SM2 方式2和方式3中的多机通信控制位 在方式2和方式3中 如SM2 1 则当接收到的第9位数据 RB8 为0时 不激活接收中断标志RI RI 1 在方式1中 如SM2 1 则只有当接收到有效停止位时才激活RI 若没有接收到有效停止位 则RI清0 在方式0中 SM2必须为0 REN 允许串行接收位 REN 1允许接收 REN 0禁止接收 由软件置位或清零 TB8 是工作在方式2和3时 要发送的第9位数据 可由软件置1或清0 在许多的通讯协议中该位是奇偶校
5、验位 在多机通讯中用来表示是地址帧还是数据帧 TB8 1为地址帧 TB8 0为数据帧 11 串行口控制寄存器SCON RB8 当工作在方式2和3时 为接收到的第9位数据 TI 发送中断标志位 在方式0串行发送第8位数据结束时由硬件置1 或在其它方式串行发送停止位后置1 并申请中断 CPU响应中断后 可发送下一帧数据 TI必须由软件清0 RI 为接收结束中断标志 在方式0中 当接收到一帧数据的第8位结束时 RI 1 在其他方式中 接收到停止位后 RI 1 表示可读取接收SBUF中的内容 RI必须用软件清0 每次发送和接收前 要注意先将TI和RI标志位清0 串行口作为一个中断源 中断入口地址只有一
6、个 0023H 当用中断方式同时进行发送和接收时 可通过查询TI和RI状态 确定是发送还是接收结束引起的中断 12 节电控制寄存器PCON PCON主要用于节电运行方式控制 PCON 7用做串行口波特率加倍控制位 当设定SMOD 1时 波特率加倍 当SMOD 0时 波特率不加倍 13 串行口的工作方式 SM0 SM1工作方式选择位 14 方式0 SM0 0SM1 0 串行口方式0为8位数据同步移位寄存器方式 RXD引脚为同步数据的输入 输出端 TXD引脚为同步移位脉冲输出端 一个数据帧为8位 每一个移位脉冲对应数据帧的一个数据位 方式0的波特率固定为fosc 12 15 方式0的说明 写入SC
7、ON使REN 0 TI 0 然后执行写入SBUF的指令 8位数据装入发送SBUF 硬件启动串行口发送器进行一次发送 通过发送移位寄存器将8位数据逐位送到RXD引脚 每个机器周期内发送一位数据 对应发送数据的每一位 由TXD引脚同步输出一个移位脉冲 发送完一帧 自动置位TI标志 并申请串行口中断 若CPU响应中断 则将从0023H单元开始执行串行口的中断服务程序 写入SCON使REN 1 RI 0 将启动串行口接收器开始接收 由TXD输出移位脉冲 每对应一个移位脉冲 采样一次RXD引脚信号 每个机器周期采样一次RXD引脚 采到的数据位送入接收移位寄存器后 接收移位寄存器左移一位 接收完一帧 自动
8、置位RI标志 申请串行口中断 并将接收下来的8位数据装入接收SBUF 若CPU响应中断 则从0023H单元开始执行串行口的中断服务程序 串行口方式0常用于扩展单片机的并行I O口 也可外接串行同步I O设备 用方式0输入 输出数据皆通过RXD端 因此方式0为半双工方式 只能分时进行发送和接收 16 方式1 SM0 0SM1 1 功能说明 串行口方式1为8位数据全双工异步通信方式 TXD为发送数据端 RXD为接收数据端 一个数据帧为10位 包含8位数据位 1个起始位 0 和1个停止位 1 串行口用方式1工作时 使用定时器T1作为波特率发生器 波特率的设定以T1的溢出率为基准 波特率计算式为 2S
9、MOD 32 T1溢出率 17 方式1的时序图 18 方式1功能说明 执行写入SBUF指令 将8位数据装入发送SBUF 并启动发送器进行一次发送 先将起始位 0 送到TXD引脚 再从低到高逐位发送8位数据 最后发送停止位 1 每位发送占用的时间由设定的波特率决定 发送完一帧数据 置位TI标志 申请串行口中断 当REN 1时 允许接收器准备接收 开始 以16倍于波特率的速率检测RXD引脚的负跳变 当检测到负跳变后 启动一次接收 接收完一帧信息 判断是否满足条件 RI 0 而且停止位为1 或SM2 0 若同时满足这两个条件 则置位RI标志 申请串行口中断 并将接收的8位数据装入接收SBUF 停止位
10、装入RB8 否则接收无效 丢失所接收的一帧信息 且不影响RI标志 一位时间以后 接收器重新开始检测RXD端的负跳变 以准备接收下一帧数据 19 方式2 方式3 串行口方式2和方式3皆为9位数据全双工异步通信方式 比串行口方式1增加了第9位数据位 TXD为发送数据端 RXD为接收数据端 一帧信息有11位 包括9位数据位 1个起始位 0 和1个停止位 1 发送数据的第9位在TB8中 接收数据的第9位存入RB8中 第9位数据位也称为可编程位 常用做奇偶校检位或多机通信中的地址 数据识别位 串行口的方式2与方式3的唯一差别是波特率设定方法不同 方式2的波特率以系统时钟为基准 计算式为 2SMOD 64
11、 fosc 方式3的波特率与方式1的相同 计算式为 2SMOD 32 T1溢出率 20 方式2 3的时序 21 方式2 3的功能说明 发送时 应先将发送数据的第9位送入TB8 再写入8位数据到发送SBUF 使发送器启动一次发送 将一帧数据逐位送到TXD引脚 发送起始位 0 之后 再发送SBUF中的8位数据 接着发送TB8中的第9位 最后发送停止位 1 一帧发送结束 置位TI标志 申请串行口中断 方式2和方式3的接收过程和方式1的接收过程基本相同 但RB8中装入的是接收数据的第9位 而不是停止位 接收有效必须同时满足的两个条件改为 RI 0 且接收的第9位数据位为1 或SM2 0 当正确接收到一
12、帧数据后 前面8位数据进入接收SBUF 第9位数据进入RB8 22 波特率的制定 波特率的定义 串行口每秒钟发送或者接收的位数 串行口方式0的波特率是固定的 为系统时钟的12分频 fosc 12 即每个机器周期传送一位数据位 串行口用方式2工作时 波特率为 2SMOD 64 fosc SMOD为PCON中的D7位 即波特率加倍选择位 方式2可有两种波特率供选择 当SMOD 0时 波特率为fosc 64 当SMOD 1时 波特率则为fosc 32 串行口方式1和方式3用定时器T1作为波特率发生器 其波特率有多种选择 与T1的溢出率有关 波特率 2SMOD 32 T1溢出率 23 定时器T1产生波
13、特率的计算 T1溢出率 T1溢出时间的倒数 T1用于波特率发生器时一般工作于非门控定时器方式2 即常数自动重装入方式 TH1 TL1为T1的时间常数 24 定时器T1产生波特率的计算 串行口用方式1和方式3工作时 当需要很低的波特率时 也可选择T1工作于方式1 但需利用T1溢出中断来实现软件重装初值 T1用方式1工作时溢出率为 N为T1溢出后用软件重装初值所需的机器周期数 25 T1产生的常用波特率 26 波特率计算的几点注意事项 1 波特率的相对误差不大于2 5 2 注意SMOD位对波特率的影响例如 通讯波特率设为2400 晶振频率为6MHz 计算T1的计时常数 当SMOD 0时 计时常数约
14、为249 相对误差7 当SMOD 1时 计时常数约为243 相对误差0 16 27 串行口的编程举例 设定波特率设定串行口的工作方式设计中断服务程序或查询程序注意对TI RI的处理 硬件置位 软件清零 28 MCS 51双机串行通讯的实现 如何进行物理连线 波特率的选择 工作方式的选择 如何编程实现 29 双机串行通讯的实现 1 正确进行物理接线 30 双机串行通讯的实现 2 设定一致的波特率设定一致的串行口工作方式分别设计中断服务程序或查询程序注意对TI RI的处理 硬件置位 软件清零 31 方式3发送50H 5FH的内容 待发送的16个字节存放在片内RAM中地址为50H 5FH串行口波特率
15、为2400波特率发生器T1工作于方式2 且SMOD 0晶振为11 0592MHz计算得到TL1的初值为F4H 串行口工作于方式3第9位发送奇偶校验位 32 例1 方式3发送50H 5FH中内容 1 ORG0000H 复位入口AJMPMAINORG0023H 串行口中断入口AJMPL1ORG0100H 主程序入口MAIN MOVSCON 0C0H 串行口初始化 用方式3发送 TI 0MOVPCON 00H SMOD 0MOVTMOD 20H T1方式2定时MOVTL1 0F4H 写入T1时间常数MOVTH1 0F4HSETBTR1 启动T1SETBEASETBES 允许串行口中断MOVR0 50
16、H 设数据指针MOVR7 10H 数据长度LOOP MOVA R0 取一个字符MOVC P 加奇偶校验MOVTB8 CMOVSBUF A 发送一个字符HERE SJMPHERE CPU原地循环 等待发送结束 33 例1 方式3发送50H 5FH中内容 2 L1 CLRTI 中断服务程序 发送结束标志位清0DJNZR7 NEXT 发送完全部字符 CLRES 已发送完 关闭串行口中断SJMPTENDNEXT INCR0 未发送完 修改指针MOVA R0 取下一个字符MOVC P 加奇偶校验MOVTB8 CMOVSBUF A 再次发送一个字符TEND RETI 中断返回主程序 34 例2 方式3接收 接收到的16个字节存放在片内RAM中地址为50H 5FH串行口波特率为2400波特率发生器T1工作于方式2 且SMOD 0晶振为11 0592MHz计算得到TL1的初值为F4H 串行口工作于方式3奇偶校验方式判断接收数据是否出错设校验出错标志位为F0 35 MAIN MOVSCON 0D0H 串行口方式3允许接收 RI 0MOVPCON 00H SMOD 0MOVTMOD 20H T1方式2定时