串行口的通信模式文档格式.docx
《串行口的通信模式文档格式.docx》由会员分享,可在线阅读,更多相关《串行口的通信模式文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
这种“读—修改—写”的操作有:
ORL、XRL、JBC、CPL、INC、DEC、DJNZ、MOVPx,y、CLRPx,y和SETPx,y。
而真正读引脚的指令只有 MOVA,P0
为什么“读——修改——写”操作不是从引脚回取信号?
引脚信号与外部设备连接,易受外界干扰;
引脚上的电平往往不能正确反映前次的输出结果。
P0口特点小结:
做通用数据I/O端口并与MOS器件连接时,必须外接“上拉电阻”,否则不能正确的输出高电平;
在输入操作前,必须先向端口“写1;
“读引脚”与“读锁存器”是不同的两个数据通道;
在总线方式时,P0口不能再做通用的I/O端口。
它分时输出地址、数据总线的信息(此时引脚不用外接上拉电阻)。
5.使用外数据存储器时,P2口分两种情况:
1,使用256B的外部RAM时,此时用8位的寄存器R0或R1作间址寄存器,这时P2口无用,所以在这种情况下,P2口仍然可以做通用I/O端口。
如:
movxa,@r0或movxa,@r1
2,如果访问外部ROM或使用大于256BRAM时,P2口必须作为外存储器的高八位地址总线。
movxa,@dptr;
访问外部数据存储器
movca,@a+dptr;
访问外部程序存储器
这里使用了16位的寄存器DPTR
6.P3口
在多用途情况下,P3口分别作为串行口、外中断输入、外部计数输入和系统扩展时使用的WR和RD信号的端口。
在这种情况下,锁存器Q端为“1”电平以保证与门是打开的。
在通用I/O模式下,“替代输出功能”端为“1”电平,以保证与门打开。
原则上在进行系统设计时,P3口不做通用I/O口,以充分利用单片机的内部模块资源。
7.
使用灌电流的方式与电流较大的负载直接连接时,MCS-51的端口可以吸收约20mA的电流而保证端口电平不高于0.45V(见右上图),但驱动逻辑并不符合人们的日常习惯。
采用拉电流方式连接负载时,MCS-51所能提供“拉电流”仅仅为80μA,否则输出的高电平会急剧下降.如果我们采用右下图的方式,向端口输出一个高电平去点亮LED,会发现端口输出的电平不是“1”而是“0”!
8.当前嵌入式系统流行的串行接口
①异步串行UART、同步串行USRT总线接口;
②SPI(Microwire)总线接口---MOTOROAL、NS;
③I2C总线接口------PHILIPS;
④1-Wire总线接口----Dallas;
⑤CAN总线接口---Bosch;
⑥USB总线接口---Compaq等
9.串行通信的两种基本方式
异步通信传送方式:
在物理结构上,异步通信的双方只有数据线而没有时钟传输线。
A、B双方都以自己的时钟源控制着发送的速率或对接收进行采样;
由于通讯双方系统时钟往往不同,所以在异步通信中,要想保证通信的成功必须保证两点:
①通信双方必须保持相同的传送、接收速率(波特率);
②双方必须遵守相同的数据格式(字符帧)。
同步传送模式:
在物理结构上,通信双方除了通信的数据线外还增加了一个通信用的“时钟传输线clock”。
由主控方提供时钟信号clock。
由于有了时钟信号来“同步”发送或接收操作,所以被传送的数据不再使用“起始位”和“停止位”,因而提高了传送速度。
因此同步通信常被用于系统内部各芯片之间的接口设计。
由于同步通信多了一条“时钟线”,因此不太适合远距离的通信。
10.MCS-51单片机的串行接口
具有一个“全双工”的通讯能力串行接口。
其中;
P3.0端口作RXD——异步接收端;
P3.1端口作TXD——异步发送端。
包含“同步通信”和“异步通信”两种工作方式的四种工作模式;
在“异步方式”中由T1做波特率发生器;
与串行口相关的SFR有:
SBUF(接收SBUF和发送SBUF)SCON串口控制寄存器(设定四种模式)。
11.
D1、D0:
TI、RI发送、接收完成标志
TI:
完成一帧数据发送标志,原始应软件清零,发送完成TI=1同时申请中断(如果中断开放,则引发中断);
RI:
完成一帧数据接收标志,原始应软件清零,接收完成RI=1并申请中断(如果中断开放,则引发中断);
D3、D2:
TB8、RB8发送、接收的第9位数据
TB8:
在9位数据传送的模式2、3时,将要发送的第9位数据,在执行MOVSBUF,A指令之前要事先将TB8设定好;
RB8:
在9位数据传送的模式2、3时,接收到的第9位数据;
D4:
REN允许接收控制位。
REN:
允许接收位,REN=1时允许接收,由软件置位或清零。
D5:
SM2多机通信使能位(用于接收方串口控制)
模式0、1时:
SM2不用。
模式2、3时:
有两种设定方法。
①若SM2=0,无论RB8如何,RI都能被激活,但RI不能引发中断!
CPU可通过查询RI的方式接收数据。
②若SM2=1,若接收到的第9位(RB8)=0时,RI不会被激活;
若RB8=1时,RI不仅能被激活,并可引发中断。
这种特性得出一个特殊的结果:
如果接收方将其SM2=1,则能否接收到对方发送的数据不取决于自己,而是由发送方的TB8来决定的。
SM2=1的设定用于多机通信的场合。
12.使用RI、TI标志完成数据的发送与接收
SBUF是独立于CPU。
不论是数据的发送还是接收都由SBUF独立完成。
SBUF的传送速度远远低于CPU执行指令的速度,每次发送后CPU必须等待SBUF。
协调CPU与SBUF的速度只能靠标志信号。
即:
发送操作后,查询TI=1?
来决定是否可以发送下一个数据;
接收操作时,查询RI=1?
判断是否接收到数据。
13.利用接收标志RI控制数据的接收操作
RI(SCON.0):
接收完成标志。
当SUBF从RXD引脚接收完一个完整的数据帧时RI=1,CPU可以使用两种方式来处理接收的数据:
CPU采用查询RI来控制数据的读取。
JNBRI,$;
如果RI≠1则等待
MOVA,SBUF;
RI=1时,取SBUF中数据送A。
如果中断是开放的,则RI=1时会自动引发中断。
用户可以通过中断服务程序将SBUF中的数据取出送累加器A。
MOVA,SBUF;
中断方式接收数据;
TI(SCON.1):
发送完成标志。
当CPU执行:
MOVSBUF,A指令后,便引发一次串行通讯的过程。
SBUF开始通过TXD向外按位发送数据。
当完成一帧数据的发送后,TI=1。
使用查询的方式对TI进行检测:
JNBTI,$;
如果TI≠1则等待
MOVSBUF,A;
TI=1时发送下一个数据
如果系统中断是开放的,则TI=1会自动引发中断。
用户可以通过中断服务程序向SBUF输送下一个数据:
MOVSBUF,A;
在中断程序中发送下一个数据;
14.
15.
16.模式0的工作原理(发送)
单片机执行movsbuf,a指令的S6P2时,出现“写sbuf”信号:
1,打开总线三态门使累加器中的数据送到SBUF中;
2,使D型触发器置一,触发器的输出构成了SBUF的第9位;
3,启动“发送控制器”开始发送。
在“写SBUF信号”有效相隔一个机器周期后,“发送控制器”的SEND=1使RXD,TXD端的与门打开,使数据和移位脉冲输出。
在TXD端,每一个机器周期中发出一个同步脉冲,同时在SEND=1期间,每一个S6P2时控制器发出一个SHIFT移位信号将SBUF中的数据右移一次(同时D型触发器清零)。
这样:
每当SBUF中的数据右移(发送)一位时,SBUF的左端便移入1个“0”。
当SBIUF中的数据右移7次后,检零器的7个输入端全为“0”,向控制器发出一个信号:
通知控制器作最后一次移位,然后控制器的SEND=0停止发送数据和同步信号,TI被置位。
模式0的工作原理(接收)
在满足REN=1且RI=0的条件下(实际上是一条写SCON指令),就会引发一次接收过程。
在下一个机器周期的S6P2时刻,接收控制器将11111110写入移位寄存器。
在下一个周期的S1P1使RECEIVE=1从而使TXD端的与门打开。
同发送的过程类似:
在后面的每一个机器周期从TXD端发出同步移位脉冲,在每一个S5P2时刻对RXD线进行采样。
在S6P2时刻,控制器对寄存器进行移位,每左移一次右端就补进一位由RXD端输入的数据。
当从RXD端输入7位数据时,开始最右端的“0”被移到寄存器的最左端,寄存器向控制器发信号,通知控制器做最后一次接收,并将完整的8位数据装入SBUF中。
最后清RECEIVE,SCON中的RI置位,向CPU发中断申请。
17.
接收操作:
在REN=1且RI=0的条件下进行。
串行口的接收控制器对RXD线进行采样,其采样频率是接收时钟的16倍。
当连续8次采集到RXD线上为低电平时,检测电路便认定RXD线上有了“起始位”,在此后,便开始在每次第7、8、9三个脉冲时进行RXD采样,采取“三中取二”的原则来确定接收的数据(如图所示)。
当接收到停止位时,必须满足:
RI=0且SM2=0,才能把接收的数据送到SBUF中(停止位送SCON的RB8中,并使RI=1),否则数据丢失。
上面的条件意味着:
要向得到接收的数据,在接收前必须事先清零RI。
18.
模式2、3的发送过程类似于模式1,唯一的区别在于数据帧中数据是9位。
这样,在发送一帧数据时,CPU除了要把8位数据送SBUF外(movsbuf,a),还要事先将第9位数据送到SCON.TB8中SETBSCON.TB8或:
CLRSCON.TB8
RI=0是保证下一个数据的正常接收的重要条件。
每次当SBUF收到数据时,RI自动置一。
当取走数据时必须通过软件复位RI(指令CLRRI),否则外部发来的数据将丢失!
模式2、3的接收过程类似于模式1,不同的是:
模式1时,SCON中的RB8是接收到的停止位“1”;
而模式2、3时,RB8是接收到的第9位。
19.关于SM2的设定
对于接收操作:
模式1:
SM2无用,令其=0即可。
此时接收数据条件是:
RI=0且REN=1。
单片机可以利用查询或中断方式为串口服务。
模式2、3的接收条件是:
(除了RI=0、REN=1外)
①当SM2=0时:
RI可以被激活(但不能引发中断);
②当SM2=1时:
只有接收到RB8=1时,RI不仅能激活,还能引发中断。
可见:
当SM2=1时,单片机是否能接收到数据取决于外部数据的第9位RB8。
这样外部可以通过第九位数据是“0”还是“1”来控制、决定单片机的接收状况。
在模式2、3中:
如何利用和设置SM2和RB8来控制接收?
①当数据是带奇偶效验位的9位数据时(效验位是RB8):
必须令SM2=0,这样才能保证所有数据的正确接收(无论RB8如何);
②在“多机通讯”时,所有的从机都将其SM2=1,这样作为主机在向从机发送数据/命令时,可以通过所发数据的第9位TB8(对于从机来说是RB8)来决定从机是否可以接收到此数据/命令(取决于RB8)。
即RB8=1时接收有效;
RB8=0时接收无效。
所以,SM2也称“多机通讯位”,用于多机通讯。
奇偶效验:
一种防止串行通讯出错的方法。
串行口模式2、3时数据帧格式发送时:
将SCON中的TB8作为第9位数据发送;
接收时:
将接收来的第9位送到SCON中的RB8中。
20.奇偶校验:
收到的第9位RB8是发送方送来的奇偶校验位。
在这种情况下必须令SM2=0,否则接收的校验位RB8=0时,将影响数据的接收(因为RB8有时为“1”,而有时为“0”)。
21.主从式多机通讯原理
主机发送的数据可以传送到各个从机,从机发送的数据只能为主机接收,从机之间不能直接通讯。
主机和从机的设置为模式2或3,其中主机的SM2=0,从机的SM2=1。
\
从机的SM2=1时,接收到的第九位数据RB8=1时,RI可以激活,如果RB8=0,则RI不能激活。
主机首先通过发送地址码来寻找从机(地址码的特征是第9位数据为“1”),所以所有的从机都能接收到主机发出的地址码(因为从机的RI=0,SM2=1,RB8=1),并使RI=1引发中断。
从机在中断服务程序中,将接收到地址码与自己的地址进行比较,被选中的从机将自己的SM2=0;
而未被选中的从机仍保持SM2=1,并退出中断服务程序。
当主机找到从机后,开始向从机发数据、命令(其特征为第9位=0)。
由于从机SM2=0,所以尽管接收到的RB8=0,同样可以激活从机的RI,使其以查询的方式接收主机发出的数据或命令。
当主机与从机的通讯完成后,从机再将其SM2=1,并退出中断服务程序。
主机重新发出另一个从机的地址,所有从机可以马上响应并接收地址信息……。
22.多机通讯小结:
1,主机的SM2=0,从机的SM2=1;
2,主机向从机发送的地址码(第9位为“1”);
3,所有的从机(SM2=1、RB8=1、RI=0)都接收主机的地址进入中断服务程序。
在服务程序中比较、确认是否为被寻从机。
4,被寻从机将SM2清零,以保证能以查询的方式接收主机的数据、命令。
同时向主机返回地址供主机核实。
没有被选种的从机保持SM2=1并退出服务程序。
5,被寻中的从机以查询RI的方式与主机之间进行数据交换(注意:
因为SM2=0时,RI虽然能被激活,但不能引发中断),完成后,重新将SM2置1。
23.
24.如何设定波特率?
25.模式2、3应用举例
与模式1相比,模式2、3的主要特点:
1,9位数据的传送格式:
其中:
发送时第9位在TB8中,接收时第9位在RB8中。
2,SM2:
多机通讯位:
在模式0、1中:
设SM2=0,RI可以正常的激活并引发中断。
在模式2、3中:
①SM2=0时,RI可以被激活,但不能引发中断;
②SM2=1时,当RB8=1,RI可以激活且引发中断;
若RB8=0则不能激活RI,不能引发中断!
根据上面特点,模式2、3可以:
1,利用第9位数据来传送、接收数据的“奇偶效验位”(SM2=0)。
2,利用SM2、RB8实现多机通讯功能(SM2=1)。
多机通讯原理与SM2的设定
1,SM2:
多机通讯位的设定。
(在模式2、3时):
SM2=0(单机通讯模式):
RI能被激活,但不能引发中断。
SM2=1(多机通讯模式):
①若接收的第9位RB8=0,则不能激活RI,更不能引发中断;
②若RB8=1,RI能被激活且引发中断。
2,主机、从机设置为模式2或3。
其中:
主机的SM2=0(单机方式);
从机的SM2=1(多机方式)。
3,主机发送的地址码的特征是第9位(TB8)=1;
而主机发送的数据、命令码的特征是TB8=0。
4,主机发送地址码寻找从机时,所有从机的RI都被激活RI=1且引发中断,进入中断服务程序(因为SM2=1且RB8=1)。
5,在从机的中断服务程序中,将接收到地址码与自己的地址进行比较:
被选中的从机将自己的SM2=0(单机模式),并向主机回送的地址码。
未被选中的从机保持SM2=1(多机模式),并退出中断服务程序。
6,主机得到从机返回的地址后,开始向该从机发数据、命令(其特征为第9位=0)。
由于选中的从机SM2=0,所以该从机RI仍可以被激活,但要用查询RI的方式与主机继续通讯。
而未选中的从机因SM2=1且RB8=0所以主机发出的命令和数据不会激活它们的RI。
7,当主机与从机的通讯完成后,该从机再将其SM2=1并退出中断服务程序。
主机重发下一个从机的地址(TB8=1),所有从机马上激活RI并进入中断对地址码判断……。
一:
主机程序(初始化部分)
ORG2000H
START:
MOVTMOD,#20H;
定时器T1为模式2(8位自动重装)
MOVTH1,#0F4H
MOVTL1,#0F4H;
波特率为1200(设外接6MHz晶体)
SETBTR1;
启动T1
MOVSCON,#0D8H;
串口为模式3,REN=1,SM2=0,TB8=1
MOVPCON,#00H;
设PCON中的SMOD=0
MOVR0,#40H;
发送数据块首地址送R0指针
MOVR1,#20H;
接收数据块首地址送R1指针
MOVR2,#SLAVE;
被寻从机地址送R2
MOVR3,#00H/#01H;
主发、从收命令。
或主收、从发命令
MOVR4,#14H;
发送数据块长度送R4(20)计数器
MOVR5,#14H;
接收数据块长度送R5(20)计数器
ACALLMCOM;
调用主机通讯子程序
SJMP$
二:
主机通讯子程序(MCOM)
ORG2100H
MCOM:
MOVA,R2;
取从机地址
MOVSBUF,A
JNBRI,$;
注意:
为什么判断RI而不是TI?
CLRRI
MOVA,SBUF;
取从机的返回地址
XRLA,R2;
核对两个地址
JZMTXD2;
相符时,转MTXD2
MTXD1:
MOVSBUF,#0FFH;
返回地址错误时,发送从机复位信号
SETBTB8;
设定地址标志
SJMPMCOM;
重发从机地址,所有从机重新判断地址
MTXD2:
CLRTB8;
将TB8=0,准备发送命令
MOVSBUF,R3;
送出命令
等待从机应答
CLRRI;
从机应答后清标志
接收从机应答命令
JNBACC.7,MTXD3;
命令无错时,则命令分类
SJMPMTXD1;
命令错返回重新联络
MTXD3:
CJNER3,#00H,MRXD;
从机发送主机接收时,转MRXD
JNBACC.0,MTXD1;
从机接收时,若从机未准备好转回
MTXD4:
MOVSBUF,@R0;
若从机准备好,则开始发送
JNBTI,$
CLRTI
INCR0
DJNZR4,MTXD4
RET
MRXD:
JNBACC.1,MTXD1;
从机发送未准备好返回
MRXD1:
JNBRI,$;
等待接收
MOVA,SBUF
INCR1;
接收数据区指针加一
DJNZR5,MRXD1;
未接收完则继续(R5接收数据计数器)
END
三,从机主程序(初始化)
ORG0000H
LJMPSTART
ORG0023H
LJMP0100H
ORG0040H
设定定时器T1为模式2
MOVTH1,#0F4H;
设定波特率为1200
MOVTL1,#0F4H
启动定时器T1
MOVSCON,#0F8H;
设串口模式3,REN=1,SM2=1,TB8=1
MOVPCON,#00H
MOVR0,#20H;
R0指向发送数据块首地址
MOVR1,#40H;
R1指向接收数据块首址
MOVR2,#14H;
R2赋发送数据块长度
MOVR3,#14H;
R3赋接收数据块长度
SETBEA
SETBES;
开中断
CLRRI;
清标志RI准备接收数据
SJMP$;
等待中断
四:
从机中断服务程序
ORG0100H
SINTS:
CLRRI;
接收到地址后清RI
PUSHACC
PUSHPSW;
保护现场
接收主机送来得从机地址
XRLA,#SLAVE;
核实从机地址
JZSRXD1;
若是本机地址转SRXD1
RETU:
POPPSW;
返回主程序
POPACC;
恢复现场
RETI;
中断返回
SRXD1:
CLRSM2;
SM2清零,单独接收主机数据/命令
MOVSBUF,#SLAVE;
向主机发回从机地址
等待主机的命令
接收到主机命令后清RI
JNBRB8,SRXD2;
若是命令(RB8=0)则转SRXD2继续
SJMPRETU;
接收的不是命令时(RB8=1),返回
SRXD2:
MOVA,SBUF;
将接收到的命令送A
CJNEA,#02H,NEXT;
命令合法(A-02H)
NEXT:
JCSRXD3;
若命令合法(A<
02H)则继续
CLRTI;
命令不合法则清TI准备发回ERR=1
MOVSBUF,#80H;
发送ERR=1的状态字
SETBSM2;
SM2重新置位
SJMPRETU;
SRXD3:
JZSCHRX;
若A=00H既主机发送从机接收转SCHRX
JBF0,STXD;
若从机准备好(F0=1)时,转STXD