本机的CPU到其他设备中间常常会有信息交换, 而本机和其他计算机之间常常也会进行信息的交换
通信的方式有两种:
往往通过数据传送距离来判断选择哪一种方式
对PC而言, 30m是一个分水岭, 小于30m, PC间往往采用并行通信, 反之, 就使用串行通信
8951这两种通信方式都具有
指数据的各位同时进行传输的通信方式
优点是传送速度快, 缺点是数据有多少位, 传送线就需要多少根
因此, 并行通信在位数多且距离远时就不适用了
例如8951和打印机之间的数据传送就属于并行通信
下图为8951和外设间8位信息传送并行通信的连接方法
通信引脚连接方式图
串行通信的传送方式有3种
3种串行的示例图
通常, 对于串行通信来说, 按双方时钟情况来分, 有两种通信方式
此时通信双方的时钟是相互独立的, 双方的数据发送和接收可以不在同一时刻进行(即所谓异步), 但是双方必须遵守相同的通信协议, 包括相同的数据格式和相同的通信速率
在异步通信中, 数据是以帧为单位完成一次收发的传送的(通常包括 一字节\字符 的 数据\代码 )
数据帧图示
一帧依次由四部分组成: 起始(标识)位, 数据位, 奇偶效验位, 和停止位
例如, 规定使用ascii码时, 字符数据占7位, 加起始停止各一位和1位奇偶校验位, 一共一帧10位
此时通信双方的物理时钟是相同的, 数据的收发同时进行
同步通信方式和数据(块)格式
同步通信中, 在数据开始传送之前用 同步字符 来指示(一般约定为 1~2 个字符), 并且由时钟来实现发送端和接收端同步, 当检测到规定的同步字符之后, 接下来就连续按顺序传送数据, 直到通信告一段落
同步通信期间, 字符之间没有间隙, 也不需要起始位和停止位, 仅在数据块开始传送时用同步字符SYNC来指示
可以采用ascii码的同步字符SYNC, 值为16h, 用户也可以自行约定同步字符
在同步传送时, 要求用时钟来实现发送端和接收端之间的同步, 为保证接收准确无误, 发送方就需在传送数据之外, 同时传送时钟信号
同步传送可以提高传输速率( 56kb\s 或 更高), 但硬件比较复杂
即数据传输速率, 指每秒发送的二进制码位数, 单位是b\s, 它的值的确定对CPU和外界的通信很重要
波特率计算方法: 每字符占二进制码位数 * 每秒发送字符数
则每位字符的传送时间即为波特率的倒数
保证两个通信设备在串行线路上成功实现通信必须解决两个问题:
发: 在串行发送前, 计算机将内部并行数据送入移位寄存器, 并一位一位地移出, 将内部并行数据转换成串行数据, 再通过一根通信线传送
收: 来自通信线路的串行数据被送入移位寄存器, 满8位后并行送到计算机内部
在串行通信控制电路中, 串并转换逻辑被集成到出现异步通讯控制芯片里, 8951的串行口和IBM-PC机中的8250芯片都能实现这一功能
进行串行通信的两台设备必须同步工作, 才能有效地检测通信线路上的信号变化, 从而采样传送数据脉冲
设备同步的对双方的要求是:
存在同步和异步两种协议, 此处只讨论异步串行通信协议和其规定的字符数据传送格式(按先后顺序)
8951有个可编程全双工串行通信接口, 可用作UART(), 也可用作同步移位寄存器
帧格式支持 8位, 10位 或 11位, 并能设置各种波特率, 具有很大的灵活性
8951通过引脚RXD(p3.0, 串行数据接收端)和TXD(p3.1, 串行数据发送端)与外界进行通信
下图中由两个物理上独立的接收和发送缓冲器SBUF, 占用同一地址99h, 可同时发送接收数据(在一周期不同时期段里)
发送缓冲器只写, 接收缓冲器只读
结构图
8951的串行口是可编程接口, 对他初始化编程只用两个控制字分别写入特殊功能寄存器SCON和电源控制寄存器PCON中即可
8951串行通信的方式选择, 收发控制, 和串行口状态标志均由scon控制和指示
scon结构示意
pcon结构图
pcon中只有smod位和串行口工作有关
smod(pcon.7):波特率倍增位
方式1, 2, 3的波特率和2的smod次方成正比(见波特率计算式), 因此在方式1, 2, 3时, 若smod置1 ,则波特率翻倍
smod复位时被置0
选择串行口工作方式的sm0和sm1置位表
同步 移位寄存器输入输出方式
常用于扩展并行IO口, 串行数据通过RXD输入和输出, TXD用作输出移位时钟, 作为外部部件的同步信号
这种方法不适用于8951之间的通信
但可通过外接移位寄存器实现单片机的接口扩展
例如
74HC164可以用于扩展并行输出口(8位串入、并出移位寄存器)
74HC165可以用于扩展输入口(8位并入、串出移位寄存器)
他人的74HC164/74HC165相关博客链接
方式0的发送电路和时序
发送时
当执行一条数据写入SBUF的指令时,串行口会把sbuf中的8位数据以fosc/12的波特率从rxd(p30)端输出, 发送完毕置ti中断标志位为 1
写sbuf指令在本周期的s6p1产生正脉冲, 在下一个周期s6p2处, 数据的最低位输出到rxd针脚
输出帧每位数据的过程中, 每周期 TXD(在 方式0 中用作输出位移时钟) 在s3s4s5为低电平, s6和下一个周期的s1s2为高电平, 输出f/12的移位时钟
方式0的接收电路和时序示意图
接收时 ,先由软件将scon.ren(接收允许标志位)置1, 同时接收中断标志ri置 0 , 产生一个正脉冲, 开始接收, 对应到电路上就是在下个周期s3p1~s5p2, txd(p31)发送低电位的移位脉冲, 并且在s5p2采样p30, 并在本周期的s6p2将串口采样值通过输入移位器 移位接收, 与此同时, 从本周期s6p1到下周期的s2p2, txd将置高电平
由此按位逐一接收, 直到ri清0后(下一个周期开始发送数据)的第10周期的s1p1(上一个周期发送了最后一位数据), ri被硬件置1, 表示这一帧接收完毕, 触发接收中断
真正常用于串行收发的方式, 为10位通用异步接口
txd和rxd分别用于发送和接收数据
收发一帧数据的格式为:
1 位起始位
8 位数据位(低位在前)
1 位停止位
共10位
注意, 接收时, 停止位写入 scon 的 rb8 位,此方式的传送波特率可调(pcon.7 smod, 置1 时波特率翻倍)
方式1发送时
数据从txd(p31)端输出
当执行数据写入sbuf(此时指物理意义上的 发送缓冲器 , sbuf这个名字被两个缓冲器共用)指令时, 就启动了发送器开始发送
发送器的定时信号, 由 定时器t1 的送来的溢出信号经过 16 或 32 分频(取决于smod位值)之后得到的, tx时钟就是发送波特率
发送开始的同时, 非send针脚被置有效, 将起始位向txd输出, 此后每一个tx时钟周期(16分频计数器溢出一次作为一个时钟周期, 因此tx时钟频率由波特率决定)产生一个移位脉冲, 并由txd输出一个数据位
当8位数据位全部发送完毕后, ti位置 1 并申请中断, 与此同时将停止位 1 置txd并发送, 在经过一个时钟周期, 非send失效
方式1接收时
数据从rxd(p30)端输入
接收的前提是scon.ren置1, 并且rxd检测到起始位(rxd检测到 1 到 0 的跳变)
接收时, 定时信号有两种
当一帧数据接收完毕后必须同时满足以下两个条件, 这次接收才被视为有效:
如果不满足, 移位寄存器从rxd接收到的信息不能装入sbuf, 这意味着该帧信息将会丢失
值得注意的是, 在整个接收过程中, ren=1是先决条件, 只有ren有效时, 才能对rxd采样检测
方式1的收发电路和时序示意图
方式2和3均是每帧11位(在数据位和停止位之间多一位可编程位, 之前提到的奇偶校验位就是这位的一种用法)的异步通信格式, 由txd和rxd发送和接收, 不同之处是方式3波特率可变
每帧11位:
接收时需置scon.ren = 1
采样器检测到rxd1-0跳变时开始接收9位数据输入移位寄存器(9位)
当满足 ri=0 且 sm2=0或sm2=1时
第九位接收到逻辑1, 前八位送入sbuf, 第九位送入rb8, 并将ri置1
如果不满足情况,则本次接收无效且不置位ri
方式2和3的收发电路和时序示意图
方式0 的波特率
串行口方式0波特率的产生
由上图可见, 方式0的收发移位脉冲由每机器周期的第六状态周期(s6)给出, 即每机器周期产生一个移位时钟, 接收或者发送一位数据
因此方式0的波特率固定为震荡频率fosc的十二分之一, 并且不受pcon.7(也就是smod)的影响
方式2 的波特率
串行口方式2波特率的产生
方式2的波特率产生方式和方式0不同(时钟源不同), 其时钟输出部分如上图所示, 收发移位时钟(脉冲)由震荡频率fosc的第二节拍给出(sxp2), 即时钟 = fosc/2, 且可知, 方式2的波特率取决于pcon.smod
当smod = 0时, 波特率 = fosc/64
当smod = 1时, 波特率 = fosc/32
方式 1和3 的波特率
串行口方式 1和3 波特率的产生
方式1和3的 移位时钟脉冲 由定时器t1的溢出速率决定
由图可得, 方式1和3 的波特率 = (1 + smod) * t1溢出(速)率 / 32
取决于 定时器t1的溢出率 和 smod
定时器t1的溢出率
t1计数速率(focs/12, 也就是一个机器周期的时间) 和 t1 (的th1和tl1)预置的初值
不就是溢出所需要的时间取倒数吗
t1溢出(速)率 = (focs / 12) / ((2^16 或 2^8) - 定时器初值)
溢出率计算公式示意图
smod
smod置0时为32分频
smod置1时为16分频
常用波特率与其他参数的选取关系
可以采用中断方式, 也可以采用非中断程序中查询中断标志位的方式, 两者都需要借助ri和ti标志位, 且记得在使用前将scon初始化, 对于方式1, 将scon初始化为00h即可, 不需要将ren置1
中断方式 开启中断源和cpu中断之后可用
发送时
通过用串行口发送一次数据或置位ti来触发一次中断后, 在中断服务程序中发送下一组数据
接收时
通过置ri位为1, 请求中断来在中断服务程序中进行一次数据的接收
(软件)查询标志位方式
发送时
循环查询, 直到ti = 1, 发送下一组数据
接收时
循环查询, 直到ri = 1, 接收下一组数据(记得收发过程中, 在适当位置处理对应中断标志位)
通常定时器1为自动装填的模式2, 用于将溢出信号经过分频后用作移位器时钟脉冲
双方约定通信的时间,校验,收到之后的回报(重发请求等)等规定, 只有这样才能顺利地通信
一般(位检验采样)时钟频率都比较高, 以确保捕捉到的信号正确, 一般是波特率的16倍或者64倍
如果时钟频率正好等于波特率, 则若频率稍有偏差就会产生接收错误
利用pc机配置的异步通信适配器, 可以很方便地完成pc和8951之间的数据通信
最简单的连接是零调制3线经济型, 这是进行全双工通信所必须的最少数目的线路(可能是一收一发一时钟?)
max232单芯片结构示意图
send()
receive()
NRF9E5单片机示意图
工作原理图
测温装置图
物联网:
RFID技术: