东北大学单片机课件第九章_第1页
东北大学单片机课件第九章_第2页
东北大学单片机课件第九章_第3页
东北大学单片机课件第九章_第4页
东北大学单片机课件第九章_第5页
已阅读5页,还剩95页未读 继续免费阅读

下载本文档

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

文档简介

9.1串行通讯基础数据交换的方式总体上分为两种:即并行数据通信和串行数据通信.如果距离小于30m,可采用并行数据通信方式;当距离大于30m时,则要采用串行数据通信方式。第九章串行通讯接口设计一

、串行通讯的分类(一)、异步通讯1.发送端和接收端要有互相独立的时钟源。2.在帧格式中,一个字符数据由四部分组成:起始位、数据位、奇偶校验位和停止位。起始位:起始位“0”,在通讯线上不传送数据时保持逻辑“1”。数据位:可以是5、6、7或8位,规定低位在前,高位在后。奇偶校验位:也可以用于确定一帧的字符所代表信息(地址/数据等)。停止位:(逻辑“1”)是一个字符数据的结束标志。波特率:--所传二进制位数/秒字符传输速率:--所传帧数/秒例:1200bps的字符帧(13位),

则:字符传输速率=1200/13帧/秒(二)、同步通讯仅在数据块开始时用同步字符SYNC来指示,同步字符可以单同步字符,也可以使双同步字符方式。国际标准为单字符16H,双字符EBH,90H.二.串行通讯的制式

1.半双工制式2.全双工制式三.串行通讯中的调制解调器1.MODEM的作用和原理2.MODEM的分类3.MODEM的调制/解调三、串行通信中的调制解调器1、MODEM的作用和原理2、MODEM的分类3、MODEM的调制/解调1)应答式MODEM的发送器2050HZ—发送空号(逻辑0),2225HZ--发送传号(逻辑1)。2)应答式MODEM的接收器RXD接收信号:“1”(2225HZ)上通道

“0”(2025HZ)下通道四.串行I/O数据的实现串行数据----并行数据的实现(一)软件实现(二)硬件实现ORG1000HSOUT:MOVR0,#20HNEXT:MOVR2,#0BHCLRCMOVA,@R0RLCAINCR0LOOP:MOVR1,AANLA,#01HORLP1,AMOVA,R1ACALLDELAYRRCASETBCDJNZR2,LOOPDJNZLEN,NEXT(一).软件实现20HC7H21H..LNELP1.08031CYR1(二)硬件实现对RXD的采样:(1)若连续采样8个负脉冲RXD为低电平则为启动位.(2)每隔13个脉冲采样2次RXD,按2/3原则确定数据值(3).错误校验五.串行通讯的差错控制技术在信息码元中增加一定数量的多余码元(称为监督码元),在传输过程中如果受到干扰,某位码元发生了变化,相当于破坏了他们之间的约束关系。1.奇偶校验在每个信息码组之后附加一位监督码元,使整个码组中“1”的个数成为奇数或偶数,分别称为奇校验或偶校验。2.校验和在数据发送时,发送方对块中数据简单求和,产生一单字节校验字符(校验和)附加到数据块结尾,

3.循环冗余码校验CRC

4.海明码校验六.设备地址问题网络中每个节点都有一个唯一的地址码.产生方法:(1)软件中直接写定方法简单,无附加电路,修改不方便,设备不能互换;(2)通过外部开关进行设置可以动态改变,组织灵活,但占用资源,机械开关不可靠;

(3)用非易失存储器保存,可以在线修改,灵活,可靠,但需要增加硬件设备,软件较复杂.七.传输介质、总线电气特性、负载量等问题

a.传输介质普通双绞线RVV2*1.0

建筑物内部,短距离场合,干扰不严重情况

屏蔽双绞线RVVP2*1.0

建筑物之间空旷地带,距离远,干扰大情况

同轴电缆SYV75-5

适合做干线

光导纤维(单膜和多膜)

高速网络,主干线,Internet接口,计算机之间局域网络

b.总线电气特性RS-485通讯信号的传输距离和波特率主要受总线分布电容的影响.

分布电容的实际测量值为:

网线(5类线),5000pf/100m=50pf/mRVV线,6200pf/100m=62pf/m

工程实践证明:485总线负载电容上限为75000pf

所以,使用RVV线时距离为:L=75000/62=1209米使用5类线时L=75000/50=1500米C.负载量RS-485通讯发送驱动芯片的输出电流能力约为60mA,接收器吸收电流的情况有所不同,所以有32站、128站和256站的区别。对于MAC1387E驱动器,等效负载约为并联电阻37欧姆。第二节MCS-51的串行接口一、串行口的结构RXD(P3.0)发送SBUF(99H)门88串行口结构框图

TXD(P3.1)中断接收SBUF(99H)定时器T1fosc2分频器发送控制器接收控制器串寄行存控器制

SCON(98H)输入移位寄存器TIRI内部总线发送过程:

MOVA,#7FHMOVSBUF,A串口自动发送:起始位,7FH,TB8,停止位接收退出接收过程:MOVA,SBUFRXD检测起始位。串口自动接收:7FH,TB8,停止位二、串行口的工作方式1.方式0—同步移位寄存器2.方式1—10位异步收发3.方式2—11位异步收发4.方式3—11位异步收发要求:SCON,(SM2=0,RB8=0,TB8=0)

MOVSBUF,AMOVA,SBUF发送(TI=0)时:

SBUF:TXD—发移位脉冲。

RXD—发送数据。发完一帧后,TI=1,中断接收(RI=0,REN=1)时:

SBUF:TXD—发移位脉冲。

RXD—接收数据。接收一帧后,RI=1,中断1、方式0—同步移位寄存器移位数据以8位为一帧,不设起始位和停止位2.方式1(10位异步收发)要求:SCON中(SM2=0,TB8=0)发送(TI=0)时:发送开始:执行MOVSBUF,ATXD—发送:(起始位:1位,数据位:8位,停止位:1位)发完一帧后:TI=1和TXD=高电平,并产生中断接收(RI=0和REN=1)时:RXD—接收字符帧若RI=0和SM2=0(或收到停止位),则接收字符送SBUF,停止位送RB8,RI=1,发中断.否则,字符不送SBUFTXDRXD3.方式2(11位异步收发)波特率固定(fosc/32,fosc/64)发送(TI=0)时:发送开始:执行MOVSBUF,ATXD—发送:(起始位,数据位,TB8,停止位)发完一帧后:TI=1和TXD=高电平,并产生中断接收(RI=0和REN=1)时:RXD—接收字符帧若RI=0和SM2=0(或收到停止位),则接收字符送SBUF,第9位送RB8,RI=1,发中断.否则,字符不送SBUF.TXDRXD4.方式3(11位异步收发)波特率可调,可利用T1,T2分频提供发送(TI=0)时:发送开始:执行MOVSBUF,ATXD—发送:(起始位,数据位,TB8,停止位)发完一帧后:TI=1和TXD=高电平,并产生中断接收(RI=0和REN=1)时:RXD—接收字符帧若RI=0和SM2=0(或收到停止位),则接收字符送SBUF,第9位送RB8,RI=1,发中断.否则,字符不送SBUF.TXDRXD1.方式0波特率固定为fosc/12(fosc为单片机晶振频率)三.串行口的通讯波特率3.方式1/3波特率=(2SMOD/32)×(T1的溢出率)=(2SMOD/32)×(fosc/12(2K-x))

式中,K:方式0,K=13

方式1,K=16

方式2/3,K=8根据给定的波特率,可以计算T1的计数初值X。2.方式2波特率固定为(2SMOD/64)×fosc.注意:1)T1初值和对应波特率间若有误差可通过fosc调整.2)T1在方式1下的TC初值应考虑到重装时间.第三节MCS-51串行口的应用串行口在方式0下的应用串行移位输出例:串行通信方式0,扩展I/O接口,接八个数码管,使内部数据存储器58H~-5FH单元的内容为0XH。ΩΩ

××

ORG0050H SETBP3.3;允许移位寄存器工作

MOVSCON,#0;选串行通信方式0 MOVR7,#08H;显示八个字符

MOVR0,#5FH;先送最后一个显示字符

MOVDPTR,#TBA;DPTR指向字形表首址

DLO:MOVA,@R0;取待显示数码

MOVCA,@A+DPTR;查字形表

MOVSBUF,A;送出显示

JNBTI,$;一帧输出完?

CLRTI ;已完,清中断标志

DECR0;修改显示数据地址

DJNZR7,DLOCLRP3.3;8位送完,关发送脉冲

SJMP$TBA:DB0C0H,0F9H,0A4H,B0H,99H,92H DB82H,0F8H,80H,90H,83H,83H,0C6HDB0A1H,86H,84H,0FFH,0BFH

(一)串行口方式1下的应用(查询方式)例:甲机只有收到乙机答应信号“00”后才可把存放在片外RAM中的内容发送给乙机,其发送数据格式为:字节数n数据1数据2……数据n累加校验和字节数n:甲机将向乙机发送的数据字节数;数据1~数据n:甲机将向乙机发送的n个字节数据;累加校验和:字节数n,数据1,…,数据n,这(n+1)的算术累加和(向高位进位丢失)。乙机根据接收到的“校验和”判断收到的数据是否正确。若接收正确,向甲机发“0F”信号,否则回发“F0”信号。二、串行口在其它方式下的应用(1)甲机查询方式发送子程序发送程序约定:波特率设置初始化:定时器T1模式2工作,计数初值F3H,SMOD=1;串行口初始化:方式1工作,启动发送;片内RAM和工作寄存器设置:

31H和30H存放发送的数据块首地址;

2FH存放发送的数据块长度;

R6为累加和寄存器。甲机发送子程序框图如下:甲机发送子程序清单:FMT_T_S: MOV TMOD,#20H ;波特率设置

MOV TH1,#0F3H MOV TL1,#0F3H SETB TR1 MOV SCON,#50H ;串行口初始化,方式1并启动接收

MOV PCON,#80H ;置SMOD=1FMT_RAM: MOV DPH,31H ;设置DPTR指针

MOV DPL,30H MOV R7,2FH ;送字节数至R7 MOV R6,#00H ;清累加和寄存器TX_ACK: MOV A,#06H ;发呼叫信号“06” MOV SBUF,AWAIT1: JBC T1,RX_YES ;等待发送完一个字节

SJMP WAIT1RX_YES: JBC RI,NEXT1 SJMP RX_YESNEXT1:MOV A,SBUF;判断乙机是否同意接收,

CJNE A,#00H,TX_ACK不同意就继续呼叫TX_BYTES: MOV A,R7 MOV SBUF,A ADD A,R6 ;求累加和

MOV R6,AWAIT2: JBC T1,TX_NEWS SJMP WAIT2TX_NEWS: MOVXA,@DPTR ;发送数据

MOV SBUF,A ADD A,R6 ;形成累加和送R6 MOV R6,A INC DPTR ;指针加1WAIT3: JBC TI,NEXT2 SJMP WAIT3NEXT2: DJNZ R7,TX_NEWS;判发送结束TX_SUM: MOV A,R6 ;数据已发送完,发累加和给乙机

MOV SBUF,AWAIT4: JBC TI,RX_0FH SJMP WAIT4RX_0FH: JBC RI,IF_0FH ;等待乙机回答

SJMP RX_0FHIF_0FH:MOVA,SBUF ;读入

CJNEA,#OFH,FMT_RAM ;判断传送则正确否

RET(2)乙机查询方式接收子程序接收程序约定:波特率设置初始化:同甲机发送子程序。串行口初始化:同发送程序寄存器设置:31H,30H——存放接收数据缓冲区首地址。

R7——数据块长度寄存器。

R6——累加和寄存器。向甲机回答的状态信息:0FH为接收正常,FOH为传送出错,00H为同意接收数据。乙机接收子程序框图见下图乙机接收子程序清单:FMT_T_S: MOV TMOD,#20H ;T1初始化

MOV TH1,#0F3HMOV TL1,#0F3HSETB TR1 MOVSCON,#50H ;串行口初始化方式1,并允许接收

MOVPCON,#80H ;SMOD=1FMT_RAM: MOV DPH,31H ;设置DPTR地址指针

MOV DPL,30H MOV R6,#00H ;校验和寄存器清0RX_ACK: JBC RI,IF_06H ;接收呼叫信号

SJMP RX_ACKIF_06H: MOV A,SBUF;判断呼叫信号是否有误

CJNE A,#06H,TX_15HTX_00H: MOV A,#00H;向甲机回送同意接收信号

MOV SBUF,AWAIT1: JBC TI,RX_BYTES;等待应答信号发送完

SJMP WAIT1TX_15H: MOV A,#15H;向甲机报告接收的

MOV SBUF,A呼叫信号不正确WAIT2: JBC TI,HAVE1 SJMP WAIT2

HAVE1:LJMP RX_ACK ;返回到开始接收呼叫信号状态RX_BYTES: JBC RI,HAVE2 ;接收数据块长度

SJMP RX_BYTESHAVE2:MOVA,SBUF ;给长度寄存器赋值

MOVR7,A MOVR6,A ;形成累加和RX_NEWS: JBC RI,HAVE3 ;接收数据

SJMP RX_NEWSHAVE3: MOV A,SBUF ;将接收到的数据存放入

MOVX@DPTR,A外部RAM INC DPTR ADD A,R6 ;形成累加和

MOV R6,A DJNZ R7,RX_NEWS;判断是否接收完毕RX_SUM: JBC RI,HAVE4 ;接收校验和

SJMP RX_SUMHAVE4: MOV A,SBUF CJNE A,R6,TX_ERRTX_RIGHT: MOV A,#0FH;向甲机报告传输正确

MOV SBUF,AWAIT3: JBC TI,GOOD SJMP WAIT3TX_ERR: MOV A,#0F0H;向甲机报告传送有误

MOV SBUF,AWAIT4: JBC TI,AGAIN SJMP WAIT4AGAIN: LJMP FMT_RAM ;返回重新接收数据GOOD: RET ;返回被调用的主程序(二).串行口方式1下的应用(中断方式)(1)主程序框图

ORG2100HTBLOCKDATA20HLENDATA14HSTART:MOVTMOD,#20H;T1方式2MOVTL1,#0F4H;2400pbsMOVTH1,#0F4HMOVPCON,#80H;SMOD=1SETBTR1MOVSCON,#40H;串口方式1MOVR0,#TBLOCKMOVA,LENMOVR2,AMOVSBUF,ASETBEAWAIT:SETBESSJMPWAIT

中断服务程序

ORG0023HLJMPTXSVEORG2150HTXSVE:CLRRS;串口关中断

CLRTIMOVA,@R0;发送字符AMOVC,PSW.0;形成奇校位

CPLCMOVACC.7,CMOVSBUF,ADJNZR2,NEXTSJMP$NEXT:INCR0NN:RETIEND(2)乙机中断接收子程序设置三个标志位来判断所接收的信息,是数据块长度,是数据还是校验和。本例约定:波特率:T1方式2工作,计数初值F4H,

SMOD=1。串行口初始化:方式1,启动接收。31H,30H—存放在以

31H、30H

(送DPTR)为地址指针的片外RAM中。32H——数据块长度寄存单元。33H——累加校验和寄存单元。(三).串行口方式3下的应用(中断方式)设甲机发送,乙机接收,串行接口工作方式3(每帧数据为11位,第9位用于奇偶校验),两机均选用6MHz的振荡频率,波特率为2400b/s,通信的功能为:甲机:将片外RAM4000H~407FH单元的内容向乙机发送,乙机:对接收的信息进行奇偶校验(偶校验),P位值放TB8中。若校验正确,则乙机向甲机回发(00H)。若奇偶校验有错,则乙机发出信号(FFH)。接收甲机发送的数据,并写入以4000H为首地址的片外RAM中。(四)8051C语言通讯程序实例1、通信协议的约定假定A机是发送者,B机是接收者。当A机开始发送时,先送一个“AA”信号,

B机接收到后回答一个“BB”,表示同意接收。当A机收到“BB”后,开始发送数据,每发送一次求“校验和”,数据块发送完后发送“校验和”。B机每接收到一个数据便计算一次“校验和”,当收齐一个数据块后,再接收A机发来的校验和,并将它与B机求出的校验和进行比较。若两者相等,说明接收正确,B机回答00H;若两者不等,说明接收不正确,B机回答0FFH,请求重发。A机收到00H回答结束发送;若收到的非零,则将数据再重发一次。双方约定的传输速率若为1200b/s,查表可知,在双方的fosc=11.0592MHz下,T1工作在定时器模式2,TH1=TL1=0E8H,PCON寄存器的SMOD位为0。2、点对点通信程序人为规定一个为发送,一个为接收。要求两机串行口的波特率相同。A机发送程序#include<reg51.h>#define uchar unsignedchar#define TR1 //发送接收差别值TR=0发送uchar

idatabuf[10];ucharpf;voidinit(void) //串行口初始化{TMOD=0x20; //设T1为定时器模式2 TH1=0xe8; //设定波特率

TL1=0xe8; PCON=0x00; TR1=1; //启动T1 SCON=0x50; //串行口工作在方式1并允许接收}voidsend(uchar

idata*d){uchari; do{SBUF=0xaa; //发送联络信号“AA” while(TI==0); //等待发送出去

TI=0; while(RI==0); //等待B机回答

RI=0;}while((SBUF^0xbb)!=0);//B机未准备好,继续联络(收到“BB”吗)

do{pf=0; //清校验和

for(i=0;i<16;i++) {SBUF=d[i]; //发送一个数据

pf+=d[i]; //求校验和

while(TI==0);TI=0;}SBUF=pf; //发送校验和

while(TI==0);TI=0;while(RI==0);RI=0; //发送校验和

}while(SBUF!=0); //回答出错,则重发}voidreceive(uchar

idata*d){uchari;do{while(RI==0);RI=0;}while((SBUF^0xaa)!=0);//判A机请求否

SBUF=0xbb;while(TI==0);TI=0;while(1){pf=0; //清校验和

for(i=0;i<16;i++) {while(RI==0);RI=0; d[i]=SBUF; //接收数据

pf+=d[i];} //求校验和

while(RI==0);RI=0;//接收A机校验和

if((SBUF^pf)==0)//比较校验和

{SBUF=0x00;//检验和相同发“00” break;}

else{SBUF=0xff;//出错发“FF”,重新接收

while(TI==0);TI=0;}}}B机接收程序voidmain(void){ init(); if(TR==0) {

send(buf);}else{

receive(buf);}}第四节8051多机通讯技术在许多场合,需要多台单片机互相配合才能完成某个过程或任务。以完成各种功能。网络形式有4种:星形网络、串行总线形网络、环形网络、树形网络结构.串行总线形主从式多机通信全双工串行总线形主从式多机通信半双工结构(一)主从式多机通信

1.特点:1)一台是主机,其余的为从机,2)主机、从机均工作于方式2或方式3。2.原理1)主机(SM2=0),

TB8=1---发送地址标志

TB8=0---命令、数据标志从机(SM2=1)

若RB8=1则接收主机地址进入中断

RI=02)从机在中服完成本机/从机地址比较若本机<>接收地址,则本机未被选中,令SM2=1,退中断3)若本机地址=接收地址,则本机被选中令SM2=0,回送所接收地址,完成主机---从机通信。4)从机完成主机----从机间通讯后,令SM2=1,退出中服3。主机给从机1发地址地址符合(二)主从式多机通讯实例主机通讯(1200bps)1)所用命令/状态字(1)各从机均有自己的本机地址(2)控制字

00H---主机发和从机收命令

01H---从机发和主机收命令(3}从机状态字ERR00000TRDYRRDY0—合法1—非法0—从机未准备好接收1—从机准备好接收0—从机未准备好发送1—从机准备好发送2)主机通讯程序(装入主机)R0—主机发送数块始址R1—主机接收数块始址R2—被寻址从机地址R3—主机发出的命令R4—发送数块长度R5—接收数块长度(1)主机主程序

ORG2000HSTART:MOVTMOD,#20H;T1方式2MOVTH1,#0F4H;1200bpsMOVTL1,#0F4HSETBTR1;启动T1MOVSCON,#0D8H;方式3,

MOVPCON,#00H;接收TB8=1MOVR0,#40H;发送数块始址

MOVR1,#20H;接收数块始址

MOVR2,#SLAVE;被寻址从机地址

MOVR3,#00H/01H;主机发出的命令

MOVR4,#20;发送数块长度

MOVR5,#20;接收数块长度

ACALLMCOMMU;调主机通讯程序

SJMP$(2)主机通讯程序框图(3)主机通讯程序

ORG2100HMCOM:MOVA,R2;从机地址送AMOVSBUF,A;发送从机地址

JNBRI,$;等待接收从机

CLRRI;应答地址

MOVA,SBUF;从机应答地址送AXRLA,R2;核对两个地址

JZMTXD2;相符,转MTXD2MTXD1:MOVSBUF,#0FFH;从机复位命令

SETBTB8;地址桢标志送TB8SJMPMCOMMTXD2:CLRTB8;准备发送命令

MOVSBUF,R3;发送命令字

JNBRI,$;(00/01)等待从机应答

CLRRIMOVA,SBUF;等待从机应答状态字

JNBACC.7,MTXD3;正确,MTXD3SJMPMTXD1;错误,重新联络MTXD3:CJNZR3,#00H,MRXD;若从机发

;主机收,MRXDJNBACC.0,MTXD1;若从机接收

;未就绪,MTXD1MTXD4:MOVSBUF,@R0;若从机接收就

JNBTI,$;绪,则开始发送

CLRTIINCR0DJNZR4,MTXD4;若数块未发

RET完,则继续

MRXD:JNBACC.1,MTXD1;从机发送未

;就绪,重新联络MRXD1:JNBRI,$;等待接收完毕

CLRRIMOVA,SBUF;接收数据送AMOV@R1,AINCR1DJNZR5,MRXD1若未接完,继续

RET3)从机通讯程序(装入从机)R0—从机发送数块始址R1—从机接收数块始址R2—发送数块长度R3—接收数块长度

ORG1000HSTART:MOVTMOD,#20H;T1方式2MOVTH1,#0F4H;1200bpsMOVTL1,#0F4H;SETBTR1MOVSCON,#0F8H;方式3,允许

MOVPCON,#00H;接收,TB8=1MOVR0,#20H;MOVR1,#40H;MOVR2,#20MOVR3,#20SETBEASETBESCLRRI…SJMP$

ORG0023HSJMPSINTORG0100HSINT:CLRRIPUSHACCPUSHPSWMOVA,SBUF;接收从机地

XRLA,#SLAVE;址送AJZRXD1;若呼叫本机,继续RETN:POPPSWPOPACCRETIRXD1:CLRSM2;接收数据/命令

MOVSBUF,#SLAVE;发回

JNBRI,$;本机地址,核对

CLRRIJNBRB8,RED2;若命令

(TB8=0),则RXD2

SETBSM2;若复位命令,则SM2=1SJMPRETN;返回主程序RXD2:MOVA,SBUF;收到命令送ACJNEA,#02H,NEXT;命令合法?NEXT:JCRXD3;若命令合法,则RXD3CLRTI;命令非法,则清TIMOVSBUF,#80H;发ERR=1的状态字

SETBSM2SJMPRETN;返回主程序RXD3:JZSCRX;若00H(接收)命令,则SCHRXJBF0H,STXD;若本机发送就绪,则STXDMOVSBUF,#00H;本机发未就绪,SETBSM2;则TRDY=0SJMPRETN;返回主程序STXD:MOVSBUF,#02H;发TRDY=1状态字

JNBTI,$;等待发完

CLRTI;发完清TI

INCR0;发送块指针加1DJNZR2,LOOP1SETBSM2;发完令SM2=1SJMPRETN;返回SCRX:JBPSW.1,SRXD;接收就绪,则SRXDMOVSBUF,#00H;未就绪,SETBSM2;发RRDY=0SJMPRETNSRXD:MOVSBUF,#01H;发RRDY=1状态字LOOP2:JNBRI,$;接收一个字符

CLRRIMOV@R1,SBUF;存入内存

INCR1;数块指针加1DJNZR3,LOOP2SETBSM2SJMPRETNEND(三)C语言多机通讯程序设计实例主机采用查询方式,从机采用中断方式通信。1.通信协议(1)主机先发送一帧地址信息,其中前8位为地址,第9位为地址/数据信息的标志位,1表示该帧为地址信息。(2)所有从机接收到地址帧后,各自将接收的地址与本机的地址比较地址相符的从机,使SM2=0,以接收随后发来的所有信息;地址不符的从机,仍SM2=1,对发来的数据不予理睬。(3)从机发送结束后,发送一帧校验和,并置第9位(TB8)为1,作为从机数据传送结束标志。(4)主机接收数据时,●若RB8=1,表示数据传送结束,比较此帧校验和,若正确,则回送正确信号00H,此信号令该机复位(即重新等待地址帧)若出错,则发送0FFH,令该从机重发数据。●若RB8=0,则原数据到缓冲区,并准备接收下帧信息。跨过(5)主机向从机发送数据时,从机比较地址相符后,从机令SM2=0,同时把本站地址发回主机。作为应答之后才能收到主机发送来的数据。其他从机继续监听地址(SM2=1),无法收到数据。(6)主机收到从机的应答地址后,确认地址是否相符。如果地址不符,发复位信号(数据帧中TB8=1);如果地址相符,则清

TB8,开始发送数据。(7)从机收到复位命令后回到监听地址状态(SM2=1),否则开始接收数据和命令。2.通信程序

00H为主机地址,01H,02H为从机设备地址.FFH是命令各从机恢复SM2=1的状态及复位。主机的命令编码为:01H 请求从机接收主机的数据命令02H 请求从机向主机发送数据命令从机的状态字节格式为:ERR00000TRDYRRDYRRDY=1,从机准备好接收主机的数据。TRDY=1,从机准备好向主机发送数据。ERR=1,从机接收到的命令是非法的。程序可分成主机程序和从机程序,约定一次传送的数据为16个字节,以02H地址的从机为例。(1)主机程序(查询方式)主机程序流程图:主机程序master.c如下:#include<reg51.h>#defineucharunsignedchar#defineSLAVE0x02 //从机地址#defineBN16uchar

idatarbuf[16];uchar

idatatbuf[16]={“mastertransmit”};voiderr(void){SBUF=0xff;

while(TI!=1);TI=0;}ucharmaster(uchar

addr,ucharcommand){uchar

aa,i,p;while(1){SBUF=SLAVE; //发呼叫地址

while(TI!=1);TI=0;while(RI!=1);RI=0; //等待从机回答

if(SBUF!=addr)err(); //若地址错,发复位信号

else{TB8=0; //清地址标志

SBUF=command; //发命令

while(TI!=1);TI=0;

while(RI!=1);RI=0;

aa=SBUF;if((aa&0x80)==0x80){TB8=1;//若命令未接收,发复位信号

err();}

else{if(command==0x01) //是发送命令

{if((aa&0x01)==0x01)//从机准备好接收

{do{p=0;//清校验和

for(i=0;i<BN;i++){SBUF=tbuf[i];//发送一个数据

p+=tbuf[i];while(TI!=0);TI=0;}SBUF=p; //发送校验和

while(TI==0);TI=0;

while(RI==0);RI=0;}while(SBUF!=0); //接收不正确,重新发送

TB8=1;return(0);}

}

else{if((aa&0x02)==0x02) //是接收命令,从机准备好发送

{while(1){p=0; //清校验和

for(i=0;i<BN;i++){

while(RI!=1);RI=0;

rbuf[i]=SBUF; //接收一数据

p+=rubf[i];}while(RI==0);RI=0;If(SBUF==p){SBUF=0x00; //校验和相同发00while(TI==0);TI=0;break;}else{SBUF=0xff; //校验和不同0FF,重新接收

while(TI==0);TI=0;}}TB8=1; //置地址标志

return(0);

}}}

}}}voidmain(void){TMOD=0x20;//T1定义为模式2TL1=0xfd; //置初值

TH1=0xfd;PCON=0x00;TR1=1;SCON=0xf0; //串行口为方式3master(SLAVE,0x01);master(SLAVE,0x02);}(2)从机程序(中断方式)从机中断程序的流程从机程序slave.c如下:#include<reg51.h>#defineucharunsignedchar#defineSLAVE0x02#defineBN16uchar

idatatrbuf[16];uchar

idatarebuf[16];bittready;bitrready;voidmain(void){TMOD=0x20; //T1定义为模式2TL1=0xfd; //置初值

TH1=0xfd;PCON=0x00;TR=1;SCON=0xf0; //串行口为方式3EA=1;EA=1; //开串行口中断

while(1){

tready=1;

rready=1; //假定准备好发送和接收

}}voidssio(void)interrupt4using1{voidstr(void);voidsre(void);

uchara,i;RI=0;ES=0; //关串口中断

if(SBUF!=SLAVE){ES=1;

goto

reti; //非本机地址,继续监听

}SM2=0; //取消监听状态

SBUF=SLAVE; //从机地址发回

while(TI!=1);TI=0;while(RI!=1);RI=0;

if(RB8==1){SM2=1;ES=1;

goto

reti; //是复位信号恢复监听

}

a=SBUF; //接收命令

if(a=0x01) //从机接收主机的数据

{

if(rready==1)SBUF=0x01; //接收准备好发状态

elseSBUF=0x00;while(TI!=1);TI=0;while(RI=1);RI=0;

if(RB8==1){SM2=1;ES=1;

goto

reti;}sre(); //接收数据块}else{if(a=0x02) //从机向主机发数据

{

if(tready==1)SBUF=0x02; //发送准备好发状态

elseSBUF=0x00;while(TI!=1);TI=0;while(RI!=1);RI=0;

if(RB==1){SM2=1;ES=1;

Goto

reti;}

str(); //发送数据块

}else{SBUF=0x80; //命令非法,发状态

while(TI!=1);TI=0;SM2=1;ES=1; //恢复监听

}}reti:;}voidstr(void) //发送数据块{

ucharp,i;

tready=0;do

温馨提示

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

评论

0/150

提交评论