CRC应用.docx
- 文档编号:9448971
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:20
- 大小:18.47KB
CRC应用.docx
《CRC应用.docx》由会员分享,可在线阅读,更多相关《CRC应用.docx(20页珍藏版)》请在冰点文库上搜索。
CRC应用
/***********************************************************/
#include
#include
#include
#include
#include
#include
#definesbi(sfr,bit)(_SFR_BYTE(sfr)|=_BV(bit))
#definecbi(sfr,bit)(_SFR_BYTE(sfr)&=~_BV(bit))
//----------------------------------------------------------
uint8_trec_num,rec_data[13],tran_data[13];
uint8_tout_data[8];//输出控制数组,8路,00:
释放,ff:
吸合
uint8_taddress;//本机地址
uint8_tn1,n2,n3,n4,n5,cmd;//relaycomd
//uint16_tcrc_16_tab[]=/*CRC高位字节值表*/
uint8_tauchCRCHi[]={0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x01,0xC0,0x80,0x41,0x00,0xC1,0x81,0x40,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40,0x00,0xC1,0x81,0x40,
0x01,0xC0,0x80,0x41,0x01,0xC0,0x80,0x41,0x00,0xC1,
0x81,0x40,0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,
0x00,0xC1,0x81,0x40,0x01,0xC0,0x80,0x41,0x01,0xC0,
0x80,0x41,0x00,0xC1,0x81,0x40};
/*CRC低位字节值表*/
uint8_tauchCRCLo[]={0x00,0xC0,0xC1,0x01,0xC3,0x03,0x02,0xC2,0xC6,0x06,
0x07,0xC7,0x05,0xC5,0xC4,0x04,0xCC,0x0C,0x0D,0xCD,
0x0F,0xCF,0xCE,0x0E,0x0A,0xCA,0xCB,0x0B,0xC9,0x09,
0x08,0xC8,0xD8,0x18,0x19,0xD9,0x1B,0xDB,0xDA,0x1A,
0x1E,0xDE,0xDF,0x1F,0xDD,0x1D,0x1C,0xDC,0x14,0xD4,
0xD5,0x15,0xD7,0x17,0x16,0xD6,0xD2,0x12,0x13,0xD3,
0x11,0xD1,0xD0,0x10,0xF0,0x30,0x31,0xF1,0x33,0xF3,
0xF2,0x32,0x36,0xF6,0xF7,0x37,0xF5,0x35,0x34,0xF4,
0x3C,0xFC,0xFD,0x3D,0xFF,0x3F,0x3E,0xFE,0xFA,0x3A,
0x3B,0xFB,0x39,0xF9,0xF8,0x38,0x28,0xE8,0xE9,0x29,
0xEB,0x2B,0x2A,0xEA,0xEE,0x2E,0x2F,0xEF,0x2D,0xED,
0xEC,0x2C,0xE4,0x24,0x25,0xE5,0x27,0xE7,0xE6,0x26,
0x22,0xE2,0xE3,0x23,0xE1,0x21,0x20,0xE0,0xA0,0x60,
0x61,0xA1,0x63,0xA3,0xA2,0x62,0x66,0xA6,0xA7,0x67,
0xA5,0x65,0x64,0xA4,0x6C,0xAC,0xAD,0x6D,0xAF,0x6F,
0x6E,0xAE,0xAA,0x6A,0x6B,0xAB,0x69,0xA9,0xA8,0x68,
0x78,0xB8,0xB9,0x79,0xBB,0x7B,0x7A,0xBA,0xBE,0x7E,
0x7F,0xBF,0x7D,0xBD,0xBC,0x7C,0xB4,0x74,0x75,0xB5,
0x77,0xB7,0xB6,0x76,0x72,0xB2,0xB3,0x73,0xB1,0x71,
0x70,0xB0,0x50,0x90,0x91,0x51,0x93,0x53,0x52,0x92,
0x96,0x56,0x57,0x97,0x55,0x95,0x94,0x54,0x9C,0x5C,
0x5D,0x9D,0x5F,0x9F,0x9E,0x5E,0x5A,0x9A,0x9B,0x5B,
0x99,0x59,0x58,0x98,0x88,0x48,0x49,0x89,0x4B,0x8B,
0x8A,0x4A,0x4E,0x8E,0x8F,0x4F,0x8D,0x4D,0x4C,0x8C,
0x44,0x84,0x85,0x45,0x87,0x47,0x46,0x86,0x82,0x42,
0x43,0x83,0x41,0x81,0x80,0x40};
//---------------------------------------------------
//crc校验子程序
uint16_tcrc_cal(uint8_tusDataLen,uint8_t*puchMsg)
{
uint8_tuchCRCHi=0xFF;/*高CRC字节初始化*/
uint8_tuchCRCLo=0xFF;/*低CRC字节初始化*/
uint8_tuIndex;/*CRC循环中的索引*/
while(usDataLen--)/*传输消息缓冲区*/
{
uIndex=uchCRCHi^*puchMsg++;/*计算CRC*/
uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
uchCRCLo=auchCRCLo[uIndex];
}
return(uchCRCHi<<8|uchCRCLo);
}
//----------------------------------------------------
//写内部EEPROM,add_wr为写数据地址,data_wr为要写的数据
voideep_wr(uint8_tadd_wr,uint8_tdata_wr)
{
//EEARH=0;
_delay_ms(10);
while(EECR&(1< EEAR=add_wr; EEDR=data_wr; cli(); EECR|=(1< EECR|=(1< sei(); _delay_ms(10); } //---------------------------------------------------- //读内部EEPROM,add_rd为读数据地址,data_rd为读取的数据 uint8_teep_rd(uint8_tadd_rd) { uint8_tdata_rd; _delay_ms(10); while(EECR&(1< EEARH=0; EEARL=add_rd; EECR|=(1< data_rd=EEDR; _delay_ms(10); returndata_rd; } //---------------------------------------------------- //输出控制子程序 voidset(uint8_tcom) { uint8_ttemp; cbi(PORTB,PB2);//锁存器输出不使能 if((com&0x01)==1) { sbi(PORTB,PB1); } else { cbi(PORTB,PB1); } if((com&0x02)==0x02) { sbi(PORTB,PB0); } else { cbi(PORTB,PB0); } if((com&0x04)==0x04) { sbi(PORTA,PA0); } else { cbi(PORTA,PA0); } if((com&0x08)==0x08) { sbi(PORTA,PA1); } else { cbi(PORTA,PA1); } if((com&0x10)==0x10) { sbi(PORTA,PA2); } else { cbi(PORTA,PA2); } sbi(PORTB,PB3);//锁存器锁存使能 sbi(PORTB,PB3);//锁存器锁存使能 sbi(PORTB,PB3);//锁存器锁存使能 cbi(PORTB,PB3);//锁存器锁存禁止 cbi(PORTB,PB3);//锁存器锁存禁止 cbi(PORTB,PB3);//锁存器锁存禁止 cbi(PORTB,PB2);//锁存器输出使能 } //---------------------------------------------------------- //串口初始化 voidUART_SETTING(intbaud_rate,longfosc) { UBRRL=(unsignedchar)((fosc/16/baud_rate)-1); UBRRH=(unsignedchar)(((fosc/16/baud_rate)-1)>>8); UCSRB|=(1< UCSRC|=(1< } //=====================================接收中断服务程序====== SIGNAL(SIG_UART_RECV) { uint8_ti,temp,func,value,addr; uint16_tcrc,crc1; loop_until_bit_is_set(UCSRA,RXC); i=UDR; UCSRA|=1< rec_data[rec_num]=i; rec_num++; if(rec_num>=12)//判断数据是否接全 { crc=crc_cal(10,rec_data);//计算校验码 crc1=rec_data[10]*256+rec_data[11]; if(crc==crc1) {//校验正确 //led_flash (2);//校验正确,闪烁2次 //-------------------------------------- if(rec_data[0]==address)//判断是否本机地址 { if(rec_data[1]==0x05)//单独设置开关量输出状态 { func=rec_data[1]; addr=rec_data[3]; value=rec_data[4]; switch(addr) { case1: if(value==0xff)cmd=(cmd|0x01); elsecmd=(cmd&0x1e);break; case2: if(value==0xff)cmd=(cmd|0x02); elsecmd=(cmd&0x1d);break; case3: if(value==0xff)cmd=(cmd|0x04); elsecmd=(cmd&0x1b);break; case4: if(value==0xff)cmd=(cmd|0x08); elsecmd=(cmd&0x17);break; case5: if(value==0xff)cmd=(cmd|0x10); elsecmd=(cmd&0x0f);break; default: break; } send_data(0x05);//应答 _delay_ms(200); } elseif(rec_data[1]==0x01) { send_data(0x01); } elseif(rec_data[1]==0x15) { cmd=rec_data[7]; send_data(0x15);//应答 _delay_ms(200); } } //-------------------------------------- elseif(rec_data[1]==0x02)//模块地址设定 { //检测PD3是否为0,为0则设定模块地址,否则不操作 if((PIND&0x08)==0x00) { address=rec_data[2]; eeprom_busy_wait();//保存地址到EEPROM eeprom_write_byte(0x00,address); address=rec_data[2]; eeprom_busy_wait();//保存地址到EEPROM eeprom_write_byte(0x00,address); send_data(0x02);//应答 } } //-------------------------------------- //elseif((rec_data[1]==0x03)&&(rec_data[0]==0x00))//广播进入保护状态 //{ //for(i=0;i<5;i++) //{ //eeprom_busy_wait();//读取异常保护状态输出数据 //out_data[i]=eeprom_read_byte(i+0x11); //} //output(); //} } else//校验出错 { //led_flash(3);//校验出错,闪烁3次 } rec_num=0; } } //---------------------------------------------------------- //串口发送单字节 voidUART_DATA_BYTE_SEND(uint8_tdata) { sbi(PORTC,PC7); if(! (UCSRA&(1< { UCSRA|=(1< } while(! (UCSRA&(1< ; UDR=data;//发送数据 loop_until_bit_is_set(UCSRA,TXC);//查询发送是否结束 UCSRA=UCSRA|(1< cbi(PORTC,PC7); } //---------------------------------------------------------- //发送数据包服务程序 voidsend_data(uint8_tflag) { uint8_ti; uint16_tcrc; tran_data[0]=address; tran_data[1]=flag; if(flag==0x01)//读取线圈状态 { tran_data[2]=1; tran_data[3]=cmd; tran_data[4]=0; tran_data[5]=0; tran_data[6]=0; tran_data[7]=0; tran_data[8]=0; tran_data[9]=0; crc=crc_cal(10,tran_data);//计算回发校验码 tran_data[10]=crc/256; tran_data[11]=crc%256; for(i=0;i<=3;i++)//回发数据 { UART_DATA_BYTE_SEND(tran_data[i]); } UART_DATA_BYTE_SEND(tran_data[10]); UART_DATA_BYTE_SEND(tran_data[11]); } elseif(flag==0x02)//回发模块地址 { tran_data[2]=address; tran_data[3]=0x00; tran_data[4]=0x00; tran_data[5]=0x00; tran_data[6]=0x00; tran_data[7]=0x00; tran_data[8]=0x00; tran_data[9]=0x00; crc=crc_cal(10,tran_data);//计算回发校验码 tran_data[10]=crc/256; tran_data[11]=crc%256; for(i=0;i<=11;i++)//回发数据 { UART_DATA_BYTE_SEND(tran_data[i]); } } elseif(flag==0x15)//集体设置输出 { tran_data[2]=0x00; tran_data[3]=0x00; tran_data[4]=0x00; tran_data[5]=0x05; tran_data[6]=0x00; tran_data[7]=0x00; tran_data[8]=0x00; tran_data[9]=0x00; crc=crc_cal(10,tran_data);//计算回发校验码 tran_data[10]=crc/256; tran_data[11]=crc%256; for(i=0;i<=5;i++)//回发数据 { UART_DATA_BYTE_SEND(tran_data[i]); } UART_DATA_BYTE_SEND(tran_data[1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CRC 应用