串行通信最终新文档格式.docx
《串行通信最终新文档格式.docx》由会员分享,可在线阅读,更多相关《串行通信最终新文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
REN
TB8
RB8
TI
RI
见下表
多机通信
0:
单机对单
1:
接收控制
禁止
允许
发送数据第9位
接收数据第9位
发送中断标志
接收中断标志
SM0、SM1:
串行口工作方式选择位用于设定串行口工作方式,其定义如下:
SM0、SM1
相应工作方式
功能描述
所用波特率
00
方式0
8位移位寄存器
Fosc/12
01
方式1
10位异步收发
由定时器控制
10
方式2
11位异步收发
Fosc/64或osc/32
11
方式3
可变
其中fosc为晶振频率
SM2:
多机通讯控制位。
在方式0时,SM2一定要等于0。
在方式1中,当SM2=0则只有接收到有效停止位时,RI才置1,并自动发出串行口中断请求(设中断是开放的)。
在方式2或方式3当SM2=0时,串行口以单机发送或接收方式工作,TI和RI以正常方式被激活,但不会引起中断请求;
当SM2=1且接收到的第九位数据RB8=1时,RI才置1,并向CPU提出中断请求。
REN:
接收允许控制位。
由软件置位即SETBREN以允许接收;
由软件清0即CLRREN来禁止接收。
TB8:
发送数据第9位。
在方式2或方式3中,要发送的第9位数据,根据需要由软件置1或清0。
例如,可约定作为奇偶校验位,或在多机通讯中作为区别地址帧或数据帧的标志位。
RB8:
接收到的数据的第9位。
在方式0中不使用RB8。
在方式1中,若SM2=0,RB8为接收到的停止位。
在方式2或方式3中,RB8为接收到的第9位数据。
TI:
发送中断标志,用于指示一帧信息是否发送完。
在方式0中,第8位发送结束时,由硬件置位。
在其它方式的发送停止位前,由硬件置位。
TI置位既表示一帧信息发送结束,同时也是申请中断,可根据需要,用软件查询的方法获得数据已发送完毕的信息,或用中断的方式来发送下一个数据。
TI必须用软件清0。
RI:
接收中断标志位,用于指示一帧信息是否接收完。
在方式0,当接收完第8位数据后,由硬件置位。
在其它方式中,在接收到停止位的中间时刻由硬件置位。
RI置位表示一帧数据接收完毕,可用查询的方法获知或者用中断的方法获知。
RI也必须用软件清0。
特殊功能寄存器PCON
PCON各位定义:
8E
8D
8C
8B
8A
89
88
87
PCON
SMOD
-
GF1
GF0
PD
IDL
波特率选择位SMOD=1时,方式1、2、3波特率加倍
通用标志位
掉电控制位
正常
掉电
空闲控制位
空闲
PCON是为了在CHMOS的80C51单片机上实现电源控制而附加的。
其中最高位是SMOD为波特率选择位。
4.2.2串行口的工作方式
8051单片机的全双工串行口可编程为4种工作方式,现分述如下:
1、方式0
方式0为移位寄存器输入/输出方式。
主要用于外接移位寄存器以扩展I/O口,也可以外接同步输入/输出设备。
在串行发送时,”SBUF(发送)”相当于一个并入串出的移位寄存器,由MCS-51的内部总线并行输入8位数据,并从TXD(P3.1)线串行输出;
在接收时,“SBUF(接收)”相当于一个串入并出的移位寄存器,从RXD(P3.0)线上接收一帧数据,并把它并行的送入内部数据总线。
发送时,在TI=0的条件下,CPU执行指令MOVSBUF,A时,立即启动发送,将8位数据以fos/12的固定波特率从RXD输出,低位在前,高位在后,同时TXD引脚输出移位脉冲。
发送完一帧数据后,发送中断标志TI自动置位,并向CPU提出中断请求(设中断是开放的)。
CPU执行中断服务程序后要用软件清零TI,然后再发送下一帧数据。
接收时,先执行SETBREN;
SETRI。
此时,RXD为串行数据输入端,TXD仍为同步脉冲移位输出端。
当接收到第8位数据后,RI自动置位,并向CPU发出串行口中断请求。
CPU查询到RI=1或响应中断后便可通过指令MOVA,SBUF把接收到的数据送入累加器A中。
RI也由软件清零。
方式0的波特率固定为主振频率的1/12
串行口在方式0下的应用
串行口在方式0下有两种用途:
一种是把串行口设置成并入串出的输出口,另一种是设置成串入并出的输入口。
串行口设置成并入串出的输出口时需要外接一片8位的串入并出的同步移位寄存器74LS164或CD4094;
设置成串入并出的输入口时,需外接一片8位并入串出的同步移位寄存器74LS165或CD4014.
发光二极管自左至右以一定速度轮流显示的程序。
设二极管为共阴接法。
74ls164是一种串入并出的同步移位寄存器.CLK为同步脉冲输入端;
STB是清零端.在数据进入前要先清零,清完后要置高,否则数据将丢失.
;
-----------主程序
ORG0000H
AJMPMAIN
ORG0023H
AJMPSBV
MAIN:
MOVSCON,#00H;
串行口初始化为方式0
SETBEA;
开所有中断
SETBES;
开串行中断
CLRP2.0;
74ls164清零
MOVA,#80H;
起始显示码送入
CLRTI;
中断标志位清零
SETBP2.0;
清零端置高
MOVSBUF,A;
发送第一数据
SJMP$;
等待中断
-----------中断服务程序
SBV:
ACALLDELAY;
点亮一段时间
RRA;
移到下一位
CLRTI
CLRP2.0
SETBP2.0
MOVSBUF,A
RETI;
中断返回
DELAY:
MOV31H,#0F0H;
延时程序
LOOP1:
MOV32H,#0FFH
LOOP2:
DJNZ32H,LOOP2
DJNZ31H,LOOP1
RET
END
2、方式1
方式1为波特率可变的10位异步通信方式。
发送或接收一帧10位数据的信息,包括1个起始位“0”,8个数据位和1个停止位“1”。
发送时,在TI=0的条件下,当CPU执行指令MOVSBUF,A时,发送电路自动在8位数据前后分别添加1位起始位和停止位并开始发送。
串行数据从TXD(P1.1)引脚输出,发送完一帧数据后,维持TXD线为高电平,由硬件置位TI。
要用软件清零后再发送下一帧数据。
接收时,在REN=1时,串行口采样RXD引脚,当采样到1至0的跳变时,确认是开始位0,就开始接收一帧数据。
只有当条件RI=0且SM2=0或条件停止位为“1”时,8位数据才能进入接收寄存器SBUF(接收),停止位也才进入RB8,并由硬件置位中断标志位RI;
否则舍去,也意味着丢失一帧数据。
所以在方式1接收时,应先用软件清零RI和SM2。
串行口在方式1下的收发程序。
在发送程序中,开机时就向接收机发送6帧数据完后显示发送的数据以便对比;
接收端收到6帧数据后把它显示出来。
发送程序
SJMPMAIN
SJMPTXSV
MOV51H,#06H;
欲发送的数据
MOV52H,#01H
MOV53H,#02H
MOV54H,#03H
MOV55H,#04H
MOV56H,#05H
MOVTMOD,#20H;
设定定时器为方式2
MOVTL1,#0CBH;
装入定时器
MOVTH1,#0CBH
MOVPCON,#80H;
设置SMOD为1
SETBTR1;
开定时器
MOVSCON,#40H;
串行口为方式1
MOVR2,51H;
存数据长度
MOVR0,#51H
MOVA,@R0;
发送数据长度
MOVSBUF,A
INCR0
DISPLY:
MOVR1,#51H
MOV42H,#20H;
存位码
MOVR6,#07H;
存记数
MOVDPTR,#TABLE
LOOP0:
MOVA,@R1
MOVCA,@A+DPTR
MOVP0,A
MOVA,42H
MOVP2,A
DJNZR6,NEXT1
SJMPDISPLY
NEXT1:
ACALLDELAY
RRA
MOV42H,A
INCR1
SJMPLOOP0
MOV45H,#04H
LOOP3:
MOV46H,#0FH
LOOP4:
DJNZ46H,LOOP4
DJNZ45H,LOOP3
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH
DB7DH,07H,7FH,6FH,80H
TXSV:
CLRTI
发送数据
DJNZR2,NEXT;
是否发完
NEXT:
INCR0
RETI
END
接收程序
SJMPMAIN
ORG0023H
SJMPRXSV
MOVTMOD,#20H;
定时器1设为方式2
定时器装入波特率为2400b/s
SETBTR1;
SETBEA;
SETBES;
CLRRI
MOVSCON,#50H;
设定为方式2接收
设定SMOD为1
MOVR0,#52H
SETB20H.0;
设定一个标志位
SJMP$
RXSV:
JB20H.0,LENGTH
MOVA,SBUF;
接收数据
MOV@R0,A;
存入数据
DJNZ61H,NEXT;
是否接收完
SJMPDISPLY;
接收完转入显示
RETI
LENGTH:
MOVA,SBUF
MOV61H,A;
存入数据长度
MOV51H,A
CLR20H.0
MOV42H,#20H;
MOVR6,#07H;
MOVDPTR,#TABLE
RRA
DJNZ46H,LOOP2
DJNZ45H,LOOP1
3、方式2
方式2为固定波特率的11位异步收发方式。
它比方式1增加了一位可控制为“1”或“0”的第9位数据。
输出:
发送的串行数据由TXD(P3.1)端输出一帧信息为11位,附加的第9位来自SCON寄存器的TB8位,用软件置位或复位。
它可作为多机通讯中地址/数据信息的标志位,也可以作为数据的奇偶校验位。
当CPU执行一条数据写入SUBF的指令时,就启动发送器发送。
发送完一帧信息后,自动置位中断标志位TI。
输入:
在REN=1时,串行口采样RXD(P3.0)引脚,当采样到1至0的跳变时,确认是开始位“0”,就开始接收一帧数据。
在接收到附加的第9位数据后,当RI=0且SM2=0时,8位数据才能进入接收寄存器,第9位数据才进入RB8,并由硬件置位中断标志位RI,否则信息丢失。
再过一位时间后,不管上述条件是否满足,接收电路即执行复位,并重新检测RXD上从1到0的跳变。
方式2的波特率由PCON中的选择位SMOD来决定,可由下式表示:
波特率
。
也就是当SMOD=1时,波特率为1/32fosc,当SMOD=0时,波特率为1/64fosc
4、方式3
方式3为波特率可变的11位异步收发方式。
除波特率外,其余与方式2相同。
方式1和方式3波特率
串行口的波特率由定时器的溢出率决定.其公式如下:
定时器T1溢出率
T1溢出率=
波特率的计算公式:
式中:
K为定时器T1的位数,它和定时器的T1的设定方式有关.即:
若定时器T1为方式0,则K=13;
若定时器T1为方式1,则K=16;
若定时器T1为方式2或是,则K=8。
有
因为方式2为自动重装入初值的8位定时器/计数器模式,所以用它来做波特率发生器最恰当。
下表列出了定时器T1工作于方式2常用波特率及初值。
常用波特率
Fosc(MHZ)
TH1初值
19200
11.0592
1
FDH
9600
4800
FAH
2400
F4H
1200
E8H
方式2、方式3下的应用:
单片机的多机通信。
在多机通信中作为主机的AT89S52的SM2应设置为0,作从机的SM2设定为1。
主机发送并被从机接收的信息有两类:
一类是地址,用于指示需要和主机通信的从机地址。
由串行数据第9位为“1”来标志;
另一类是数据,由串行数据第9位为“0”来标志。
由于所有从机的SM2=1,故每个从机总能在RI=0时收到主机发来的地址(因为串行数据第9位为“1”),并进入各自的中断服务程序。
在中断服务程序中,每台从机把接收到的主机发来的地址和它本机的地址(系统设计时分配)进行比较。
所有比较不相等的从机均从各自的中断服务程序中退出(SM2仍为1)只有比较成功的从机才是被主机寻址的通信从机。
被寻址的从机在程序中使SM2=0,以便接收随之而来的数据或命令(R8=0).
多机通信的一个例子程序如下:
主程序装于主机中,从机程序在所有从机中运行。
假设在主机中存有6个数据,本程序是把这6个数据发送到地址为01的从机,并显示发送的数据.从机接收到这6个数据后显示出以便对照.
在多机通信中,主从机之间除传送从机地址外,还应传送一些供主机或从机识别的命令和状态字。
如
两条控制命令为:
00H—主机发送从机接收命令
01H—从机发送主机接收命令
这两条命令均以数据形式发送(即第9位数据为0)。
从机状态字。
由被寻址的从机发送,被主机所接收,用于指示从机的工作状态,其格式为
ERR
TRDY
RRDY
命令合法
命令不合法
从机发送未就绪
从机发送已就绪
从机接收未就绪
从机接收已就绪
寄存器分配如下:
R0:
存放主机发送的数据块起始地址
R1:
存放主机接收的数据块起始地址
R2:
存放被寻址的从机地址
R3:
存放主机发出的命令
R4:
存放发送的数据块长度
R5:
存放接收的数据长度
主机程序:
ORG0030H
MOV71H,#06H;
MOV72H,#01H
MOV73H,#02H
MOV74H,#03H
MOV75H,#04H
MOV76H,#05H
MOVTMOD,#20H;
定时器T1为方式2
MOVTH1,#0CBH;
波特率为1200
MOVTL1,#0CBH
SETBTR1
MOVSCON,#0D8H;
串行口为方式3,允许接收,SM2=0,TB8=1
MOVPCON,#00H
MOVR1,#61H;
接收数据块起始地址
MOVR2,#01H;
被寻址从机地址
MOVR3,#00H;
数据传送方向:
01从机发主机收;
00主机发从机收
;
由主机键盘或其它方式存入,这而我们假设为00
MOVR5,#02H;
接收数据块长度
CLRSM2
MCOMMU:
MOVA,R2;
发送从机地址
JNBRI,$
CLRRI;
从机应答
MOVA,SBUF
XRLA,R2;
核对地址
JZMTXD2
MTXD1:
MOVSBUF,#0FFH;
不相符,发送复位信号
SETBTB8
SJMPMCOMMU;
重发地址
MTXD2:
CLRTB8;
相符准备发数据
MOVSBUF,R3;
主机要发送数据
应答
MOV47H,A
JNBACC.7,MTXD3;
命令是否合法
SJMPMTXD1
MTXD3:
CJNER3,#00H,MRXD;
是否主机接收数据
MOVA,47H
JNBACC.0,MTXD1;
从机是否就绪接收
MOVR0,#71H;
发送数据块起始地址
MOV55H,#06H;
发送数据块长度
MTXD4:
MOVSBUF,@R0;
发送数据
JNBRI,$
DJNZ55H,MTXD4
MRXD:
JNBACC.1,MTXD1;
从机是否发送就绪
MRXD1:
JNBRI,$;
MOV@R1,A
DJNZR5,MRXD1
MOVR1,#71H
从机程序:
SJMPSINTSBV
MOV51H,#06H;
MOV52H,#05H
MOV53H,#04H
MOV55H,#02H
MOV56H,#01H
SETBPSW.1
SE