网站建设公司合同,闵行建设机械网站,网站内链建设方法,怎么制作小网站 不用域名的串行与并行通讯方式 并行#xff1a;控制简单#xff0c;传输速度快。线多#xff0c;长距离成本较高且同时接受困难。 串行#xff1a;将数据字节分成一位一位的行驶在一条传输线上进行传输。如图#xff1a; 同步与异步串行通讯方式 同步串行通讯方式#xff1a;同步…串行与并行通讯方式 并行控制简单传输速度快。线多长距离成本较高且同时接受困难。 串行将数据字节分成一位一位的行驶在一条传输线上进行传输。如图 同步与异步串行通讯方式 同步串行通讯方式同步通讯需要建立发送方对接收方时钟的直接控制是双方达到完全同步。 异步串行通讯方式通讯的发送和接收设备使用各自的时钟控制数据的发送和接收为使双方收发协调要求发送和接收的时钟尽可能一致。如图异步通讯方式的特点 异步通讯以字符构成的帧为单位进行传输字符与字符之间的间隙是任意的但每个字符中的各位是以固定的时间传送的。其一帧字符信息由4部分组成起始位、数据位、奇偶检验位、停止位。在单片机中的通讯一般情况下均使用这种帧格式。如图串行通讯的制式 单工数据传输仅沿一个方向不能实现反向传输 半双工数据可以沿两个方向传输但是需要分时 全双工数据可以同时进行双向传输串行通讯三种错误校验奇偶校验、代码和校验、循环冗余校验RS232电平与TTL电平的转换 PC使用的串口的电平为RS232的九针串口MCU使用的电平是TTL电平要使得PC 和MCU进行通讯就需要对其电平极性转换。主要的几款电平转换芯片MAX232、MAX202、HIN232SIPEX320等串行通讯速度的定义_波特率 串行通讯的速率用波特率表示其定义为 每秒钟传送二进制代码的位数即1波特1位/秒单位bps位/秒 eg每秒钟传送240个字符而每个字符格式包含10位1起始、8数据、1停止此时的波特率为 10位*240个/秒2400bps串行通讯波特率的计算 单片机的串行口可设定为四种工作方式其中方式0和方式2波特率固定方式1和方式3波特率可变由定时器T1的溢出率来决定。计算公式如下 其中fosc为系统晶振频率通常为12MHz或者11.0592MHzSMOD为PCON寄存器的最高位。T1的溢出率即定时器T1溢出的频率。电源管理寄存器_PCON SMOD;该位与串通信波特率有关。 SMOD0串口方式1、2、3时波特率正常 SMOD1串口方式1、2、3时波特率加倍 SMOD0LVDFP0F此三位为STC_MCU 所特有的可查看相关手册。 GF1、GF0两个通用标志位可随意使用。 PD掉电模式设定位 PD0MCU正常工作 PD1MCU进入掉电模式 IDL空闲模式设定位 IDL0MCU正常工作 IDL1单片机进入空闲模式单片机的两种模式状态 掉电模式进入掉电模式后晶振停震CPU定时器串行口全部停止工作只有外部中断继续工作 可有外部中断低电平触发或下降沿触发或硬件复位模式唤醒。 空闲模式除CPU不够工作外其余仍继续工作在空闲模式下可由任一个中断或者硬件复位唤醒T1的溢出率 T1的溢出率就是T1定时器溢出的频率只要算出T1定时器每一处一次所需的时间T那么T的倒数即为他的溢出率。51串行口结构 51单片机串行口是一个可编程全双工的通信接口具有Uart通用异步收发器的全部功能能同时进行数据的发送与接收也可作为同步一位寄存器使用。 51_MCU主要由两个独立的串行数据缓冲寄存器SBUF 一个发送一个接收和发送控制器、接收控制器,输入移位寄存器及若干控制门电路。如图串行口控制寄存器_SCON SM0,SM1;工作方式选择位串口有四中工作方式如下 SM2多机通信可控制位SM2主要用于方式2和方式3当接收机的SM21时可以利用收的RB8来控制是否激活RI;RB80不激活RI收到的信息丢弃 RB81收到的数据进入SBUF并激活RI进而在中断服务中将数据从SBUF读走 当SM20时无论收到的RB8是0还是1均可以收收到的数据进入SBUF并激活RI通过控制SM2可实现多机通信。在方式0时SM2必须是0 在方式1时若SM21则只有接收到有效停止位时RI才置1 REN允许串行接收位REN1允许串行口接收数据 REN0禁止串行口接收数据 TB8方式2、3中发送数据的第九位可定义其作用奇偶检验地址帧标志等方式0和1中未使用 RB8方式2、3中接收数据的第九位可定义其作用奇偶检验地址帧标志等方式1若SM20则RB8是接收到的停止位。 TI;发送中断标志位方式0中串行发送第8位数据结束时或者其他方式串行发送停止位时由内部硬件置1向CPU发出中断申请在中断服务程序中须用软件清零取消此中断申请。 RI接收中断标志位 方式0中串行接收第8位数据结束时或者其他方式串行接收停止位时由内部硬件置1向CPU发出中断申请在中断服务程序中须用软件清零取消此中断申请 串口方式0串行口为同步移位寄存器的输入输出方式主要永不扩展并行输入输出接口数据由RXDP3.0引脚输入或者输出同步移位脉冲由TXDP3.1引脚输出发送和接收均为8位数据低位在先高位在后。波特率固定fosc/12 串口方式110位数据一步通讯口1起始8数据1停止TXDP3.1为数据发送引脚RXDP3.0为数据接收引脚。其传输波特率可变对51而言波特率有定时器1的溢出率而决定一般而言在单片基于单片机单片机与计算机计算机与计算机串口通讯时基本都市选择方式1所以此种方式必须掌握。 串口方士2,311位数据的异步通讯口XDP3.1为数据发送引脚RXDP3.0为数据接收引脚。在这两种方式下1起始9数据1停止一帧数据11位。方式2的波特率固定为晶晶振频率的1/64或1/32方式3的波特率由定时器1的溢出率决定。方式2和方式2的差别仅在于波特率的选取不同两种方式下接收到的停止位与SBUFRB8RI都无关。串口方式1的编程实现 方式1数据输出时序图如下 当数据被写入SBUF寄存器后单片机自动开始从起始位发送数据发送到停止位的开始时 由内部硬件将TI置1向CPU申请中断接下来可在中断服务程序中进行相关处理也可选择不进入中断。 用软件置REN为1时接收器以所选择波特率的16倍速率采样RXD引脚电平 检测到RXD引脚输入电平发声负跳变时则说明起始位有效。 将其移入输入移位寄存器并开始接受这一帧信息的其余位。 接收过程中数据从输入移位寄存器右边移入起始位移至输入移位寄存器的最左边 控制电路进行最后一次移位当RI0且SM20或结收到的停止位为1时 将接受到的9位数据前8位数据装入接收SBUF第九位停止位进入RB8并置RI1向CPU申请中断 在进行串口的相关操作之前需要对单片机的一些特殊寄存器和进行初始化设置 主要是设置产生波特率的定时器1串行口控制和中断控制具体步骤如下确定T1的工作方式编程TMOD寄存器 计算T1的初值装载TH1和TL1 启动T1编程TCON中的TR1位 确定串行口工作方式编程SCON寄存器 串行口工作在中断方式时要进行中断设置编程IE、IP寄存器 ----------------------------------------------------------------------------------------------------------------------- //串口方式1 TMOD0X20; //T1定时器工作方式2 TH10XFD; //T1定时器装初值 TL10XFD; //T1定时器装初值 TR11; //启动T1定时器 REN1; //允许串口接收 SM00; //设定串口工作方式1 SM11; //设定串口工作方式1 EA1; //开总中断 ES1; //开串口中断 ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- //串口中断服务程序 void ser() interrupt 4 { RI0; //RI清零因为收到数据或者或者发送了数据会由硬件置1 aSBUF; //将SBUF中的数据读走给a flag1; //中断标志位置1 } ----------------------------------------------------------------------------------------------------------------------- 串口方式0 串行口为同步移位寄存器的输入输出方式主要永不扩展并行输入输出接口数据由RXDP3.0引脚输入或者输出同步移位脉冲由TXDP3.1引脚输出发送和接收均为8位数据低位在先高位在后。波特率固定fosc/12。 在该模式下串行口的SBUF是作为同步移位寄存器使用的。 在串行口发送时。SBUF相当于一个并行进入串行输出的移位寄存器 由单片机的内部总线并行接收八位数据并从RXD信号线串行输出在接收操作时他有相当于一个串行输入、并行输出的移位寄存器。该模式下SM2RB8TB8不起作用。 方式0数据输出时序图如下 发送操作在TI0时进行CPU将数据移入SBUF后RXD线上即可发出8位数据TXD上发送同步脉冲 8位数据发送完后TI由硬件置位并在中断允许的情况下向CPU申请中断 CPU相应中断后先用软件是TI清零然后再给SBUF送下一个需要发送的字符如此重复上述过程。 方式0数据输入时序图如下 接收过程在REN1和RI0的条件下启动为此串行数据由RXD线输入TXD线输出同步脉冲 接收电路接收到8位数据后RI自动置位并在中断允许的条件下向CPU发出中断请求 CPU 查询到RI为1或者相应中断以后便将SBUF中的数据送到累加器RI需要由软件复位 需要注意的是 串行口工作模式0并不是一个同步通讯串口通讯方式 它的主要用途是与外面的同步移位寄存器相连已达到扩展单片机输入并行口和输出并行口的目的。 其可以通过芯片74LS164把串口数据转化成并口数据通过芯片74LS165把并行输出的数据转换成串口输出 ----------------------------------------------------------------------------------------------------------------------- 使用串口工作模式0间隔发送数据0XAA void main() { SCON0; //串行口工作方式0 EA1; //开总中断 ES1; //允许串口中断 TI0; //发送中断标志位 while(1) { SBUF0XAA; delay(); } } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- void ser0() interrupt 4 { TI0; //清楚发送中断标志位 } ----------------------------------------------------------------------------------------------------------------------- 串口方式2和方式3均为11位数据的异步通信口唯一的区别在于传输速率的不同。 TXD数据发送引脚RXD数据接收引脚1起始 9数据含1位附加第9位发送时为SCON中的TB8接收时为RB81停止一帧数据11位。 方式2的波特率固定为晶晶振频率的1/64或1/32方式3的波特率由定时器1的溢出率决定。 串口方式2和方式3一帧数据传送格式如图 串口方式2和方式3输出时序图 发送开始时先把起始位0输出到TXD管脚然后发送移位寄存器的的输出位D0到TXD引脚 每一个移位脉冲都使输出移位寄存器的各位右移一位并由TXD引脚输出 第一次移位时停止位1移入输出移位寄存器的第9位以后每次移位左边都输入0 当停止移位至输出位时左边其余位全为零检测电路检测到这一条件时使控制电路进行最后一次移位并置TI1向CPU请求中断。 串口方式2和方式3输入时序图 接受时数据从右边移入输入移位寄存器在起始位0移到最左边时控制电路进行最后一次移位。 当RI0且SM20或接收到第9位数据位1时接收到的数据装入接收缓冲器SBUF和RB8接收数据的第9位置RI1向CPU申请中断如果条件不满足则数据丢失且不置位RI继续搜索RXD引脚的负跳变。 在方式2和方式3中要用到SCON寄存器中的TB8位和RB8位TB8为数据发送的第9位用于方式2和方式3由软件更改RB8为数据接收的第9位用于方式2和方式3在方式1中如果SM20则RB8用于存放接收到的停止位在方式0下不适用该位。 ----------------------------------------------------------------------------------------------------------------------- 使用串口工作方式2发送0XAA void main() { SM01; //SMOSM1为10,串行工作方式2 SM10; //11位异步收发9位数据 TB80; //数据发送的第9位 EA1; //开总中断 ES1; //允许串口中断 TI0; //发送中断标志位 while(1) { SBUF0XAA; delay(); } } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- void ser0() interrupt 4 { TI0; //清楚发送中断标志位 } ----------------------------------------------------------------------------------------------------------------------- 单片机双机通信 通常单片机通信有以下四种实现方式 TTL电平通信 RS-232C通信 RS-422A通信 RS-485通信 TTL电平通信 RS-232C通信 RS-422A通信 RS-422A驱动器为双端驱动器其中一条线的逻辑为1另一条线就为0 具抗干扰型能够200mv以上的电位差 传输速率90Kbps传输距离可达1200m接口电路如下全双工 RS-485通信 RS-485是RS-422A的变种422A是全双工485为半双工 最多可使用32对差分器。如在一个网络中连接超过32个还可使用中继器。 引起传输线采用差动信号所以抗干扰性好传输速率可达1Mbps接口如下 多机通信 采用主从结构在整个系统中有且仅有一个主机其余全是从机多机通信所应遵循的原则如下A.所有从机的SM21处于接收地址帧状态B.主机发送一地址帧其中8位是地址第9位是地址/数据区分标志该位置1表示地址帧。 所有从机收到地址帧后与本季的地址比较对于地址相符的从机 是自己的SM2置0已接收主机随后发来的数据帧并把本机地址发回主机作为应答 对于地址不符的仍保持SM21对主机随后发来的数据帧不予理睬.C.从机发送数据结束后要发送一帧校验和并置第9位TB8为1作为从机数据结束的标志。D.主机验证数据时先判断数据接收标志RB8若RB81表示数据传送结束并比较此帧校验和 若正确则会送正确信号00H命令该从机复位即重新等待地址帧。 若校验和出错则发送0FFH命令该从机重发数据。 若接受侦的RB80则将数据存到缓存区并准备接收下一帧信息。E.主机接到从机应答地址后确认地址是否相符如果地址不符 则发复位信号数据帧中TB81如果地址相符则TB8清0开始发送数据。 从机收到复位命令后会到监听地址状态SM21否则开始接收数据和命令。 编程时可按以下方式操作 主机发送的地址联络信号为00H01H02H...即从机设备地址地址FFH为命令各从机复位即回复SM21 主机命令编码如下01H主机命令从机接收数据 02H主机命令从机发送数句 若有其他数据则都按02H对待。 从机状态字格式如图若ERR 1;从机收到非法命令。 若TRDY1从机发送准备就绪 若RRDY1从机接收准备就绪 通常从机以中断方式控制和主机通讯。 多机通信主机流程图如下 程序代码如下 ----------------------------------------------------------------------------------------------------------------------- #include #define uchar unsigned char #define uint unsigned int #define SLAVE 0X02 //从机地址 #define NB 16 uchar rbuf[16]; uchar code tbuf[16]{master transmit}; void err() { SBUF0XFF; while(!TI1); TI0; } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- uchar master(uchar add,uchar com) { while(1) { SBUFSLAVE; //发呼叫地址 while(!TI1); TI0; while(!RI1); RI0; //等待从机应答 if(SBUF!add) { err(); //地址错误发复位信号 } else //地址相符 { TB80; //清地址标志 SBUFcmd; //发命令 while(!TI1); TI0; while(!RI1); RI0; aaSBUF; //接收状态 if(aa0x080x08) //若命令未被接收发复位信号 { TB81; err(); } else { if(cmd0X01) //发送命令 { if(aa0x010x01) //从机准备好接受 { do { p0; //清校验和 for(i0;i { SBUFtbuf[i]; //发送一数据 ptbuf[i]; while(!TI1); TI0; } SBUFp; //发送检验和 while(!TI1); TI0; while(!RI1); RI0; } while(SBUF!0); //接收不正确重新发送 TB81; //置地址标志 return(0); } else if(aa0x020x02) //是接收命令从机准备好发送 { while(1) { p0; //清检验和 for(i0;i { while(!RI1); RI0; rbuf[i]SBUF; //接收一数据 prbuf[i]; } while(!RI1); RI0; if(SBUFp) { SBUF0x00; //校验和相同发0X00 while(!TI1); TI0; break; } else { SBUF0xFF; while(!TI1); TI0; } } TB81; //置地址标志 return(0); } } } } } } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- void main() { TMOD0x20; //T/C1定义为方式2 TL10XFD; //置初值 TH10XFD; PCON0X00; TR11; SCON0XF0; //串行口方式3 master(SLAVE,0x01); master(SLAVE,0X02); while(1); } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- 多机通信从机流程图 程序如下 ----------------------------------------------------------------------------------------------------------------------- #include #define uchar unsigned char #define uint unsigned int #define SLAVE 0X02 #define BN 16 uchar trbuf[16]; uchar rebuf[16]; bit tready; bit rready; void str(void); void sre(void); void main() { TMOD0x20; //T/C1定义为方式2 TH10XFD; TL10XFD; PCON0X00; TR11; SCON0XF0; ES1; //开串行口中断 EA1; //开总中断 while(1) { tready1; rready1; } //假定准备好发送和接受 } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- void ssio(void) interrupt 4 { uchar a; RI0; ES0; if(SBUF!SLAVE) { ES1; goto reti; } //非本机地址继续监听 SM20; //取消监听状态 SBUFSLAVE; //从本地址发回 while(!TI1); TI0; while(!RI1); RI0; if(RB81) { SM21; ES1; goto reti; } //是复位信号恢复监听 aSBUF; //接收命令 if(a0X01) { if(rready1) SBUF0X01; //接收准备好发状体 else SBUF0X00; while(!TI1); TI0; while(!RI1); RI0; if(RB81) { SM21; ES1; goto reti; } sre(); //接收数据 } else { if(a0X02) //从机向主机发送数据 { if(tready1) SBUF0X02; //发送准备好发状体 else SBUF0X00; while(!TI1); TI0; while(!RI1); RI0; if(RB81) { SM21; ES1; goto reti; } str(); //发送数据 } else { SBUF0X80; //命令非法发状态 while(!TI1); TI0; SM21; ES1; //恢复监听 } } reti; } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- void str(void) //发送数据块 { uchr p,i; tready0; do { p0; //清校验和 for(i0;i { SBUFtrbuf[i]; //发送一数据 ptrbuf[i]; while(!TI1); TI0; } SBUFp; //发送校验和 while(!TI1); TI0; while(!RI1); RI0; }while(SBUF!0); //主机接收不正确从新发送 SM21; ES1; } ----------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------- void sre(void) //接收数据块 { uchr p,i; rready0; while(1) { p0; //清校验和 for(i0;i { while(!RI1); RI0; rebuf[i]SBUF; //接收数据 prebuf[i]; } while(!RI1); RI0; if(SBUFp) { SBUF0X00; break; } //校验和相同发00 else { SBUF0XFF; //校验值不同发0FF重新接收 while(!TI1); TI0; } } SM21; ES1; } ----------------------------------------------------------------------------------------------------------------------- 以上是51串口的通讯的协议内容也可以说是串口通讯协议。其与Uart等具有相同的传输性质双向传输全双工转载于:https://www.cnblogs.com/hulianxingkong/p/9096733.html