基于USB接口实现计算机与多个单片机串行通信郑勇1,曾水平1,关晓菡2,翟维枫1(1北方工业大学机电工程学院北京100144;2北方工业大学信息工程学院北京100144)摘要:本文给出了一种计算机通过USB接口与多单片机串行通信的实现方法,从硬件和软件两方面做了详细阐述。系统由以高集成度的C8051F020MCU为核心设计的多块硬件板卡和上位机软件组成,上位机软件可分为VB/VC与组态王两种,根据制定的通信协议,数据采集板和计算机之间采用USB转串口芯片CP2102通信,连接方便,可以构成功能完善的数据采集与控制平台。关键词:USB;CP2102;C8051F020;多机通信1引言目前很多分布式测控系统是由PC机与多个单片机控制装置组成,单片机采集现场的数据和状态通过串行口传送到PC机进行分析、存储与显示,PC机的控制指令通过串行口传到单片机,以控制设备的运转。我们开发的单片机的控制装置以C8051F020为核心,扩展有2路DA,8路AD,通过P1、P2口扩展16路DI输入,通过P6口扩展8路DO输出,P5口连接8位拨码开关用于地址设定,单片机和计算机之间采用USB转串口芯片CP2102实现通信,并可方便地改装成RS485通信,通过制定相应的通信协议,上位机最多可与256个单片机进行通信,上位机软件包是基于VB/VC或组态王软件开发的,配合相应的扩展电路可应用于信号采集、过程控制、机械自动化等诸多领域。2硬件电路设计2.1微控制器的选择及电路设计下位机的微控制器采用美国SiliconLaboratories公司的C8051F020,此单片机是完全集成的混合信号系统级芯片(SOC),具有与MCS-51完全兼容的指令内核,具有高速、流水线结构,可达25MIPS。具有全速、非侵入式的系统调试接口,方便程序的下载、调试;具有真正12位、100ksps的8通道ADC,带PGA和模拟多路开关,可以满足数据采集卡模数转换的需要;两个12位DAC,具有可编程数据更新方式,可以满足数据采集卡数模转换的需要;足够多的通用IO口,可以扩展数字量输入输出;64K字节可在系统编程的FLASH存储器,以及4352字节的片内RAM,足可满足软件编程需要;两个UART串行接口方便单片机和计算机的通讯。图1为CPU电路图,其中P5口连接8位拨码开关用于板卡地址设定。1第一作者简介:郑勇(1970-),男,河北省泊头市人,副教授,主要从事自动化技术与计算机应用方面的教学与科研工作。图1CPU电路设计2.2USB接口电路设计USB通讯电路芯片选用美国Silicon公司的USB-UART桥接电路芯片CP2102,该电路的集成度高,内置USB2.0全速功能控制器、USB收发器,振荡器和带有全部的调制解调器控制信号的异步串行数据总线(UART),全部功能集成在一个5mm×5mmMLP-28封装的IC中,无需其他的外部USB元件,外围电路设计简单,使用方便。在程序编写上完全可以把USB接口作为一个串口来使用,从而简化编程。如图2电路所示,可以简单地通过SS34二极管将多个单片机同时连接到1个CP2102,再与计算机的USB口连接,以轮询的方式组成1对多通信网络,与此类似,该系统也可方便地转为RS-485通信的方式以加大信号传输距离。TMSTCKTDITDO/RSTA/D0VREF1A/D5A/D6A/D7A/D3A/D4A/D2A/D1P55P56P57P70P71P72P73P74P75P76P77TXDRXDSPICLKSPIMISOSPIMOSISPIMSSI2CSDAI2CSCLP17P16P15P14P23P22P11P10P27P25P26P24P12P13P21P20DAC0DAC1P40P41R8019ResetP43P44ALERDWRP51P50P65P54P53P52P66P67P60P61P62P63P643VJ111.059MC120C22012345678910DOWNLOAD3VTCKTDOTMSTDI3VTMS1TCK2TDI3TDO4RST5CP1-6CP1+7CP0-8CP0+9AGND10AV+11VREF12AGND13AV+14VREFD15VREF016VREF117AIN0.018AIN0.119AIN0.220AIN0.321AIN0.422AIN0.523AIN0.624AIN0.725XTAL126XTAL227MONEN28AIN1.7/A15/P1.729AIN1.6/A14/P1.630AIN1.5/A13/P1.531AIN1.4/A12/P1.432AIN1.3/A11/P1.333AIN1.2/A10/P1.234AIN1.1/A9/P1.135AIN1.0/A8/P1.036VDD37DGND38A15m/A7/P2.739A14m/A6/P2.640A13m/A5/P2.541A12m/A4/P2.442A11m/A3/P2.343A10m/A2/P2.244A9m/A1/P2.145A8m/A0/P2.046AD7/D7/P3.747AD6/D6/P3.648AD5/D5/P3.549AD4/D4/P3.450AD3/D3/P3.351AD2/D2/P3.252AD1/D1/P3.153AD0/D0/P3.054WR/P0.755RD/P0.656ALE/P0.557P0.458P0.359P0.260P0.161P0.062DGND63VDD64AD7/D7/P7.765AD6/D6/P7.666AD5/D5/P7.567AD4/D4/P7.468AD3/D3/P7.369AD2/D2/P7.270AD1/D1/P7.171AD0/D0/P7.072A15m/A7/P6.773A14m/A6/P6.674A13m/A5/P6.575A12m/A4/P6.476A11m/A3/P6.377A10m/A2/P6.278A9m/A1/P6.179A8m/A0/P6.080A15/P5.781A14/P5.682A13/P5.583A12/P5.484A11/P5.385A10/P5.286A9/P5.187A8/P5.088DGND89VDD90WR/P4.791RD/P4.692ALE/P4.593P4.494P4.395P4.296P4.197P4.098DAC199DAC0100U1C8051F0203V3VP30P31P32P33P34P35P36P37AV+A3V123456789RB220K3VCP1-CP1+CP0-CP0+P50P51P52P53P54P55P56P5712345678161514131211109ADDRSWDIP-83单片机与VB/VC应用软件实现通信3.1单片机与VB/VC应用软件通信协议设计系统采用串行通信,115200bps,8位数据位,1位停止位,无奇偶校验位,通信协议见表1。表1单片机与VB/VC应用软件通信协议指令字节1字节2字节3字节4回复DA0输出(需回执模拟量输出)ADDR000XXX01DA1输出(需回执模拟量输出)ADDR010XXX01AD(模拟量输入)ADDR02任意通道号00-070XXXDO(需回执P6口数字量输出)ADDR03任意XX01DI(P1口数字量输入)ADDR04任意任意XX(P1口状态)DI(P2口数字量输入)ADDR05任意任意XX(P2口状态)DI(P6口数字量输入)ADDR06任意任意XX(P6口状态)注:XX代表十六进制数据00-FF3.2单片机与VB/VC应用软件通信程序设计程序采用C51语言进行设计,以循环的方式接收串口数据,协议的处理采用查询模式,根据指令不同作出不同的处理并回复。图2USB硬件电路REGIN7VDD6GND3VBUS8D-5D+4/RST9SUSPEND12/SUSPEND11RI2DCD1DTR28DSR27TXD26RXD25RTS24CTS23GND0U4CP2102MCU1_/RSTPC_USB_TXDPC_USB_RXD123456USBC191uFC20104V34148V44148V54148V64148V14148V24148MCU1_TXDMCU2_TXDMCU3_TXDMCU4_TXDMCU5_TXDMCU6__TXDMCU1_RXDMCU2_RXDMCU3_RXDMCU4_RXDMCU5_RXDMCU6_RXD//ADDRSetting#defineA0(P5&0x01)#defineA1(P5&0x02)#defineA2(P5&0x04)#defineA3(P5&0x08)voidGetAddr(void){if(A0)DeviceAddr+=1;if(A1)DeviceAddr+=2;if(A2)DeviceAddr+=4;if(A3)DeviceAddr+=8;}while(1){while(RI0==0){}RI0=0;tmpAddr=SBUF0;//接收命令地址if(tmpAddr==DeviceAddr){while(RI0==0){}RI0=0;tmpCommand=SBUF0;//接收命令字if(0=tmpCommand){while(RI0==0){}RI0=0;value1=SBUF0;while(RI0==0){}RI0=0;value2=SBUF0;if(tmpCommand==0)//DA转换0通道{DAC0L=value2;//低位DAC0H=value1;//高位UART_Send(1);}elseif(tmpCommand==1)//DA转换1通道{DAC1L=value2;//低位DAC1H=value1;//高位UART_Send(1);}elseif(tmpCommand==2)//AD转换{ADC_Start(value2);UART_Send(ADC0H);UART_Send(ADC0L);}。。。。。。//DO,DI略}}else{while(RI0==0){}RI0=0;tmpCommand=SBUF0;while(RI0==0){}RI0=0;value1=SBUF0;while(RI0==0){}RI0=0;value2=SBUF0;}}//ADC0转换启动voidADC_Start(ucharsource){AMX0SL=source;//选择通道AD0INT=0;AD0BUSY=1;//启动AD转换while(!AD0INT){}//等待转换完成AD0INT=0;}//UART通讯发送voidUART_Send(ucharsdata){SBUF0=sdata;while(TI0==0){;}TI0=0;}4单片机与组态软件实现通信4.1单片机与组态软件通信协议设计(以组态王6.55为例)1组态王发送地址请求ENQStaEOTCRC2单片机应答地址ACKStaETXCRC3组态王读数据请求ENQRDataTypeDataAddrDataNumEOTCRC4单片机应答读数据ACKDataLongData。。。ETXCRC5组态王写数据请求ENQWDataTypeDataAddrData。。。EOTCRC6单片机应答写数据ACKErrorCodeETXCRC协议说明数据传输:所有数据均为16进制数;ENQ:(H05)请求帧的开始;ACK:(H06)确认应答帧开始;NAK:(H15)否认应答帧开始;EOT:(H04)请求帧的结束;ETX:(H03)应答帧的结束;Sta:设备地址,1字节;R:读标志1字节(0X52);W:写标志1字节(0X57);DataType:数据类型,1表示字节,2表示字,3表示浮点数;DataNum:要读取的数据的数量,1字节;DataAddr:为数据偏移地址,2字节,低字节在前,高字节在后;Data:实际传输的数据,低字节在前,高字节在后;DataLong:单片机返回Data的字节数,2字节,低字节在前,高字节在后;CRC:为从第一个字节至CRC前的所有字节的异或值,1字节;Erro