51單片機串口通信程序,帶CRC校驗
單片機源碼:
- /**********模擬測試軟件指令*******************/
- /**********驗證Agilent設備通信端口************/
- /**********下位機間的信號交流*****************/
- /**********驗證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++);
- }
- }
- /***********************/
- /******************************************************
- *函數名稱:CRC16RTU
- *輸 入:pszBuf 要校驗的數據
- unLength 校驗數據的長
- *輸 出:校驗值
- *功 能:循環(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("設備已經復位\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("設備進入遠程模式\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("設備進入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, 下載次數: 86)
2018-8-23 14:13 上傳
點擊文件名下載附件
51定時器模擬 下載積分: 黑幣 -5
|