您的位置:
首页
>>
管理中心
>>
行业资讯
>>修改新闻资讯信息
资讯类型:
行业要闻
企业动态
新品速递
解决方案
交流培训
嘉宾访谈
产业纵横
人物聚焦
展会动态
会展报告
本站动态
标 题:
*
页面广告:
不显示
显示
副 标 题:
关 键 字:
多个关键字请用“
/
”分隔,如:西门子/重大新闻
内容描述:
新闻来源:
链 接:
责任编辑:
标题图片:
无
当编辑区有插入图片时,将自动填充此下拉框
*
所属类别:
(不超过20项)
电源产品分类
:
UPS电源
稳压电源
EPS电源
变频电源
净化电源
特种电源
发电机组
开关电源(AC/DC)
逆变电源(DC/AC)
模块电源(DC/DC)
电源应用分类
:
通信电源
电力电源
车载电源
军工电源
航空航天电源
工控电源
PC电源
LED电源
电镀电源
焊接电源
加热电源
医疗电源
家电电源
便携式电源
充电机(器)
励磁电源
电源配套分类
:
功率器件
防雷浪涌
测试仪器
电磁兼容
电源IC
电池/蓄电池
电池检测
变压器
传感器
轴流风机
电子元件
连接器及端子
散热器
电解电容
PCB/辅助材料
新能源分类
:
太阳能(光伏发电)
风能发电
潮汐发电
水利发电
燃料电池
其他类
:
其他
静态页面:
生成静态页面
*
内 容:
<P>一、计算步骤:</P> <P>1、定义一个初始值为FFFF的16位的组合变量(regs),该变量称为CRC寄存器。</P> <P>2、把欲发送或接收消息的高8位和CRC寄存器的底8位作异或运算,并把结果在赋到CRC寄存器。</P> <P>3、CRC寄存器右移1位(朝最低位),同时最高位添零。取出并检查最低位是否为1。</P> <P>4、如果为1,则CRC寄存器与多项式A001异或;如果为0,则重复第3步的动作。</P> <P>5、重复3和4直到完成了8次移位。这样完整的8位字节将完成处理了。</P> <P>6、对于下一个8位字节的处理就是重复第2步到第5步了</P> <P>7、把所有的欲发送或接收消息这样处理后,CRC寄存器里的值就是我们最终需要得到的CRC校验码(在result中)。</P> <P>二、C51源程序</P> <P>/*CRC数组计算程序*/</P> <P>#include <stdio.h></P> <P>typedef unsigned char uchar;//定义简写类型</P> <P>typedef unsigned short u16;//定义简写类型</P> <P>u16 result;//放计算后的CRC结果值</P> <P>u16 len=6;//参与计算的数组个数(不包括CRC两子节)</P> <P>//数组1</P> <P>//uchar ppp[]={0xFF,0x03,0xC0,0x21,0x04,0x03,0x00,0x07,0x0D,0x03,0x06};</P> <P>//CRC高节=0x9b,CRC低节=0x03,即result=0x9B03 len=11</P> <P>//数组2</P> <P>uchar ppp[]={0x64,0x03,0x00,0x0A,0x00,0x01};</P> <P>//CRC高节=0xfd,CRC低节=0xad 即result=0xfdad len=6</P> <P>//定义组合结构 </P> <P>typedef union </P> <P>{</P> <P> u16 val;</P> <P> struct</P> <P> {</P> <P> u16 bit0 : 1;</P> <P> u16 bit1 : 1;</P> <P> u16 bit2 : 1;</P> <P> u16 bit3 : 1;</P> <P> u16 bit4 : 1;</P> <P> u16 bit5 : 1;</P> <P> u16 bit6 : 1;</P> <P> u16 bit7 : 1;</P> <P> u16 bit8 : 1;</P> <P> u16 bit9 : 1;</P> <P> u16 bit10 : 1;</P> <P> u16 bit11 : 1;</P> <P> u16 bit12 : 1;</P> <P> u16 bit13 : 1;</P> <P> u16 bit14 : 1;</P> <P> u16 bit15 : 1;</P> <P> } bits;</P> <P>} CRCREGS;</P> <P>CRCREGS regs;</P> <P> </P> <P>u16 CRCCheck(uchar *pp,u16 CRClen)</P> <P>{</P> <P>bit a;</P> <P>int i,j;</P> <P>regs.val=0xffff;</P> <P>pp=&ppp[0];</P> <P>for(i=0;i<CRClen;i++)</P> <P> {</P> <P> regs.val^=pp[i];</P> <P> for(j=0;j<8;j++)</P> <P> {</P> <P> a=regs.bits.bit0;</P> <P> regs.val>>=1; </P> <P> if(a) regs.val^=0xA001;</P> <P> }</P> <P> }</P> <P> return regs.val;</P> <P>}</P> <P> </P> <P>/* 主程序 */</P> <P>void main()</P> <P>{ </P> <P>result=CRCCheck(ppp,len);</P> <P>}</P> <P>三、简要说明</P> <P>1、程序中列了两组数,可以做测试用,结果都在注释中,注意 len 的值要与数组的个数相匹配,数组1为11,数组2为6;</P> <P>2、regs.val是一个共用体变量,该变量既可以作为字用,也可以进行位操作,详细情况请参照变量union和共用和struct结构类型体说明;</P> <P>3、在主程序中直接调用result=CRCCheck(ppp,len);即可得到CRC-16结果,注意ppp是一个数组变量,在函数中是当成数组变量指针用的。</P>本人参考了许多资料,通过反复修本人认为是比较精练的C51程序,完全可以直接用到编程中去。希望能够对同行有所帮助。