?? uart_cimr.c
字號(hào):
#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 //定時(shí)35ms
#define TL0_VALUE 0x00
#define RCAP2H_VALUE 0x6F //定時(shí)20ms
#define RCAP2L_VALUE 0xFF
//串口通訊設(shè)置相關(guān)參數(shù)
#define IP_VALUE 0x10 //串行中斷高優(yōu)先級(jí)
#define TMOD_VALUE 0x21 //T0十六位定時(shí)器,T1 波特率發(fā)生器
#define SCON_VALUE 0x50 //方式1,10位,能接收 //0xD0 方式3,11位
#define PCON_VALUE 0x00 //單倍波特率
#define BAUD_VALUE 0xFA //22.1184MHz晶振,波特率設(shè)定植為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 //測(cè)試回路功能碼
#define TEST_ADDRH 0x00 //測(cè)試高地址
#define TEST_ADDRL 0x00 //測(cè)試低地址
#define TEST_DATAH 0xA5 //測(cè)試高位數(shù)據(jù)
#define TEST_DATAL 0x37 //測(cè)試低位數(shù)據(jù)
#define UART_COMPLETE 0x80 //接收完成標(biāo)志常量
unsigned char receive_cmp[C_DATAOUT_LEN1];
unsigned char s_buffer[41];
unsigned char r_buffer[37]; //接收從CIMR發(fā)來(lái)的數(shù)據(jù)幀
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, //運(yùn)行指令地址
0x00,
0x02, //頻率指令地址
0x00,
0x04, //力矩指令地址
0x00,
0x05, //力矩補(bǔ)償?shù)刂? 0x00,
0x00, //保留
0x00,
0x07, //模擬量輸出1設(shè)定地址
0x00,
0x08, //模擬量輸出2設(shè)定地址
0x00,
0x09, //多功能接點(diǎn)輸出設(shè)定地址
};
unsigned char code read_mode02_addr[]=
{
0x00,
0x20, //變頻器狀態(tài)地址
0x00,
0x23, //頻率指令地址
0x00,
0x26, //輸出電流地址
};
unsigned char code read_mode1_addr[]=
{
0x00,
0x20, //變頻器狀態(tài)地址
0x00,
0x44, //電機(jī)速度U1-05 0x23頻率指令地址
0x00,
0x28, //力矩指令地址
0x03,
0x80, //PG速度檢測(cè)記數(shù)地址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//校驗(yàn)單元
{
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; //設(shè)置各中斷優(yōu)先級(jí)
TMOD=TMOD_VALUE; //設(shè)置各定時(shí)器的工作方式
T2CON=T2CON_VALUE;
SCON=SCON_VALUE; //設(shè)置串行工作方式
TH1=TL1=BAUD_VALUE; //設(shè)定波特率的值
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;
}
//比較傳送的用戶輸出數(shù)據(jù)和上一次是否相同,若相同則不需往下傳
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;
}
}
}
//單字節(jié)的CRC校驗(yàn)
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;
}
}
//多字節(jié)校驗(yàn)
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]);
}
}
//發(fā)送一個(gè)字節(jié)
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;
}
//對(duì)接收的CIMR的一個(gè)數(shù)據(jù)幀分析
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:
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -