最新日志

发表于:2008-5-16 17:02:11
标签:ASCII  

0

ASCII码表

ASCII 码表,放在这里只是为了查询方便。

DecHx OctChar
DecHx OctChar DecHx OctChar DecHx OctChar
00000NUL(null)3220040SPACE6440100@9660140`
11001SOH(start of heading)3321041!6541101A9761141a
22002STX(start of text)3422042"6642102B9862142b
33003ETX(end of text)3523043#6743103C9963143c
44004EOT(end of transmission)3624044$6844104D10064144d
55005ENQ(enquiry)3725045%6945105E10165145e
66006ACK(acknowledge)3826046&7046106F10266146f
77007BEL(bell)3927047'7147107G10367147g
88010BS(backspace)4028050(7248110H10468150h
99011TAB(horizontal tab)4129051)7349111I10569151i
10A012LF(NL line feed, new_line)422A052*744A112J1066A152j
11B013VT(vertical tab)432B053+754B113K1076B153k
12C014FF(NP form feed, new page)442C054,764C114L1086C154l
13D015CR(carriage return)452D055-774D115M1096D155m
14E016SO(shift out)462E056.784E116N1106E156n
15F017SI(shift in)472F057/794F117O1116F157o
1610020DLE(data link escape)483006008050120P11270160p
1711021DC1(device control 1)493106118151121Q11371161q
1812022DC2(device control 2)503206228252122R11472162r
1913023DC3(device control 3)513306338353123S11573163s
2014024DC4(device control 4)523406448454124T11674164t
2115025NAK(negative acknowledge)533506558555125U11775165u
2216026SYN(synchronous idle)543606668656126V11876166v
2317027ETB(end of trans. block)553706778757127W11977167w
2418030CAN(cancel)563807088858130X12078170x
2519031EM(end of medium)573907198959131Y12179171y
261A032SUB(substitute)583A072:905A132Z1227A172z
271B033ESC(escape)593B073;915B133[1237B173{
281C034FS(file separator)603C074<925C134\1247C174
291D035GS(group separator)613D075=935D135]1257D175}
301E036RS(record separator)623E076>945E136^1267E176~
311F037US(unit separator)633F077?955F137_1277F177DEL

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(14)
发表于:2008-5-15 21:34:53
标签:串口  

0

串口惊魂

UART串口就像我的宠物,亲亲热热十几年了,一直很温顺。今天突然向我龇牙,被它吓出一身冷汗。

其实事件的起因很简单,算是我多事,本来没什么的。焊好一片新板,uPSD3251的,11.0592的晶体,带两个串口,想调试一下。就写了一段单片机的程序,在串口接收中断里面把收到的东东立刻发回去。

用PC机串口调试软件定时发出一个测试字符“a”,然后接收,Rx和Tx指示LED同时闪亮,接收正确。当我随手把测试字符改为“abcdefg”时,就出现乱码了,好像大约一秒出现一次(巧合,跟自动发送的定时时间有关)。

于是怀疑是不是没有伺候好看门狗,经测试,那条狗很尽职,从来不乱叫。

然后怀疑晶体的质量,换了晶体,也换了相应的电容,愁容依旧。

最后,修改程序,把收到的东东放到接收缓冲区,满了的时候,就转移到发送缓冲区发送,本本份份的、按部就班的处理接收和发送,问题就解决了。

其实,在接收中断里面随手把收到的东东发回去,只是为了测试一下通路,实际应用中没有人会这样做。但是,仅仅是测试的时候多发了几个字符,没想到就能积累起误差,引起这么大的麻烦。看来,还是功夫不到家啊。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(78)
发表于:2008-5-15 10:30:44
标签:Max+plus  II  

0

Max+plus II小贴士

下载线的长度最大不过30cm


不用的全局信号和专用输入脚,如:Global Clk, Global Clear, Ded Input应该接地;其他I/O悬空即可。


如果想用Global Clock以外的引脚作时钟输入端,须将Assign->Global Project Logic Synthesis->Automatic Global选项去掉。


Max+Plus II的安装

1、安装好Baseline10_1.exe
2、运行Max+Plus.11.v10.1.exe;解压缩到Maxplus的安装目录下;运行Maxplus2Crack.exe,开放Max+PlusII的所有功能。
3、如果是在WindowsXP2000下,要安装Byteblaster(MV)的驱动程序:在Control PanelAdd Hardware,Add Hardware Wizard中,选择Add a New Hardware Device, 然后在设备类型中选择Sound,Video and Game Controllers, 驱动程序是"Maxplus2\drivers\win2000\win2000.inf"


使用EPF10K10时的设置


1、打开Compiler窗口。在Processing->Fitter Settings...菜单下,去掉Use Quartus Fitter for FLEX 10K and ACEX1K Devices选项。
2、打开Programmer窗口:
EPF10K10TC144-4编程设置:
a) Assign->Device...中,去掉Show Only Fastest Speed Grades选项;
选择EPF10K10TC144-4器件;
打开Device Options...,去掉Device Option Group中部分选项,如:User-supplied Start-up Clock Use Configuration Device     Pull-up Resistor
Configuration Device选择EPCLC20
Configuration Scheme选择Passive Serial
b) 去掉菜单选项JTAG->Multi-Device JTAG Chain
c) 单击Programmer中的Configure即可(此时源文件为:目标.SOF)。
d) 也可在FLEX->Multi-Device Flex Chain Setup...中加入目标.SOF”,然后,选中FLEX->Multi-Device Flex Chain选项。
EPC2编程设置(首先要设置好EPF10K10TC1440-4):
a) 选菜单JTAG->Multi-Device JTAG Chain
b) 进入菜单JTAG->Multi-Device JTAG Chain Setup...Device NameEPC2 Select Programming File...目标.POF”文件;单击“Add”加入Chain
c) Programmer窗口点击Program即可。
3EPF10K10TC144也支持JTAG编程,但硬件连线不同。于FLEX方式(即ByteBlasterMV)。
4MAX+PLUSII10.1在不选Multi-Device JTAG ChainMulti-Device FLEX Chain时,默认Config当前工程的SOF文件,以FLEX方式编程。
5、编辑好文件之后,要将File->Project->Name...设置为当前编辑的文件,然后才能开始compile。否则Compile"Start"键为无效状态。


2#101# 为二进制数;
16#AA# 16进制数;
数字之间可以任意加下划线(underscore,只为方便读数。如:1_7_0 等价于170

点击此处查看原文 >>

系统分类: CPLD/FPGA   |    用户分类:    |    来源: 原创

评论(0) | 阅读(33)
发表于:2008-5-9 17:01:55
标签:Protel99  SE  

0

关于《Protel99 SE小贴士》的一点补充

(接《Protel99 SE小贴士》)

16: PCB改栅格:工具条里面的“#”。

17:如果原理图太大,打印困难,可以切割成多个sch分图,然后建立一个总图,在总图里面用"Design->Creat Symble from sheet"生成各个分图的Symble。用总图做Annotate并生成网络表。做Annotate的时候,不要选中Annotate对话框中的"Option->Current sheet only",这样,所有的分图的元件会统一编号。生成网络表的时候,"Net Identifier Scope"要选择"Net Labels and Ports Global";"Sheets to Netlist"要选择"Active sheet plus sub sheets"或者"Active project"。这样,就不需要在各分图之间用Port做电连接,系统会认为不同分图中所有同名的NetLabel是连在一起的。


点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(75)
发表于:2008-5-9 16:53:38
标签:继电器  

0

继电器线圈的驱动

关于继电器:
交流线圈的铁芯中有短路环,保证电流过零而磁路不过零,直流线圈的铁芯中没有。
交流线圈可以长时间通电,直流线圈则要看具体型号的说明书。
交流线圈的阻抗小,如果用直流驱动,要串联电阻。
MAX4822/4824用于驱动继电器,具有省电模式。
如果需要一个线圈长时间通电,可以用PWM驱动。线圈ON的时候,使PWM的duty cycle为100%,维持1s,然后降低duty cycle使线圈两端的电压达到维持电压的1.5倍。如果要驱动多个继电器,可以用74HC165,6B595等带OE的芯片缓冲,PWM连接到OE。

点击此处查看原文 >>

系统分类: 接口电路   |    用户分类:    |    来源: 原创

评论(0) | 阅读(77)
发表于:2008-5-9 16:44:58
标签:无标签

0

见证

恩典博客Z7m FB.zo ~A*f Z
见证,顾名思义,就是看见、证实神的存在,神的恩典,神的慈爱,神的大能,神的信实,神的怜悯,神的公义,神的荣耀。。。。。。。所以,见证一定要真实,不可以夸张、虚构、演绎、推理。做假见证是有罪的。
L3t d/F| S ni0恩典博客(N;IRZ lGb p8XX
基督徒的很多见证,都不是铁板钉钉,无可辩驳的。很多基督徒把一些明显是偶然发生的事情解释为神的作为,我觉得是不应该的,比如,阴天没有带伞,就祷告,结果一天没有下雨。这类鸡毛蒜皮的事情不要生拉硬扯地说成是神听了祷告。当然,可以因着这些事情感恩,但不可以将它们作为见证。从见证里面,要能够看出神行事的目的性。圣经里面,哪一个神迹奇事的发生不是带有目的性的呢?恩典博客R v TW rlx
恩典博客b i},pj#}
见证讲出来,是要造就人的。神要藉着这见证,使不信的变成信的,使信心小的变成信心大的,使软弱的变成刚强的,使愚拙的变为聪明的。
[5C,Q&B.J)o M c0恩典博客"]x~ ^ b
所以,见证,是被神所使用的,是一件极为严肃的事情。要本着唯物的、实事求是的精神,用科学的,严谨的态度来做,绝不能随口说说而已。
`t#?&j9[M+S6wBEz^H q0恩典博客 n1kH)~9yg UY
讲 到这里,顺便捎带一句:基督徒是唯物的,实事求是的。我们信,是因为我们经历了神的同在。而那些因为没有经历过就说没有神的无神论者是唯心主义的,他们就 像鸵鸟,把头埋在沙子里,然后说“我没有看见你们所说的神,所以没有神!”那是愚蠢的人。真正唯物主义的人中,只有有神论者和怀疑论者,绝不可能出现无神 论者。
恩典博客7w"Gk'Q1Zb#ZNa

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(0) | 阅读(65)
发表于:2008-4-13 20:15:54
标签:开胃小菜  

1

开胃小菜

工作劳累之余,做道自己喜欢的菜也是一种乐趣

可乐鸡翅
(这道菜我可是得到了水晶苹果鼠的真传)

鸡中翅若干,以味精花椒淹半小时。炒一下,加盐适量、酱油、葱、蒜少许,啤酒半杯,最后,加可乐至没过鸡翅。烧至收汤即可。

莲藕黄豆排骨汤
油烧至5成热时倒入排骨段翻炒,然后放入料酒、生抽、高汤、花椒粉、葱段、姜片、黄豆、盐和切好的藕块,开锅后倒入砂锅中,炖至肉离骨,出锅时撒入香菜末即可。

怀旧海带丝
超市购买的海带丝1至2小袋,加老干妈辣椒酱适量,开水冲泡。配馒头、烧饼皆可。感觉回到了学生时代。

猪脚醋
这是南方坐月子人吃的菜,味道好极了,不坐月子也可以吃。
用料:姜1.2公斤,猪脚两只约1.8公斤,鸡蛋12粒,黑甜醋750ml装2瓶,水3瓶,黄糖0.5公斤,盐一茶匙半,生抽5汤匙,麻油一汤匙。
做法:鸡蛋煮熟剥皮代用。猪脚用滚水煮熟,冲去肥油。姜去皮洗净,拍松,用滚水泡片刻,沥干水分,用生油和麻油炒香。把甜醋、水、黄糖、盐和姜放入砂锅用温火烧1小时,放入猪脚和鸡蛋,再煲半小时。隔夜吃更入味。

点击此处查看原文 >>

系统分类: 生活点滴   |    用户分类:    |    来源: 原创

评论(1) | 阅读(199)
发表于:2008-4-9 23:18:33
标签:Protel99  SE  

3

Protel99 SE的小贴士

Protel99 SE 的 Tips

1:按Tab键修改正准备放置的实体的属性。

2:Schematics生成网络文件,在选中Active Project时,也要选Append Sheet Numbers to Local Nets和Descend into sheet parts。

3:生成元件列表。Schematics中选"Edit"->"Export to Spreed"->选"Current Sheet" 或 "Project"->"Next"->只选中"Part",其余的都Off掉->"Next"->只选中"Designator"、"Footprint"和"Part Type"->"Next"->"Finish"。
或者:"Report"->"Bill of Material"设置更简单,更快一些。

4:在排了一半的PCB中,如果删掉了网络线或者根本就没有调入网络线,只是用手 工排了一部分,这时,如果调入网络线,所有的网络线线会像蜘蛛网一样,都会显示在屏幕上。这时,要去掉已经排好的部分的网络线,应该这样做: "Design"->"Netlist Manager"->"Menu"->"Update_Free Primitives From Component Pads"->"Yes"。

5:设置/取消自动生成backup文件,在"File"左边那个大的下箭头中,有一个"Preference"。

6:"View"->"Toolbars"中有"Power Objects"、"Digital Objects"等工具,很好用。

7:键盘上的"End"键刷新屏幕。

8:其实,窗口上的"SelectObjectInsideArea"、"DeselectAllObjects"等buttons和"Wiring Tools"中的"Place Part"等buttons都很方便,不必在键盘上敲命令。可能是DOS版本的Protel用的实在是太熟练了,这种恶习很难改。

9:生成Gerberfile: "File"->"CAM Manager..."->"Gerber"。在"Cam Output for xxx.cam"中选中"Gerber Output1"。然后按"F9"或"Tools"->"Generate CAM Files"。

10:改线宽参数:"Design"->"Rules"->"Routing"->"Width Constraint"设置Minimum、Maximum和Preferred。
改孔径参数:"Design"->"Rules"->"Manufacturing"->"Hole size constraint"。

11:PCB生成.net,并与Sch生成的.net比较:"Design"->"Netlist Manager"->"Menu"->"Creat Net List From connected Copper..."、"Compare Net List"、"Compare Net List File to Board..."。

12:PCB打印某一层:"File"->"Print/Preview"->左侧"Browse PCB Print"页中->"Multilayer Composite Print"中delete掉不想要得层。

13: 隐藏所有的元件名:双击Component,属性页有三页,选"Comment"->"Hide"即可。

14: 1206的SMDLED用3528封装。大一点的4007用7227封装。

15:schematic lib编辑器件时,"SPACE"键用来切换是否允许线条为任意角度斜线,或者切换x,y方向中哪一个先画。

点击此处查看原文 >>

系统分类: 模拟技术   |    用户分类:    |    来源: 原创

评论(3) | 阅读(527)
发表于:2008-4-7 17:35:21
标签:会跳的蚂蚁  

1

会跳的蚂蚁

偶然在桌子上发现了一只小蚂蚁,用手靠近它的时候,突然不见了。于是我仔细寻找,在电脑显示器靠近顶部的地方发现了一只(我的视力一向很好,可以达到空军C字视力表2.0标准)。然后再用手靠近它,这次可是盯紧了的----蚂蚁居然跳了起来!落在20厘米以外的桌面上。


V(S$]5_FK*?W d0我把这个发现告诉旁边的建安。建安不信,“开什么玩笑?蚂蚁哪里会跳!”我让他自己观察。他终于找到了一只,并且作了几次试验,对我说:“你吓唬它的时候,它最多会跳三次。如果再吓唬第四次,它就累了,跳不动了;或者是胆子大了,不怕了。”

恩典博客.[a0_*h,j?PsU'wk
后来又发现了一只大一些的蚂蚁,也会跳,只是远不如第一只跳得高。我以为这是一个崭新的发现,如同胡姬花一样。当把这个发现告诉亲戚朋友时,竟然没有一个人相信。都说:“是跳蚤吧?带一个标本回来。”我没见过活的跳蚤,但是见过跳蚤的照片啊。蚂蚁和跳蚤还分不清吗?


$f%t5iO%sn'V cd0于 是在互联网上查找有关蚂蚁的资料,还真是没找到会跳的蚂蚁。后来又联系过几个大学里研究昆虫的专家,最后也是不了了之。我一直都很想知道这蚂蚁是怎么跳起 来的,它的腿那么细,怎么能撑得住呢?由于它跳得实在太快,没有高速摄像机是拍不到跳跃的细节的,所以,最终也不知道这蚂蚁是怎么跳起来的。

恩典博客&}aPv |+F
之所以放弃对这个蚂蚁的研究,是因为有一个缅甸同事告诉我,他们家乡有很多蚂蚁会跳,还会咬人,而且很疼。既然不是什么稀罕东西,不研究也罢了。


UD |QDo2Ki0科学就是这么回事:上帝造的这个世界隐藏了很多的奥秘。有人有好奇心,想研究一下,搞清楚一些“真相”。看到这个人孜孜不倦地研究,上帝就发怜悯,把奥秘揭示给他。他就成了科学家。当然,还有更多的人像我一样,有一点好奇心,没有多少毅力,所以,成不了科学家。

点击看大图

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(1) | 阅读(248)
发表于:2008-4-5 21:24:05
标签:CRC校验  

0

关于CRC校验的开发笔记

Cyclic Redundancy check (CRC) Polynomials:

CRC-8:    c(x) = x8 + x2 + x + 1
CRC-10:   c(x) = x10 + x9 + x5 + x4 + x + 1
CRC-12:   c(x) = x12 + x11 + x3 + x2 + 1
CRC-16:   c(x) = x16 + x15 + x2 + 1
CRC-CCITT:c(x) = x16 + x12 + x5 + 1
CRC-32:   c(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

CRC can detect all single-bit errors, all double-bit errors, any odd number of errors, any burst error where the length of burst is less than k bits (k = degree of c(x)), and most burst error of larger than k bits.


CRC Example:
1: M(x) = 1001,1010  //Message to be send
2: C(x) = 1,0000,0111       //Polynomial, degree = 8 (k = 8)
3: Shift left M(x) by 8 (the degree of c(x)) and add E(x) to produce message
。其中E(x) = "0000,0000"M(x)的下一个字节。
4: Polynomial long division by c(x) to yield remainder. R(x) = 1100,1111.
5: So, the message minus R(x) would be exactly divisible by C(x).
Note: Addition, subtraction and division here means Exclusive-OR (XOR).


1 0 0 1
1 0 0 1  








M(x)*x8/C(x)的商,在此没有用处。

1 0 0 1   1 0 1 0   0 0 0 0   0 0 0 0 M(x)*x8 + E(x); 分界线左边是M(x),右边是E(x)
xor 1 0 0 0
0 0 1 1   1







分界线右边C1(x) = 10000000

0 0 0 1
1 0 0 1   1 0 0 0
0 0 0 0
xor


1
0 0 0 0   0 1 1 1




分界线右边C2(x) = 01110000




0
1 0 0 1   1 1 1 1
0 0 0 0
xor




1 0 0 0   0 0 1 1
1


分界线右边C3(x) = 00111000






0 0 0 1   1 1 0 0
1 0 0 0
xor







1   0 0 0 0
0 1 1 1 分界线右边C4(x) = 00000111









0   1 1 0 0
1 1 1 1 (M(x)*xk + E(x))/C(x)的余数R(x)
运算到最后,分界线左边一定是
'0',所以,R(x)一定是8位。

最后,P(x) = M(x)*xk + R(x) = 1001,1010,0000,0000 + 1100,1111 = 1001,1010,1100,1111

其实R(x) = E(x) xor C1(x) xor C2(x) xor C3(x) xor C4(x).....xor Cn(x).
其中,"C1(x) xor C2(x) xor C3(x) xor C4(x).....xor Cn(x)"是由M(x)的值决定的。
所以,在单片机中,只要做一个
256字节的表格,根据M(x)查出"C1(x) xor C2(x) xor C3(x) xor C4(x).....Cn(x)"的值,再与E(x)异或就可以得到R(x)了。
当然,也可以做两个
16字节的表格,分别查出"C1(x) xor C2(x)" "C3(x) xor C4(x)"的值,再将他们异或,然后将结果与E(x)异或,得到R(x)
然后,再把
R(x)作为下一轮的M(x),继续查表,与下一字节异或,产生新的Rx(x)。如此循环,直到最后一个字节,然后,将结果作为M(x)再查一次表(是为最后添加的那个0x00查的)。


CRC-851单片机实现:
51的表格(汇编):
db 000h,007h,00eh,009h,01ch,01bh,012h,015h,038h,03fh,036h,031h,024h,023h,02ah,02dh;
db 070h,077h,07eh,079h,06ch,06bh,062h,065h,048h,04fh,046h,041h,054h,053h,05ah,05dh;
db 0e0h,0e7h,0eeh,0e9h,0fch,0fbh,0f2h,0f5h,0d8h,0dfh,0d6h,0d1h,0c4h,0c3h,0cah,0cdh;
db 090h,097h,09eh,099h,08ch,08bh,082h,085h,0a8h,0afh,0a6h,0a1h,0b4h,0b3h,0bah,0bdh;
db 0c7h,0c0h,0c9h,0ceh,0dbh,0dch,0d5h,0d2h,0ffh,0f8h,0f1h,0f6h,0e3h,0e4h,0edh,0eah;
db 0b7h,0b0h,0b9h,0beh,0abh,0ach,0a5h,0a2h,08fh,088h,081h,086h,093h,094h,09dh,09ah;
db 027h,020h,029h,02eh,03bh,03ch,035h,032h,01fh,018h,011h,016h,003h,004h,00dh,00ah;
db 057h,050h,059h,05eh,04bh,04ch,045h,042h,06fh,068h,061h,066h,073h,074h,07dh,07ah;
db 089h,08eh,087h,080h,095h,092h,09bh,09ch,0b1h,0b6h,0bfh,0b8h,0adh,0aah,0a3h,0a4h;
db 0f9h,0feh,0f7h,0f0h,0e5h,0e2h,0ebh,0ech,0c1h,0c6h,0cfh,0c8h,0ddh,0dah,0d3h,0d4h;
db 069h,06eh,067h,060h,075h,072h,07bh,07ch,051h,056h,05fh,058h,04dh,04ah,043h,044h;
db 019h,01eh,017h,010h,005h,002h,00bh,00ch,021h,026h,02fh,028h,03dh,03ah,033h,034h;
db 04eh,049h,040h,047h,052h,055h,05ch,05bh,076h,071h,078h,07fh,06ah,06dh,064h,063h;
db 03eh,039h,030h,037h,022h,025h,02ch,02bh,006h,001h,008h,00fh,01ah,01dh,014h,013h;
db 0aeh,0a9h,0a0h,0a7h,0b2h,0b5h,0bch,0bbh,096h,091h,098h,09fh,08ah,08dh,084h,083h;
db 0deh,0d9h,0d0h,0d7h,0c2h,0c5h,0cch,0cbh,0e6h,0e1h,0e8h,0efh,0fah,0fdh,0f4h,0f3h;

51
的表格(C语言):
const unsigned char code CRC8[256] = {
0x00,0x07,0x0e,0x09,0x1c,0x1b,0x12,0x15,0x38,0x3f,0x36,0x31,0x24,0x23,0x2a,0x2d,
0x70,0x77,0x7e,0x79,0x6c,0x6b,0x62,0x65,0x48,0x4f,0x46,0x41,0x54,0x53,0x5a,0x5d,
0xe0,0xe7,0xee,0xe9,0xfc,0xfb,0xf2,0xf5,0xd8,0xdf,0xd6,0xd1,0xc4,0xc3,0xca,0xcd,
0x90,0x97,0x9e,0x99,0x8c,0x8b,0x82,0x85,0xa8,0xaf,0xa6,0xa1,0xb4,0xb3,0xba,0xbd,
0xc7,0xc0,0xc9,0xce,0xdb,0xdc,0xd5,0xd2,0xff,0xf8,0xf1,0xf6,0xe3,0xe4,0xed,0xea,
0xb7,0xb0,0xb9,0xbe,0xab,0xac,0xa5,0xa2,0x8f,0x88,0x81,0x86,0x93,0x94,0x9d,0x9a,
0x27,0x20,0x29,0x2e,0x3b,0x3c,0x35,0x32,0x1f,0x18,0x11,0x16,0x03,0x04,0x0d,0x0a,
0x57,0x50,0x59,0x5e,0x4b,0x4c,0x45,0x42,0x6f,0x68,0x61,0x66,0x73,0x74,0x7d,0x7a,
0x89,0x8e,0x87,0x80,0x95,0x92,0x9b,0x9c,0xb1,0xb6,0xbf,0xb8,0xad,0xaa,0xa3,0xa4,
0xf9,0xfe,0xf7,0xf0,0xe5,0xe2,0xeb,0xec,0xc1,0xc6,0xcf,0xc8,0xdd,0xda,0xd3,0xd4,
0x69,0x6e,0x67,0x60,0x75,0x72,0x7b,0x7c,0x51,0x56,0x5f,0x58,0x4d,0x4a,0x43,0x44,
0x19,0x1e,0x17,0x10,0x05,0x02,0x0b,0x0c,0x21,0x26,0x2f,0x28,0x3d,0x3a,0x33,0x34,
0x4e,0x49,0x40,0x47,0x52,0x55,0x5c,0x5b,0x76,0x71,0x78,0x7f,0x6a,0x6d,0x64,0x63,
0x3e,0x39,0x30,0x37,0x22,0x25,0x2c,0x2b,0x06,0x01,0x08,0x0f,0x1a,0x1d,0x14,0x13,
0xae,0xa9,0xa0,0xa7,0xb2,0xb5,0xbc,0xbb,0x96,0x91,0x98,0x9f,0x8a,0x8d,0x84,0x83,
0xde,0xd9,0xd0,0xd7,0xc2,0xc5,0xcc,0xcb,0xe6,0xe1,0xe8,0xef,0xfa,0xfd,0xf4,0xf3,
};

i = 1 , m = UARTIn[0] ;
while(i <= UARTPtr){
  m = CRC8[m] ^ UARTIn[i];
  i++;
}
m = CRC8[m];


CRC-8PIC单片机实现:两个表格CRC8LCRCH分别为51表格的第一行和第一列。其实,51表格中的每一个数字都是其对应的行、列坐标处的数字异或的结果。
CRC8L:
  addwf PCL
  retlw 0x00
  retlw 0x07
  retlw 0x0e
  retlw 0x09
  retlw 0x1c
  retlw 0x1b
  retlw 0x12
  retlw 0x15
  retlw 0x38
  retlw 0x3f
  retlw 0x36
  retlw 0x31
  retlw 0x24
  retlw 0x23
  retlw 0x2a
  retlw 0x2d

CRC8H:
  addwf PCL
  retlw 0x00
  retlw 0x70
  retlw 0xe0
  retlw 0x90
  retlw 0xc7
  retlw 0xb7
  retlw 0x27
  retlw 0x57
  retlw 0x89
  retlw 0xf9
  retlw 0x69
  retlw 0x19
  retlw 0x4e
  retlw 0x3e
  retlw 0xae
  retlw 0xde

;Input: FSR, CRCCounter
;Output: FSR+CRCCounter,FSR+CRCCounter+1;
;Output: STATUS.C=1 if CRC+CRCCounter and CRC+CRCCounter+1 matchs with their old value, otherwise STATUS.C=0
CRC8:
  banksel bank0
  clrf Temp
CRC8_10:
  swapf Temp,w
  andlw 0x0f
  call CRC8H
  xorwf Temp,w
  xorwf Temp
  xorwf Temp,w
  andlw 0x0f
  call CRC8L
  xorwf INDF,w
  xorwf Temp

  incf FSR
  decfsz CRCCounter
  goto CRC8_10

  swapf Temp,w
  andlw 0x0f
  call CRC8H
  xorwf Temp,w
  xorwf Temp
  xorwf Temp,w
  andlw 0x0f
  call CRC8L
  xorwf Temp

  swapf Temp,w
  andlw 0x0f
  call Hex2Asc
  xorwf INDF,w
  xorwf INDF
  incf FSR
  xorwf Temp,w
  xorwf Temp
  xorwf Temp,w
  andlw 0x0f
  call Hex2Asc
  xorwf INDF,w
  xorwf INDF
  xorwf Temp
  btfss STATUS,Z
  bcf STATUS,C
  btfsc STATUS,Z
  bsf STATUS,C
  incf FSR
  return


CRCPC机实现:
由于
k阶多项式的第2k项一定为"1",所以:
1: M(x)左移k位(在M(x)后面加k"0"),放到寄存器中。
2: 将寄存器左移一位,若移出位为"1",则将寄存器与多项式C(x)0~(k-1)项异或,否则不变,如此循环k次。
CRC-8为例:
UCHR _cded CRC8( UCHR* strBuf, DWORD& dwLength)
{
    UCHR bCRC;
    if(dwLength ==0) return 0;
    __asm
    {
        pushf;
        mov edx, strBuf;
        mov ebx, dwLength; //dwLength
为引用传递,地址 -> ebx
        mov ebx,[ebx];     //取得dwLength的值 -> ebx
        mov ah,[edx];      //M(x)放入寄存器高8位。
        dec ebx;
        jz crc4;           //
如果dwLength == 1 则在寄存器低8位添加"0000,0000"
crc1:   inc edx;           //否则就将M(x)的下一个字节放入寄存器低8位。
        mov al,[edx];
        mov ecx,8;         //
循环8次,一定用ecx,不可用cx,否则Debug编译时正确,Release编译时执行错误。
crc2:   shl ax,1;          //左移。
        jnc crc3;          //如果移出位为"1"就异或,否则继续移位。
        xor ah,7;          //C(x) = x8 + x2 + x + 1 = x8 + 7。由于x8已经移出,故只异或0~(k-1)x2 + x + 1即可。
crc3:   loop crc2;
        dec ebx;
        jnz crc1;
crc4:   mov al,0;          //
在寄存器低8位添加"0000,0000"
        mov ecx,8;
crc5:   shl ax,1;
        jnc crc6;
        xor ah,7;
crc6:   loop crc5;
        mov bCRC,ah;
        popf;
    }
    return bCRC;
}
对于CRC-16CRC-CCITT,初始化时要将M(x)放到eax的高16位,M(x)的下一个word或添加的"0000,0000,0000,0000"要放到ax。做运算时,eax与多项式的0~15位及其后面扩展的16"0"异或(第16位已经移出),即与"10000000000001010000000000000000""00010000001000010000000000000000"异或。

点击此处查看原文 >>

系统分类: 嵌入式   |    用户分类:    |    来源: 原创

评论(0) | 阅读(216)
总共 , 当前 /,23下一页