第5章 串行口与通信 本章学习目标 : 了解并行通信与串行通信的含义 理解波特率的概念,学会波特率的计算方法 能按要求正确设置特殊功能寄存器SCON和PCON的SMOD位 能区分串行口的4种工作方式, 熟悉方式1、方式2、方式3 程序的编制方法 知道RS-232C、RS-422A和RS485 基本性能 理解双机通信和多机通信的基本过程 能读懂教材中的控制实例,学会编写同等难度的控制程序
5.1串行通信的基础知识 数据通信的传输方式:并行通信和串行通信 并行通信:数据的各位同时送出。占用I/O多,速度快。 在实际应用中,80C51单片机经常要与外设进行信息交换;单片机与单片机之间或单片机与计算机之间往往也要交换信息,这些信息交换都可以称为通信。 数据通信的传输方式:并行通信和串行通信 并行通信:数据的各位同时送出。占用I/O多,速度快。 串行通信:数据的各位逐位送出。线路简单,速度慢。 传送数据1101 0010B时并行通信和串行通信的示意图。
5.1.1串行通信的制式 按照信息传送的方向,串行通信可分为3种制式。 1.单工制式 2.半双工制式 3.全双工制式
5.1.2串行通信的方式 串行通信有两种基本的通信方式:同步通信与异步通信。 1.异步通信(Asynchronous Communication) 在异步通信中,数据通常是以字符(或字节)为单位组成字符帧传送的。字符帧由发送端逐帧发送,接收端逐帧接收。发送端和接收端由各自的时钟来控制。这两个时钟源可以彼此独立、互不同步。 在帧格式中,一个字符由4个部分组成:起始位、二进制数据位、奇偶校验位和停止位。下图给出了典型的异步帧格式。
5.1.2串行通信的方式 2.同步通信(Synchronous Communication) 同步通信在发送一组数据时,只在开始用1~2个同步字符作为双方取得同步的号令,然后连续发送整组数据。不像异步通信那样将字符一个一个地分开来传送。格式下图所示。
标准波特率系列为110、300、600、1200、1800、2400、4800、9600和19200bps。 5.1.3串行通信的传输速率 所谓传输速率就是指每秒传输多少位,传输速率也称波特率(bps)。 如果数据传送的速率是120帧/秒,每个帧包含10位,则波特率为 10×120=1200 bps,于是每位传送的时间 T=1/1200=0.833ms 标准波特率系列为110、300、600、1200、1800、2400、4800、9600和19200bps。
5.1.4调制解调器(MODEM 又称猫) 在进行远程异步串行数据通信时,二进制的数据位在传输时会出现畸变,可以利用调制解调器解决这个问题。 利用调制解调器进行数据远距离串行通信的过程如下图所示。
接收和发送缓冲器SBUF在物理上共用一个地址99H。 5.2串行口的基本结构和工作方式 5.2.1串行口的基本组成 发送缓冲器SBUF只能写入不能读出。 全双工的串行通信口,可同时接收和发送。 接收和发送缓冲器SBUF在物理上共用一个地址99H。 接收缓冲器SBUF只能读出不能写入。
5.2.2串行口的特殊功能控制寄存器 1.串行口发送/接收缓冲器SBUF(99H) 2.串行口控制寄存器SCON 与串行口有关的特殊功能寄存器有SBUF、SCON、PCON,与串行口中断有关的特殊功能寄存器有IE、IP. 1.串行口发送/接收缓冲器SBUF(99H) 2.串行口控制寄存器SCON SCON的各位的定义和功能如下:
SM0、SM1: 串行口工作方式选择位(内容见5.2.3节)。 REN: 串行接收允许位。由软件置1或清0。软件置1时,串行口允许接收,清0后禁止接收。 TB8: 在方式2和方式3中是发送的第9位数据。 RB8: 在方式2和方式3中是接收的第9位数据。 TI: 发送中断标志位。发送结束时由硬件置位。该位必须用软件清零。 RI: 接收中断标志位。结束接收时由硬件置位。该位必须用软件清零。
3.电源控制寄存器PCON 串行口借用了电源控制寄存器PCON的最高位。PCON是8位寄存器,字节地址为87H,不可进行位寻址。它的低4位全部用于80C51/80C31子系列单片机的电源控制。只有最高位SMOD位用于串行口波特率系数的控制。当SMOD=l时,方式1、2、3的波特率加倍,否则不加倍。PCON的格式如下:
5.2.3串行口的四种工作方式 80C51单片机串行口有4种工作方式,用特殊功能寄存器SCON中的SM0、 SM1两位进行设定,见表5-1。
1.方式0 (1)特点 用于串行I/O口扩展,有固定的波特率,为fOSC/12。 同步发送/接收功能,由TXD提供移位脉冲,RXD用作数据输入/输出通道。 发送接收8位数据,低位在前,高位在后。 (2)发送操作 由指令MOV SBUF,A 启动发送操作,发送时由TXD输出移位脉冲,RXD发送SBUF中的数据。发送完8位数据后,TI自动置1,请求中断。要继续发送时,TI必须由指令清0(CLR TI)。 (3)接收操作 在RI=0的前提下,用指令置REN=1,可以启动一帧数据的接收。同样由TXD输出移位脉冲,由RXD接收串行数据。接收完一帧RI自动置1,请求中断。想继续接收时要用指令清除RI。
2.方式1 (1)特点 8位异步串行通信UART接口。 帧结构为10位,包括起始位0,8位数据位,1位停止位。 (2)发送操作 由指令MOV SBUF,A 启动A中的数据从TXD端异步发送。发送完一帧数据后,TI自动置1,请求中断。要继续发送时,TI必须由指令清0(CLR TI)。 (3)接收操作 在RI=0的前提下,用指令置REN=1,启动一帧数据的接收。串行口采样RXD,当采样到1至0的跳变时,表明接到串行数据的起始位,开始接收一帧数据,直到停止位到来时,把停止位送到RB8中,此时RI自动置1,请求中断并通知CPU从SBUF中取走已接收到的数据 。想继续接收时要用指令清除RI。
8位异步串行通信UART接口。帧结构为11位,包括起始位0,8位数据位,1位可编程位TB8/RB8,1位停止位。 3.方式2和方式3 方式2和方式3具有多机通信功能,两种方式除了波特率设置不同外,其余功能完全相同。 (1)特点 8位异步串行通信UART接口。帧结构为11位,包括起始位0,8位数据位,1位可编程位TB8/RB8,1位停止位。 方式2的波特率固定,由PCON中的SMOD位选择,当SMOD=0时,波特率为fOSC/64;当SMOD=1时,波特率为fOSC/32;SMOD位状态用软件设置。见表5-1。
在多机通信的发送操作中,用TB8作地址/数据标志位。TB8=1,地址帧;TB8=0,数据帧。 3.方式2和方式3 (2)发送操作 发送操作前,用指令定义TB8(如作为奇偶校验位或地址/数据标志位),由指令MOV SBUF,A 将A中的数据送入SBUF后启动发送操作;在发送操作中,已定义的TB8位能自动加入待发送的8位数据之后构成第9位,这样组成的一帧完整数据自动从TXD端异步发送;发送完成后,TI自动置1,请求中断。要继续发送时,TI必须由指令清0(CLR TI)。 在多机通信的发送操作中,用TB8作地址/数据标志位。TB8=1,地址帧;TB8=0,数据帧。
3.方式2和方式3 (3)接收操作 在RI=0的前提下,用指令置REN=1,启动一帧数据的接收,将接收数据的第9位送入RB8。该数据能否接收,要由SM2和RB8的状态决定: SM2=0时,串行口不看RB8状态,无条件接收。 SM2=1是多机通信方式,接收到的RB8是地址/数据标志位: 若RB8=1,接收的信息是地址,此时RI自动置1,串行口接收发送来的数据。 若RB8=0,接收的信息是数据。对于SM2=1的从机,RI不置1,此数据丢失;对于SM2=0的从机,SBUF自动接收发来的数据。
5.3串行通信的常用标准接口 80C51单片机常与其它51单片机或PC机进行串行通信。 80C51单片机串行接口的信号电平为TTL类型,抗干扰能力差,传输距离短。为了提高串行通信的可靠性,延长通信距离,工程设计人员一般采用标准串行接口,如RS-232C、RS-422A和RS-485等。这三种接口最初都是由美国电子工业协会(EIA)制订并发布的。
图5-7 RS-232C通过电话网实现远程通信的示意图 RS-232C(又称 EIA RS-232-C)是目前PC机与通信工业中应用最广泛的一种串行接口。图5-7是利用RS-232C通过电话网实现远程通信的示意图。 图5-7 RS-232C通过电话网实现远程通信的示意图
1.接口信号 RS-232C是EIA在1969年推出的。全名是“数据终端设备DTE(如计算机和各种终端机)和数据通讯设备DCE(如调制解调器MODEM)之间串行二进制数据交换接口技术标准”。它适合于数据传输速率在0~20 000bps范围内的通信。 图5-8 RS-232C串口结构
目前较为常用的RS-232C有9针串口(DB9)和25针串口(DB25),结构分别如图5-8所示。在保证通信准确性的前提下,如果通信距离较近 (小于12米),可以用电缆线直接连接,图5-9是这种连接方式的示意图;若距离较远,需附加调制解调器(MODEM),见图5-7。 图5-9 近程通信示意图
实际上DB25中有许多引脚很少使用,在计算机与终端通讯中一般只使用3-9条引线。最常用的9条引线的信号内容见表5-2所示。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连。传输线采用屏蔽双绞线。如图5-10 所示。 图5-10 RS-232C串口结构
表5-2 DB9和DB25的常用信号脚说明
2.逻辑电平 -3V~-15V规定为“1”; +3V~+15V规定为“0”; -3V~+3V为过渡区,不做定义。 RS-232C是早期为促进公用电话网络进行数据通信而制定的标准。它采用负逻辑,即 -3V~-15V规定为“1”; +3V~+15V规定为“0”; -3V~+3V为过渡区,不做定义。
3.电平转换芯片与接口电路 RS-232C信号的电平和单片机串口信号的电平不一致,必须进行二者之间的电平转换。常用芯片有MC1488(TTL转换成RS-232C信号)、MC1489(RS-232C信号转换成TTL)等。另一种常用的集成电平转换芯片MAX232可以实现RS-232C/TTL电平的双向转换,它只使用单一的+5V电源供电,配接4个1μF电解电容即可完成RS-232电平与TTL电平之间的转换。其原理图如图5-11所示。转换完毕的串口信号TXD、RXD直接和80C51的串行口连接。
图5-11 电平匹配原理图 注:1.为提高电路抗干扰能力,C1~C4要用钽电容1.0μF/16V,且尽 量靠近MAX232; 图5-11 电平匹配原理图 注:1.为提高电路抗干扰能力,C1~C4要用钽电容1.0μF/16V,且尽 量靠近MAX232; 2. MAX232对噪声很敏感,在VCC与GND之间加C5=0.1μF,起去耦作用
5.3.2 RS-485接口 1.性能特点 RS-485以良好的抗噪声干扰性,长距离传输特性和多站能力等优点成为首选的串行接口。表现为: 接口信号电平比RS-232C低(±1.5V~±6V),不易损坏接口电路芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。 RS-485传输数据的速度较快,最高速率达到10Mbps 。 采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性能好。 最大传输距离标准值为4000英尺,折合1219米,实际上可达 3000米。 RS-485接口允许在总线上同时连接32个发送器和32个接收器,即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。 因RS-485接口组成的半双工网络一般只需二根连线,所以RS-485接口均采用屏蔽双绞线传输。RS-485接口连接器采用DB9的9芯插头座。与智能终端RS-485接口采用DB9(孔);与键盘连接的键盘接口RS-485采用DB9(针)。
2、与其它标准接口的对照 表5-3 列出了RS-485与其它标准接口的对照表 接口标准 RS-232C RS-422A RS-485 功能 双向,全双工 双向,半双工 工作方式 单端 差分 逻辑“0”电平 3V~15V 2V~6V 1.5V~6V 逻辑“1”电平 -3V~-15V -2V~-6V -1.5V~-6V 节点数 1收、1发 1发10收 1发32收 最大传输距离 15米 1219米 最大传输速率 20Kb/S 10Mb/s 驱动器加载输出电压 ±5V~±15V ±2V ±1.5V 接收器输入电阻(Ω) 3K~7K 4K(最小) ≥12K 抗干扰能力 弱 强
5.4串行口应用与训练 5.4.1应用指导 1.串行通信中的常用波特率 80C51的四种工作方式中,方式0和方式2的波特率固定,见表5-1和方式0、方式2的特点。方式1和方式3的波特率可变,其具体数值由定时器T1的溢出率和SMOD位共同决定,公式见表5-1。 定时器T1作波特率发生器时,为了防止溢出中断,应保持T1为中断禁止状态。表5-4列出了T1的常用波特率。
表5- 4 T1的常用波特率
2.利用串行口扩展I/O口 80C51单片机串行口方式0为同步移位寄存器方式,可进行8位并行I/O口的扩展。当串行口别无它用时,可通过使用串行输入并行输出移位寄存器(如74LS164)扩展并行输出口;或使用并行输入串行输出移位寄存器(如74LS165)扩展并行输入口。这种方法不占用片外RAM地址,而且还能简化单片机系统的硬件结构。但缺点是操作速度较慢,且扩展芯片越多,速度越慢。 图5-12是利用一片74LS165扩展8位并行输入口的实用电路。当移位/置入端S/由“1”变为“0”时,并行输入端的数据被置入寄存器。当S/=1,且时钟禁止端(15脚)接地时,在时钟脉冲的作用下,数据由QA向QH方向(即D7→D0)移动。
图5-12 利用一片74LS165扩展8位并行输入口电路 图中RXD(P3.0)作为80C51的串行输入端与74LS165的串行输出端相连,TXD(P3.1)为移位脉冲输出端,与74LS165芯片的移位脉冲输入端连接,用一根I/O口线P1.0与74LS165芯片的S/相连来控制移位与置位过程。 注:图中74LS165的SIN引脚为串行输入端,用于两片74LS165的串行扩展连接。
3.串行通信编程基础 (1)串行口初始化编程 串行口初始化应该包括对SCON、PCON和T1的初始化。对T1的初始化又包含TMOD寄存器初始化(将T1设置为波特率发生器)、根据波特率求时间常数并对TH1和TL1赋值、启动T1等过程,串口初始化格式如下,其中加括号的指令可根据情况选择使用: SIO:MOV SCON,#控制状态字 ;写方式字且TI=RI=0 (MOV PCON,#80H) ;波特率加倍 (MOV TMOD,#20H ) ;T1作波特率发生器 ( MOV TH1,#X ) ;选定波特率 ( MOV TH1,#X ) ( SETB TR1) ;启动T1 ( SETB EA) ;开串行口中断 ( SETB ES)
(2)发送程序 发送程序可以采用中断和查询两种方式设计。 查询方式: TRAM: MOV A,@R0 ;取数据 MOV SBUF,A ;发送一个字符 WAIT: JBC TI,NEXT ;等待发送结束 SJMP WAIT NEXT: INC R0 ;准备下一次发送 SJMP TRAM
中断方式: ORG 0023H ;串行口中断入口 AJMP SINT MAIN: … ;初始化编程 TRAM: MOV A,@R0 ;取数据 MOV SBUF,A ;发送第一个字符 SJMP $ ;其它工作 SINT:CLR TI ;中断服务程序 INC R0 MOV A,@R0 ;取数据 MOV SBUF,A ;发送下一个字符 RETI
(3)接收程序 与发送相类似,接收也可以采用中断和查询两种方式设计。 当REN=1、RI=0时80C51处于等待接收状态;一旦检测到RI=1,80C51开始从SBUF读取数据。 查询方式: WAIT: JBC RI,NEXT ;查询等待 SJMP WAIT NEXT: MOV A,SBUF ;读取接收数据 MOV @R0,A ;保存数据 INC R0 ;准备下一次接收
5.4.2 基本训练 1.初始化训练 要求:某80C51单片机通信系统,晶振频率为12MHz,要求串行口发送8位数据,波特率1200bmp,请编写它的初始化程序。 思路与计算:要选择串行口和定时器T1的工作方式,计算时间常数并赋值给TH1、TL1。我们可以利用表5- 1中求波特率的公式:
初始化程序: MOV SCON,#40H ;串口工作于方式1 MOV PCON,#80H ;SMOD=1 MOV TMOD,#20H ;T1 作定时器,工作于方式2 MOV TH1,#0CCH ;装入时间常数初值 MOV TL1 ,#0CCH ;自动重装时间常数 CLR ET1 ;禁止T1中断 SETB TR1 ;启动T1波特率发生器 总结:用上述公式计算出的波特率不为整数,近似取整后,波特率也就不能精确地等于1200bps。但在异步传送中,每接收一个字符实际上都要整步一次,因此这点微小误差并不影响收发。
2.串行传送训练 要求:利用80C51的串行口实现一个数据块的发送。设发送数据区首地址为58H,数据块长度(字节数)为10,串行口工作于方式1,波特率1200bps,晶振频率为11.0592MHz。 思路:串行口工作于方式1时,波特率要编程设定。通常使T1工作在方式2,当波特率取1200bps时,可以查表或计算时间常数初值,得0E8H(SMOD=0时)。 发送子程序TRAM清单: TRAM:MOV TMOD,#20H ;T1工作在方式2 MOV TH1,#0E8H ;装入时间常数初值 MOV TL1,#0E8H ;自动重装时间常数
CLR ET1 ;禁止T1中断 SETB TR1 ;启动T1波特率发生器 MOV SCON,#40H ;串口工作于方式1 MOV PCON,#00H ;SMOD=0,该指令可不写 MOV R1,#58H ;数据发送区首址送R1 MOV R5,#10 ;发送长度送R5 LOOP:MOV A,@R1 ;发送一帧数据 MOV SBUF,A WAIT:JBC TI,NEXT ;发送等待,发完一帧转去NEXT SJMP WAIT NEXT:INC R1 ;准备取下一数据 DJNZ R5,LOOP ;数据块发完?未发完转LOOP RET ;发完,结束 <想一想> 发送等待时为什么不用“JB TI,NEXT”指令,而用“ JBC TI,NEXT”指令?
5.4.3 课题与实训10 串行输出控制彩灯 一.实训目的 1.熟悉74LS164的使用,掌握串行口的基本应用方法。 5.4.3 课题与实训10 串行输出控制彩灯 一.实训目的 1.熟悉74LS164的使用,掌握串行口的基本应用方法。 2.学习串行口的扩展技术,掌握串行口相关寄存器的设定方法。 3.掌握串行口扩展显示器的电路设计原理和编程方法 二.课题要求 利用一片AT89C51芯片,使之工作于方式0。在其串口扩展一片74LS164控制8个LED,要求使用建表方式,控制LED闪烁,其闪烁规律为:8个LED作左移2次,闪2次;右移2次,闪2次。闪烁间隔0.2秒。
三.背景知识 1.74LS164是串行输入并行输出移位寄存器,接在80C51的串行口,可以实现对8位并行数据的控制。 2.80C51与74LS164连接时,RXD(P3.0)作为串行输出与74LS164的数据输入端(1、2)相连,TXD(P3.1)作为移位脉冲输出与74LS164的时钟脉冲输入端(8)相连,74LS164的CLR端(9)通过电阻、电容接在电源和地上。
四.硬件电路 图5-13 串行输出控制彩灯硬件电路
五.软件设计(参考程序如下:) ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV SCON,#00H;串口工作于方式0 START:MOV DPTR,#TABLE;指向TABLE表 LOOP:CLR A;清除A MOVC A,@A+DPTR;从TABLE表取数据 CJNE A,#05H,NEXT;取到结束码05H?没有跳到NEXT AJMP START;结束,重新开始 NEXT:CPL A;取到数据反相 MOV SBUF,A;向串口发送 LOOP1:JBC TI,LOOP2;发送结束?是,跳到LOOP2 AJMP LOOP1;没结束,再检测 LOOP2:ACALL DELAY;延时0.2秒 INC DPTR;指向下一地址 AJMP LOOP
六.总结与思考 DELAY:MOV R7,#4 ;延时0.2S D1: MOV R6,#20 D2: MOV R5,#123 NOP DJNZ R5,$ DJNZ R6,D2 DJNZ R7,D1 RET TABLE:DB 01H,02H,04H,08H DB 10H,20H,40H,80H DB 01H,02H,04H,08H DB 00H,0FFH,00H,0FFH DB 80H,40H,20H,10H DB 08H,04H,02H,01H DB 05H END 六.总结与思考 1.74LS164无输出控制端,故串行输入过程中,输出端会不断地变化。所以一般应在74LS164和输出装置之间加接输出控制门,以保证串行输入结束后再输出数据。 2.如果不用建表方式,如何实现?
5.5 单片机串行口应用举例 5.5.1 单片机与显示器的串行通信 分析与设计 例:某车间拟设置一块生产进度显示板,显示当天已完成的产品数量(不超过256),所需的产量数据,要从主单片机传送到显示板,请帮助设计相应的传送程序。 分析与设计 该任务中,每当生产线上完成一台合格产品时,通过自动计数装置向主单片机外部中断输入端送出一个低电平“0”,作为请求中断信号;主单片机响应中断后,在中断服务程序中,将产量值(存放在50H中)加1,并通过串口将其送给显示板。 显示版接收主单片机送来的显示数据。显示板的CPU平时运行显示程序,显示当前的产量(产量数据存放在数据存储区50H单元中)。只有当显示板的串口接收到主单片机发来的显示数据时,才会因串口中断,转去执行中断服务程序,以便将新接收到的产量数据存放到50H单元中,再返回到主程序执行显示程序。
软件设计 1.主单片机 ⑴主程序 发送端的主程序要完成外部中断和串行口的初始化工作,然后等待外部中断。 ORG 0000H AJMP MAIN ORG 0013H AJMP SUBG ;中断入口 ORG 0100H MAIN:MOV 50H,#00H ;当天产量从0开始 MOV SP,#60H SETB IT1;采用边沿触发方式 MOV SCON,#40H;串口工作于方式1,禁止接收 MOV PCON,#00H;波特率不加倍 MOV TMOD,#20H;T1工作于方式2
MOV TH1,#0E8H;波特率为1200bps MOV TL1,#0E8H SETB EX1;开中断 SETB EA;开中断 SETB TR1;打开波特率发生器 AJMP $;等待中断 ⑵中断服务子程序 当外部中断申请中断时,表示生产线上已完成一台成品,因此中断服务程序的任务就是将产量单元50H加1,并将加1后的数值从串口输出。程序如下: ORG 0200H SUBG:PUSH ACC INC 50H MOV A,50H MOV SBUF,A
WAIT:JBC TI,NEXT SJMP WAIT NEXT:POP ACC RETI 2.显示板的CPU ⑴主程序 主程序的初始化部分与发送端基本相同,只是要将SCON的禁止接收改成允许接收。并且要一边执行显示程序,一边等待中断。显示程序从略,可参看第6章。 ORG 0000H AJMP MAIN ORG 0023H AJMP SUBG ;串口中断入口 ORG 0100H MAIN:MOV 50H,#00H ;当天产量从0开始 MOV SP,#60H
MOV SCON,#50H;串口工作于方式1,允许接收 MOV PCON,#00H;波特率不加倍 MOV TMOD,#20H;T1工作于方式2 MOV TH1,#0E8H;波特率为1200bps MOV TL1,#0E8H SETB ES;开串口中断 SETB EA;开中断 SETB TR1;打开波特率发生器 WAIT:ACALL DISPLAY;转显示子程序 AJMP WAIT;等待中断
⑵中断服务子程序 当接收端的串口收到单片机发来的数据时,串口申请中断。在中断服务程序中,要保护现场,将新接收到的产量数据存放到50H单元中,再返回主程序。 ORG 0200H SUBG:PUSH ACC CLR RI MOV A, SBUF MOV 50H, A NEXT:POP ACC RETI
5.5.2 课题与实训11 双机通信 一.实训目的 二.课题要求 三.背景知识 1.学习双机通信的常识。 5.5.2 课题与实训11 双机通信 一.实训目的 1.学习双机通信的常识。 2.掌握双机通信程序状态字的设置方法。 3.学习双机通信程序的编制方法。 二.课题要求 利用2片AT89C51芯片,一片用作发送器,记作89C51-T,用来读入P1口指拨开关的状态;另一片用作接收器,记作89C51-R,用来接收89C51-T发送过来的指拨开关的状态,并将其在89C51-R输出的8个LED上显示出来。 三.背景知识 1.双机通信 如果两个80C51单片机相距很近,将它们的串行口直接相连,即可实现双机通信。采用图5-14所示的两个80C51串行口直接相连的方法,通信距离只限于1.5m以内。如果要增加通信距离,可以在两个单片机之间采用标准异步串行接口连接,如使用RS-232C、RS-422A及RS-485等串行接口总线。
图5-14 双机通信简图 2.通信协议 在双机通信或多机通信时,通常要规定通信协议。所谓通信协议是指通信双方的一种约定。它对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程。 本实训所用的两片AT89C51芯片,一个只作输入,另一个只作输出,形式非常简单,不用规定通信协议。
四.硬件电路 图5-15 双机通信硬件电路
五.软件设计 参考程序如下: AT89C51-T的发送程序 ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV SP,#50H ;设定堆栈区 MOV SCON,#40H ;串行口工作在方式1,禁止接收 MOV TMOD,#20H ;定时器1工作在方式2 MOV TL1,#0E8H ;波特率为1200 MOV TH1,#0E8H ; SETB TR1 ;启动定时器1 MOV 30H,#0FFH ;设定指拨开关初值 MOV P1, #0FFH ;P1 口设为输入状态 READ:MOV A,P1 ;读入指拨开关值 CJNE A,30H,KEY ;输入值改变则跳至KEY AJMP READ ;否则继续读指拨开关值
KEY:MOV 30H,A ;存指拨开关新值 MOV SBUF,A ;送串行口发送 WAIT:JBC TI,READ ;查看是否送完 AJMP WAIT END AT89C51-R的接收程序 ORG 0000H AJMP MAIN ORG 0100H MAIN:MOV SP,#50H ;设定堆栈区 MOV SCON,#50H ;串行口工作在方式1,允许接收 MOV TMOD,#20H ;定时器1工作在方式2 MOV TL1,#0E8H ;波特率为1200 MOV TH1,#0E8H SETB TR1 ;启动定时器1 READ:JBC RI,UART ;是否接收到数据,收到则跳到UART AJMP READ
六.总结与提高 在编写串行口应用程序时应注意这样几个问题: 必须对串行口进行初始化。具体包括SCON、PCON 和波特率的设定。 UART:MOV A,SBUF ;收到的数据送A MOV P1,A ;发送至P1口 AJMP READ END 六.总结与提高 在编写串行口应用程序时应注意这样几个问题: 必须对串行口进行初始化。具体包括SCON、PCON 和波特率的设定。 在接收和发送一个字节完毕后必须用软件清除中断标志。 本实训采用软件查询方式编程,请尝试用中断方式实现该功能。
5.5.3 多机通信 串行口的方式2和方式3具有多机通信功能,能实现一台主单片机和若干从单片机构成的多机分布控制系统,其连接方式如图5-16所示。 图5-16 多机通信示意图
置所有从机的SM2=1,都处于只接收地址的状态。 主机发送一帧地址(前8位是地址值,第9位为1,表示该帧信息是地址)。 多机通信时,充分利用单片机SCON中的多机通信控制SM2位。当从机SM2=1时,从机只接收主机发来的地址帧(特点是第9位为1),对数据帧不予理睬;当从机SM2=0时,从机可以接收主机发来所有信息。过程如下: 置所有从机的SM2=1,都处于只接收地址的状态。 主机发送一帧地址(前8位是地址值,第9位为1,表示该帧信息是地址)。 所有从机接到地址帧后,转去执行中断,目的是将接收到的地址与自身地址相比较,二者相同,则SM2=0,否则,SM2=1。 由于被呼叫从机已令SM2=0,所以它可以接收主机接下来传送的所有数据,实现与主机的通信。 被呼叫从机通信完成后,置SM2=1,恢复多机通信的原始状态。
本章小结 80C51单片机的串行接口能完成以下基本任务: (1)实现数据格式化:在异步通信方式下,对来自CPU的普通并行数据,接口自动生成起止的帧数据格式。 (2)进行串-并转换:这是串行接口电路的重要任务。它能把计算机处理的并行数据与串行口所需的串行数据进行转换。
(3)控制数据传输速率:串行通信接口电路具有对数据传输速率——波特率进行选择和控制的能力。 串行口有四种工作方式:方式0、方式1、方式2、方式3,其中方式0常用于接口扩展,波特率固定;方式1常用于一般数据传送,波特率可调;方式2和方式3常用于双机或多机通信,方式2的波特率固定(SMOD确定后);方式3的波特率可调。 80C51单片机作串行通信时,为提高通信质量,常采用标准串行接口RS-232C、RS-422A或RS-485等。其中RS-232C应用广泛,但传输距离短,只有几十米;而RS-485抗干扰能力强,接线简单,传输距离能达到1200米。 在工业控制系统中,采用单片机与PC机组合的形式构成的分布式控制系统是今后多点现场工控系统的一个重要的发展方向。
思考题与习题 1.什么是串行通信和并行通信?各有何特点? 2.按照信息传送方向来分,串行通信有哪几种工作制式?80C51单片机采用哪种工作制式? 3.什么是同步通信和异步通信? 4.什么叫波特率?在80C51单片机中有几种产生波特率的方法?串行通信对波特率有什么基本的要求? 5.80C51单片机的UART中有哪些方式采用异步数据传输?哪些方式采用同步数据传输? 6.80C51单片机串行口有几种工作方式?由什么寄存器决定? 7.串行缓冲寄存器SBUF有什么作用?简述串行口接收和发送数据的过程。 8.串行通信时为什么一般采用标准接口?你知道的标准接口有哪些?
9.RS-232C 和RS-485 的信号逻辑电平各是什么?在与80C51单片机通信时,中间是否都要加装逻辑电平转换芯片? 10.某80C51单片机控制系统,主振频率为12MHz,要求串行口发送数据为8位,波特率为1200bps,请编写它的初始化程序。 11.串行口控制寄存器SCON中TB8、RB8起什么作用?在什么方式下使用? 12.请编程将内RAM 40H单元中的数据从串行口移位输出至串入并出芯片74LS164 ,输出完成后置位P1.0 。 13.利用80C51 的串行口UART实现一个数据块的接收。设接收数据缓冲区的首地址为40H,接收数据长度为10H,串行口工作于方式2(设SMOD=1)。
14.设以串行方式1进行数据传送,fosc=6MHz,波特率为2400bps(设SMOD=1)。发送的8个数据依次存在外RAM首址4000H单元中,先发送数据长度,后发送8个数据,请编写发送子程序。 15.在5.4.2节的串行传送训练中如果增加奇偶校验功能,软件该如何设计?(提示:因发送的是8位数据字节,故奇偶校验位需另外安排,不能采用方式1工作状态,可以采用UART的方式3:把TB8嵌入发送程序中作奇偶校验位。波特率设置和发送缓冲区不变。)