蓝色天使211的个人空间 https://www.eechina.com/space-uid-75446.html [收藏] [复制] [分享] [RSS]

博客

单片机与台达变频器的通信

已有 1655 次阅读2013-4-19 14:45 |个人分类:工程控制| 单片机, 变频器

    下面是我在工程实践中做的一个上位机和下位机控制台达VFD-M系列变频器的一个测试程序,希望对大家有所帮助。
说明:通信模式:RTU模式;波特率:9600,;数据格式:“8,E,1”;
程序通过串口调试助手以十六进制发送01变频器启动,02停止,03换向;读者可以根据实际情况进行扩展,本人水平有限,望读者朋友多加指正,谢谢!


#include<reg52.h>
 /***********************************/
#define bp   8
unsigned char bpq[bp];      //变频器数据缓冲区定义

unsigned char flag1,temp1;
/****************串行口初始化函数****************/
void InitUART(void)
{
    TMOD = 0x20;    //定时器1工作在方式2  8位自动重装
    SCON = 0xda;    
    TH1 = 0xfd;   //定时器1初值
    TL1 = TH1;
    TR1 = 1;   //定时器1开始计数
    EA =1; //开总中断
    ES =1; //开串口1中断

   
}
/****************串行口发送****************/
void UART_1SendOneByte(unsigned char c)
{
   ACC=c;
   if(P)
 {
  TB8=1;
  }
 else
 {
  TB8=0;
  }
 SBUF = ACC;
 while(TI==0);
    TI=0;  
}

 //向串口1发送一个字符串,strlen为该字符串长度 
void send_string_com(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do 
    {
        UART_1SendOneByte(*(str + k));
        k++;
    } while(k < strlen);
}

 /**********************************CRC算法****************************/

unsigned int crc_check(unsigned char *dat,unsigned char length)
{

 int j;
 unsigned int reg_crc=0xffff;
 while(length--)
 {
 reg_crc^=*dat++;
 for(j=0;j<8;j++)
 {
  if(reg_crc&0x01)
   {
  reg_crc=(reg_crc>>1)^0xa001;
    }
  else
   {
  reg_crc=reg_crc>>1;
     }
   }
  }
  return reg_crc;
 }



 /************************************************写变频器函数**************************************/
void write_uart_buffer(unsigned char add,unsigned char cmd,unsigned int dat_add,unsigned int dat_data)
//add表示从机地址,cmd表示命令,dat_add表示数据地址,dat_data表示数据内容
{
bpq[0]=add;
bpq[1]=cmd;
bpq[2]=(unsigned char)(dat_add>>8);
bpq[3]=(unsigned char)dat_add;
bpq[4]=(unsigned char)(dat_data>>8);
bpq[5]=(unsigned char)dat_data;
// 插入CRC算法的两个字节
bpq[6]= (unsigned char)(crc_check(bpq,6));
bpq[7]= (unsigned char)(crc_check(bpq,6)>>8);
send_string_com(bpq,bp);
}

/**************变频器启动函数****************/
void bpq_start()
{

write_uart_buffer(0x01,0x06,0x2000,0x0012);


 }  
/**************变频器停止函数**********/

void bpq_stop()
{

write_uart_buffer(0x01,0x06,0x2000,0x0011);

 }
/*******************变频器换向函数****************/
void bpq_rev()
{

write_uart_buffer(0x01,0x06,2000,0x0032);

 }

/*****************主函数******************/
void main(void)
{
temp1=0x00;
InitUART(); //串行口初始化
while(1)
{
if(flag1==1)
{
 unsigned char m;
 m=temp1;
flag1=0;
 temp1=0x00;
switch(m)
{
case 0x01: bpq_start();break;
case 0x02:  bpq_stop();break;
case 0x03:  bpq_rev();break;
default:break;
}
}
}
}
/************串行口1中断处理函数*************/
void UART_1Interrupt(void) interrupt 4
{
if(RI==1)
{
RI=0;
flag1=1;
temp1=SBUF;
}
}



路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部