师傅们好,请教,
我在网上找了一个单片机和变频器(C51和台达VFD—M)通讯的程序,但在测试中总是没有任何反应,由于以前没搞过变频器通讯。变频器通讯的设置已经手动设置好,运行程序有时能看到RUN灯亮,但STOP灯也同时闪亮,电机不转,按该发送程序写入其它参数也没有反应,我用以前别人写的芯片插上去就能正常运转,因此我不知道错在哪里,希望各位有经验的师傅指点一下,如有测试过的样板程序能发个给我,本人万分感谢. maibb@163.com
程序于下
//通讯源程序
/*********************************************************
* 本程序是AT89C52单片机和台达B系列、M系列、L系列、F系列通讯例子.
* 通讯协议ASCII格式,帧格式为“1位起始位、7位数据、奇偶位(或无)、结束位”共10位.
* 台达VFD系列变频器一帧的通讯格式:send数组的第0位:“:”起始位;第1,2位:站号地址.
* 第3,4位:功能号码;第5,6,7,8位:写入的地址;第9,10,11,12位:传输数据.
* 第13,14位:校验码;第15,116位:停止0X0D,0X0A.
* 该程序通过向2000H地址写入0012H数据来启动变频器;向2000H地址写入0012H数据来停止变频器.
* 由P1.0来控制MCU发送数据,P2来控制通讯指示灯.*
* 编译环境:KEIL V3.30
* 作者:刘元刚
* 部门:中达电通股份有限公司AMD产品处
* 编写时间:2008.1.8
* 修改时间:
* 修改内容:
**********************************************************/
#include <reg51.h>
char send【17】={0};
char send1【8】={0x01,0x06,0x01,0x00,0x17,0x70,0x86,0x22};
char count;
int temp;
bit motor_flag=0;
/*********ASCII格式变量定义**********/
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;
/*
函数ASCII()实现了台达变频器通讯协议转换为ASCII协议格式的功能。
*/
void ASCII(void);
/*
init_serial()函数串行通讯初始化函数
实现了:波特率的设定,定时器的选择,发送模式的选择
*/
void init_serial(void); //函数串行通讯初始化函数
void ASCII7N2(void); //函数ASCII7N2()以数据格式 7,N 2方式发送数据
void ASCII7O1(void); //函数ASCII7O1()以数据格式 7,O 1方式发送数据
void ASCII7E1(void); //函数ASCII7E1()以数据格式 7,E 1方式发送数据
main()
{
delay();//此处延时2秒
init_serial();
/***********VFD系列变频器通讯资料初始化*****/
number=0x01;
function=0x06; //06是写指令,03H是读指令,08H是回路侦测指令,10H写入多笔资料至寄存器
address_h=0x20;//03读出指令最多可读出20笔资料
address_l=0x00;
data_h=0X00;
data_l=0x12;
/******************************************/
while(1)
{
if(P1!=0XFF)
{
for(temp=0;temp<3000;temp++)//延时一段时间
{;}
if(P1!=0XFF)
{
P2=0;
TI=0;
ASCII();//发送数据的处理
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=0x11;}
else{data_l=0x12;}
P1=0XFF;
P2=0XFF;
}
}
}
}
/*******************************************************************************
******
函数nop名称:void init_serial(void)
函数功能:
参数列表:
返回值 :
影响资源:
实现过程:
********************************************************************************
*****/
void init_serial(void)
{
SCON=0x40;//工作在方式1,
TMOD=0x20;
TH1=0xFD; //波特率为9600,晶振11.0592MHZ
TL1=0xFD;
TR1=1; //启动定时器1
P1=0XFF;
}
void ASCII7N2(void)
{
for(count=0;count<17;count++)
{
SBUF=send【count】|0X80;
while(TI==0);
TI=0;
}
}
void ASCII7O1(void)
{
for(count=0;count<17;count++)
{
temp=0;
ACC=send【count】&0X7F;
send_temp=ACC;
temp=P;
send_temp=(temp<<7)|send_temp;