480 likes | 655 Views
模块四 内部资源(三) ---- 串行口及应用. 一、案例 ---- 基于串行口的彩灯控制系统 功能: 1 、彩灯 0.5S 移动 1 次 ; 2 、彩灯输出控制由串行口实现。 前面介绍的彩灯输出控制都是基于并行口的,本次课讨论另外的实现方法 --- 串行输出。. 数据输入 RXD 1 2 TXD 移位脉冲 74LS164 8 8051 3 4 5 6 10 11 12 13.
E N D
模块四 内部资源(三)----串行口及应用 一、案例----基于串行口的彩灯控制系统 功能:1、彩灯0.5S移动1次; 2、彩灯输出控制由串行口实现。 前面介绍的彩灯输出控制都是基于并行口的,本次课讨论另外的实现方法---串行输出。 数据输入 RXD 1 2 TXD 移位脉冲 74LS164 8 8051 3 4 5 6 10 11 12 13 D7 D6 D5 D4 D3 D2 D1 D0
要求:(1)8个发光管全亮;(2)从左向右依次变灭,每次减少一个,直到全灭;(3)从左向右依次点亮,每次亮一个;(4)从右向左依次点亮,每次亮一个;(5)从左向右依次点亮,每次增加一个,直到全亮;(6)返回(2)循环。要求:(1)8个发光管全亮;(2)从左向右依次变灭,每次减少一个,直到全灭;(3)从左向右依次点亮,每次亮一个;(4)从右向左依次点亮,每次亮一个;(5)从左向右依次点亮,每次增加一个,直到全亮;(6)返回(2)循环。 ORG 0000H LJMP MAIN ORG 0030H MAIN:MOV SCON,#0 CLR ES MOV DPTR,#TAB LOOP:MOV R0,#0 L1: MOV A,R0
MOVC A,@A+DPTR CLR P1.0 MOV SUBF,A JNB TI,$ CLR TI SETB P1.0 ACALL DELAY INC R0 CJNE R0,#34,L1 SJMP LOOP TAB: DB 0FFH DB 0FFH,7FH,3FH,1FH,0FH,7,3,1,0,80H,40H DB 20H,10H,8,4,2,1,1,2,4,8,10H,20H,40H,80H,80H DB 0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH END 请试验上段程序,看一下运行效果。 计算机串行通信基础
并 行 数 据 传 送 串 行 数 据 传 送 原 理 各数据位同时传送 数据位按位顺序进行 优 点 传送速度快、效率高 最少只需一根传输线即可完成:成本低 缺 点 数据位数→传输线根数:成本高 速度慢 应 用 传送距离<30米,用于计算机内部 几米~几千公里,用于计算机与外设之间 二、 串行通信基础知识 并行 数据传送 同步 串行 异步(用于单片机中)
通信:并行通信与串行通信 • 并行通信 特点:传送控制简单、速度快,但传输线较多,成本高。
串行通信 特点:传送控制复杂、速度慢,传输线少,成本低
1.串行通信的基本概念 • 异步通信与同步通信 • 异步通信 收、发设备时钟独立,以字符(帧)为单位传输
异步通信帧格式 • 起始位(1位); • 数据位(8位); • 奇偶校验位(1位,可无校验位); • 停止位(1位)。 特点 • 易于实现 • 效率不高 • 同步通信(发、收时钟直接连接,效率高。板内元件间的SPI接口)
串行通信的传输方向 • 单工 • 半双工 • 全双工 80C51有1个全双工串行口
信号的调制与解调 调制解调器 • 调制 • 解调 DTE:数据终端设备 DCE:数据通信设备
2.串行通信接口标准 RS-232C定义的是DTE与DCE间的接口标准。 • 机械特性 DB-25 连接器 DB-9 连接器
RS-232C采用负逻辑电平,规定(-3~-25V)为逻辑“1”,(+3~+25V)为逻辑“0”。-3V~+3V是未定义的过渡区。试比较:RS-232C采用负逻辑电平,规定(-3~-25V)为逻辑“1”,(+3~+25V)为逻辑“0”。-3V~+3V是未定义的过渡区。试比较: • 电气特性 电平转换电路(如MAX232)。
远程通信,需要调制解调器 • 过程特性
近程通信,不需要调制解调器 无联络线方式 联络线短接(伪连接)方式
RS-232C电平与TTL电平转换驱动电路 早期常用MC1488、MC1489 近期常用MAXM232: 片内带有自升压电路 仅需+5V电源 内含2个发送器,2个接收器
采用RS-232C接口存在的问题 传输距离短、速率低 通常不超过15米,速率20Kbps 有电平偏移 RS-232收发共地,地电流会使电平偏移出现逻辑错误。 抗干扰能力差 RS-232常用单端输入,易混入干扰。 新标准RS-485改善了传输特性,应用广泛。
单片机与单片机间的通信 • 硬件连接 近程连接 (直连) 远程连接 (电平转换)
通信协议 • 串口方式1,2400 Baud,T1定时方式2, 晶振选11.0592MHz,查表知:TH1=TL1=F4H,SMOD=0 • A机发“E1”联络,B机同意接收发“E2”响应 A机收到“E2”后,发数据块及校验字节。 • B机接收数据块及校验字节,判传输是否正确 正确时向A机发送“00H”,否则发送“FFH” • A机接收到“00H”则本次传输结束。否则重新传输数据
单片机与PC机间的通信 • 硬件连接 直接连接 交叉连接
通信协议 • 串口方式1,1200 Baud,T1定时方式2, 晶振选11.0592MHz,查表知:TH1=TL1=E8H,SMOD=0 • PC机发“E1”联络,单片机响应后向PC机发送数据 • PC机再发“E1”联络, 单片机会再一次发送数据
三、80C51单片机的串行口 1个全双工串口:通信或接口扩展 1.80C51串行口的结构及SBUF 接收发送缓冲器逻辑同名、物理分开;接收双缓冲。
发送SBUF和接收SBUF共用一个地址99H。 1)发送SBUF存放待发送的8位数据,写入SBUF将同时 启动发送。发送指令: MOV SBUF,A 2)接收SBUF存放已接收成功的8位数据,供CPU读取。 读取串行口接收数据指令: MOV A,SBUF
2.80C51串行口的控制寄存器 • 串行口控制寄存器SCON • SM0和SM1:工作方式选择位
SM2:多机通信控制位 SM2=1时,接收机处于地址帧筛选状态。若RB8=1,该地址帧信息可进入SBUF,并使RI为1,进而在中断服务中再进行地址号比较;若RB8=0,该帧不是地址帧,应丢掉,且保持RI=0。 SM2=0时,接收机处于地址帧筛选被禁止状态。不论收到的RB8为0或1,均可以使收到的信息进入SBUF,并使RI=1。此时的RB8通常为校验位。 • REN:串行接收使能位,软件置1时,启动接收过程
TB8:多机方式发送的第9位 多机方式的地址/数据帧标志。也可作为奇偶校验位。 • RB8:多机方式接收的第9位 多机方式的地址/数据帧标志。也可作为奇偶校验位。 • TI:发送中断标志位,要由软件清0 • RI:接收中断标志位,要由软件清0
电源控制寄存器PCON • SMOD:波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。
3. 80C51串行口的工作方式 方式0:同步移位寄存器,用于扩展并行口 • RXD:输入或输出引脚 • TXD:移位脉冲输出 • 接收和方式都是8位 • 波特率固定为:fosc/12
数据输出: CLR用于对74LS164清0
先发送一个字符,等待TI=1后再发送下一个字符。先发送一个字符,等待TI=1后再发送下一个字符。 发送程序: 1、查询方式: TRAM: MOV SCON,#00H ;方式 MOV IE,#00H MOV SBUF,A ;发送一个字符 WAIT: JBC TI,NEXT ;等待发送结束 SJMP WAIT NEXT: CLR TI SJMP TRAM 2、中断方式: ORG 0023H ;串行口中断入口 AJMP SINT MAIN: MOV SCON,#00H;初始化编程 SETB ES SETB EA TRAM: MOV SBUF,A ;发送第一个字符 H: SJMP H ;其它工作 SINT: CLR TI ;中断服务程序 MOV A,@ R0;取数据 MOV SBUF,A ;发送下一个字符 RETI
数据输入: S/L负脉冲将并行数据装入,高电平时启动单片机进行数据输入。
REN=1、RI=0等待接收,当RI=1,从SBUF读取数据。 接收程序: 1.查询方式: WAIT: JBC RI,NEXT ;查询等待 SJMP WAIT NEXT: MOV A,SBUF ;读取接收数据 MOV @R0,A ;保存数据 CLR RI INC R0;准备下一次接收 SJMP WAIT 2.中断方式: ORG 0023H AJMP RINT MAIN: … ;初始化编程 H: SJMP H ;其它任务 RINT: CLR RI;清中断标志 MOV A,SBUF;读取接收数据 MOV @R0,A;保存数据 INC R0 RETI
方式1:10位帧,用于双机通信 • 起始位:1位 • 数据位:8位 • 停止位:1位
串行发送:(写SBUF启动发送过程) 串行接收:(置REN=1启动接收过程)
方式2和方式3:11位帧,用于多机通信 • 起始位:1位 • 数据位:9位 • 停止位:1位
串行发送:(写SBUF启动发送过程) 串行接收:(置REN=1启动接收过程)
4.80C51波特率确定与初始化步骤 波特率的确定 • 波特率的计算 固定波特率: 方式0波特率= fosc/12 方式2波特率=(2SMOD/64)*fosc 可变波特率: 方式1波特率=(2SMOD/32)*(T1溢出率) 方式3波特率=(2SMOD/32)*(T1溢出率) T1 溢出率 = fosc /{12×[256 -(TH1)]}
串行接口控制: 1.数据缓冲器SBUF 发送SBUF和接收SBUF共用一个地址99H。 1)发送SBUF存放待发送的8位数据,写入SBUF将同时 启动发送。发送指令: MOV SBUF,A 2)接收SBUF存放已接收成功的8位数据,供CPU读取。 读取串行口接收数据指令: MOV A,SBUF 2.节电控制寄存器PCON SMOD(PCON.7):波特率加倍控制位。 SMOD=1,波特率加倍; SMOD=0,则不加倍。
(四)计算波特率 方式0为固定波特率:B=fosc/12 方式2可选两种波特率: B=(2SMOD/64)×fosc 方式1、3为可变波特率,用T1作波特率发生器。 B=(2SMOD/32)×T1溢出率 T1为方式2的时间常数: X = 28 - t/T 溢出时间: t= (28 -X)T = (28 -X)×12/ fosc T1溢出率=1/t= fosc /[12×(2n -X)] 波特率B=(2SMOD/32)×fosc/[12×(28-X)] 串行口方式1、3,根据波特率选择T1工作方式,计算时间常数。 T1选方式2: TH1= X = 28 - fosc/12×2SMOD/(32×B) T1选方式1用于低波特率,需考虑T1重装时间常数时间。 也可选工作方式3。
四、单片机串行口的应用 串行口初始化编程格式: SIO:MOV SCON,#控制状态字 ;写方式字且TI=RI=0 ( MOV PCON,#80H ) ;波特率加倍 ( MOV TMOD,#20H ) ;T1作波特率发生器 ( MOV TH1,#X ) ;选定波特率 ( MOV TL1,#X ) ( SETB TR1) ( SETB EA) ;开串行口中断 ( SETB ES)
先发送一个字符,等待TI=1后再发送下一个字符。先发送一个字符,等待TI=1后再发送下一个字符。 发送程序: 1、查询方式: TRAM: MOV A,@R0;取数据 MOV SBUF,A ;发送一个字符 WAIT: JBC TI,NEXT ;等待发送结束 SJMP WAIT NEXT: CLR TI INC R0;准备下一次发送 SJMP TRAM 2、中断方式: ORG 0023H ;串行口中断入口 AJMP SINT MAIN: … ;初始化编程 TRAM: MOV A,@ R0;取数据 MOV SBUF,A ;发送第一个字符 H: SJMP H ;其它工作 SINT: CLR TI ;中断服务程序 INC R0 MOV A,@ R0;取数据 MOV SBUF,A ;发送下一个字符 RETI
REN=1、RI=0等待接收,当RI=1,从SBUF读取数据。 接收程序: 1.查询方式: WAIT: JBC RI,NEXT ;查询等待 SJMP WAIT NEXT: MOV A,SBUF ;读取接收数据 MOV @R0,A ;保存数据 CLR RI INC R0;准备下一次接收 SJMP WAIT 2.中断方式: ORG 0023H AJMP RINT MAIN: … ;初始化编程 H: SJMP H ;其它任务 RINT: CLR RI;清中断标志 MOV A,SBUF;读取接收数据 MOV @R0,A;保存数据 INC R0 RETI
ORG 0023H ;串行口中断入口 AJMP TRANI TRANI: PUSH A ;保护现场 PUSH PSW CLR TI ;清发送结束标志 DJNZ R7,NEXT ;是否发送完? CLR ES ;发送完,关闭串行口中断 SJMP TEND NEXT: INC R0 ;未发送完,修改指针 MOV A,@R0 ;取下一个字符 MOV C,P ;加奇偶校验 MOV TB8,C MOV SBUF,A ;发送一个字符 POP PSW ;恢复现场 POP A TEND: RETI ;中断返回
接收程序:串行输入16个字符,存入片内RAM的50H起 始单元,串行口波特率为2400(设晶振为11.0592MHz)。 RECS: MOV SCON,#50H ;串行口方式1允许接收 MOV TMOD,#20H ;T1方式2定时 MOV TL1,#0F4H ;写入T1时间常数 MOV TH1,#0F4H SETB TR1 ;启动T1 MOV R0,#50H ;设数据指针 MOV R7,#10H ;接收数据长度 WAIT: JBC RI,NEXT ;等待串行口接收 SJMP WAIT NEXT: MOV A,SBUF ;读取接收字符 MOV @R0,A ;保存一个字符 INC R0 ;修改指针 DJNZ R7,WAIT ;全部字符接收完? RET
RECS: MOV SCON,#0D0H ;串行口方式3允许接收 MOV TMOD,#20H ;T1方式2定时 MOV TL1,#0F4H ;写入T1时间常数 MOV TH1,#0F4H SETB TR1 ;启动T1 MOV R0,#50H ;设数据指针 MOV R7,#10H ;接收数据长度 WAIT: JBC RI,NEXT ;等待串行口接收 SJMP WAIT NEXT: MOV A,SBUF ;取一个接收字符 JNB P,COMP ;奇偶校验 JNB RB8,ERR ;P≠RB8,数据出错 SJMP RIGHT ;P=RB8,数据正确 COMP: JB RB8,ERR RIGHT: MOV @R0,A ;保存一个字符 INC R0 ;修改指针 DJNZ R7,WAIT ;全部字符接收完? CLR F0 ;F0 =0,接收数据全部正确RETERR: SETB F0 ;F0 =1,接收数据出错 RET 接收程序:串行输入16个字符,进行奇偶校验。