630 likes | 735 Vues
第 7 章 MCS-51 单片机 串行口. 曲阜师范大学杏坛学院 秦婧文. 第 7 章 MCS-51 单片机串行口. 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举例 7.5 单片机与 PC 机通信的接口电路. 本章要点 本章主要讲述 MCS-51 单片机串行口的结构、工作原理以及应用 。 主要内容包括串行通信基本知识、 MCS-51 单片机串行口结构、串行口工作方式以及单片机与 PC 机通信的接口电路。. 7.1 串行通信基本知识. 主要内容
E N D
第7章 MCS-51单片机串行口 曲阜师范大学杏坛学院 秦婧文
第7章 MCS-51单片机串行口 目 录 7.1 串行通信基本知识 7.2 串行口结构及控制 7.3 串行口工作方式 7.4 串行口应用举例 7.5 单片机与PC机通信的接口电路
本章要点 本章主要讲述MCS-51单片机串行口的结构、工作原理以及应用。 主要内容包括串行通信基本知识、MCS-51单片机串行口结构、串行口工作方式以及单片机与PC机通信的接口电路。
7.1 串行通信基本知识 主要内容 7.1.1 数据通信 7.1.2 异步通信和同步通信 7.1.3 波特率 7.1.4 通信方向 7.1.5 串行通信接口种类
7.1.1 数据通信 计算机与外界的信息交换称为通信。基本的通信方法有并行通信和串行通信两种。 1.并行通信 单位信息(通常指一个字节)的各位数据同时传送的通信方法称为并行通信。 2.串行通信 单位信息的各位数据被分时一位一位依次顺序传送的通信方式称为串行通信。
7.1.1 数据通信 图7-1 并行通信示意图 图7-2 串行通信示意图 从图中可以看出: 并行通信连线多,速度快,适合近距离通信; 串行通信连线少,速度慢,适合远距离通信。 图7-1 并行通信示意图
7.1.2 异步通信和同步通信 1.异步通信 异步通信中,传送的数据可以是一个字符代码或一个字节数据,数据以帧的形式一帧一帧传送。 图7-3 异步通信的一帧数据格式
7.1.2 异步通信和同步通信 2.同步通信 在同步通信中,每一数据块发送开始时,先发送一个或两个同步字符,使发送与接收取得同步,然后再顺序发送数据。数据块的各个字符间取消起始位和停止位,所以通信速度得以提高 。 图7-4 同步通信数据帧格式
7.1.3 波特率 在串行通信中,对数据传送速度有一定要求。波特率表示每秒传送的位数,单位为b/s(记作波特)。 例如:数据传送速率为每秒钟10个字符,若每个字符的一帧为11位,则传送波持率为: 11b/字符×10字符/s=110b/s 异步通信的传送速率一般在50~19 200b/s之间 。
7.1.4 通信方向 单工方式:一对传输线只允许单方向传送数据; 半双工方式:一对传输线允许向两个方向中的任一方向传送数据,但不能同时进行; 全双工方式:用两对传输线连接在发送器和接收器上,发送和接收能同时进行。
7.1.4 通信方向 图7-5 串行通信传输方式
7.1.5 串行通信接口种类 根据串行通信格式及约定(如同步方式、通信速率、数据块格式等)不同,形成了许多串行通信接口标准,如常见的: UART(串行异步通信接口)、 USB(通用串行总线接口)、 I2C(集成电路间的串行总线)、 SPI(串行外设总线)、 485总线、CAN总线接口等。
7.2 串行口结构及控制 主要内容 7.2.1 MCS-51串行口结构 7.2.2 与串行口有关的特殊功能寄存器 7.2.3 波特率设计
7.2.1 MCS-51串行口结构 图7-6 串行口方式1、3内部结构示意简图
7.2.2 与串行口有关的特殊功能寄存器 1.控制状态寄存器SCON 用于定义串行通信口的工作方式和反映串行口状态,其字节地址为98H,复位值为0000 0000B,可位寻址格式为:
7.2.2 与串行口有关的特殊功能寄存器 • SM0和SM1(SCON.7、SCON.6):串行口工作方式选择位。 • SM2(SCON.5):多机通信控制位,在方式2或3中使用。 • REN(SCON.4):允许接收控制位,由软件置1或清0。
7.2.2 与串行口有关的特殊功能寄存器 • TB8(SCON.3):发送数据的第9位。 • RB8(SCON.2):接收数据的第9位。 • TI(SCON.1):发送中断标志。 • RI(SCON.0):接收中断标志。 关于TI和RI:串行发送中断标志TI和接收中断RI是同一个中断源,CPU事先不知道是发送中断标志TI还是接收中断标志RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。
7.2.2 与串行口有关的特殊功能寄存器 2.电源控制寄存器PCON 电源控制寄存器PCON (地址为87H)中只有SMOD位与串行口工作有关。 SMOD(PCON.7):波特率倍增位。串行口工作于方式1、方式2和方式3时,当SMOD=1时,串行口波特率加倍。复位值为0000 0000B。PCON寄存器不能进行位寻址。
7.2.3 波特率设计 方式0和方式2的波特率是固定的,方式1和方式3的波特率是由定时器T1的溢出率来决定的。在增强型单片机中,也可以使用T2作波特率发生器。 1.方式0的波特率 固定为振荡频率的1/12。并不受PCON寄存器中SMOD位的影响。 方式0的波特率=fosc/12
7.2.3 波特率设计 2.方式2的波特率 接收与发送的移位时钟由振荡频率fosc的第二节拍P2时钟(fosc/2)给出,所以,方式2波特率取决于PCON中SMOD位的值:当SMOD=0时,波特率为fosc的1/64;若SMOD=1,则波特率为fosc的1/32。即 方式2的波特率= 2SMOD×fosc/64
7.2.3 波特率设计 3.方式1和方式3的波特率 (1)T1作波特率发生器 在最典型应用中,定时器T1选用定时器模式2,此时n=8,设定时器的初值为X: 于是, X=256 - 方式1、3的波特率= ×(T1溢出速率) 即波特率= ××/(2n -初值)
7.2.3 波特率设计 (2)T2作波特率发生器 在增强型单片机中,还可以使用T2作为波特率发生器。当寄存器T2CON的位TCLK=1和(或)RCLK=1时,允许串行口从T2获得发送和(或)接收的波特率。 串行口方式1、3的波特率=T2溢出率/16 定时器2作波特率发生器时,计数在每个状态周期递增。这样: 方式1、3的波特率=
主要内容7.3.1 串行口方式0 7.3.2 串行口方式1 7.3.3 串行口方式2和方式3 7.3 串行口工作方式
7.3.1 串行口方式0 方式0为同步移位寄存器输入/输出方式,常用于扩展I/O口。RXD为数据输入或输出,TXD为移位时钟,作为外接部件的同步信号。 方式0不适用于两个89C52之间的数据通信,可以通过外接移位寄存器来实现单片机的接口扩展。 在这种方式下,收/发的数据为8位,低位在前,无起始位、奇偶校验位及停止位,波特率是固定的。
7.3.1 串行口方式0 发送电路 接收电路
7.3.2 串行口方式1 方式1真正用于串行发送或接收,为10位通用异步接口。TXD与RXD分别用于发送与接收数据。 收发一帧数据的格式为1位起始位、8位数据位(低位在前)、1位停止位,共10位。在接收时,停止位进入SCON的RB8,此方式的传送波特率可调。
7.3.3 串行口方式2和方式3 串行口工作在方式2和方式3均为每帧11位异步通信格式,由TXD和RXD发送与接收(两种方式操作是完全一样的,不同的只是特波率)。 每帧11位:即1位起始位、8位数据位(低位在前)、1位可编程的第9数据位和1位停止位。 发送时,第9数据位(TB8)可以设置为1或0,也可将奇偶位装入TB8; 接收时,第9数据位进入SCON的RB8。
7.4 串行口应用举例 主要内容 7.4.1 同步方式应用 7.4.2 异步方式应用
7.4.1 同步方式应用 MSC-51单片机的串行口在方式0时,以同步方式操作。外接串入/并出或并入/串出器件,可实现I/O口的扩展。 例7-2用89C52串行口外接164串入/并出移位寄存器扩展8位并行输出口,外接165并入/串出移位寄存器扩展8位并行输入口。8位并行输出口的每位都接一个发光二极管,要求从8位并行输入口读入开关的状态值,使闭合开关对应的发光二极管点亮。如图7-13所示。
7.4.1 同步方式应用 图7-13 方式0扩展输入输出电路
7.4.1 同步方式应用 解:数据的输入输出通过RXD接收和发送,移位时钟通过TXD送出,74HC164用于串/并转换,74HC165用于并/串转换。 C语言程序清单: #include<reg52.h> sbit P1_0=P1^0; sbit P1_1=P1^1; unsigned char data1; void main() { SCON=0x10; //串行口方式0,允许接收 ES=1; EA=1; //允许串行口中断
7.4.1 同步方式应用 P1_0=0; //关闭并行输出 P1_1=1; //并行置入数据 P1_1=0; //开始串行移位 SBUF=0; //送入串行数据 while(1); //等待中断 } void s_srv() interrupt 4 //中断服务程序 { if(TI) //发送中断 { TI=0; P1_0=1; //打开并行输出 }
7.4.1 同步方式应用 else //接收中断 { RI=0; data1=SBUF; //读取接收的数据 P1_0=0; //关闭并行输出 SBUF=~data1; //送入串行数据 P1_1=1; //为接收下一次 P1_1=0; //数据做准备 } } 汇编语言程序清单: ORG 0000H SJMP MAIN ORG 23H SJMP S_SRV ;串行口中断服务程序
7.4.1 同步方式应用 MAIN: MOV SCON,#10H ;串行口方式0初始化 SETB ES SETB EA MOV A,#0 CLR P1.0 ;关闭并行输出 MOV SBUF,A ;开始串行输出 SETB P1.1 CLR P1.1 SJMP $ ;等待中断
7.4.1 同步方式应用 S_SRV: JBC TI,SEND CLR RI MOV A,SBUF CLR P1.0 CPL A MOV SBUF,A SETB P1.1 CLR P1.1 RETI SEND: SETB P1.0 RETI
7.4.2 异步方式应用 串行口方式1与方式3很近似,波特率设置一样,不同之处在于方式3比方式1多了一个数据附加位。 方式2与方式3基本一样(只是波特率设置不同),接收/发送11位信息:开始为1位起始位(0),中间8位数据位.数据位之后为1位程控位(由用户置SCON的TB8决定),最后是1位停止位(1)。只比方式1多了一位程控位。
7.4.2 异步方式应用 例7-3将片内RAM 50H~5FH中的数据串行发送,用第9个数据位作奇偶校验位,设晶振为11.059 2MHz,波特率为2 400b/s,编制串行口方式3的发送程序。 解:用TB8作奇偶校验位,在数据写入发送缓冲器之前.先将数据的奇偶位P写入TB8,这时,第9位数据作奇偶校验用,发送采用中断方式。
7.4.2 异步方式应用 C语言程序清单: #include<reg52.h> unsigned char i=0; unsigned char array[16] _at_ 0x50; //发送缓冲区 void main() { SCON=0xc0; //串行口初始化 TMOD=0x20; //定时器初始化 TH1=0xf4; TL1=0xf4; TR1=1; ES=1; EA=1; //中断初始化 ACC=array[i]; //发送第一个数据送 TB8=P; //累加器,目的取P位 SBUF=ACC; //发送一个数据 while(1); //等待中断 }
7.4.2 异步方式应用 void server() interrupt 4 //串行口中断服务程序 { TI=0; //清发送中断标志 ACC=array[++i]; //取下一个数据 TB8=P; SBUF=ACC; if(i==16) //发送完毕, ES=0; //禁止串口中断 }
7.4.2 异步方式应用 汇编语言程序清单: ORG 0000H SJMP MAIN ;上电,转主程序 ORG 23H SJMP SERVER ;转中断服务程序 MAIN: MOV SCON,#0C0H ;串行口方式3初始化 MOV TMOD,#20H ;定时器1工作在方式2 MOV TH1,#0F4H MOV TL1,#0F4H SETB TR1 SETB ES ;允许串行口中断 SETB EA ;CPU开中断 MOV R0,#50H MOV R7,#0FH
7.4.2 异步方式应用 MOV A,@R0 MOV C,P MOV TB8,C ;送奇偶标志位到TB8 MOV SBUF,A ;发送第一个数据 SJMP $ SERVER: CLR TI ;清除发送中断标志 INC R0 ;修改数据地址 MOV A,@R0 MOV C,P MOV TB8,C MOV SBUF,A ;发送下一个数据 DJNZ R7,ENDT ;判断数据块是否发送完 CLR ES ;否则,禁止串行口中断 ENDT: RETI ;中断返回
例7-4编写一个接收程序,将接收的16字节数据送入片内RAM 50H~5FH单元中。设第9个数据位作奇偶校验位,晶振为11.059 2 MHz,波特率为2 400b/s。 解:RB8作奇偶校验位,接收时,取出该位进行核对,接收采用查询方式。 7.4.2 异步方式应用
7.4.2 异步方式应用 C语言程序清单: #include<reg52.h> unsigned char i; unsigned char array[16] _at_ 0x50; //接收缓冲区 void main() { SCON=0xd0; //串行口初始化,允许接收 TMOD=0x20; TH1=0xf4; TL1=0xf4; TR1=1;
7.4.2 异步方式应用 for(i=0;i<16;i++) //循环接收16个数据 { while(!RI); //等待一次接收完成 RI=0; ACC=SBUF; if(RB8==P) //校验正确 array[i]=ACC; else //校验不正确 { F0=1; break; } } while(1); }
7.4.2 异步方式应用 汇编语言程序清单: MAIN:MOV TMOD,#20H ;定时器初始化 MOV TH1,#0F4H MOV TL1,#0F4H SETB TR1 MOV SCON,#0D0H ;串口初始化,允许接收 MOV R0,#50H ;首地址送R0 MOV R7,#10H ;数据长度送R7 WAIT:JNB RI,$ ;等待接收完成 CLR RI ;清中断标志 MOV A,SBUF ;读数到累加器
7.4.2 异步方式应用 JNB P,PNP ;P=0,转PNP JNB RB8,ERROR ;P=1,RB8=0,转出错 SJMP RIGHT PNP: JB RB8,ERROR ;P=0,RB8=1,转出错 RIGHT:MOV @R0,A ;存数 INC R0 ;修改地址指针 DJNZ R7,WAIT ;未接收完,继续 CLR F0 ;置正确接收标志F0=0 RET ERROR:SETB F0 ;置错误接收标志F0=1 RET
7.4.2 异步方式应用 例7-5用第9个数据位作奇偶校验位,编制串行口方式3的全双工通信程序,设双机将各自键盘的按键键值发送给对方,接收正确后放入缓冲区(可用于显示或其它处理),晶振为11.059 2 MHz,波特率为9 600b/s。 解:因为是全双工方式,通信双方的程序一样。发送和接收都采用中断方式。
7.4.2 异步方式应用 C语言程序清单: #include<reg52.h> char k; unsigned char buffer; void main() { SCON=0xd0; //串行口初始化, 允许接收 TMOD=0x20; //定时器初始化 TH1=0xfd; TL1=0xfd; TR1=1; ES=1; //开串行口中断 EA=1; //开总中断
7.4.2 异步方式应用 while(1) { k=key(); //读取按键按下键值 if(k!=-1) //无键按下返回-1 { ACC=k; //将键值送累加器,取P位 TB8=P; //送TB8 SBUF=ACC; //发送 } display(); //显示程序 } }
7.4.2 异步方式应用 void serial_server() interrupt 4 { if(TI) //发送引起,清TI TI=0; else //否则,接收引起 { RI=0; ACC=SBUF; //读取接收数据 if(RB8==P) //校验正确, buffer=ACC; //存入缓冲区 } }