第12章STC12C5A60S2的串行口及SPI接口ppt课件_第1页
第12章STC12C5A60S2的串行口及SPI接口ppt课件_第2页
第12章STC12C5A60S2的串行口及SPI接口ppt课件_第3页
第12章STC12C5A60S2的串行口及SPI接口ppt课件_第4页
第12章STC12C5A60S2的串行口及SPI接口ppt课件_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

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

文档简介

第8章串行通信 8 1通信的有关概念 8 2STC12C5A60S2单片机的串行接口 8 3STC12C5A60S2SPI接口 8 1通信的有关概念 实际应用中 计算机的CPU与外部设备之间常常要进行信息的交换 计算机之间也需要交换信息 所有这些信息的交换均称为 通信 并行通信与串行通信 通信的基本方式可分为并行通信和串行通信两种 并行通信 是指数据的各位同时进行传送的方式 其特点是传输速度快 但当距离较远 位数又多时导致了通信线路复杂且成本高 串行通信 是指数据一位一位的顺序传送的通信方式 其特点是通信线路简单 只要一对传输线就可以实现通信 从而大大的降低了成本 特别适用于远距离通信 但传送速度慢 1 按照串行数据的同步方式分类 按照串行数据的同步方式 串行通信本身又分为异步传送和同步传送两种基本方式 1 异步传送在异步传送中 每一个字符要用起始位和停止位作为字符开始和结束的标志 它是以字符为单位一个个的发送和接收的 异步传送时 每个字符的组成格式如下 首先是一个起始位表示字符的开始 后面紧跟着的是字符的数据字 数据字可以是5 6 7或8位数据 在数据字中可根据需要加入奇偶校验位 最后是停止位 其长度可以是一位 一位半或两位 所以 串行传送的数据字节加上成帧信号起始位和停止位就形成一个字符串行传送的帧 起始位用逻辑 0 低电平表示 停止位用逻辑 1 高电平表示 图 a 所示为数据字为7位的ASCII码 第8位是奇偶校验位 加上起始位 停止位 一个字符由10位组成 这样形成帧信号后 字符便可以一个接一个的传送了 在异步传送中 字符间隔不固定 在停止位后可以加空闲位 空闲位用高电平表示 用于等待发送 这样 接收和发送可以随时的或间断的进行 而不受时间的限制 图 b 为有空闲位的情况 8 1 1串行通信的分类 2 同步传送所谓同步传送就是去掉异步传送时每个字符的起始位和停止位的成帧标志信号 仅在数据块开始处用同步字符来指示 如下图所示 同步传送的有效数据位传送速率高于异步传送 可达50千波特 其缺点是硬件设备较为复杂 因为它要求要有时钟来实现发送端和接收端之间的严格同步 而且对时钟脉冲信号的相位一致性还要求非常严格 为此通常还要采用 锁相器 等措施来保证 在异步数据传送中 CPU与外设之间事先必须约好两项事宜 第一 字符格式 双方要约好字符的编码形式 奇偶校验形式 以及起始位和停止位的规定 第二 波特率 Baudrate 波特率是衡量数据传送速率的指标 它要求发送站和接收站都要以相同的数据传送速率工作 2 按照数据的传送方向分类1 点对点传输一般情况下 串行数据传送是在两个通信端之间进行的 其数据传送的方式有如图所示的几种情况 图 a 为单工通信方式 A端为发送站 B端为接收站 数据仅能从A站发至B站 图 b 为半双工通信方式 数据可以从A发送到B 也可以由B发送到A 不过同一时间只能作一个方向的传送 其传送方式由收发控制开关K来控制 图 c 为全双工通信方式 每个站 A B 既可同时发送 又可同时接收 2 主从多终端通信方式A站可以向多个终端 B C D 发出信息 在A站允许的条件下 可以控制管理B C D 等站在不同的时间向A站发出信息 根据数据传送的方向又可分为多终端半双工通信和多终端全双工通信 这种多终端通信方式常用于主 从计算机系统通信中 8 1 2通用的异步接收器 发送器UART在串行传送中 数据是一位一位按顺序进行的 而计算机内部的数据是并行的 因此当计算机向外发送数据时 必须将并行的数据转换为串行的数据再行传送 反之 又必须将串行数据转换为并行数据输入计算机中 上述并 串或串 并的转换既可以用通用的异步接收器 发送器实现 通用的异步接收器 发送器 简称UART UniversalAsynchronousReceiver Transmitter 是串行接口的核心部件 其结构如图所示 它既能发送 由并行 串行输出 又能接收 由串行 并行输入 对每一方来说都是一个双缓冲器结构 当UART接收数据时 串行数据先经RXD端 ReceiverData 进入移位寄存器 再经移位寄存器输出并行数据到缓冲器 最后通过数据总线送到CPU 当UART发送信息时 先由CPU经数据总线将并行数据送给缓冲器 再由并行缓冲器送给一位寄存器 最后逐位由TXD TransmitterData 端输出 所有这些工作都是在时钟信号和其他控制信号作用下完成的 8 2STC12C5A60S2单片机的串行口 STC12C5A60S2单片机具有2个采用UART工作方式的全双工串行通信接口 串口1和串口2 每个串口由2个数据缓冲器 1个移位寄存器 1个串行控制寄存器和一个波特率发生器等组成 每个串口的数据缓冲器由串行接收缓冲器和发送缓冲器构成 它们在物理上是独立的 既可以接收数据也可以发送数据 还可以同时发送和接收数据 接收缓冲器只能读出 不能写入 而发送缓冲器则只能写入 不能读出 它们共用一个地址号 STC12C5A60S2的串行口既可以用于串行异步通信 也可以构成同步移位寄存器 如果在串行口的输入 输出引脚上加上电平转换器 可以方便地构成标准的RS 232接口 串口1与传统8051单片机的串口完全兼容 串口2的结构 工作原理与串口1类似 8 2 1串行接口的寄存器 与串行接口1相关的寄存器有SCON PCON AUXR SBUF TMOD TL1 TH1 TCON IE IP IPH SADEN和SADDR 与串行接口2相关的寄存器有 S2CON S2BUF BRT AUXR IE2 IP2 IPH2和AUXR1 SM0 FE PCON寄存器中的SMOD0位为1时 该位用于帧错误检测 当检测到一个无效停止位时 通过UART接收器设置该位 它必须由软件清零 PCON寄存器中的SMOD0为0时 该位和SM1一起指定串行通信的工作方式 1 串口1控制寄存器SCONSCON 地址为98H 复位值为00H 用于确定串行通道的操作方式和控制串行通道的某些功能 也可用于发送和接收第九个数据位 TB8 RB8 并设有接收和发送中断标志 RI及TI 位 SCON各位的意义如下 SM2 在方式2和方式3时 如SM2 1 只有在接收数据第9位为1时才能激发中断标志 RI 1 在方式1时 如SM2 1 则只有在接收到有效停止位时才能激发中断标志 RI 1 在方式0时 SM2应为0 REN 允许串行I O口接收控制位 用软件置REN 1时为允许接收状态 可启动串行口的接收器RXD 开始接收数据 用软件复位 REN 0 时 为禁止接收状态 TB8 在方式2和方式3时 它是要发生的第九个数据位 按需要由软件进行置位或清零 例如可用作数据的奇偶校验位 或在多机通信中表示是地址帧 数据帧标志位 TB8 1 0 RB8 在方式2和方式3时 它是接收到的第九位数据 作为奇偶位或地址帧 数据帧标志位 在方式1时 若SM2 0 则RB8是接收到的停止位 在方式0时 不使用RB8 TI 发生中断标志位 在方式0时 当串行发送数据字第八位结束时 由内部硬件置位 TI 1 向CPU申请发生中断 CPU响应中断后 必须用软件清零 取消此中断标志 在其他方式时 它在停止位开始发送时由硬件置位 同样 必须用软件使其复位 RI 接收中断标志位 在方式0时 串行接收到第八位结束时由内部硬件置位 在其他方式中 它在接收到停止位的中间时刻由硬件置位 也必须用软件来复位 当一帧数据发送完成时 发送中断标志TI被置位 接着发生串口中断 进入串口中断服务程序 但CPU事先并不能分辨是TI还是RI的中断请求 因此 必须在中断服务程序中用位测试指令加以判别 两个中断标志位TI及RI均不能自动复位 必须在中断服务程序中使用清中断标志位指令 撤销中断请求状态 否则原先的中断标志位状态又将表示有中断请求 2 串口2控制寄存器S2CON 寄存器S2CON 地址为9AH 复位值为00H 用于确定串口2的操作方式和控制串口2的某些功能 也可用于发送和接收第9个数据位 S2TB8 S2RB8 并设有接收和发送中断标志 S2RI及S2TI 位 S2CON各位的意义如下 寄存器S2CON的各个位与寄存器SCON的各个位含义和功能都类似 读者可以进行对比学习 在此 不再赘述 3 掉电控制寄存器PCONPCON 地址为87H 复位值为30H 中的SMOD用于设置方式1 方式2和方式3的波特率是否加倍 各位的定义如下 其中 与串行通信相关的位是SMOD和SMOD0 SMOD 串行口波特率系数控制位 复位时 SMOD 0 1 使方式1 方式2和方式3的波特率加倍 0 各工作方式的波特率不加倍 SMOD0 帧错误检测有效控制 复位时 SMOD0 0 1 SCON寄存器中的SM0 FE位用于FE 帧错误检测 功能 0 SCON寄存器中的SM0 FE位用于SM0功能 和SM1一起指定串行通信的工作方式 4 辅助寄存器AUXR辅助寄存器AUXR 地址为8EH 复位值为00H 各位的定义如下 T0 x12和T1x12用于设置定时器0和定时器1的速度 详见 第8章定时 计数器与可编程计数器阵列 一章 EXTRAM用于设置是否允许使用内部扩展的1024字节扩展RAM 1 UART M0 x6 串行口模式0的通信速度设置位 0 UART串口模式0的速度是传统12T的8051速度 12分频 1 UART串口模式0的速度是传统12T的8051的6倍 2分频 2 BRTR 独立波特率发生器运行控制位 0 不允许独立波特率发生器运行 1 允许独立波特率发生器运行 3 S2SMOD UART2的波特率加倍控制位 0 UART2的波特率不加倍 1 UART2的波特率加倍 4 BRTx12 独立波特率发生器计数控制位 0 独立波特率发生器每12个时钟计数一次 1 独立波特率发生器每1个时钟计数一次 5 S1BRS 串口1波特率发生器选择位 0 选择定时器1作为串口1波特率发生器 1 选择独立波特率发生器作为串口1的波特率发生器 此时定时器1得到释放 可以作为独立定时器使用 注意 对于具有串口2的STC12C5A60S2单片机 串口2只能使用独立波特率发生器作为波特率发生器 不能够选择定时器1作为波特率发生器 串口1可以选择定时器1作为波特率发生器 也可以选择独立波特率发生器作为波特率发生器 5 独立波特率发生器寄存器BRT独立波特率发生器寄存器BRT 地址为9CH 复位值为00H 用于保存重装时间常数 6 从机地址控制寄存器为了方便多机通信 STC12C5A60S2单片机设置了从机地址控制寄存器SADEN和SADDR 其中 SADEN是从机地址掩模寄存器 地址为B9H 复位值为00H SADDR是从机地址寄存器 地址为A9H 复位值为00H 7 数据缓冲器数据缓冲器用于保存要发送的数据或者从串口接收到的数据 串口1的数据缓冲器是SBUF 串口2的数据缓冲器是S2BUF 对于串口1 当一个字符接收完毕 移位寄存器中的数据字节装入串行接收数据缓冲器SBUF中 其第9位则装入SCON寄存器的RB8位 如果SM2使得已接收的数据无效 则RB8位和SBUF缓冲器中的内容不变 对于串口2 当一个字符接收完毕 移位寄存器中的数据字节装入串行接收数据缓冲器S2BUF中 其第9位则装入S2CON寄存器的S2RB8位 如果S2SM2使得已接收的数据无效 则S2RB8位和S2BUF缓冲器中的内容不变 无论对于串口1还是串口2 发送缓冲器只能写入 不能读出 接收缓冲器只能读出 不能写入 因此 串口1的两个缓冲器共用一个地址号 99H 串口2的两个缓冲器共用一个地址号 9BH 4 串行收发寄存器SBUF 字节地址99H 没有位寻址 在所有的串行方式中 在写SBUF信号的控制下 将其数据装入移位寄存器 前面8位为数据字节 其最低位就是移位寄存器的移位输出位 根据不同的工作方式会将 1 或TB8的值装入移位寄存器的第九位 并进行发送 当一个字符接收完毕 移位寄存器中的数据字节装入串行接收数据缓冲器SBUF中 其第九位则装入SCON寄存器的RB8位 如果SM2使得已接收的数据无效 则RB8位和SBUF缓冲器中的内容不变 发送缓冲器只能写入不能读出 而接收缓冲器只能读出 不能写入 因而两个缓冲器可共有一个地址号 99H 8 2 2串行接口的四种工作方式 1 方式0 移位寄存器方式 1 串口1的工作方式0串行口输出端可直接与移位寄存器相连 也可用作扩展I O口或外接同步输入输出设备 发送过程 当CPU将数据写入到发送缓冲区SBUF时 串行口即把8位数据以Fosc 12的波特率由RXD引脚输出 同时由TXD引脚输出同步脉冲 字符发送完毕 置中断标志TI为1 接收过程 控制字除方式0外 还应置允许接收控制位REN 1 清除RI中断标志 接收器启动后RXD为数据输入端 TXD为同步信号输出端 接收器以Fosc 12波特率采样RXD引脚输入的数据信息 当接收完8位数据时又重新置RI 1 方式0工作时 必须使SCON控制字的SM2位 多机通信控制位 为0 由于波特率固定 无须用定时器提供 但以中断方式传送数据时 CPU响应中断并不会自动清除TI RI标志 所以在中断服务程序中必须由指令清0 例如CLRTI及CLRRI指令 2 串口2的工作方式0串行数据通过RXD2 P1 2 RXD2 P4 2 接收和发送 TXD2 P1 3 TXD2 P4 3 输出同步移位时钟 发送接收的是8位数据 低位在先 波特率固定在Fosc 12 方式0工作方式波形图 2 其他方式 UART方式 1 串口1的UART方式发送过程 CPU执行数据写入发送缓冲区SBUF的指令即可启动发送 如MOVSBUF A 串行口内自动将发送缓冲区中内容送入发送移位寄存器 发送移位寄存器先发一个起始位 接着按程序设定每个字符的代码 先低位后高位 数据字加上奇偶校验位或可控位 方式2 3中即为程序设定的TB8位的值 再发停止位 从而完成一帧的发送 串行数据均由TXD端输出 发送完毕将中断标志位置1 以供查询及向CPU申请中断之用 接收过程 接收数据均由RXD输入 串行口以所选定的波特率的16倍速率采样RXD端状态 当采样的RXD端电平由1到0的跳变时 就启动接收器 串行口按程序审定的格式接收一帧代码 并把此码的数据位拼成并行码送入接收缓冲寄存器中 在方式1时 把停止位 方式2 3时把程控的第九位数据都送入RB8 等待CPU取走 为保证可靠无误 对每一数据位要进行连续3次采样 接收的值取3次采样中至少相同的二次的值 接收完毕 置接收中断标志RI 1 CPU的响应中断后必须在中断服务程序中使RI清零 方式1工作方式波形图 方式2 3工作方式波形图 方式1与方式2 3的区别之一是 方式1其数据字是8位异步通信接口 串行口发送 接收收共10位信息 第0位为起始位 0 1 8位是数据位 最后是停止位 1 方式2 3其数据字为9位的异步通信接口 1位起始位 0 8位数据位 第9位是可程控位 1 或 0 最后是停止位 1 共有11位信息 方式1与方式2 3的区别之二是 方式1 3的波特率是可变的 其波特率取决于定时器1的溢出率和特殊功能寄存器PCON中的SMOD位的值 即工作方式1 3的波特率 2SMOD 定时器1的溢出率 32而工作方式2的波特率 2SMOD 振荡器频率 64显然 方式2的波特率变化范围比方式1 3小 这也是方式2和方式3的唯一区别 TB8可用于多机通信或作为奇偶校验位使用 若以TB8位作为奇偶校验位 处理方法为数据写入SBUF之前 先将数据的奇偶位写入TB8 设工作寄存器区2的R0作为发送数据区地址指针 RIPTI PUSHPSW 保护现场PUSHACCSETBPSW 4CLRPSW 3CLRTI 发送中断标志TI清零MOVA R0 取数据MOVC PMOVTB8 CMOVSBUF A 数据写入到发送缓冲器 启动发送器INCR0 数据指针加1POPACCPOPPSW 恢复现场RETI 对输入方式而言 除选不同的方式控制外 均应使REN 1 允许串行接收 只有在最后的移位脉冲产生并同时满足下列二个条件时 才会产生接收数据装入SBUF和RB8及置位RI的信号 对方式1对方式2 31 RI 01 RI 02 SM2 0或接收到的停止位 12 SM2 0或接收到的第九个数据 1如果不满足上述条件 接收到的信号将不可避免的丢失 由此可见 中断标志必须由用户在中断服务程序中设置清 0 指令 否则 将有可能产生另一次中断而造成混乱并影响后序数据的接收 2 串口2的UART方式1 模式1 10位数据通过TXD2 P1 3 TXD2 P4 3 发送 通过RXD2 P1 2 RXD2 P4 2 接收 一帧数据包含一个起始位 0 8个数据位和一个停止位 1 接收时 停止位进入特殊功能寄存器S2CON的S2RB8位 波特率由独立波特率发生器BRT的溢出率决定 2 模式2 11位数据通过TXD2 P1 3 TXD2 P4 3 发送 通过RXD2 P1 2 RXD2 P4 2 接收 一帧数据包含一个起始位 0 8个数据位 一个可编程的第9位和一个停止位 1 发送时 第9位数据由特殊功能寄存器S2CON的S2TB8位确定 接收时 第9位数据进入特殊功能寄存器S2CON的S2RB8位 波特率为 Fosc 32或者Fosc 64 3 模式3 波特率的确定方法与模式1相同 数据的传输模式和模式2相同 8 2 3多处理机通信 下面以使用串口1为例说明多机通信的过程 串行口控制寄存器SCON中的SM2位为方式2和方式3工作时进行多机通信的控制位 这种多机通信方式一般为一台主机 多台从机系统 主机发送信息可被各从机接收 而从机只能对主机发送信息 而从机间互相不能直接通信 多机系统中使用两类信息 一类是地址信息 用于选择从机 另一类是要传送的数据信息 在通信中使用第9位区分两类信息 地址帧 第9位为1数据帧 第9位为0从机系统由初始化程序 或相关处理程序 将串行口置成工作方式2或3 SM2 1 REN 1 处于接收状态 当主机和某一从机通信时 主机应先发出地址帧确定某从机的地址 接着才能送数据或命令 当各从机接收到主机发出的地址帧信息后 由于第9数据位为 1 可激发中断标志RI 1 分别中断CPU 各CPU响应中断后均进入中断服务程序 在服务程序中把主机送来的地址号与本从机的地址号相比较 若地址相等 则使本机之SM2置 0 为接收主机接着送来的数据帧作准备 而地址号不符的其他从机仍然维持SM2 1状态 对主机以后发出的数据帧信息不予理睬 不激发中断标志RI 0 直到与主机发出的地址信息相符后 才可接收以后的数据信息 从而实现了主从一对一通信 点 点通信 在多机通信时 SM2控制位起着极为重要的作用 方式0 串口1 波特率为振荡频率的1 12或1 2 由UART M0 x6决定 串口2 波特率为振荡频率的1 12 忽略波特率发生器 方式2 波特率是可编程设定的 有两种波特率可选择 它取决于电源控制寄存器PCON中SMOD位的值 当SMOD 0时 为振荡频率的1 64 当SMOD 1时 为振荡频率的1 32 工作于方式1和3时 波特率是可变的 对于串口1 可以通过编程改变定时器1的溢出率或者独立波特率发生器的溢出率来确定波特率 对于串口2 只能通过编程改变独立波特率发生器的溢出率来确定波特率 波特率 定时器1的溢出率或独立波特率发生器的溢出率 定时器1作为波特率发生器应用时 最典型的用法是定时器1工作在自动再装入时间常数的定时方式2 即定时器的方式控制寄存器TMOD的高四位为0010B状态 定时器的控制寄存器TCON的TCON 6 TR1 1启动定时器1 禁止定时器中断 这时溢出率取决于TH1中的自动重新再装入值 定时器1的溢出率可由下式算出 溢出率 其中 12T模式时 n 1 1T模式时 n 0 将此值代入求波特率的算式 可求得串行口的波特率 8 2 4波特率的设定 当使用独立波特率发生器BRT时 独立波特率发生器的溢出率为 独立波特率发生器的溢出率 Fosc 12n 256 BRT 其中 BRT为BRT寄存器的值 对于独立波特率发生器BRT 1T模式是指BRTx12 1 12T模式是指BRTx12 0 12T模式时 n 1 1T模式时 n 0 此时 串行口的波特率计算公式为 串行口的波特率 由于串口2只能使用独立波特率发生器 因此 在使用串口2时 应特别注意波特率的设置方法 SMOD 0时 自动重装时间常数RELOAD的计算方法 1 计算RELOAD1 12T模式的计算公式 RELOAD 256 INT fosc Baud0 32 12 0 5 2 1T模式的计算公式 RELOAD 256 INT fosc Baud0 32 0 5 式中 INT 表示取整运算即舍去小数 在式中加0 5可以达到四舍五入的目的 fosc为晶振频率 Baud0为标准波特率 2 计算用RELOAD产生的波特率1 12T模式 Baud fosc 256 RELOAD 32 122 1T模式 Baud fosc 256 RELOAD 32 3 计算误差率error Baud Baud0 Baud0 100 4 如果误差率 4 5 则需要更换波特率或者更换晶体频率 重复步骤1 4 例如 设fosc 22 1184MHz Baud0 57600 则12T模式时 RELOAD 256 INT 22118400 57600 32 12 0 5 255 0FFHBaud 22118400 256 255 32 12 57600误差等于零 又如 设fosc 18 432MHz Baud0 57600 则12T模式时 RELOAD 256 INT 18432000 57600 32 12 0 5 0FFHBaud 18432000 256 255 32 12 48000误差 error 48000 57600 57600 100 16 66 误差很大 需要更换波特率或者更换晶体频率 在实际设计时 为了保证通信的可靠性 应尽量保证设计后的误差为0 常用波特率与系统时钟及定时器1的重装时间常数等设置关系请参考表8 4 8 2 5串行接口通信应用举例 1 串口1的编程要点 1 设置串口的工作模式设置SCON寄存器的内容 若要串口接收 需将其中的REN位置1 2 设置正确的波特率1 使用定时器1作为波特率发生器时 需要设置定时器1的工作方式和时间常数 设定TMOD和TH1 TL1寄存器的内容 启动定时器1 置位TR1 2 使用独立波特率发生器时 需要设置独立波特率发生器寄存器和相应的位 包括 独立波特率发生器寄存器BRT BRTx12位 SMOD位 启动BRT 置位BRTR BRT开始计数 3 设置串口的中断优先级 设置PS和PSH 也可以不设置 取默认值 设置相应的中断控制位 ES和EA 4 如要串口1发送 将数据送入SBUF 5 编制串行中断服务程序 在中断服务程序中要有清除中断标志指令 将TI和RI清零 2 串口2的编程要点 1 设置串口2的工作模式设置S2CON寄存器中的S2SM0和S2SM1两位 如要串口2接收 将S2REN置1 2 设置串口2的波特率相应的寄存器和位 包括 独立波特率发生器寄存器BRT BRTx12和S2SMOD位 启动BRT 置位BRTR BRT开始计数 3 设置串口2的中断优先级 设置PS2和PS2H 也可以不设置 取默认值 设置打开相应的中断控制位 ES2和EA 4 如要串口2发送 将数据送入S2BUF 5 编制串行中断服务程序 在中断服务程序中要设置清除中断标志指令 分别是接收完成标志S2RI和发送完成标志S2TI 例8 1设有甲 乙两台单片机 编出两台单片机间实现如下串行通信功能的程序 甲机发送 将首址为ADDRT的128个字节的数据块顺序向乙机发送 乙机接收 将接收的128个字节的数据 顺序存放在以首址为ADDRR的数据缓冲区中 编制该类程序的要点是 选定正确的控制字 以保证接口功能的初始化 选择合适的波特率 这主要是选择定时器1的方式和时间常数的确定 最后还应注意是在串行中断服务程序中要设置清除中断标志指令 否则将产生另一个中断 甲机发送程序流程图 汇编语言发送程序如下 include STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件ORG0000HLJMPMAINT 跳至主程序入口ORG0023HLJMPINTSE1 转至串行中断服务程序ORG0100HMAINT MOVSP 60H 设置堆栈指针MOVSCON 01000000B 置串行口工作方式1MOVTMOD 20H 定时器1为工作方式2MOVTH1 0FDH 产生9600bps的时间常数MOVTL1 0FDHSETBTR1 启动定时器1SETBES 串行口开中断SETBEA 开中断MOVDPTR ADDRT ADDRT是首址 可以使用EQU定义MOVR0 00H 传送字节数初值MOVXA DPTR 取第一个发送字节MOVSBUF A 启动串行口发送SJMP 等待中断 中断服务程序INTSE1 CLRTI 将中断标志清零CJNER0 7FH LOOPT 判断128B是否发送完 若没完 则转LOOPTCLRES 全部发送完毕 禁止串行口中断LJMPENDT 转中断返回LOOPT INCR0 修改字节数指针INCDPTR 修改地址指针MOVXA DPTR 取发送数据MOVSBUF A 启动串行口ENDT RETI 中断返回END 对应的C语言程序如下 include stc12c5a h 包含STC12C5A60S2单片机寄存器定义文件unsignedcharxdataADDRT 128 在外部RAM区定义128个单元unsignedcharnum 0 声明计数变量unsignedchar psend 指向发送数据区的指针voidmain void 主程序 SCON 0 x40 置串行口工作方式1TMOD 0 x20 定时器1为工作方式2TH1 0 xFD 产生9600bps的时间常数TL1 0 xFD TR1 1 启动定时器1ES 1 串行口开中断EA 1 开中断psend ADDRT 设置发送数据缓冲区指针SBUF psend 发送第一个数据while 1 等待中断 voidUART ISR void interrupt4 中断号4是串行中断 TI 0 清发送中断标志num 修改计数变量值if num 0 x7F ES 0 判断是否发送完 若已完 则关中断else 否则 修改指针 发送下一个数据 psend SBUF psend 乙机接收数据流程图 接收程序如下 汇编语言 对应的C语言程序请思考 include STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件ORG0000HLJMPMAINR 转主程序ORG0023HLJMPINTSE2 转串行口中断服务程序ORG0100HMAINR MOVSP 60H 设置堆栈指针MOVSCON 01010000B 置串行口工作方式1 允许接收MOVTMOD 20H 定时器1为工作方式2MOVTH1 0FDH 产生9600bps的时间常数MOVTL1 0FDHSETBTR1 启动定时器1SETBES 串行口开中断SETBEA 开中断MOVDPTR ADDRR 数据缓冲区首址送DPTRMOVR0 00H 置传送字节数初值SJMP 等待中断 中断服务程序INTSE2 CLRRI 清接收中断标志MOVA SBUF 取接收的数据MOVX DPTR A 接收的数据送缓冲区CJNER0 7FH LOOPR 判别接收完没有 若没有 转LOOPR继续接收CLRES 若接收完 则关串行口中断LJMPENDRLOOPR INCR0 修改计数指针INCDPTR 修改地址指针ENDR RETI 中断返回END 例8 2设有甲 乙两台单片机 编写程序 使用调用子程序的方法进行串行通信 甲机 发送机 从内部RAM单元20H 25H中取出6个ASCII码数据 在最高位加上奇偶校验位后由串行口发送 采用8位异步通信 波特率为1200bps 假设系统时钟为11 0592MHz 乙机 接收机 把接收到的ASCII码数据 先进行奇偶校验 若校验正确 将数据依次存放在内部RAM区20H 25H单元中 若校验出错 则将出错信息 0FFH 存入相应的单元 调用子程序的查询方式串行通信流程图 甲机的汇编语言程序如下 include STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件ORG0000H 主程序入口LJMPMAINTORG0030HMAINT MOVSP 60HMOVTMOD 20H 置定时器1为工作方式2MOVTH1 0E8H 置波特率时间常数MOVTL1 0E8HMOVSCON 40H 置串行口为工作方式1SETBTR1 启动定时器1工作MOVR0 20H 数据首地址送R0MOVR7 06H 传送字节数送R7LOOPT MOVA R0 取一个待传送的数据字节LCALLDATAOUT 调用串行可发送子程序INCR0 修改地址指针DJNZR7 LOOPT 若没有全部发送完毕 则转LOOPT继续发送SJMP DATAOUT 串行口发送子程序MOVC P 设置奇偶校验位 补奇 CPLCMOVACC 7 CMOVSBUF A 启动串行口发送数据JNBTI 等待数据字节发送完毕CLRTI 清发送标志TI 为下一数据字节串行发送作准备RETEND 对应的C语言程序如下 include stc12c5a h 包含STC12C5A60S2单片机寄存器定义文件unsignedchardataADDRT 6 at 0 x20 在内部RAM区定义6个单元voidmain void 主程序 unsignedchari TMOD 0 x20 置定时器1为工作方式2TH1 0 xe8 置波特率时间常数TL1 0 xe8 SCON 0 x40 置串行口为工作方式1TR1 1 启动定时器1工作for i 0 i 6 i UART SEND ADDRT i 发送一个数据while 1 发送完毕 循环等待 voidUART SEND unsignedcharsenddata 串行口发送子程序 bittmpbit ACC senddata tmpbit P 设置奇偶校验位 补奇 tmpbit tmpbit if tmpbit senddata senddata 0 x80 elsesenddata senddata 清发送标志TI 为下一数据字节串行发送作准备 include STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件ORG0000H 主程序入口地址LJMPMAINRORG0030HMAINR MOVSP 60HMOVTMOD 20H 置定时器1为工作方式2MOVTH1 0E8H 置波特率时间常数MOVTL1 0E8HMOVSCON 52H 置串行口为工作方式1 并使REN 1SETBTR1 启动定时器1MOVR0 20H 存放数据首地址送R0MOVR7 06H 存放数据字节数送R7LOOP LCALLDATAIN 调用接收子程序JCERROR 若C 1 则出错 转出错处理程序MOV R0 A 将接收的数据送指定RAM单元中LJMPLOOPCERROR MOV R0 0FFH 将出错字符 0FFH 送指定RAM单元LOOPC INCR0 修改地址指针DJNZR7 LOOP 若没全部接收完毕 则继续接收数据 否则顺序进行SJMP 串行口接收子程序DATAIN JNBRI 等待一个数据字节接收完毕CLRRI 接收完毕 清标志RI 为接收下一个数据字节作准备MOVA SBUF 接收到的数据字节送AMOVC P 检查奇偶校验位CPLCANLA 7FH 消去奇校验位RET 子程序返回END 乙机汇编语言程序 例8 3 多机通信编程举例 现用简单实例说明多机串行通信中从机的基本工作过程 而实际应用中还需要考虑通信的规范协议 有些协议很复杂 在此不加以考虑 假设系统晶振频率为11 0592MHz 编程实现如下功能 主机 先向从机发送一帧地址信息 然后再向从机发送10个数据信息 从机 接收主机发来的地址帧信息 并与本机的地址号相比较 若不符合 仍保持SM2 1不变 若相等 则使SM2清零 准备接收后续的数据信息 直至接收完10个数据信息 a 主机程序流程图b 从机程序流程图 主机程序 include STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件ADDRTEQU0000HSLAVEEQU5 从机地址号ORG0000HLJMPMAINT 主程序入口地址ORG0023HLJMPINTST 串行口中断入口地址ORG0100HMAINT MOVSP 60HMOVSCON 0C0H 串行口方式3MOVTMOD 20H 置T1工作方式2MOVTH1 0FAH 置4800波特率MOVTL1 0FAH 相应的时间常数MOVDPTR ADDRT 置数据地址指针MOVR0 00H 发送数据字节计数清零MOVR2 SLAVE 从机地址号 R2SETBTR1 启动T1SETBES 串行口开中断SETBEA CPU开中断SETBTB8 置位TB8 作为地址帧信息特征MOVA R2 发送地址帧信息MOVSBUF ASJMP 等待中断 串行口中断服务程序 INTST CLRTI 清发送中断标志CLRTB8 清TB8位 为发送数据帧信息作准备MOVXA DPTR 发送一个数据字节MOVSBUF AINCDPTR 修改指针INCR0CJNER0 0AH LOOPT 判数据字节是否发送完CLRESLOOPT RETIEND 对应的C语言版程序如下 include stc12c5a h 包含STC12C5A60S2单片机寄存器定义文件unsignedcharxdataADDRT 10 保存数据的外部RAM单元unsignedcharSLAVE 保存从机地址号的变量unsignedcharnum 0 mypdata voidmain void SCON 0 xC0 TMOD 0 x20 TH1 0 xFA TL1 0 xFA mypdata ADDRT SLAVE 5 定义从机地址 在此假设从机地址为5TR1 1 ES 1 EA 1 TB8 1 SBUF SLAVE 发送从机地址while 1 等待中断 voidSerial ISR void interrupt4 TI 0 TB8 0 SBUF mypdata 发送数据mypdata 修改指针num if num 0 x0a ES 0 从机程序如下 include STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件ADDRREQU0000HSLAVEEQU5 从机地址号ORG0000HLJMPMAINR 从机主程序入口地址ORG0023HLJMPINTSR 串行口中断入口地址ORG0100HMAINR MOVSP 60HMOVSCON 0F0H 串行口方式3 SM2 1 REN 1 接收状态MOVTMOD 20H 置T1为工作方式2MOVTH1 0FAH 置4800波特率MOVTL1 0FAH 相应的时间常数MOVDPTR ADDRR 置数据地址指针MOVR0 0AH 置接收数据字节数指针SETBTR1 启动T1SETBES 串行口开中断SETBEA CPU开中断SJMP 等待中断 INTSR CLRRI 清接收中断标志MOVA SBUF 取接收信息MOVC RB8 取RB8 信息特征位 CJNCLOOPR1 RB8 0为数据帧信息 转LOOPR1XRLA SLAVE RB8 1为地址帧信息 与本机地址号SLAVE相比较JZLOOPR2 地址相等 则转LOOPR2LJMPENDR 地址不相等 则转中断返回ENDRLOOPR2 CLRSM2 清SM2 为后面接收数据帧信息作准备LJMPENDR 中断返回LOOPR1 MOVX DPTR A 接收的数据 数据缓冲区INCDPTR 修改地址指针DJNZR0 ENDR 数据字节没全部接收完 则转LOOPR2SETBSM2 全部接收完 置SM2 1ENDR RETI 中断返回END 对应的C语言版程序如下 include stc12c5a h 包含STC12C5A60S2单片机寄存器定义文件unsignedcharxdataADDRR 10 unsignedcharSLAVE num 0 x0a rdata mypdata voidmain void SCON 0 xF0 TMOD 0 x20 TH1 0 xFA TL1 0 xFA mypdata ADDRR SLAVE 5 设定从机地址TR1 1 ES 1 EA 1 while 1 等待中断 voidSerial ISR void interrupt4 RI 0 rdata SBUF 将接收缓冲区的数据保存到rdata变量中if RB8 RB8 1说明收到的信息是地址 if rdata SLAVE 如果地址相等 则SM2 0SM2 0 else 接收到的信息是数据 mypdata rdata mypdata num if num 0 x00 所有数据接收完毕 令SM2 1 为下一次接收地址信息作准备SM2 1 例8 4 串口1使用独立波特率发生器作串行通信的实例 include stc12c5a h 包含STC12C5A60S2寄存器定义文件 include intrins h defineRELOAD COUNT0 xfb Fosc 18 432MHz 12T SMOD 0 9600bpssbitMCU Start Led P1 4 unsignedchararray 9 0 2 4 6 8 10 12 14 16 voidUART send unsignedchari voiddelay void voiddisplay MCU Start Led void voidmain void unsignedchari 串口初始化SCON 0 x50 0101 00008位可变波特率 无奇偶校验位BRT RELOAD COUNT AUXR 0 x11 BRTR 1 启动独立波特率发生器 S1BRS 1 串口1选择独立波特率发生器作为波特率发生器 ES 1 允许串口中断EA 1 开总中断display MCU Start Led 点亮发光二极管表示单片机开始工作UART send 0 x34 串口发送数据表示单片机串口正常工作UART send 0 xa7 串口发送数据表示单片机串口正常工作for i 0 i 9 i UART send array i while 1 voidUART send unsignedchari ES 0 关串口中断TI 0 清零串口发送完成中断请求标志SBUF i while TI 0 等待发送完成TI 0 清零串口发送完成中断请求标志ES 1 允许串口中断 voiddelay void unsignedintg j for j 0 j 5 j for g 0 g 50000 g nop nop nop voiddisplay MCU Start Led void unsignedchari for i 0 i 5 i MCU Start Led 0 点亮MCU开始工作指示灯delay MCU Start Led 1 熄灭MCU开始工作指示灯delay voidUART Receive void interrupt4 unsignedchark if RI 1 RI 0 k SBUF UART send k 1 elseTI 0 8 2 6计算机与单片机之间的串行通信 在以计算机为控制中心的数据采集与自动控制系统中 通常需要用单片机采集数据 然后用异步串行通信方式传给计算机 要完成的控制命令由计算机通过串行通信方式传给单片机 由单片机进行控制 计算机和单片机之间的串行通信一般采用RS 232 RS 422或RS 485总线标准接口 也有采用非标准的20mA电流环的 这里介绍最常用的RS 232接口串行通信的设计方法 RS 232是早期为公用电话网络数据通信而制定的标准 其逻辑电平与TTL CMOS电平完全不同 逻辑 0 规定为 5 15V之间 逻辑 1 规定为 5 15V之间 由于RS 232发送和接收之间有公共地 传输采用非平衡模式 因此共模噪声会耦合到信号系统中 标准中建议的最大通信距离为15m 下面通过一个简单实例 介绍计算机与单片机进行RS232通信的硬件接口设计和软件设计 例8 5 计算机向单片机发送一个数据 单片机接收到数据后 将接收到的数据回发给计算机 假设单片机的系统时钟为11 0592MHz 通信参数为 9600 n 8 1 这是常见的通信参数表示方法 即波特率为9600bps 8个数据位 1个停止位 没有奇偶校验 在计算机上显示从单片机发送过来的数据 可以使用该方法测试硬件电路的连接情况 1 硬件接口设计从硬件上讲 计算机的串行口是RS 232电平的 而单片机的串口是TTL电平的 因此 要实现单片机与计算机之间的串行通信 必须通过电路实现TTL电平和RS 232电平的转换 常用的电平转换集成电路是MAX232或者与它兼容转换芯片 它包含两路驱动器和接收器 单片机与计算机进行串行通信的硬件连接 最简单的方法是采用三线制连接方式 也就是说 计算机的9针串口只连接其中的3根线 第5脚的GND 第2脚的RXD 第3脚的TXD 电路如教材图1 7 2 软件设计软件设计往往因应用系统要求的不同而不同 根据题目的要求 进行如下的计算机程序设计和单片机程序设计 1 上位计算机程序设计软件设计往往因应用系统要求的不同而不同 软件设计分为上位机程序设计和单片机程序设计两部分 如果仅仅为了测试串口的电路连接以及单片机通信程序设计正确与否 上位机程序可以直接使用现成的串口调试助手软件 当然 也可以使用VisualC 等可视化程序开发环境自行设计 串口调试助手软件可以从中下载 利用STC2C5A60S2单片机的串口2和上位计算机通信 汇编语言程序 系统晶振为11 0592MHz 波特率为9600bit s INCLUDE STC12C5A INC 包含STC12C5A60S2单片机寄存器定义文件BITTESTDATA20HS2TIbitBIT01HS2RIbitBIT00HORG0000HLJMPMAINORG0043HLJMPUART2 ISRORG0100HMAIN MOVSP 60H 设置堆栈MOVS2CON 50H 010100008位可变波特率 无奇偶校验位 允许接收MOVBRT 0FDHMOVAUXR 11H BRTR 1 启动BRT S1BRS 1MOVIE2 01H 允许串口2中断 ES2 1SETBEASJMP UART2 ISR MOVBITTEST S2CON 将S2CON保存到20H单元以便位寻址JBCS2RIbit RDATA 若是接收中断 则将S2RI清零CLRS2TIbit 否则就是发送中断 将S2TI清零LJMPRETURNRDATA MOVA S2BUF 读取收到的数据

温馨提示

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

评论

0/150

提交评论