图1 台达变频器通讯字符格式
(2)台达变频器通讯格式的表格描述。台达变频器通讯格式的表格描述参见下表。表 台达变频器通讯格式的表格描述
3 单片机通讯设计 3.1 C52 单片机的串行接口结构 8051串行接口是一个可编程的全双工串行通讯接口。它可用作异步通讯方式(UART),与串行传送信息的外部设备相连接,或用于通过标准异步通讯协议进行全双工的8051多机系统也可以通过同步方式,使用TTL或CMOS移位寄存器来扩充I/O口。8051单片机通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界通讯。SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。它们有相同名字和地址空间,但不会出现冲突,因为它们两个一个只能被CPU读出数据,一个只能被CPU写入数据。 台达变频器接受的RS485信号,单片机输出的是TTL电平。因此要变频器和单片机通讯要有通讯转换芯片,目前常用的RS485芯片有MAX485、MAX483,S75176等。在本例子中采用了MAX485和S75176芯片,同时电路图中预留了RS232电路的接口,方便单片机以RS232通讯方式和其他外设进行通讯。主单片机采用ATMEL公司的AT89C52单片机。 3.2 软件调试界面单片机程序通过在KEIL环境下开发编译的,调试界面如下:
3.3通讯源程序 #include <reg51.h> char send[17]={0}; char send1[8]={001,006,001,000,017,070,086,022}; char count; int temp; bit motor_flag=0; char number ; //设备站号 char function ; //功能 char address_h; //地址高 char address_l; //地址低 char data_h ; //数据 char data_l ; //数据 char CRC_H; //校验 char CRC_L; //校验 char send_temp; int sum_temp; void asci(void); void init_serial(void); //函数ASCII7N2()以数据格式 7,N 2方式发送数据 void ASCII7N2(void); //函数ASCII7O1()以数据格式 7,O 1方式发送数据 void ASCII7O1(void); //函数ASCII7E1()以数据格式 7,E 1方式发送数据 void ASCII7E1(void); main() { init_serial(); number=001; function=006; address_h=020; address_l=000; data_h=000; data_l=012; while(1) { if(P1!=0FF) { for(temp=0;temp<3000;temp++)//延时一段时间 {;} if(P1!=0FF) { P2=0; TI=0; asci();//发送数据的处理 ASCII7N2();//以通讯协议为ASCII 9600,7,N,2发送数据 ASCII7O1();//以通讯协议为ASCII 9600,7,O,1发送数据 ASCII7E1();//以通讯协议为ASCII 9600,7,E,1发送数据 for(temp=0;temp<10000;temp++) //发送完数据之后延时一段时间 {;} for(temp=0;temp<10000;temp++) {;} motor_flag=~motor_flag; //完成了变频器启动和停止之间的切换 if(motor_flag==1){data_l=011;} else{data_l=012;} P1=0FF; P2=0FF; } } } } void init_serial(void) { SCON=040;//工作在方式1, TMOD=020; TH1=0FD; //波特率为9600,晶振11.0592MHZ TL1=0FD; TR1=1; //启动定时器1 P1=0FF; } void ASCII7N2(void) { for(count=0;count<17;count++) { SBUF=send[count]|080; while(TI==0); TI=0; } } void ASCII7O1(void) { for(count=0;count<17;count++) { temp=0; ACC=send[count]&07F; send_temp=ACC; temp=P; send_temp=(temp<<7)|send_temp; SBUF=send_temp; while(TI==0); TI=0; } } void ASCII7E1(void) { for(count=0;count<17;count++) { temp=0; ACC=send[count]&07F; send_temp=ACC; temp=~P; send_temp=(temp<<7)|send_temp; SBUF=send_temp; while(TI==0); TI=0; } } void asci() { send[0]=03A; send[1]=((number&0F0)>>4)+030; if(send[1]>039)(send[1]=(send[1]-039)+040); send[2]=((number&00F)+030); if(send[2]>039)(send[2]=(send[2]-039)+040); send[3]=((function&0F0)>>4)+030; if(send[3]>039)(send[3]=(send[3]-039)+040); send[4]=((function&00F)+030); if(send[4]>039)(send[4]=(send[4]-039)+040); send[5]=((address_h&0F0)>>4)+030; if(send[5]>039)(send[5]=(send[5]-039)+040); send[6]=((address_h&00F)+030); if(send[6]>039)(send[6]=(send[6]-039)+040); send[7]=((address_l&0F0)>>4)+030; if(send[7]>039)(send[7]=(send[7]-039)+040); send[8]=((address_l&00F)+030); if(send[8]>039)(send[8]=(send[8]-039)+040); send[9]=((data_h&0F0)>>4)+030; if(send[9]>039)(send[9]=(send[9]-039)+040); send[10]=((data_h&00F)+030); if(send[10]>039)(send[10]=(send[10]-039)+040); send[11]=((data_l&0F0)>>4)+030; if(send[11]>039)(send[11]=(send[11]-039)+040); send[12]=((data_l&00F)+030); if(send[12]>039)(send[12]=(send[12]-039)+040); sum_temp=number+function+address_h+address_l+data_h+data_l; sum_temp=(~sum_temp)+1 ; send[13]=((sum_temp&0F0)>>4)+030; if(send[13]>039)(send[13]=(send[13]-039)+040); send[14]=((sum_temp&00F)+030); if(send[14]>039)(send[14]=(send[14]-039)+040); send[15]=00D; send[16]=00A; } 4 结束语 随着嵌入式技术的飞速发展,单片机与变频器的通讯设计技术变得越来越有强烈的工程实用意义。在定制化或者客制化应用系统里的单片机与变频器通讯集成系统不但可以有更加紧凑经济灵活的体系结构,特别是还有利于形成具有独立技术特点和独立知识产权的主权增值产品。



