📄 uart_cimr.c
字号:
#define stc_mcu
#ifdef stc_mcu
#include ".\STC89c5x.H"
#endif
void uart_send(unsigned char );
sbit RTS_485 = P3^3; //RS485选通
sbit RUN_FLAG = P3^4;
#define C_DATAIN_LEN0 6
#define C_DATAOUT_LEN0 6
#define C_DATAIN_LEN1 32
#define C_DATAOUT_LEN1 32
#define C_DATAIN_LEN2 12
#define C_DATAOUT_LEN2 12
#define RSTATE_NUM0 3
#define RSTATE_NUM1 8
#define RSTATE_NUM2 2
#define TRUE 1
#define FALSE 0
#define TH0_VALUE 0x00 //定时35ms
#define TL0_VALUE 0x00
#define RCAP2H_VALUE 0x6F //定时20ms
#define RCAP2L_VALUE 0xFF
//串口通讯设置相关参数
#define IP_VALUE 0x10 //串行中断高优先级
#define TMOD_VALUE 0x21 //T0十六位定时器,T1 波特率发生器
#define SCON_VALUE 0x50 //方式1,10位,能接收 //0xD0 方式3,11位
#define PCON_VALUE 0x00 //单倍波特率
#define BAUD_VALUE 0xFA //22.1184MHz晶振,波特率设定植为9600
#define T2CON_VALUE 0x00 /*T2 act as 16 bit timer*/
#define SLAVE_ADDR 0x01 //从站地址
#define FUN_READ 0x03 //读功能码
#define FUN_WRITE 0x10 //写功能码
#define FUN_TEST 0x08 //测试回路功能码
#define TEST_ADDRH 0x00 //测试高地址
#define TEST_ADDRL 0x00 //测试低地址
#define TEST_DATAH 0xA5 //测试高位数据
#define TEST_DATAL 0x37 //测试低位数据
#define UART_COMPLETE 0x80 //接收完成标志常量
unsigned char receive_cmp[C_DATAOUT_LEN1];
unsigned char s_buffer[41];
unsigned char r_buffer[37]; //接收从CIMR发来的数据帧
unsigned char j=0;
unsigned char rstate_num=0;
unsigned char rstate_max[3];
unsigned char ctrl_change[8];
unsigned char func_change=0;
unsigned char read_mode=0;
unsigned char write_mode=0;
unsigned char comm_flag=0;
unsigned char data uart_number;
unsigned char uart_complete;
unsigned char timer2_num;
unsigned char timer2_num1;
unsigned char timer2_num2;
unsigned char comm_error=0;
unsigned char comm_len=0;
unsigned char comm_enum=0;
unsigned char comm_cnum=0;
unsigned char code ctrl_mode_addr[]=
{
0x00,
0x01, //运行指令地址
0x00,
0x02, //频率指令地址
0x00,
0x04, //力矩指令地址
0x00,
0x05, //力矩补偿地址
0x00,
0x00, //保留
0x00,
0x07, //模拟量输出1设定地址
0x00,
0x08, //模拟量输出2设定地址
0x00,
0x09, //多功能接点输出设定地址
};
unsigned char code read_mode02_addr[]=
{
0x00,
0x20, //变频器状态地址
0x00,
0x23, //频率指令地址
0x00,
0x26, //输出电流地址
};
unsigned char code read_mode1_addr[]=
{
0x00,
0x20, //变频器状态地址
0x00,
0x44, //电机速度U1-05 0x23频率指令地址
0x00,
0x28, //力矩指令地址
0x03,
0x80, //PG速度检测记数地址F1-01 0x00
0x00,
0x23, //频率指令地址
0x00,
0x24, //输出频率地址
0x00,
0x26, //输出电流地址
0x00,
0x2b, //模拟量输入1地址
};
extern unsigned char i;
extern unsigned char mode;
extern unsigned char c_datain_len,c_dataout_len;
extern unsigned char receive_buf[C_DATAOUT_LEN1];
extern unsigned char send_buf[C_DATAIN_LEN1];
union//校验单元
{
unsigned int crc_value;
struct
{
unsigned char crc_h;
unsigned char crc_l;
}crc_w;
}crc_c;
union
{
unsigned int temp_value;
struct
{
unsigned char temp_h;
unsigned char temp_l;
}temp_s;
}temp_u;
/*--------------------------------------------------------------------------*/
/* FUNCTION ` */
/*--------------------------------------------------------------------------*/
void uart_timer_set(void)
{
TCON=0x00;
PCON=PCON_VALUE; //波特率选择
IP=IP_VALUE; //设置各中断优先级
TMOD=TMOD_VALUE; //设置各定时器的工作方式
T2CON=T2CON_VALUE;
SCON=SCON_VALUE; //设置串行工作方式
TH1=TL1=BAUD_VALUE; //设定波特率的值
TR1=TRUE;
TR0=TI=RI=FALSE;
timer2_num=timer2_num1=timer2_num2=0;
uart_number=0;
for(i=0;i<C_DATAOUT_LEN1;i++)
{
receive_cmp[i]=0x00;
}
for(i=0;i<C_DATAIN_LEN1;i++)
{
send_buf[i]=0x00;
}
for(i=0;i<8;i++)
{
ctrl_change[i]=0x00;
}
rstate_max[0]=RSTATE_NUM0;
rstate_max[1]=RSTATE_NUM1;
rstate_max[2]=RSTATE_NUM2;
}
//比较传送的用户输出数据和上一次是否相同,若相同则不需往下传
void receive_buf_cmp(void)
{
for(i=0;i<c_dataout_len;i++)
{
if(receive_buf[i]!=receive_cmp[i])
{
if(mode==1)
{
if(i>15)
{
func_change=1;
break;
}
}
if(mode==2)
{
if(i>3)
{
func_change=1;
break;
}
}
if(i<16)ctrl_change[i/2]=1;
}
}
for(j=0;j<8;j++)
{
if((ctrl_change[j]==1)||(func_change==1))
{
for(i=0;i<c_dataout_len;i++)
{
receive_cmp[i]=receive_buf[i];
}
break;
}
}
}
//单字节的CRC校验
void crc(unsigned char s)
{
unsigned char k;
crc_c.crc_w.crc_l=s^crc_c.crc_w.crc_l;//高位不变
for(k=0;k<8;k++)
{
if(crc_c.crc_value&0x0001==1)
{
crc_c.crc_value=crc_c.crc_value>>1;
crc_c.crc_value=crc_c.crc_value^0xA001;
}
else crc_c.crc_value=crc_c.crc_value>>1;
}
}
//多字节校验
void crc_n(unsigned char q)
{
crc_c.crc_value=0xffff;
for(i=0;i<q;i++)
{ if(uart_complete!=UART_COMPLETE)
crc(s_buffer[i]);
else crc(r_buffer[i]);
}
}
//发送一个字节
void uart_send(unsigned char s)
{
SBUF=s;
while(TI!=TRUE)
;
TI=FALSE;
}
void frame_send(unsigned char t)
{
EA=FALSE;
RTS_485=!RTS_485;
for(i=0;i<t;i++)
{
uart_send(s_buffer[i]);
}
RTS_485=!RTS_485;
EA=TRUE;
}
//对接收的CIMR的一个数据帧分析
void uart_analyze(void)
{
crc_n(uart_number-2);
if((r_buffer[uart_number-2]==crc_c.crc_w.crc_l)&&(r_buffer[uart_number-1]==crc_c.crc_w.crc_h))
{
if(r_buffer[0]==SLAVE_ADDR)
{
switch( r_buffer[1])
{
case FUN_READ:
if(read_mode==1)
{
if(uart_number==7)
{
comm_error=0;
if(rstate_num==0)
{
if(mode==0)
{
send_buf[4]=r_buffer[3];
send_buf[5]=r_buffer[4];
}
if(mode==1)
{
send_buf[14]=r_buffer[3];
send_buf[15]=r_buffer[4];
}
if(mode==2)
{
send_buf[2]=r_buffer[3];
send_buf[3]=r_buffer[4];
}
}
send_buf[2*(rstate_num-1)]=r_buffer[3];
send_buf[2*(rstate_num-1)+1]=r_buffer[4];
}
else comm_error=1;//num error
}
if(read_mode==2)
{
if(mode==1)
{
if((r_buffer[2]==2*s_buffer[5])&&(uart_number==5+r_buffer[2]))
{
comm_error=0;
send_buf[16]=r_buffer[1];
send_buf[17]=s_buffer[2];
send_buf[18]=s_buffer[3];
send_buf[19]=r_buffer[2];
for(i=0;i<r_buffer[2];i++)
{
send_buf[20+i]=r_buffer[3+i];
}
}
else comm_error=1;//num error
}
if(mode==2)
{
if((r_buffer[2]==0x02)&&(uart_number==7))
{
comm_error=0;
send_buf[4]=r_buffer[1];
send_buf[5]=s_buffer[2];
send_buf[6]=s_buffer[3];
send_buf[7]=r_buffer[2];
send_buf[8]=r_buffer[3];
send_buf[9]=r_buffer[4];
}
else comm_error=1;//num error
}
}
read_mode=0;
break;
case FUN_WRITE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -