单片机原理及接口技术-基于C51 Proteus仿真(第二版)课件汇 (屈霞) 第10-13章 80C51单片机串口设计- Keil c51 和Proteus 虚拟仿真平台的使用_第1页
单片机原理及接口技术-基于C51 Proteus仿真(第二版)课件汇 (屈霞) 第10-13章 80C51单片机串口设计- Keil c51 和Proteus 虚拟仿真平台的使用_第2页
单片机原理及接口技术-基于C51 Proteus仿真(第二版)课件汇 (屈霞) 第10-13章 80C51单片机串口设计- Keil c51 和Proteus 虚拟仿真平台的使用_第3页
单片机原理及接口技术-基于C51 Proteus仿真(第二版)课件汇 (屈霞) 第10-13章 80C51单片机串口设计- Keil c51 和Proteus 虚拟仿真平台的使用_第4页
单片机原理及接口技术-基于C51 Proteus仿真(第二版)课件汇 (屈霞) 第10-13章 80C51单片机串口设计- Keil c51 和Proteus 虚拟仿真平台的使用_第5页
已阅读5页,还剩561页未读 继续免费阅读

下载本文档

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

文档简介

第10章80C51单片机串口设计

110.1串口通信基础10.1.1串行通讯的基本方式10.1.2串行通讯的波特率10.1.3串行数据传送方向10.1.4串行通信接口种类10.2单片机串口的结构10.2.180C51串行口结构10.2.2串行口相关的特殊功能寄存器10.3串口工作方式10.4串口波特率设计10.5多机通信10.6串口应用设计10.6.1串口方式0的应用设计10.6.2串口方式1的应用设计10.6.3串口方式2和3的多机通信应用设计10.6.4单片机与PC机异步串行通信设计10.6.5单片机与异步串口RS-232C的接口电路设计10.6.6单片机与异步串口RS-422A接口电路设计10.6.7单片机与异步串口RS-485接口电路设计第10章80C51单片机串口设计本章主要讲述80C51单片机串行口的结构、工作原理以及应用。主要介绍串行通信基础知识、单片机串口结构、串口工作方式、串口波特率设计、多机通信以及串口应用设计。10.1串口通信基础数据通信的基本方式有并行通信和串行通信两种。1.并行通信

单位信息(通常是一个字节)的各位数据同时传送的通信方式称为并行通信。并行通信连线多,速度快,适合近距离通信。42.串行通信单位信息的各位数据被分时一位一位依次顺序传送的通信方式称为串行通信。串行通信连线少,速度慢,适合远距离通信。串行通信是将二进制数据按位传送,它所需要的传输线少,适用于分布式控制系统以及远程通信。10.1.1串行通讯的基本方式按照串行数据的同步方式,串行通信分为异步通信和同步通信两类。异步通信是一种利用字符的再同步技术的通信方式,同步通信是按照软件识别同步字符来实现数据的发送与接收。1.异步通信异步通信(Universalasychronousreceiver-transmitter)指接收器和发送器有各自的时钟,非同步,传送的数据是一个字符代码或一个字节数据,数据以帧的形式一帧一帧传送。6以字符为传送单位,从起始位0、数据位(由低到高,5~8位)、奇偶校验位和停止位1逐位传送,第9位D8可作奇偶校验位,也可是地址/数据帧标志。字符位数间隔不固定,用空闲位1填充。异步通信的一帧数据格式如图10-1所示。7

图10-1异步通信的一帧数据格式2.同步通信

在同步通信中,每一数据块开头时发送一个或两个同步字符,使发与收双方取得同步,然后再顺序发送数据。数据块的各个字符间取消了起始位和停止位,通信速度得以提高。同步通信数据帧格式如图10-2所示。8图10-2同步通信数据帧格式同步字符可采用统一标准格式,在单同步字符帧结构中,同步字符采用ACSII码中规定的SYN(即16H)代码;在双同步字符帧结构中,同步字符一般采用国际通用标准代码EB90H,也可由收发双方在传送之前约定好。10.1.2串行通讯的波特率在串行通信中,对数据传送速度有一定要求。波特率表示每秒传送的位数,单位是b/s、bps(bitpersecond)或波特(记作Baud)。1波特=1bit/s(1位/秒)例如,数据传送速率为每秒钟120个字符,若每个字符(一帧)为10位,则传送波持率为:120字符/s×10bit/字符=1200b/s波特率是串行通信的重要指标,用于表征数据传输的速度。波特率越高,表明数据传输速度越快,波特率和字符的实际传输

10速率不同。字符的实际传输速率是指每秒钟内所传字符帧的帧数,和字符帧格式有关。在实际应用中,一定要注意串行通信系统中字符帧的格式。字符帧的每一位传输时间(Td)定义为波特率的倒数,例如,波特率为1200bps的通信系统,其每一位数据的传输时间Td=1/1200=0.833(ms)。波特率和信道的频带有关,波特率越高,所需要的信道频带就越宽。因此,波特率也是衡量通信系统带宽的重要指标。波特率不同于发送时钟和接收时钟,常常是时钟频率的1/16或1/64。11在串行通信发送和接收端波特率设置时,必须采用相同的波特率,才能保证串行通信的正确性。异步通信的传送速率一般在50~115200b/s之间。国际上规定了标准波特率系列,这些标准波特率系列为110、300、600、1200、1800、2400、4800、9600、19200、38400、57600和115200bit/s等。1210.1.3串行数据传送方向串口通信按照通信方向分,有单工方式、半双工方式和全双工方式。串行通信传输方式如图10-3所示。1.单工方式单工方式仅有一对传输线,允许数据单方向传送。2.半双工方式半双工方式有一对传输线,允许数据分时向两个方向中的任一方向传送数据,但不能同时进行。3.全双工方式全双工方式用两对传输线连接发送器和接收器,数据发送和接收能同时进行。

图10-3串行通信传输方式10.1.4串行通信接口种类根据串行通信格式及约定(如同步方式、通信速率、数据块格式等)不同,形成了许多串行通信接口标准,常见标准有:UART(通用异步串行通信接口)、USB(通用串行总线接口)、I2C(集成电路间的串行总线)、SPI(同步串行外设总线)、485总线、CAN总线接口等。1510.2单片机串口的结构80C51单片机具有一个可编程的全双工串口,可以同时发送、接收数据,发送、接收数据可通过查询或中断方式处理,使用十分灵活。通过编程设定串行口相关的特殊功能寄存器,可作为同步移位寄存器或者作为UART,其数据帧有8位、10位或11位3种格式,可设置波特率,使用方便灵活。10.2.180C51串行口结构80C51单片机通过串行数据接收端引脚RXD(P3.0)和串行数据发送端TXD(P3.1)与外界进行通信,其内部结构如图10-4所示,80C51单片机串行口主要由发送数据缓冲器、发送控制器、16输出控制门、接收数据缓冲器、接收控制器、输入移位寄存器等组成。发送缓冲器SBUF和接收缓冲器SBUF共用一个特殊功能寄存器地址(99H)。发送时,通过写入SBUF,数据以一定波特率从TXD(方式0时为RXD)引脚串行输出,低位在先,高位在后,发送完一帧数据置“1”发送中断标志位TI。接收时,接收器以一定波特率采样RXD引脚的数据信息,当收到一帧数据时置“1”接收中断标志位RI。17图10-480C51单片机串行口内部结构(RXD\输入移位寄存器)10.2.2串行口相关的特殊功能寄存器从用户使用的角度,控制串行口的特殊功能寄存器有3个:接收和发送缓冲器SBUF(99H)、串行口控制寄存器SCON和电源控制寄存器PCON。1.发送缓冲器SBUF和接收缓冲器SBUF发送和接收SBUF共用一个特殊功能寄存器地址(99H),区别在于发送缓冲器只能写不能读,接收缓冲器只能读不能写。2.串行口控制/状态寄存器SCON(98H)SCON用于设置串口的工作方式和标识串口的状态,其字节地址为98H,可位寻址。复位值:00000000B。寄存器中各位内容如表10-1所示,说明如下。

19

20表10-1串行口控制寄存器SCON(1)SM0和SM1(SCON.7、SCON.6):串行口工作方式选择位,用于选择4种工作方式,串口方式选择如表10-2所示。21表10-2串口工作方式选择(2)SM2(SCON.5):多机通信控制位,在方式2或3中使用。(3)REN(SCON.4):允许接收控制位。设置1,允许接收;清0:禁止接收。(4)TB8(SCON.3):发送数据的第9位。(5)RB8(SCON.2):接收数据的第9位。(6)TI(SCON.1):发送中断标志。(7)RI(SCON.0):接收中断标志。串行发送中断标志TI和接收中断RI是同一个中断源引起,由于CPU不知道是发送中断标志TI还是接收中断标志RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。223.电源控制寄存器PCONPCON特殊功能寄存器的字节地址为87H,没有位寻址功能,其格式如表10-3所示,串行口工作于方式1、方式2和方式3时,PCON中的波特率选择位SMOD(PCON.7)设置为1时,串行口波特率加倍。SMOD不能进行位寻址,其复位值为00000000B。23表10-3串行口电源控制寄存器PCON10.3串口工作方式单片机串口可通过设置SCON中的SM0、SM1确定串口的4种工作方式。1.方式0串行口的工作方式0为移位寄存器方式,通常外接移位寄存器,以扩展I/O口,也可外接同步输入/输出设备。方式0工作时,数据长度为8位,数据由RXD输入和输出,波特率固定为:fosc/12,同步时钟固定通过TXD输出。发送和接收数据时,由低位到高位。方式0发送和接收时序说明如下。24(1)方式0发送时序

在TI=0时,当CPU向SBUF写数据时,就启动发送过程。经过一个机器周期(以fosc/12的固定波特率),写入SBUF的数据由低位到高位,从RXD依次发送出去,同步时钟从TXD送出。8位数据(一帧)发送完毕后,由硬件使发送中断标志TI置位,向CPU申请中断。(2)方式0接收时序在RI=0的条件下,将REN(SCON.4)置“1”,则启动一次接收过程。串行数据通过RXD接收,同步移位脉冲通过TXD输出。在移位脉冲控制下,RXD引脚上的串行数据依次移入移位寄存器。当8位25数据(一帧)全部移入移位寄存器后,接收控制器发“装载SBUF”信号,将8位数据并行送入SBUF中,同时,由硬件使接收中断标志RI置位,向CPU申请中断。2.方式1方式1为8位UART,在方式1下,一帧信息为10位:1位起始位“0”、8位数据位(低位在前)和1位停止位“1”。TXD为发送数据端,RXD为接收数据端。波特率可设置,由定时/计数器T1的溢出率和电源控制寄存器PCON中的SMOD位决定。方式1发送和接收时序说明如下。(1)发送过程时序在TI=0时,当CPU向SBUF写入数据时,就启动了发送过程。数据由TXD引脚输出,发送时钟由T1溢出信号经过16分频或32分频后得到。在发送时钟的作用下,通过TXD端送出一个起始位“0”、8位数据(低位在前)和一个高电平停止位,当发送完一帧数据,由硬件使发送中断标志TI置位,向CPU申请中断,完成一次发送过程。(2)接收过程时序当REN被置1,接收器就开始工作,由接收器以所设置的波特率16倍速率对RXD电平采样。当采样到从“1”到“0”的负跳变时,启动接收控制器接收数据。在接收移位脉冲的控制下,所接收的数据移入移位寄存器,当8位数据及停止位全部移入后,根据以下状态,执行操作。①当RI=0、SM2=0,接收控制器发出“装载SBUF”信号,将输入移位寄存器中的8位数据装入SBUF,停止位装入RB8,并置RI=1,向CPU申请中断。②当RI=0、SM2=1,则停止位=“1”才发生上述操作。③当RI=0、SM2=1且停止位=“0”,接收数据不装入SBUF,数据将会丢失。④当RI=1,则接收数据不装入SBUF,即数据丢失。3.方式2和方式3方式2和方式3都为9位UART,接收和发送一帧数据长度为11位,即1个低电平、9位数据位和1个高电平的停止位。发送的第9位数据在发送前放于TB8中,接收到的第9位数据放于RB8中。TXD为发送数据端,RXD为接收数据端。方式2和方式3的区别在于波特率不同,其中,方式2的波特率有固定2种。方式3的波特率与方式1的波特率相同,由T1的溢出率和PCON中的SMOD位决定。在方式3时,也需要对定时/计数器T1进行初始化。方式2和方式3的发送和接收时序说明如下。(1)发送过程时序方式2和方式3发送的数据为9位,在启动发送之前,必须把要发送的第9位数据装入SCON中的TB8中。通过向SBUF写入发送的字符数据来启动发送过程,发送时,由低到高发送SBUF中8位数据,第9位从TB8中取得。一帧信息发送完毕,置TI为1。(2)接收过程时序当REN置1时,启动接收过程,采样负跳变作为起始位,接收完一帧数据,若RI=0,SM2=0或RB8=1,将接收数据装入接收SBUF,第9位装入RB8,使RI=1;否则丢弃接收数据,不置位RI。10.4串口波特率设计80C51单片机方式0和方式2的波特率是固定的,方式1和方式3的波特率是由定时器T1的溢出率来决定的。52子系列单片机(如80C52、AT89C52等)中,可使用T2作波特率发生器。1.方式0的波特率方式0为同步移位寄存器方式,波特率固定为振荡频率fosc的1/12。方式0的波特率=fosc/12 (10-1)2.方式2的波特率方式2的波特率有2种,接收与发送的时钟直接来自振荡频率fosc,并且还与PCON中SMOD位有关。当SMOD=0时,波特率为fosc的1/64;若SMOD=1,则波特率为fosc的1/32。方式2的波特率=2SMOD×fosc/64 (10-2)3.方式1和方式3的波特率串行口方式1和方式3为可变波特率,用T1作波特率发生器。(1)T1作波特率发生器方式1、3的波特率==2SMOD/32xT1溢出率=(2SMOD/32)x(fosc/12)÷(2n-初值) (10-3)其中,T1的溢出率是T1定时时间的倒数,n是定时器T1的各种工作方式时的位数。在最典型应用中,定时器T1选用定时方式2,此时n=8,设定时器的初值为X,则X=256-(10-4)若T1选定时方式1,需重装时间常数。此时初值X为:X=216-fosc×2SMOD/384×B (10-5)例如,已知80C51单片机晶振频率为11.0592MHz,设定时器T1工作方式2做波特率发生器,B=2400bit/s,求初值。设波特率控制位SMOD=0,由T1选方式2,TH1=X=28-fosc×2SMOD/384×BX=256-11.0592×106×(0+1)/384×2400=244=F4H则初始化部分程序为:TMOD=0x20;TH1=0xF4;TL1=0xF4;TR1=1;在实际应用时,常根据已知波特率和时钟频率fosc计算T1的初值X。为避免繁杂初值计算,可参照常用波特率和T1初值X关系表,如表10-4所示。3536表10-4常用波特率和T1初值关系表10.5多机通信单片机多机系统中常采用总线型主从式多机系统,即在数个单片机中,有一个是主机,其余的为从机,从机要服从主机的调度。80C51单片机工作在串口方式2、3时,具有主从式的多机通信功能。通信只在主、从机之间进行,从机与从机间不可以直接通信。在主从式多机系统中,主机发出的信息有2类:一类为地址,用来确定需要和主机通信的从机,信息特征是串行传送的第9位数据TB8为1;另一类是数据,特征是串行传送的第9位数据TB8为0。37从机具有两种状态,当SM2=1时,从机可接收主机发来的TB8为1的地址信息,以确定主机是否是与自己通信;一经确认后,从机应使SM2=0时,以便接收主机发出的TB8为0的数据。主从多机通信的过程如下:(1)首先使所有从机串口工作在方式2或方式3,且SM2=1,REN=1,处于只接收地址帧的状态。(2)主机发送一帧地址信息,其中,前8位为地址,第9位RB8=1,该位置1表示该帧为地址信息。38(3)从机接收到地址帧后,各自将接收到的地址与本从机的地址比较。对于地址相符的从机(目标从机),则对自己的SM2清0,准备接收主机随后发来的数据信息;对于地址不符的从机,仍保持SM2=1,对主机随后发来的数据不予理睬,直至发送新的地址帧。(4)主机再发送数据,并且TB8为0,这时目标从机正常接收数据,其它从机均丢弃。3910.6串口应用设计在单片机串口应用中,方式0常用于扩展并行I/O口,方式1多用于实现点对点的双机通信,方式2或方式3实现多机通信的应用。串口应用设计首先要确定工作方式和波特率。1.串行口控制寄存器SCON位的确定。根据工作方式确定SM0、SM1位;对于方式2和方式3还要确定SM2位;如果是接收端,则置允许接收位REN为1;如果方式2和方式3发送数据,则应将发送数据的第9位写入TB8中。2.设置波特率对于方式0,不需要对波特率进行设置。对于方式2,设置波特率仅需对PCON中的SMOD位进行设置。对于方式1和方式3,设置波特率时,需对PCON中的SMOD位和T1设置,T1一般取方式2,8位可重置方式,初值计算如下。波特率=2SMOD×(T1的溢出率)/32T1的初值=2n-fosc×2SMOD/(12×波特率×32)10.6.1串口方式0的应用设计80C51单片机串口工作在方式0时,常用于扩展并行I/O口,当外接串入并出的移位寄存器(如CD4094、74LS164、74HC595等芯片),可扩展并行输出口;当外接并入串出的移位寄存器(如CD4014、74LS165等芯片)时,可扩展并行输入口。【例10-1】用80C51单片机串口外接串入并出CD4094芯片,扩展并行输出口控制8个发光二极管,使8个发光二极管从左至右延时轮流显示,如图10-5所示。CD4094是8位的串入并出芯片,具有一个STB控制端,当STB=0时,串行输入门被打开,在CLK时钟控制下,数据从DATA串行输入口依次输入;图10-5单片机扩展CD4094控制发光二极管当STB=1,打开并行输出门,并行输出8位数据。图10-5电路中,串口工作于方式0,TXD接CD4094的CLK,RXD接DATA,P2.0控制STB,8位并行输出端接8个发光二极管。单片机输出数据时,采用查询方式,参考C程序如下:#include<reg51.h>//包含特殊功能寄存器库sbitP2_0=P2^0;voidmain(){unsignedchari,a;SCON=0x00;a=0x01;while(1){P2_0=0;SBUF=a;44while(!TI){;}P2_0=1;TI=0;for(i=0;i<=254;i++){;}a=a*2;if(a==0x00)a=0x01;}}【例10-2】利用80C51单片机串口外接一片并行输出串行移位寄存器74LS164,扩展的并行输出8位数据通过数码管显示,实现循环显示0-9这10个数字。单片机与74LS164接口电路如图10-6所示,P3.0(RXD)接74LS164模块的数据输入引脚1、2,P3.1(TXD)接74LS164的时钟引脚CLK。46图10-6串口方式0外接串入并出转换芯片74LS164参考程C序如下:164-1.c#include<reg51.h>#include<stdio.h>#defineucharunsignedcharucharleddat[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};uchari;ucharj=0;main() //主程序{TMOD=0x01;TL0=0x00;TH0=0x4B;i=0x20;SCON=0x00;TI=0x00;RI=0x00;TR0=1;ET0=1;EA=1;while(1){;}}voidTIME_0()interrupt1using0{TL0=0x00;TH0=0x4B;i--;if(i<=0){i=20;TI=0;SBUF=leddat[j]; if(leddat[j]==0x09){j=0;}else{j++;}}}【例10-3】80C51单片机外接一片并入串出芯片CD4014,扩展并行输入口,采集8个开关状态信息到单片机内存,电路如图10-7所示。CD4014是8位并入串出的芯片,具有一个控制引脚P/S,当P/S=1时,8位并行数据置入片内寄存器;当P/S=0时,在时钟信号CLK作用下,片内寄存器数据由低到高从QB引脚输出,80C51单片机串口工作于方式0,TXD接CD4094的CLK,RXD接QB,P2.0接P/S,控制8位并行数据的置入和输出;P2.1外接开关K,当开关K合上后,开始采集8个开关K0~K7状态信息。图10-780C51单片机扩展CD4014采集开关状态参考C程序如下:#include<reg51.h>//包含特殊功能寄存器库sbitP2_0=P1^0;sbitP2_1=P1^1;voidmain(){unsignedchara; P2_1=1;while(P2_1==1){;}P2_0=1;P2_0=0;SCON=0x10;while(!RI){;}RI=0;a=SBUF;}51【例10-4】图10-8为80C51单片机串口工作于方式0输入,外接8位并行输入、串行输出同步移位寄存器74LS165芯片,74LS165的8个并行输入端接8个开关,将开关的状态通过串口方式0读入单片机内。74LS165的SH/端与单片机P1.0相接,SH/XXX是控制端,若SH/=0,则74LS165可并行输入数据,此刻串行输出端关闭;当SH/=1,则并行输入关断,可以向单片机串行传送。编程实现读取8个开关状态,并由开关控制P2口连接的8个二极管,要求采用串口中断方式。52图10-8串口方式0外接并入串出转换芯片74LS165参考C程序如下:165_1.c#include<reg51.h>#include"intrins.h"#include<stdio.h>sbitP1_0=0x90;unsignedcharm;voiddelay(unsignedinti) //延时{unsignedcharj;for(;i>0;i--) for(j=0;j<125;j++); }main(){ SCON=0x10; //串行口方式0,允许接收ES=1; //允许串行口中断54EA=1; while(1){;}}voidSerial()interrupt4using0{if(RI==1){P1_0=0; //读入开关的状态delay(1);P1_0=1; //将开关的状态送串口中RI=0;m=SBUF;P2=m;}}5510.6.2串口方式1的应用设计下面通过双机通信的案例介绍串口方式1的应用编程。【例10-5】设单片机甲、单片机乙双机通信,电路图如图10-9所示,双机均以串行方式1传输数据,晶振频率均为11.0592MHz,波特率为1200波特,要求如下:单片机甲将存在片内RAM中的0、1、2、…、9十个数字发送给单片机乙,单片机乙接收后,显示在数码管上。波特率的设计:设双机SMOD为0,定时器T1用于波特率发生器,工作在方式2,TMOD=0x20;T1的初值=28-11059200×20/(12×1200×32)=0xE8串口设置在工作方式1,单片机甲发送,SCON=0x40。单片机乙接收,SCON=0x50。双机均采用查询方式收发,禁止中断。5657图10-9双机通信为观察串口传输的数据,电路中添加了虚拟终端来显示串口发出的数据。添加虚拟终端,点击ProteusISIS左侧工具箱中的虚拟仪器图标,选择“VIRTUALTERMINAL”项,并放置在原理图编辑窗口,然后把虚拟终端的“RXD”端与单片机甲的“TXD”端相连。对虚拟终端,需要设置其波特率,双击虚拟终端,打开“EditComponent”对话框,在“BaudRate”中设置为此例串口通信中需要的1200b/s。观察仿真运行时单片机甲串行口发送出的数据,可用鼠标右键点击虚拟终端,点击最下方“VirtualTerminal”项,会弹出窗口,在窗口中右击,选择HexDisplayMode显示,窗口会显示单片机甲串口“TXD”端发出的数据字节,如图10-10所示。5859图10-10虚拟终端显示的单片机甲串口发送的数据参考C程序如下。单片机甲发送程序:#include<reg51.h>#defineucharunsignedcharucharidatasendbuf[10]={0,1,2,3,4,5,6,7,8,9};uchari; voidmain(){TMOD=0x20;TL1=0xE8;TH1=0xE8;PCON=0x00;SCON=0x40;TR1=1;60for(i=0;i<10;i++){SBUF=sendbuf[i];while(TI==0);TI=0;}}单片机乙接收程序:#include<reg51.h>#defineucharunsignedcharconstucharLED_SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};uchari;voiddelay(unsignedinti)//延时61{unsignedintj,k;for(k=0;k<i;k++)for(j=0;j<125;j++);}voiddisplay(void){unsignedchari,*R_BUF;R_BUF=0x30;for(i=0;i<10;i++){P2=LED_SEG[*R_BUF];R_BUF++;delay(500);}} 62voidmain(){unsignedchar*R_DATA;R_DATA=0x30;TMOD=0x20;TL1=0xE8;TH1=0xE8;PCON=0x00;SCON=0x50;TR1=1;for(i=0;i<10;i++){while(RI==0);RI=0;*R_DATA=SBUF;R_DATA++;}63while(1){display();}}6410.6.3串口方式2和3的多机通信应用设计串口方式2和方式3相比,除了波特率的设置不同,其他都相同,下面以方式3下多机通信为例,也适合于方式2。【例10-6】主从机多机通信,电路图如图10-11所示,主、从机均以串行方式3收发信息,晶振频率均为11.0592MHz,波特率为9600波特,要求如下:主机向3号从机发送A、B、…和F共6个数字的共阳极数码管段选码,3号从机接收后显示在数码管上。主机程序编程思路如下:主机先发送3号从机的地址0x03,且TB8=1。等待3号从机的应答信息。主机将接收到的地址应答信息与3号地址0x03比较,若地址正确,设置TB8=0,循环发送6个数据;若地址错误,则重复发送呼叫地址。3号从机编程思路:设地址状态SM2=1,REN=1,等待主机发送地址呼叫信息。将接收的地址信息与自己的0x03地址比较,若有错误,等待主机再次呼叫,若地址正确,发应答地址0x03。转入接收数据状态SM2=0,等待接收主机发送数据,接收到数据后,若TB8=0,数据接收成功,保存数据;继续接收下一个数据,直到接收完6个数据后显示。若TB8=1,数据接收错误,转为地址状态,等待主机重新呼叫。6667图10-11主从机多机通信电路参考C程序如下。主单片机程序:#include<reg51.h>#defineucharunsignedcharucharidatasendbuf[6]={0x88,0x83,0xC6,0xA1,0x86,0x8E};uchari,renum; voidmain(){while(1){SCON=0xc8; //串口方式3,SM2=0,REN=0,TB8=1TMOD=0x20; TL1=0xfd;TH1=0xfd;//波特率9600PCON=0x00;TR1=1;68do {SBUF=0x03;//发送3号从机地址while(TI==0);//等待发送完成TI=0;REN=1;//转接收while(RI==0);//等待接收应答RI=0;renum=SBUF;//保存应答}while(renum!=0x03);TB8=0;for(i=0;i<6;i++){SBUF=sendbuf[i];//主机向从机发送6个数组元素69while(TI==0);TI=0;}}}03号从单片机程序:#include<reg51.h>#defineucharunsignedcharucharidataRE_SEG[6];ucharrenum,i;voiddelay(unsignedinti)//延时{unsignedintj,k;for(k=0;k<i;k++)for(j=0;j<125;j++);}70voiddisplay(void){unsignedchari;for(i=0;i<6;i++){P2=RE_SEG[i];delay(800);}} voidmain(){while(1){SCON=0xf0; //串口方式3,SM2=1,REN=1TMOD=0x20; TL1=0xfd;71TH1=0xfd;//波特率9600PCON=0x00;TR1=1;do{while(RI==0);RI=0;renum=SBUF;}while(renum!=0x03);SM2=0;SBUF=0x03;while(TI==0);TI=0;for(i=0;i<6;i++){72while(RI==0);RI=0;if(TB8!=0)break;else{RE_SEG[i]=SBUF;}}while(1){display(); }

}}10.6.4单片机与PC机异步串行通信设计在许多应用系统中,需要计算机与单片机联合工作,计算机作为控制单片机的核心设备,即上位机,单片机通过传感器从现场采集信息数据上传至计算机,计算机分析处理后,将结果发回至单片机。随着单片机价格下降,采用多单片机的应用系统有更好的性价比,且多采用串行通信来实现系统的通信功能。在实际应用中,可根据单片机和单片机通信距离和抗干扰性要求,采用TTL传输,或采用RS-232C、RS-422A、RS-485异步串行通信进行数据传输。741.TTL电平通信接口若单片机和单片机(或PC机)相距在1.5m之内,可将串行口直接相连,即甲机RXD引脚与乙机TXD引脚相连,乙机RXD引脚与甲机TXD引脚相连,以TTL电平直接实现双机通信。2.异步串口通信标准80C51的4个I/O口包括串口都是TTL电平,采用TTL电平传输数据,传输速率较低,抗干扰性差,并且传输距离短。在实际应用中都采用标准串行接口,如RS-232C、RS-422A、RS-485,以提高信息传输速率和实现较远距离传输等。75异步串行通信物理层接口标准主要有三个:EIA/TIA-232、EIA/TIA-422和EIA/TIA-485,这三个标准最初都是由美国电子工业协会(ElectronicIndustriesAlliance,EIA)制定的,1988年后,三个标准后续版本改由美国电信工业协会(TelecommunicationsIndustriesAssociation,TIA)制定。7610.6.5单片机与异步串口RS-232C的接口电路设计下面介绍异步串口RS-232C的应用特性。(1)RS-232C标准特点RS-232C标准接口适合长度在1.5~30m的点对点(即只用一对收、发设备)连接,不适合更长线路或多点通信。传输速率限制在每秒19.2kbit/s以内或更低。短电缆(大约2米)时,数据传输速率115.2kbit/s。RS-232C用非平衡(即单端)方式传送和接收数据及控制信号,其数据和控制信号需要一根信号地(SignalGround)线以构成回路,如图10-12所示。77

78图10-12RS-232C接口的非平衡(即单端)传输方式RS-232C是用正负电压来表示逻辑状态,与TTL、CMOS等以高低电平表示逻辑状态的规定不同。RS-232C标准对逻辑电平的定义:(2)数据信号电气特性在TxD和RxD上,RS-232C采用负逻辑:逻辑1(MARK)=-3V~-15V逻辑0(SPACE)=+3~+15V(3)控制信号电气特性在RTS、CTS、DSR、DTR和DCD等控制线上:信号有效(接通,ON,正电压)=+3V~+25V信号无效(断开,OFF,负电压)=-3V~-25V(4)PC机DB-9串口(RS-232C接口)信号定义PC机串口通常使用9芯D型DB-9针型插座,外设使用DB-9孔型插座。DB-9针型插座(RS-232C接口)信号定义如表10-5所示。7980表10-5RS-232CDB-9针型插座信号定义(5)异步串口RS-232C接口电路设计由于单片机引脚的TTL电平与RS-232C标准电平互不兼容,所以单片机采用RS-232C标准串行通信时,需要进行TTL电平与RS-232C标准电平之间的变换。通常采用的MAX232/MAX232A是美国MAXIM公司生产的RS-232C全双工的包含2路接收器和2路驱动发送器芯片,可实现TTL电平与RS-232C接口信号之间的转换,该芯片仅需+5V电源供电,内部有电源电压变换器,可以把输入的+5V电源电压变换成为RS-232C输出电平所需-10V~+10V电压,满足RS-232C逻辑电平要求。MAX232/MAX232A芯片引脚如图10-13所示,MAX232电路结构如图10-14所示,其中,C1~C4均为1µF,C5为0.1µF。81

82图10-13MAX232/MAX232A芯片引脚图10-14MAX232结构电路图单片机与PC机间采用异步串口RS-232C接口通信的电路设计如图10-15所示,PC机端RS-232C接口和单片机端RS-232C接口采用3线连接,第5引脚地线直接连接,PC机端3脚发送引脚和2脚接收引脚和单片机端收发引脚交叉连接。单片机串口输出TXD接MAX232A的T1IN(T2IN),输出TTL电平经MAX232A芯片转换为RS-232C电平;MAX232A的T1OUT连接单片机端RS-232C的D型接口的3脚,由于单片机端RS-232C的D型接口的3脚连接PC机端RS-232C的D型接头接收2引脚,单片机发送信息被PC机接收。同理,PC机端发送RS-232C电平信息由PC机端RS-232C的D型接口发送端3脚经过单片机端RS-232C的D型接口2脚,被MAX232A的R1IN(R2IN)接收后,83MAX232A将RS-232C电平转换成TTL电平,由R1OUT(R2OUT)输出至单片机接收引脚RXD。84图10-15MAX232接口的串行通信电路10.6.6单片机与异步串口RS-422A接口电路设计下面介绍异步串口RS-422A的应用特性。1.RS-422A标准特点RS-422A改进了RS-232C通信距离短、速度低等缺点,定义平衡电压型数字接口电路电气特性,RS-422A采用一对双绞线和平衡线路驱动器以及接收器,以差分传输方式,将其中一线定义为A,另一线定义为B。2.RS-422A发送器电平及接口RS-422A接口及发送器电平如图10-16所示,发送驱动器A、B之间的正电平在+2~+6V,是逻辑“1”状态,A、B间负电平在-2~-6V,是“0”逻辑状态。还有一个信号地C,还设置一“使能”端控制发送驱动器与传输线切断与连接,“使能”端起作用时,发送驱动器处于高阻状态,即“第三态”,用于多点通信。86图10-16RS-422A接口及发送器电平3.RS-422A接收器电平RS-422A接收器电平如图10-17所示,接收端AB间大于+200mV电平,输出正逻辑电平,小于-200mV,输出负逻辑电平。接收器接收平衡线上电平范围在200mV至6V之间。差分接收器可分辨0.2V以上电位差,可减弱地线干扰和电磁干扰影响,抑制共模干扰,将传输速率提高到10Mbit/s,在此速率时,电缆长度为12m。其平衡双绞线的长度与传输速率成反比,在100Kbit/s速率下,传输距离可达1200米。与RS-232C接口一样,必须在TTL、CMOS等数字逻辑信号与RS-422A接口信号之间进行电平变换。8788图10-17RS-422A接收器电平4.RS-422A全双工双向通信连接示意图RS-422A全双工双向通信连接如图10-18所示,收/发器各使用两对差分信号线,加上地线,共5根线。RS-422A的DB-9连接器引脚定义如图10-19所示。由于RS-422A接收器输入阻抗高,发送驱动器比RS-232C驱动能力强,理论上RS-422A在相同传输线上连接最多10个接收节点。89图10-18RS-422A全双工双向通信连接示意图图10-19RS-422A的DB-9连接器引脚定义5.RS-422A一对多的多点双向通信RS-422A可以支持一对多的多点双向通信,如图10-20所示,一个主设备(Master),其余从设备(Salve),从设备间不通信。RS-422A推荐使用特性阻抗为100欧的双绞电缆,每个回路接收端用100欧的终端电阻。91图10-20RS-422A一点对多点双向通信系统10.6.7单片机与异步串口RS-485接口电路设计下面介绍异步串口RS-485的特性及应用编程。1.RS-485接口标准特点RS-485接口标准在RS-422A的基础上,增加多点、双向通信能力,RS-485接口标准定义平衡数字多点系统中发送器和接收器电气特性,电气规定与RS-422A相仿,例如:发送驱动器A、B间正电平时,电压为+1.5~+6V,A、B间负电平时,电压为-1.5~-6V,采用平衡传输方式、都需要在传输线上接终端电阻等。最大传输速率10Mbit/s。双绞线长度与传输速率成反比,当波特率为1200bit/s时,最大传输距离达15千米。922.RS-485接口二线连接实现真正多点双向通信RS-485采用二线与四线连接方式。RS-485接口二线连接时可实现真正的多点双向通信(即总线上所有设备与上位机任意两台之间均能通信),如图10-21所示,线路驱动器不发送时,需要切换到高阻抗状态(“三态”)。只要接口通信协议与硬件配合保证在一个时刻只有一个接口尝试在每个回路传送即可。RS-485接口若四线连接,可实现点对多通信:有一个主设备(Master),其余从设备。RS-485接口无论四线还是二线总线连接,可最多连接32个设备,使用120欧电缆和终端电阻。93图10-21典型二线连接RS-485多点通信系统943.单片机TTL电平与RS-485电平转换器MAX485MAX485、MAX487-MAX491以及MAX1487是用于RS-485与RS-422A通信的低功耗收发器,其中,经常用来完成将TTL电平转换为RS-485电平的功能的MAX485芯片,采用单一电源+5V工作,额定电流为300μA,其驱动器摆率不受限制,可以实现最高2.5Mbps的传输速率,采用半双工通讯方式。MAX485芯片内部含有一个驱动器和接收器,具有8个引脚,其引脚功能如表10-6所示。RO和DI端分别为接收器输出和驱动器的输入端,与单片机串口RXD和TXD相连;和DE端分别为接收和发送的使能端,当为逻辑0时,器件处于接收状态;当DE为逻辑1时,器件处于发送状态,因为95MAX485工作在半双工状态,只需用单片机的一个I/O口同时控制此两个引脚;A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;当A的电平低于B端时,代表发送的数据为0。MAX485具有三态输出特性,使用MAX485时,总线最多可以同时连接32个MAX485芯片,将A和B端之间加匹配电阻,一般可选100Ω的电阻。9697表10-6MAX485引脚功能【例10-7】设计上位机PC机通过RS-485串行总线与下位机单片机通信,实现采集和驱动,能够对48个开关外设信号采集,并可驱动48个指示灯亮灭。采集电路如图10-22所示,驱动电路如图10-23所示,设计思路如下。(1)先将上位机PC机RS-232C串行接口连接RS-232C转RS-485转换器;(2)单片机TTL电平与RS-485接口电路设计:PC机信号由RS-485总线电平传输一定距离后,与下位机单片机通信时,选用MAX485芯片完成RS-485电平与单片机TTL电平转换功能。单片机TTL电平与RS-485接口电路如图10-24所示,单片机串口98RXD(P3.0)、TXD(P3.1)引脚分别连接MAX485芯片的RO和DI引脚,RS-485的A、B端接MAX485芯片的A、B引脚。将MAX485的和DE相连接,单片机只需要一个I/O引脚(COM)信号控制MAX485的接收和发送。99100图10-22单片机采集8个并入串出外设信号后送RS-485接口电路

101

图10-23数据经RS-485接口电路送单片机驱动6个串入并出设备102图10-24单片机TTL电平与RS-485接口电路(3)上位机PC机与下位机单片机采集协议设计:采集帧格式设计如表10-7所示,表中内容共14个字节,由2个字节帧头(0x000x5A)、1个字节采集帧类型说明(0x57)、1个字节地址码(0x00~0xFF),一个字节控制码(0x07)、8个字节数据、1个字节校验和等组成。其中,由于通信采用RS-485总线方式,可最大允许从站数量为32,从站地址码可通过拨码开关在0x00~0xFF之间选择。具体采集帧格式说明如下。最小帧间隔10ms。串口配置:数据位:8;停止位:1;校验:无;波特率:19200。103104表10-7定时器工作方式控制位①帧头:0x000x5A②帧类型:0x57③地址码:0x00~0xFF④控制码:0x07⑤数据:数据信息共占用八个字节,第7、8字节空闲,用0000表示;由于要求对48个开关外设信号采集,48个开关分为6组,每组对应8个开关。每组开关对应6个数据字节的1个字节,每一字节8位对应8个开关状态。采集命令中,6个数据字节均为0xFF。⑥校验和字节计算公式为:校验和=(帧头+帧类型+地址码+控制码+数据位)MOD256例如:主机采集00号从机(单片机板)发出的协议为:005A570007FFFFFFFFFFFF0000B2单片机发出采集命令后,获得采集目标板响应信息,其帧格式与采集协议一致,只是6个数据字节中,对应位置1表示开关状态没有变化,对应位清零表示开关状态的有效输入。105(4)驱动通信协议设计驱动帧格式内容共有14个字节,由2个字节帧头(0x00)、1个字节驱动帧类型说明(0x58)、1个字节地址码(0x00~0xFF),一个字节控制码(0x0F)、8个字节数据、1个字节校验和等组成。具体驱动帧格式说明如下:①帧头:005A②帧类型:58③地址码:00~FF④控制码:04关闭所有输出。03开启所有输出。0F输出状态由数据位决定106⑤数据位:数据位共占用八个字节,第7、8字节空闲,用0000表示;要求可驱动48个指示灯亮灭,故将驱动的48个灯每8个为一组,共6组,用A\B\C\D\E\F6组表示。当要某个灯开启时,对应的位清零。数据字节1到6字节分别对应6组输出口。而每一个数据字节的每个位对应0~7。位置1表示关闭输出,位清零表示开启输出。⑥校验和字节的计算公式为:校验和=(帧头+帧类型+地址码+控制码+数据位)MOD256107例如:全关端口(设地址码为0xFF):005A58FF04FFFFFFFFFFFF0000AF全开端口(设地址码为0xFF):005A58FF03FFFFFFFFFFFF0000AE打开B1端口(设地址码为0xFF):005A58FF0FFFFDFFFFFFFF0000B8108(5)单片机采集电路设计:单片机采集电路使用6片八位并行输入/串行输出移位寄存器74LS165,每片74LS165芯片的8个输入并口引脚D0~D7连接8个开关(由于图幅所限,开关未画出),用来采集开关信息。连接8个开关。上电后,首先设置SH/LD端为低电平,此时将D0~D7脚上的高低电平数据存入芯片内寄存器Q0~Q7,然后设置SH/LD端为高电平,此时芯片将寄存器内数据通过SO串行发送。采用单片机的P0口连接8位地址线,可通过跳线帽选择8位地址的高低电平。109(6)单片机驱动电路设计单片机驱动电路使用6片八位串行输入并行输出74LS595,每片74LS595芯片的Q1~Q7是并行数据输出口端,连接8个指示灯(由于图幅所限,开关未画出),用来控制指示灯的亮灭。同样,采用单片机的P0口连接8位地址线,可通过跳线帽选择8位地址的高低电平。(7)PC机和单片机串口通信设置:最小帧间隔10ms,串口配置为:数据位8位,停止位1位,校验位无;波特率:19200。110485采集参考程序如下:#include<reg52.h>#include<intrins.h>//包含_nop_();#defineucharunsignedchar#defineuintunsignedintuchara,b,c,d,e,f,check,sampling[6];uintWORK,sum,setsum,checksum,fsetsum;unsignedcharbasic1,basic2,basic3,basic4,basic5,basic6;sbitCOM=P2^4;sbitred=P1^5;sbityellow=P1^6;sbitgreen=P1^7;sbitQHA=P1^0;//74LS165A并入串出引脚sbitCLKA=P1^1;//时钟引脚sbitLOADA=P1^2;//移位控制引脚sbitQHB=P3^2;//74LS165B并入串出引脚sbitCLKB=P1^3;//时钟引脚sbitLOADB=P1^4;//移位控制引脚111sbitQHC=P3^3;//74LS165C并入串出引脚sbitCLKC=P3^4;//时钟引脚sbitLOADC=P3^5;//移位控制引脚sbitQHD=P3^6;//74LS165D并入串出引脚sbitCLKD=P3^7;//时钟引脚sbitLOADD=P2^0;//移位控制引脚sbitQHE=P2^1;//74LS165E并入串出引脚sbitCLKE=P2^2;//时钟引脚sbitLOADE=P2^3;//移位控制引脚sbitQHF=P2^5;//74LS165F并入串出引脚sbitCLKF=P2^6;//时钟引脚sbitLOADF=P2^7;//移位控制引脚voidinit_uart()//串口方式1,允许接收,允许中断,TI作波特率发生器,波特率:19200{SCON=0x50; TMOD|=0x20;TH1=0xfd; TL1=0xfd; TI=0; RI=0;

112TR1=1;EA=1;ES=1;}voidInit_Timer0(void)//定时器T0定时,方式1,允许定时器中断,定时时间65.536ms{TMOD|=0x01; TH0=0x00; TL0=0x00;EA=1;ET0=1;TR0=1;}unsignedintread_165A()//采集74LS165A一字节并入串出数据{unsignedcharbasic;unsignedintcc;LOADA=1;

113_nop_();_nop_();LOADA=0;_nop_();_nop_();LOADA=1;CLKA=1;basic=0;basic=basic<<1;if(QHA) basic|=0x01;for(cc=0;cc<7;cc++){ CLKA=0; _nop_(); CLKA=1; basic=basic<<1; if(QHA) basic|=0x01;}

basic1=basic; returnbasic1;}unsignedintread_165B()//采集74LS165B一字节并入串出数据{unsignedcharbasic;unsignedintcc;LOADB=1;_nop_();_nop_();LOADB=0;_nop_();_nop_();LOADB=1;CLKB=1;basic=0;basic=basic<<1;if(QHB) basic|=0x01;

115for(cc=0;cc<7;cc++){ CLKB=0; _nop_(); CLKB=1; basic=basic<<1; if(QHB) basic|=0x01;} basic2=basic; returnbasic2;}unsignedintread_165C()//采集74LS165C一字节并入串出数据{unsignedcharbasic;unsignedintcc;LOADC=1;_nop_();_nop_();

116LOADC=0;_nop_();_nop_();LOADC=1;CLKC=1;basic=0;basic=basic<<1;if(QHC) basic|=0x01;for(cc=0;cc<7;cc++){ CLKC=0; _nop_(); CLKC=1; basic=basic<<1; if(QHC) basic|=0x01;} basic3=basic; returnbasic3;}117unsignedintread_165D()//采集74LS165D一字节并入串出数据{unsignedcharbasic;unsignedintcc;LOADD=1;_nop_();_nop_();LOADD=0;_nop_();_nop_();LOADD=1;CLKD=1;basic=0;basic=basic<<1;if(QHD) basic|=0x01;for(cc=0;cc<7;cc++){ CLKD=0; _nop_();

118CLKD=1; basic=basic<<1; if(QHD) basic|=0x01;} basic4=basic; returnbasic4;}unsignedintread_165E()//采集74LS165E一字节并入串出数据{unsignedcharbasic;unsignedintcc;LOADE=1;_nop_();_nop_();LOADE=0;_nop_();_nop_();LOADE=1;CLKE=1;

119basic=0;basic=basic<<1;if(QHE) basic|=0x01;for(cc=0;cc<7;cc++){ CLKE=0; _nop_(); CLKE=1; basic=basic<<1; if(QHE) basic|=0x01;} basic5=basic; returnbasic5;}unsignedintread_165F()//采集74LS165F一字节并入串出数据{unsignedcharbasic;

120unsignedintcc;LOADF=1;_nop_();_nop_();LOADF=0;_nop_();_nop_();LOADF=1;CLKF=1;basic=0;basic=basic<<1;if(QHF) basic|=0x01;for(cc=0;cc<7;cc++){ CLKF=0; _nop_(); CLKF=1; basic=basic<<1; if(QHF)

121basic|=0x01;} basic6=basic; returnbasic6;}voiddelay(intms)//延时1ms{ intk; while(ms--) { for(k=0;k<250;k++) { _nop_(); _nop_(); } }}voidsampl(void) //采集6路74LS165并入串出数据{

122sampling[0]=read_165A();//采集74LS165A并入串出数据 sampling[1]=read_165B();//采集74LS165B并入串出数据 sampling[2]=read_165C();//采集74LS165C并入串出数据 sampling[3]=read_165D();//采集74LS165D并入串出数据 sampling[4]=read_165E();//采集74LS165E并入串出数据 sampling[5]=read_165F();//采集74LS165F并入串出数据}voidsend(void) //通过MAX485发送一帧数据(0x000x5A0x57地址码0x078字节数据校验和){ ucharaa; COM=1; SBUF=0x00; delay(1); SBUF=0x5A; checksum=checksum+0x5A; delay(1); SBUF=0x57; checksum=checksum+0x57; delay(1);

123SBUF=a; checksum=checksum+a; delay(1); SBUF=0x07; checksum=checksum+0x07; delay(1); for(aa=0;aa<6;aa++) { SBUF=sampling[aa]; checksum=checksum+sampling[aa]; delay(1); } SBUF=0x00; delay(1); SBUF=0x00; delay(1); fsetsum=checksum%256; SBUF=fsetsum; fsetsum=0;

124checksum=0; delay(3); COM=0;}voidmain(){ a=0; b=0; c=0; d=0; e=0; f=0; COM=0; Init_Timer0(); init_uart() ; while(1) { a=P0; //采集地址 if(check==1) {

125checksum=0; delay(3); COM=0;}voidmain(){ a=0; b=0; c=0; d=0; e=0; f=0; COM=0; Init_Timer0(); init_uart() ; while(1) { a=P0; //采集地址 if(check==1) {

126sampl();//采集8路并入串出数据 delay(3); send();//发送一帧信息 check=0; } }}voidTimer0_isr(void)interrupt1using1{TH0=0x00; TL0=0x00;WORK++;if(WORK>10){WORK=0;red=!red;}//每到定时655.36ms红灯亮灭交替}voidUART_SER(void)interrupt4//串口接收处理{ if(RI==1) { RI=0; yellow=!yellow;//接收到MAX485串口数据,亮黄灯

127switch(b) { case0: if(SBUF==0x00)//接收到帧头第一个字节0x00 { b++; sum=sum+SBUF; } else { b=0; sum=0; } break; case1: if(SBUF==0x5A)//接收到帧头第二个字节0x5A { b++; sum=sum+SBUF; }

128else { b=0; sum=0; } break; case2: if(SBUF==0x57)//接收到帧类型0x57 { b++; sum=sum+SBUF; } else { b=0; sum=0; } break; case3:

129if(SBUF==a)//接收到采集芯片的地址 { b++; sum=sum+SBUF; } else { b=0; sum=0; }break; case4: if(SBUF==0x07)//接收到控制码0x07 { b++; sum=sum+SBUF; } else { b=0;

130sum=0; }break;case5:sampling[c]=SBUF;//接收采集数据信息 sum=sum+sampling[c]; c++;

if(c>=9) { sum=sum-sampling[c-1]; setsum=sum%256;//计算校验和 for(e=0;e<6;e++) { if(sampling[e]==0xff) f++; } if(f==6) { f=0;

131check=1;//校验成功 c--; if(sampling[c]!=setsum) { check=0;//校验不成功 } } b=0; f=0; c=0; sum=0; setsum=0; } break; } } else { TI=0; }}132驱动程序如下:#include<reg52.h>#include<intrins.h>//包含_nop_();#defineucharunsignedchar#defineuintunsignedintuchara,b,c,d,e,f,g,flag,flag_close,flag_open,close,open,receive[9];uintsum,setsum,workn;sbitCOM=P3^2;sbityellow=P1^6;sbitwork=P1^5;sbitSIA_595=P1^0;//74HC595A串行输入数据线sbitRCKA_595=P1^1;//74HC595A输出存储器锁存时钟线sbitSCLKA_595=P1^2;//74HC595A数据输入时钟线sbitSIB_595=P2^4;//74HC595B串行输入数据线sbitRCKB_595=P1^3;//74HC595B输出存储器锁存时钟线sbitSCLKB_595=P1^4;//74HC595B数据输入时钟线sbitSIC_595=P2^5;//74HC595C串行输入数据线sbitRCKC_595=P2^6;//74HC595C输出存储器锁存时钟线133sbitSCLKC_595=P2^7;//74HC595C数据输入时钟线sbitSID_595=P3^6;//74HC595D串行输入数据线sbitRCKD_595=P3^7;//74HC595D输出存储器锁存时钟线sbitSCLKD_595=P2^0;//74HC595D数据输入时钟线sbitSIE_595=P2^1;//74HC595E串行输入数据线sbitRCKE_595=P2^2;//74HC595E输出存储器锁存时钟线sbit

温馨提示

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

评论

0/150

提交评论