串行通信技术_第1页
串行通信技术_第2页
串行通信技术_第3页
串行通信技术_第4页
串行通信技术_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

单片机原理及应用

〔第九章串行通信技术〕教学内容串行通信概述串行通信接口的结构串行通信接口的控制串行通信接口的编程DATE:2024/1/11PAGE:2

一、串行通信概述计算机与外界的信息传输常被称为通信,根本通信方式有并行通信和串行通信两种。并行通信方式指数据的各个二进制位在不同的数据线上同时传输。并行通信传输速度快,效率高,但所需的数据线多,本钱高,抗干扰能力较差,适用于近距离传输。串行通信方式指将数据拆分成多个二进制位,逐一的在同一条数据线上输出。串行通信虽然传输速度较慢,效率较低,但所需的数据线少、硬件电路简单、抗干扰能力强,且适用于远距离数据传输。DATE:2024/1/11PAGE:3

一、串行通信概述串行通信有同步通信和异步通信两种根本的通信方式。〔1〕同步通信同步通信是一种连续的串行传输数据的通信方式,待发送的假设干个字符数据构成一个数据块,在该数据块前部添加1~2个同步字符,在数据块的末尾添加校验信息,以此种方式构成数据帧,以数据帧为单位进行串行通信。

通信时,发送方首先发送同步字符,之后紧跟数据块,最后是校验字符。接收方在检测到同步字符后,开始逐个接收数据,直到把所有数据接收完毕,最后进行校验。DATE:2024/1/11PAGE:4

一、串行通信概述〔2〕异步通信每个字符数据被封装成帧,以帧的形式发送。每一帧由四局部构成,分别是起始位、数据位、校验位和停止位。起始位是数据开始传送的标志,用逻辑0表示;数据位紧跟起始位,通常是5~8位二进制位;校验位用于校验数据位是否发送正确,可以选择奇校验、偶校验或者不使用校验位。帧和帧之间可以连续,或者参加任意的空闲位,空闲位用逻辑1表示。DATE:2024/1/11PAGE:5

一、串行通信概述串行通信的方向按照数据传送方向,串行通信可以分为三个种类,分别是单工、半双工和全双工。单工:通信双方一方固定为发送方,另一方固定为接收方,数据只能是单行传输;半双工:通信双方只使用一根数据线,每一方都有发送器和接收器,可以在两个方向上传送,但通信双方不能同时接收或发送数据,只能交替进行;全双工:通信双方使用两根数据线,分别用于不同方向的数据传输,通信双方能够同时收发数据。

DATE:2024/1/11PAGE:6

一、串行通信概述波特率波特率是数据传输速率,指每秒钟传送二进制位的个数,单位为bit/s。波特率是串行通信的重要指标,波特率越高,串口数据传输速度越快。假设设定波特率为9600bit/s,而数据帧由1位起始位、8位数据位、1位停止位构成,那么串口每秒钟最多传送9600/(1+8+1)=960个字节。DATE:2024/1/11PAGE:7

二、存储器扩展RS-232C串口计算机广泛使用DB9接口连接,DB9串口及其引脚定义如下:双机近距离串口通信时,可以采用简单

的三线式连接,连线方式如右图所示。DATE:2024/1/11PAGE:8

一、串行通信概述单片机与PC机串口连接:由于RS-232C和单片机的电气标准不统一,当单片机通过串口方式与PC机通信时通常采用MAX3232等专用芯片实现两种电平的转换,连接方式如下:DATE:2024/1/11PAGE:9

二、串行通信接口的结构8051单片机串行通信接口的结构8051单片机的串行口主要由数据发送缓冲器SBUF、发送控制器、输出控制门、数据接收缓冲器SBUF、接收控制器、输入移位存放器、串行口控制存放器SCON构成。DATE:2024/1/11PAGE:10

二、串行通信接口的结构串行通信接口的结构发送缓冲器SBUF和接收缓冲器SBUF共用同一个地址0x99,发送SBUF只能写入而不能读出,接收SBUF只能读出不能写入。CPU将数据写入SBUF中便启动发送,数据送引脚TXD被外设接收。数据从引脚RXD上接入到数据移位存放器中,一帧接收完毕后再被自动送入SBUF中,CPU读取SBUF,便完成一次串口接收。DATE:2024/1/11PAGE:11

三、串行通信接口的控制串行控制存放器SCONSCON用于设定串口通信的工作方式、接收/发送控制以及串口工作状态指示。SCON的字节地址为0x98,可以进行位寻址,格式如下:SCON各位的意义如下:SM0、SM1:串行通信工作方式选择位。SM0和SM1共4种组合,对应4中工作方式,如下表所示,其中fosc为晶振频率。DATE:2024/1/11PAGE:12

三、串行通信接口的控制SM2:多机通信控制位,主要用于工作方式2和工作方式3。当串行口在多机通信模式下接收数据时:当SM2=0时,将接收到的8位数据送入到SBUF中,并产生中断请求。假设设置SM2=1,且RB8为0时,不接收主机发来的数据。如果不是多机通信,一般将SM2设为0。DATE:2024/1/11PAGE:13

三、串行通信接口的控制REN:串行口接收允许控制位。REN=1时,允许串行口接收数据;REN=0时,禁止串行口接收数据。TB8:在方式2和方式3下,该位为发送数据的第9位,根据需要由软件置1或清0,该位可用作奇偶校验位,还可以作为区别地址帧或数据帧的标志位,一般约定地址帧时该位为1,数据帧时该位为0。在方式0和方式1下,该位不使用。RB8:在方式2和方式3下,该位为接收数据的第9位,可以作为奇偶校验位,或者用于区分接收的是数据帧还是地址帧。TI:串行口发送中断标志位。在方式0下,发送完8位数据后由硬件置1,并申请中断;在其他方式下,在停止位开始发送之前由硬件置1,并申请中断。TI必须用软件清0。RI:串行口接收中断标志位。在方式0下,接收完8位数据后由硬件置1;在其他方式下,在接收到停止位时由硬件置1。RI必须用软件清0。DATE:2024/1/11PAGE:14

三、串行通信接口的控制电源管理存放器PCONPCON用来管理单片机的电源局部,包括上电复位检测、掉电模式、空闲模式等,PCON不可以位寻址,单片机复位时PCON全部被清0。PCON中与串口通信有关的是最高位D7,用于设置串行口波特率是否加倍,如以下图所示。当SMOD=1时,方式1、2、3的波特率加倍;当SMOD=0时,方式1、2、3的波特率不变。

DATE:2024/1/11PAGE:15

三、串行通信接口的控制串行口工作方式1.串行口工作方式0方式0下,为8位同步移位存放器方式。波特率固定为fosc/12,以8位数据为一帧,不设起始位和停止位。方式0发送CPU将待发送的数据写入到SBUF后,单片机自动将数据从RXD引脚输出,同步信号通过TXD引脚输出。发送数据完毕后,TI位被硬件自动置1。启动下一次发送前,TI位必须通过软件清0。方式0接收在REN=1和RI=0的前提下允许串行口输入。串行数据通过RXD引脚一位一位接收,并被移入到SBUF中,同步信号通过TXD引脚输出。当8位数据接收完毕后,RI被硬件自动置1,CPU读取SBUF后必须通过软件将RI清0才可以进行下次接收。DATE:2024/1/11PAGE:16

三、串行通信接口的控制串行口工作方式1串行口工作方式1为8位异步通信方式,数据帧格式为1位起始位、8位数据位、1位停止位,共10位。波特率由定时器T1溢出率决定。方式1发送CPU将待发送的数据写入SBUF后,单片机自动将数据位从TXD引脚输出。当数据发送完毕后,硬件自动使TI置1。启动下一次发送前,TI位必须软件清0。方式1接收REN=1时允许串口输入。数据位从RXD引脚输入,并被移入到SBUF中,当一帧数据接收完毕后,硬件自动使RI置1,CPU读取SBUF后必须将RI软件清0才可以进行下次接收。DATE:2024/1/11PAGE:17

三、串行通信接口的控制串行口工作方式2串行口工作方式2为9位异步通信方式,数据帧格式为1位起始位、8位数据位、1位控制/校验位、1位停止位,共11位。波特率为fosc/32或fosc/64。方式2发送将要发送的数据写入到SBUF,并通过SCON中的TB8设置数据的奇偶校验。数据位从TXD引脚输出。当数据发送完毕后,硬件自动使TI置1。启动下一次发送前,TI位必须清0。方式2接收方式2的接收过程与方式1类似,当RI=0且接收数据的第9位为1,或者RI=0且SM2=0时,前8位数据被移入到SBUF中,第9位数据被送入到SCON的RB8位,硬件自动使RI置1,CPU读取SBUF后必须将RI清0才可以进行下次接收。DATE:2024/1/11PAGE:18

三、串行通信接口的控制串行口工作方式3串行口工作方式3的波特率可变,取决于定时器T1的溢出率,除此之外与方式2相同。方式1和方式3下波特率的设定方式1和方式3下,波特率是可变的,由定时器T1的溢出率控制。定时器T1用作波特率发生器时,通常选择工作方式2,即8位初值自动重装载方式。常用的波特率与定时器T1的初值关系见下表:DATE:2024/1/11PAGE:19

四、串行通信接口的编程串行通信接口的编程在使用串口收发数据之前,需要对串口相关的特殊功能存放器进行初始化设置,其内容包括以下两个方面:1、初始化:(1)串口工作模式SCON设置需要设置SM0和SM1选择串行口工作方式,多机通信时还需要设置SM2。此外,如果需要串口接收数据,那么必须设置REN为1。(2)设置波特率对于方式0,不需要设置波特率。对于方式2,可以通过设置PCON中的SMOD位选择波特率为fosc/32或fosc/64。对于方式1和方式3,波特率设置通过定时器T1的工作方式2实现。设置波特率时,需要设置TMOD存放器,使定时器T1工作于方式2,并需要根据波特率的值查表设置定时器T1的初值存放器TH1和TL1。另外还需要设置PCON中的SMOD位,以决定波特率是否加倍。(3)如需中断,开总中断和串行中断DATE:2024/1/11PAGE:20

四、串行通信接口的编程2、奇偶校验:对于方式2和方式3,需要有奇偶校验。偶校验:发送/接收的8个数据位的1的个数为偶数时,TB8=0/RB8=0;为奇数时,TB8=1/RB8=1;奇校验:发送/接收的8个数据位的1的个数为奇数时,TB8=0/RB8=0;为偶数时,TB8=1/RB8=1;用软件产生奇偶校验位是根据51系列单片机的状态存放器PSW的定义:当累加器ACC中为1的个数为奇数时,P=1,否那么P=0,因此在校验之前需要先将数据送入累加器ACC计算1的个数,以决定P值,然后将P值装入TB8位,与数据一起发送出去供接收方校验。默认是偶校验,如果需要改成奇校验,那么在发送方需要将P值取反后再装入TB8,在接收方校验时需将RB8中的值取反再与P值进行比较。DATE:2024/1/11PAGE:21

四、串行通信接口的编程例9-1以下图是单片机8051与8位并入串出接口芯片74LS165的接口电路。使用串行口工作方式0,编程实现单片机从74LS165读取8位开关状态,并送P1口上的八个LED显示。DATE:2024/1/11PAGE:22

四、串行通信接口的编程#include<reg51.h>sbitP37=P3^7;intmain(void){ EA=1;//开总中断 ES=1;//开串行中断 SCON=0x10;//设置串口工作于方式0,允许接收数据 while(1) { P37=0;//锁存数据

P37=1;//允许传送数据

REN=1;//允许接收 while(REN);//等待传送完成

}}DATE:2024/1/11PAGE:23

四、串行通信接口的编程voidRecive()interrupt4//串行中断程序 { REN=0;//禁止接收数据 P1=SBUF;//显示数据 RI=0;//允许再次中断 }

DATE:2024/1/11PAGE:24

四、串行通信接口的编程例9-2以下图是单片机与8位的串入并出接口芯片74LS164的接口电路。使用串行口工作方式0,编程实现单片机发送串行数据到74LS165控制八个LED进行流水灯显示。DATE:2024/1/11PAGE:25

四、串行通信接口的编程#include<reg51.h>unsignedcharcodeTab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯码sbitP20=P2^0;

voiddelay(void){unsignedcharm,n; for(m=0;m<200;m++) for(n=0;n<200;n++);}DATE:2024/1/11PAGE:26

四、串行通信接口的编程voidSendchar(unsignedchardat)//发送字节函数{unsignedchari=10;P20=0;//对74LS164清0while(i--);//延时,保证清0完成P20=1;//结束清0SBUF=dat;//将字节写入发送缓冲器发送while(!TI);//等待发送完成

TI=0;//将TI复位}DATE:2024/1/11PAGE:27

四、串行通信接口的编程voidmain(void){unsignedchari;SCON=0x00;//串行口工作于方式0 while(1){ for(i=0;i<8;i++) { Sendchar(Tab[i]);//发送数据 delay();//延时 } }}DATE:2024/1/11PAGE:28

四、串行通信接口的编程例9-3以下图是单片机与单片机之间基于方式1串行单工通信的接口电路。使用单片机U1通过串行口TXD将数码管字型码以方式1发送至单片机U2的RXD,U2根据字型码控制P1口的数码管循环显示0~9数字。DATE:2024/1/11PAGE:29

四、串行通信接口的编程#include<reg51.h>//包含单片机存放器的头文件unsignedcharled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//字型码voidSendchar(unsignedchardat)//发送数据函数{SBUF=dat;while(!TI);TI=0;}DATE:2024/1/11PAGE:30

四、串行通信接口的编程intmain(void){unsignedchari;intn=10000;TMOD=0x20;//TMOD=00100000B,定时器T1工作于方式2SCON=0x40;//SCON=01000000B,串口工作方式1PCON=0x00;//TMOD=0,波特率不加倍TH1=0xfd;//T1赋初值,波特率9600TL1=0xfd;//T1赋初值TR1=1;//启动定时器T1while(1){ for(i=0;i<10;i++)// { Sendchar(led[i]);//发送数据 for(n=0;n<30000;n++);//延时一段时间再发送

} }}DATE:2024/1/11PAGE:31

四、串行通信接口的编程〔2〕单片机U2的数据接收程序#include<reg51.h>//包含单片机存放器的头文件unsignedcharReceivechar(void){unsignedchardat;while(!RI);//等待接收完毕RI=0;//将RI复位,使数据有效dat=SBUF;returndat;}DATE:2024/1/11PAGE:32

四、串行通信接口的编程voidmain(void){TMOD=0x20;//定时器T1工作于方式2SCON=0x50;//SCON=01010000B,串口工作方式1,允许接收〔REN=1〕PCON=0x00;//SMOD=0,波特率不加倍TH1=0xfd;//T1赋初值TL1=0xfd;//T1赋初值TR1=1;//启动定时器T1REN=1;//允许接收while(1){ P0=Receivechar();//数据显示 }}DATE:2024/1/11PAGE:33

四、串行通信接口的编程例9-4编程实现用单片机U1通过串行口TXD将数码管字型码以方式3发送至单片机U2的RXD,U2根据字型码控制P1口的数码管循环显示0~9数字。DATE:2024/1/11PAGE:34

四、串行通信接口的编程〔1〕单片机U1数据发送程序#include<reg51.h>//包含单片机存放器的头文件unsignedcharled[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//字型码 voidSendchar(unsignedchardat)//发送数据函数{ACC=dat;//数据装入累加器计算P值,奇数时P为1,偶数时P为0TB8=P;//P值装入校验位TB8 SBUF=dat;//数据发送,串口自动将校验位装入while(!TI); TI=0;}

DATE:2024/1/11PAGE:35

四、串行通信接口的编程intmain(void){unsignedchari;intn=10000;TMOD=0x20;//TMOD=00100000B,定时器T1工作于方式2SCON=0xc0;//SCON=11000000B,串口工作方式1PCON=0x00;//TMOD=0,波特率不加倍TH1=0xfd;//T1赋初值,波特率9600TL1=0xfd;//T1赋初值TR1=1;//启动定时器T1while(1){ for(i=0;i<10;i++)// { Sendchar(led[i]);//发送数据 for(n=0;n<30000;n++);//延时一段时间再发送

} }}DATE:2024/1/11PAGE:36

四、串行通信接口的编程〔2〕单片机U2数据接收程序#include<reg51.h>//包含单片机存放器的头文件unsignedcharReceivechar(void){unsignedchardat;while(!RI);//等待接收完毕RI=0;//将RI复位,使数据有效ACC=SBUF;//数据送累加器计算p值,奇数时P为1,偶数时P为0if(RB8==P)//校验,1奇偶个数与发送的相同,那么数据有效{dat=ACC; returndat;} else return0xFF;}DATE:2024/1/11PAGE:37

四、串行通信接口的编程voidmain(void){TMOD=0x20;//定时器T1工作于方式2SCON=0xd0;//SCON=11010000B,串口工作方式3,允许接收〔REN=1〕PCON=0x00;//SMOD=0,波特率不加倍TH1=0xfd;//T1赋初值TL1=0xfd;//T1赋初值TR1=1;//启动定时器T1while(1){ P1=Receivechar();//数据显示 }}DATE:2024/1/11PAGE:38

四、串行通信接口的编程例9-5编写控制程序,实现单片机和PC机串口通信,分别采用查询方式和中断方式接收PC机发送的字符并且将该字符再发送回去。DATE:2024/1/11PAGE:39

四、串行通信接口的编程查询方式编程:#include<reg51.h>#defineBAUDRATE9600 //定义波特率为9600#defineSYSCLK11059200 //系统时钟频率intmain(void){ unsignedchartemp; TMOD=0X20; //启用定时器1:8位自动重装载方式 PCON=0; //设置PCON存放器中的SMOD=0,即波特率不加倍 TL1=TH1=256-SYSCLK/BAUDRATE/32/12;SCON=0X50; /设置串口工作于方式1,并允许接收DATE:2024/1/11PAGE:40

四、串行通信接口的编程TR1=1; //启动定时器1工作do { while(!RI); //等待串口接收数据完毕RI=0; //RI清0,为下次接收做准备temp=SBUF; //将串口数据接收到变量temp中

SBUF=temp; //启动一次串口数据发送while(!TI); //等待数据发送完毕TI=0; //TI清0,为下次发送做准备 }while(1);}DATE:2024/1/11PAGE:41

四、串行通信接口的编程中断方式编程:#include<reg51.h>#defineBAUDRATE9600#defineSYSCLK11059200intmain(void){ TMOD=0X20;//启用定时器1:8位自动重装载方式PCON=0;//设置PCON存放器中的SMOD=0,即波特率不加倍TL1=TH1=256-SYSCLK/BAUDRATE/32/12;SCON=0X50;TR1=1;//启动定时器1工作 EA=1;ES=1;//开放串行口中断 while(1);DATE:2024/1/11PAGE:42

四、串行通信接口的编程voidint(void)interrupt4{ unsignedchartemp; if(RI) //接收中断处理{RI=0;temp=SBUF;SBUF=temp;}if(TI)TI=0; //发送中断处理}DATE:2024/1/11PAGE:43

四、串行通信接口的编程例9-6单片机和PC机串口通信,PC机端通过串口调试助手向单片机发送一个字符串,该字符串以“#〞开头,一共由6个字符,单片机再判断接收到“#〞后面的字符是否都为数字,如果

温馨提示

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

评论

0/150

提交评论