標題:
51單片機帶CRC校驗的串口通信程序
[打印本頁]
作者:
hg1234
時間:
2018-8-23 14:14
標題:
51單片機帶CRC校驗的串口通信程序
51單片機串口通信程序,帶CRC校驗
單片機源碼:
/**********模擬測試軟件指令*******************/
/**********驗證Agilent設(shè)備通信端口************/
/**********下位機間的信號交流*****************/
/**********驗證OK----hg***********************/
#include "stc12c5a60s2.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
#define UCHAR unsigned char
#define USHORT unsigned int
#define u16 unsigned int
#define UINT16 unsigned int
#define UINT32 long unsigned int
#define UINT unsigned int
uchar dat11[33]={0};
uchar Rec_number=0;
uchar Rec_data=0;
sbit KEY=P1^7;
sbit LED=P3^2;
sbit MAX485_T_R=P1^6;
uchar flag=0;
uchar crc_data[10]={0xa1,0xa2,0x03,0x44,0x55,0x66,0x98,0x14,0x55,0x62};
void init_io(void)
{
P4M0=0;
P4M1=0;
P4SW=0XFF;
P4=0XFF;
}
/****************/
void init_usart(void)
{
// AUXR=0X40;
TMOD=0X20;
SCON=0X50;
TH1=TL1=0XFD;
TR1=1;
REN=1;
}
/******************/
void send_data(uchar ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
/******************/
void printf_string(uchar *s)
{
while(*s!='\0')
{
send_data(*s++);
}
}
/*******************/
/******************************/
bit receive_data(uint times)
{
uint temp=0,temp1=0;
while(RI==0)
{
temp++;
if(temp>=2000)
{
temp=0;
temp1++;
if(temp1>times)
{
return 0;
}
}
}
RI=0;
Rec_data=SBUF;
return 1;
}
/******************/
void delay_ms(uint kk)
{
uint jj;
while(kk--)
{
for(jj=0;jj<510;jj++);
}
}
/***********************/
/******************************************************
*函數(shù)名稱:CRC16RTU
*輸 入:pszBuf 要校驗的數(shù)據(jù)
unLength 校驗數(shù)據(jù)的長
*輸 出:校驗值
*功 能:循環(huán)冗余校驗-16
(RTU標準-0xA001)
*******************************************************/
UINT16 CRC16RTU( UCHAR * pszBuf, UINT unLength)
{
UINT16 CRC=0XFFFF;
UINT32 CRC_count;
for(CRC_count=0;CRC_count<unLength;CRC_count++)
{
int i;
CRC=CRC^*(pszBuf+CRC_count);
for(i=0;i<8;i++)
{
if(CRC&1)
{
CRC>>=1;
CRC^=0xA001;
}
else
{
CRC>>=1;
}
}
}
return CRC;
}
/******************/
void PC_COMMAND(void)
{
uchar *a;
// uchar i;
a=dat11;
{
if(receive_data(1))
{
dat11[Rec_number++]=Rec_data;
/* if(Rec_number==7)
{
if((dat11[0]=='*')&&(dat11[1]=='I')&&(dat11[2]=='D')&&
(dat11[3]=='N')&&(dat11[4]=='?')&&(dat11[5]==0x0D)&&(dat11[6]==0x0A))
{
LED=0;
delay_ms(50);
// printf_string("HEWLETT-PACKARD,34401A,0,11-5-3\r\n");//模擬
// delay_ms(1000);
LED=1;
// printf_string("通信完畢\r\n");
delay_ms(10);
}
else if((dat11[0]=='R')&&(dat11[1]=='E')&&(dat11[2]=='A'))
{
if((dat11[3]=='D')&&(dat11[4]=='?')&&(dat11[5]==0X0D)&&(dat11[6]==0X0A))
{
LED=0;
// printf_string("+8.00000000E-03\r\n");
delay_ms(10);
LED=1;
}
}
}
else if(Rec_number==6)
{
if((dat11[0]=='*')&&(dat11[1]=='R')&&(dat11[2]=='S'))
{
if((dat11[3]=='T')&&(dat11[4]==0x0d)&&(dat11[5]==0x0a))
{
LED=0;
delay_ms(10);
// printf_string("設(shè)備已經(jīng)復位\r\n");
LED=1;
delay_ms(10);
}
}
}
else if(Rec_number==15)
{
if((dat11[0]=='S')&&(dat11[1]=='Y')&&(dat11[2]=='S'))
{
if((dat11[3]=='t')&&(dat11[4]=='e')&&(dat11[5]=='m'))
{
if((dat11[6]==':')&&(dat11[7]=='R')&&(dat11[8]=='E'))
{
if((dat11[9]=='M')&&(dat11[10]=='o')&&(dat11[11]=='t'))
{
if((dat11[12]=='e')&&(dat11[13]==0x0d)&&(dat11[14]==0x0a))
{
LED=0;
delay_ms(10);
// printf_string("設(shè)備進入遠程模式\r\n");
LED=1;
delay_ms(10);
}
}
}
}
}
} */
if(Rec_number==33)
{
if((dat11[0]=='H')&&(dat11[1]=='E')&&(dat11[2]=='W'))
{
if((dat11[3]=='L')&&(dat11[4]=='E')&&(dat11[5]=='T'))
{
if((dat11[6]=='T')&&(dat11[7]=='-')&&(dat11[8]=='P'))
{
if((dat11[9]=='A')&&(dat11[10]=='C')&&(dat11[11]=='K')&&(dat11[12]=='A'))
{
if((dat11[13]=='R')&&(dat11[14]=='D')&&(dat11[15]==','))
{
if((dat11[16]=='3')&&(dat11[17]=='4')&&(dat11[18]=='4'))
{
if((dat11[19]=='0')&&(dat11[20]=='1')&&(dat11[21]=='A'))
{
if((dat11[22]==',')&&(dat11[23]=='0')&&(dat11[24]==','))
{
if((dat11[25]=='1')&&(dat11[26]=='1')&&(dat11[27]=='-'))
{
if((dat11[28]=='5')&&(dat11[29]=='-')&&(dat11[30]=='3'))
{
if((dat11[31]==0X0D)&&(dat11[32]==0X0A))
{
LED=0;
delay_ms(10);
// printf_string("設(shè)備進入100MA測試模式\r\n");
LED=1;
delay_ms(10);
flag=0;
}
}
}
}
}
}
}
}
}
}
}
}
/* if(Rec_number==17&&REN==1)
{
LED=0;
delay_ms(800);
LED=1;
for(i=0;i<17;i++)
{
send_data(dat11[i]);
}
}*/
}
else
Rec_number=0;
}
}
/*****************/
void main(void)
{
uchar i=0;
UINT16 crc=0;
uchar crc_h=0;
uchar crc_l=0;
init_io();
init_usart();
MAX485_T_R=1;
while(1)
{
// PC_COMMAND();
// if(KEY==0)
{
// delay_ms(10);
// if(KEY==0)
{
// while(KEY==0);
// delay_ms(10);
// while(KEY==0);
delay_ms(30);
crc=CRC16RTU(crc_data,8);
crc_h=crc/0x100;
crc_l=crc%0x100;
for(i=0;i<8;i++)
{
send_data(crc_data[i]) ;
}
send_data(crc_h);
send_data(crc_l);
delay_ms(30);
/* printf_string("*RST\r\n");
delay_ms(100);
printf_string("*IDN?\r\n");
REN=1;
flag=1;
MAX485_T_R=0;
while(flag==1)
{
PC_COMMAND();
}
MAX485_T_R=1;
if(flag==0)
{
delay_ms(300);
printf_string("SYStem:REMote\r\n");
delay_ms(100);
printf_string("CONFigure:CURRent:DC 100MA,DEF\r\n");
} */
}
}
}
}
復制代碼
所有資料51hei提供下載:
51定時器模擬.rar
(33.43 KB, 下載次數(shù): 86)
2018-8-23 14:13 上傳
點擊文件名下載附件
51定時器模擬
下載積分: 黑幣 -5
作者:
wdliming
時間:
2019-8-11 20:22
謝謝分享~~~
作者:
13631784213
時間:
2019-8-12 13:28
這個是適合那些型號的單片機
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1