中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
簡單實(shí)用的單片機(jī)CRC快速算法
煤炭科學(xué)研究總院太原分院(030006)韓炬
摘要提供兩個(gè)實(shí)用的、能夠在單片機(jī)上通過軟件來實(shí)現(xiàn)的CRC快速算法,其中一個(gè)適用于51系列等單片機(jī),另一個(gè)適用于PIC單片機(jī),這兩種算法十分簡單快捷。
關(guān)鍵詞 CRC  算法  單片機(jī)
1引言
CRC(循環(huán)冗余碼)檢驗(yàn)技術(shù)廣泛應(yīng)用于測控及通信領(lǐng)域。在很多情況下,CRC計(jì)算是靠專用的硬件來實(shí)現(xiàn)的,但是對(duì)于小型低成本的單片機(jī)系統(tǒng)來說,若要在沒有這些硬件的支持下實(shí)現(xiàn)CRC檢驗(yàn),首先要解決的就是如何通過軟件高效快速地完成CRC計(jì)算的問題,也就是CRC算法的問題。
廣告:>>
這里將提供兩種算法,它們稍有不同,一種適用于程序空間大一些的51系列等單片機(jī),另一種適用于程序空間的使用條件十分苛刻的PIC單片機(jī)。這些算法按字節(jié)進(jìn)行計(jì)算,僅使用查表和簡單的異或運(yùn)算等操作,所以,計(jì)算過程相當(dāng)簡捷,而計(jì)算速度卻很快。
下面先簡述一下CRC原理,然后再以CRC-CCITT標(biāo)準(zhǔn)生成多項(xiàng)式為例對(duì)算法進(jìn)行說明,并給出一個(gè)51系列單片機(jī)子程序和一個(gè)PIC單片機(jī)子程序。
2 CRC原理
CRC檢驗(yàn)原理實(shí)際上就是在一個(gè)p位二進(jìn)制數(shù)據(jù)序列之后附加一個(gè)r位二進(jìn)制檢驗(yàn)碼(序列),從而構(gòu)成一個(gè)總長為n=p+r位的二進(jìn)制序列,例如,p位二進(jìn)制數(shù)據(jù)序列D=[dp-1dp-2......d1d0],r位二進(jìn)制檢驗(yàn)碼R=[rr-1rr-2....r1r0],所得到的這個(gè)n位二進(jìn)制序列就是M=[dp-1dp-2......d1d0rr-1rr-2....r1r0];附加在數(shù)據(jù)序列之后的這個(gè)檢驗(yàn)碼與數(shù)據(jù)序列的內(nèi)容之間存在著某種特定的關(guān)系。如果因干擾等原因使數(shù)據(jù)序列中的某一位或某些位發(fā)生錯(cuò)誤,這種特定關(guān)系就會(huì)被破壞,因此,通過檢查這一關(guān)系,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)正確性的檢驗(yàn)。
校驗(yàn)碼R是通過對(duì)數(shù)據(jù)序列D進(jìn)行二進(jìn)制除法取余式運(yùn)算得到的,它被一個(gè)稱為生成多項(xiàng)式的(r+1)位二進(jìn)制序列G=[grgr-1....g1g0]來除,用多項(xiàng)式形式表示為
(1)
其中,xrD(x)表示將數(shù)據(jù)序列D左移r位(即在D的末尾再增加r個(gè)0位),Q(x)代表這一除法所得的商,R(x)就是所需的余式。這一運(yùn)算關(guān)系還可以用式(2)來表達(dá)
(2)
其中,Re[]表示對(duì)括號(hào)內(nèi)的式子進(jìn)行取余式運(yùn)算。
檢驗(yàn)碼的編碼計(jì)算如上所述,而檢驗(yàn)過程則是對(duì)M序列直接進(jìn)行除法取余式運(yùn)算,即
(3)
或表示為
(4)
所得到的余式R(x)若為零則表示數(shù)據(jù)正確,否則認(rèn)為發(fā)生錯(cuò)誤。
3快速算法的基本思路
這里僅以CRC-CCITT標(biāo)準(zhǔn)生成多項(xiàng)式為例進(jìn)行說明。CRC-CCITT是一個(gè)17位生成多項(xiàng)式G=[10001000000100001],用多項(xiàng)式形式表示為G(x)=x16+x12+x5+1,由它產(chǎn)生的檢驗(yàn)碼R的二進(jìn)制位數(shù)是16位(2字節(jié))。
單片機(jī)的操作是以字節(jié)形式進(jìn)行的,所以,算法應(yīng)以字節(jié)為單位進(jìn)行運(yùn)算。這里將把用字節(jié)構(gòu)成的二進(jìn)制序列稱為“字節(jié)序列”,顯然,單片機(jī)的數(shù)據(jù)序列、檢驗(yàn)碼以及它倆組成的序列M都是字節(jié)序列,或者說是“多字節(jié)序列”。
實(shí)際上,這種算法所要解決的問題就是如何對(duì)多字節(jié)序列進(jìn)行除法取余式運(yùn)算的問題。
3.1多字節(jié)序列運(yùn)算規(guī)律
首先設(shè)一個(gè)由i個(gè)字節(jié)m1、m2、......、mi-1、mi構(gòu)成的8×i位二進(jìn)制序列,并用字節(jié)形式表示它為Mi=[m1m2......mi-1mi],然后再截取Mi的前(i-1)個(gè)字節(jié)構(gòu)成一個(gè)Mi-1序列,Mi-1=[m1m2......mi-1],這兩個(gè)序列之間的關(guān)系可以用多項(xiàng)式表示為Mi(x)=x8Mi-1(x)+mi(x),其中,mi(x)是字節(jié)mi的二進(jìn)制多項(xiàng)式表示形式,而x8Mi-1(x)表示將Mi-1序列左移一個(gè)字節(jié)。
對(duì)于序列Mi-1來說,
(5)
其中,二字節(jié)序列余式Ri-1=[hi-1li-1]。
而對(duì)于Mi序列來說,可得
(6)
這一結(jié)果的前一項(xiàng)為一整數(shù),所以它與余式無關(guān),這樣,余式只可能出現(xiàn)在后一項(xiàng)中。因此,對(duì)x8Ri-1(x)+mi(x)取余式運(yùn)算就等價(jià)于對(duì)Mi(x)的取余式運(yùn)算,用式(4)的形式表示為
(7)
x8Ri-1(x)+mi(x)代表一個(gè)由Ri-1和mi共同組成的三字節(jié)序列[hi-1li-1mi],而且對(duì)這個(gè)三字節(jié)序列的取余式運(yùn)算就等于對(duì)Mi序列的取余式運(yùn)算,其結(jié)果就是Mi序列的余式Ri=[hili]。同理可得,對(duì)于一個(gè)Mi+1序列(它比Mi序列多一個(gè)字節(jié)mi+1)來說,對(duì)三字節(jié)序列[hilimi+1]的運(yùn)算就等價(jià)于對(duì)Mi+1序列的運(yùn)算,其結(jié)果就是Mi+1序列的余式Ri+1=[hi+1li+1]。
顯然,這反映出一種如圖1所示的遞推運(yùn)算的規(guī)律。可見,每一次遞推運(yùn)算都是對(duì)一個(gè)三字節(jié)序列的計(jì)算,所以,如何簡單快捷地對(duì)三字節(jié)序列進(jìn)行計(jì)算是這種算法的又一個(gè)關(guān)鍵。
3.2三字節(jié)序列計(jì)算
提到簡單快捷,人們自然會(huì)想到采用查表的辦法,例如事先把三字節(jié)序列的所有余式計(jì)算出來,置于一個(gè)稱為“余式表”的表格中,供隨時(shí)讀取。不過,這樣的表格太大,需要224個(gè)單元,也就是要占用225個(gè)字節(jié)的存儲(chǔ)空間,這對(duì)單片機(jī)來說是絕對(duì)無法接受的,因此,需要想辦法減少所占用的存儲(chǔ)空間。
圖1遞推計(jì)算步驟
設(shè)一個(gè)三字節(jié)序列Tabc=[a b c]、一個(gè)Ta00=[a00]和一個(gè)二字節(jié)序列Tbc=[b c]。可以用多項(xiàng)式形式表示它們之間的關(guān)系為Tabc(x)=Ta00(x)+Tbc(x),因此,對(duì)Ta00來說,
(8)
而對(duì)Tabc來說,
其中,Qa00是整數(shù),與余式無關(guān);而Ra00和Tbc都是二字節(jié)序列,因而,它們的和(模2加法,即異或運(yùn)算)仍然是二字節(jié)序列(二進(jìn)制16位,小于生成多項(xiàng)式的17位),因此,它就是Tabc的余式Rabc,即
(9)
這說明,可以把三字節(jié)序列Tabc=[a b c ]的運(yùn)算分解成兩個(gè)步驟來進(jìn)行,如圖2所示。
1.通過查余式表(表1),讀取Ta00=[a00]的余式Ra00=[ha00la00];
2.將Ra00與[b c ]進(jìn)行異或運(yùn)算,從而得到[a b c ]的余式Rabc=[habclabc],即habc=ha00?b,labc=la00?c。
由于[a00]中只有一個(gè)字節(jié)不為零,因此,[a00]余式表僅需要256個(gè)單元,即占用512個(gè)字節(jié)。
圖2三字節(jié)序列[a b c]的計(jì)算辦法
4 適用于51系列等單片機(jī)的算法
前面所述的辦法可以直接用于51系列等單片機(jī),因?yàn)?12字節(jié)的余式表對(duì)它們的程序存儲(chǔ)容量來說是完全不成問題的。
計(jì)算直接通過上述的遞推過程來進(jìn)行,每一次遞推都是對(duì)一個(gè)三字節(jié)序列進(jìn)行的計(jì)算:第一次是[m1m2m3],結(jié)果是[h3l3];第二次是[h3l3m4],結(jié)果是[h4l4];......,第i次是[hi+1li+1mi+2],結(jié)果是[hi+2li+2];......;最后是[hk+1lk+1mk+2],最終結(jié)果是[hl]。如果有k個(gè)數(shù)據(jù)字節(jié),則遞推k次。下面給出一個(gè)三字節(jié)序列計(jì)算子程序,供每一次遞推運(yùn)算時(shí)調(diào)用。注意,在第一次被調(diào)用之前,先將m1、m2和m3分別存入R0、R1和R2中(子程序返回時(shí),計(jì)算結(jié)果將存放在R0和R1中)。從第二次調(diào)用時(shí)開始,每次在調(diào)用之前只需先將參與本次運(yùn)算的字節(jié)存入R2即可(第二次是m4,第三次是m5,...,第i次是mi+2,...)。當(dāng)最后一次調(diào)用返回后,R0和R1分別存放的就是最終結(jié)果h和l。
CRC MOV DPH,#table ;指向余式表下半?yún)^(qū)
MOV DPL,R0 ;指向?qū)?yīng)單元
CLR A ;
MOVC A,@A+DPTR ;讀余式的高字節(jié)
XRL A,R1 ;計(jì)算余式的高字節(jié)
MOV R0,A ;存入R0
INC DPH ;指向余式表上半?yún)^(qū)
CLR A ;
MOVC A,@A+DPTR ;讀余式的低字節(jié)
XRL A,R2 ;計(jì)算余式的低字節(jié)
MOV R1,A ;存入R1
RET
這一子程序只有12條指令,因此十分簡捷,而且只占用16個(gè)機(jī)器周期,也就是說,相當(dāng)于計(jì)算每一個(gè)字節(jié)只需16個(gè)機(jī)器周期即可完成,這將比傳統(tǒng)的軟件算法快十幾倍。
表1[a00]余式表
a
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0000
1021
2042
3063
4084
50A5
60C6
70E7
8108
9129
A14A
B16B
C18C
D1AD
E1CE
F1EF
1231
0210
3273
2252
52B5
4294
72F7
62D6
9339
8318
B37B
A35A
D3BD
C39C
F3FF
E3DE
2462
3443
0420
1401
64E6
74C7
44A4
5485
A56A
B54B
8528
9509
E5EE
F5CF
C5AC
D58D
3653
2672
1611
0630
76D7
66F6
5695
46B4
B75B
A77A
9719
8738
F7DF
E7FE
D79D
C7BC
48C4
58E5
6886
78A7
0840
1861
2802
3823
C9CC
D9ED
E98E
F9AF
8948
9969
A90A
B92B
5AF5
4AD4
7AB7
6A96
1A71
0A50
3A33
2A12
DBFD
CBDC
FBBF
EB9E
9B79
8B58
BB3B
AB1A
6CA6
7C87
4CE4
5CC5
2C22
3C03
0C60
1C41
EDAE
FD8F
CDEC
DDCD
AD2A
BD0B
8D68
9D49
7E97
6EB6
5ED5
4EF4
3E13
2E32
1E51
0E70
FF9F
EFBE
DFDD
CFFC
BF1B
AF3A
9F59
8F78
9188
81A9
B1CA
A1EB
D10C
C12D
F14E
E16F
1080
00A1
30C2
20E3
5004
4025
7046
6067
83B9
9398
A3FB
B3DA
C33D
D31C
E37F
F35E
02B1
1290
22F3
32D2
4235
5214
6277
7256
B5EA
A5CB
95A8
8589
F56E
E54F
D52C
C50D
34E2
24C3
14A0
0481
7466
6447
5424
4405
A7DB
B7FA
8799
97B8
E75F
F77E
C71D
D73C
26D3
36F2
0691
16B0
6657
7676
4615
5634
D94C
C96D
F90E
E92F
99C8
89E9
B98A
A9AB
5844
4865
7806
6827
18C0
08E1
3882
28A3
CB7D
DB5C
EB3F
FB1E
8BF9
9BD8
ABBB
BB9A
4A75
5A54
6A37
7A16
0AF1
1AD0
2AB3
3A92
FD2E
ED0F
DD6C
CD4D
BDAA
AD8B
9DE8
8DC9
7C26
6C07
5C64
4C45
3CA2
2C83
1CE0
0CC1
EF1F
FF3E
CF5D
DF7C
AF9B
BFBA
8FD9
9FF8
6E17
7E36
4E55
5E74
2E93
3EB2
0ED1
1EF0
sss 5適用于PIC單片機(jī)的算法
表1所示的余式表雖然只占用512個(gè)字節(jié)的程序存儲(chǔ)空間,但對(duì)于PIC單片機(jī)來說還是太大了,需要再進(jìn)行壓縮。思路是這樣的:
將Ta00=[a00]分解成Te00=[e00]和Tf00=[f 00],并使字節(jié)e的上半字節(jié)內(nèi)容與a的上半字節(jié)相同但下半字節(jié)為零,同時(shí)使字節(jié)f的下半字節(jié)內(nèi)容與a的下半字節(jié)相同但上半字節(jié)為零,然后用Te00和Tf00生成余式表來代替Ta00余式表。由于Te00和Tf00中只有半個(gè)字節(jié)不為零,所以,每個(gè)余式表只需16個(gè)單元(32個(gè)字節(jié)),兩個(gè)余式表總共只占用64個(gè)字節(jié),這樣就可滿足PIC單片機(jī)的要求了。
由上述思路可知,e=a∧0F0H,f=a∧0FH,因此可得,Ta00=Te00?Tf00,同時(shí),還可以證明它們余式的關(guān)系為Ra00=Re00?Rf00,也就是說,如果設(shè)Ra00=[ha00la00]、Re00=[he00le00]和Rf00=[hf00lf00],則ha00=he00?hf00,la00=le00?lf00。這樣,三字節(jié)序列[a00]的計(jì)算可由圖3所示的方法來進(jìn)行,其中,[e00]和[f00]余式表見表2和表3。
表2[e00]余式表
00
10
20
30
40
50
60
70
80
90
A0
B0
C0
D0
E0
F0
0000
1231
2462
3653
48C4
5AF5
6CA6
7E97
9188
83B9
B5EA
A7DB
D94C
CB7D
FD2E
EF1F
表3[f00]余式表
00
01
02
03
04
05
06
07
08
09
0A
0B
0C
0D
0E
0F
0000
1021
2042
3063
4084
50A5
60C6
70E7
8108
9129
A14A
B16B
C18C
D1AD
E1CE
F1EF
顯然,對(duì)于PIC單片機(jī)來說,三字節(jié)序列[a b c]的計(jì)算需要綜合圖2和圖3所示的兩種辦法來進(jìn)行,下面就給出一個(gè)這樣的PIC子程序,它的使用與上面所述的51系列單片機(jī)子程序基本相同,即,在第一次被調(diào)用之前,先將m1、m2和m3分別存入通用寄存器BYTEa、BYTEb和BYTEc中;從第二次調(diào)用時(shí)開始,每次在調(diào)用之前只需先將參與本次運(yùn)算的字節(jié)存入BYTEc即可(第二次是m4,第三次是m5,...,第i次是mi+2,...)。每次子程序返回時(shí),計(jì)算結(jié)果將存放在BYTEa和BYTEb中,最后一次調(diào)用返回后,BYTEa和BYTEb分別存放的就是最終結(jié)果h和l。子程序中,除BYTEa、BYTEb和BYTEc外,ADDR、RESULTh和RESULTl也是通用寄存器。
圖3三字節(jié)序列[a 00]的計(jì)算辦法
START MOVLW DATAe
MOVWF ADDR ;將[e00]余式表首地址DATAe存入ADDR
SWAPF BYTEa,0
ANDLW 0FH ;求e和e指定的[e00]余式高字節(jié)的相對(duì)地址
ADDWF ADDR,1 ;取其絕對(duì)地址,存入ADDR
MOVF ADDR,0 ;把這一絕對(duì)地址再存入W
CALL TABLE ;查表,返回時(shí)he00放在W中
MOVWF RESULTh ;把he00存入RESULTh
MOVLW 16
ADDWF ADDR,0 ;求e指定的[e00]余式低字節(jié)的絕對(duì)地址
CALL TABLE ;查表,返回時(shí)le00放在W中
MOVWF RESULTl ;把le00存入RESULTl
MOVLW DATAf
MOVWF ADDR ;將[f 00]余式表首地址DATAf存入ADDR
MOVF BYTEa,0
ANDLW 0FH ;求f和f指定的[f 00]余式高字節(jié)的相對(duì)地址
ADDWF ADDR,1 ;取其絕對(duì)地址,存入ADDR
MOVF ADDR,0 ;把這一絕對(duì)地址再存入W
CALL TABLE ;查表,返回時(shí)hf00放在W中
XORWF RESULTh,0 ;he00與hf00異或,得ha00,存入W
XORWF BYTEb,0 ;ha00與b異或,得habc,存入W
MOVF BYTEa ;habc存入BYTEa
MOVLW 16
ADDWF ADDR,0 ;求f指定的[f00]余式低字節(jié)的絕對(duì)地址
CALL TABLE ;查表,返回時(shí)lf00放在W中
XORWF RESULTl,0 ;le00與lf00異或,得la00,存入W
XORWF BYTEc,0 ;la00與c異或,得labc,存入W
MOVF BYTEb ;labc存入BYTEb
RETLW 0
參考文獻(xiàn)
1常曉明,潘衛(wèi)華,王建東.CRC校驗(yàn)及其軟件實(shí)現(xiàn).電子技術(shù)應(yīng)用,1995(6)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
CRC 算法原理及C 語言實(shí)現(xiàn)
CRC算法原理
CRC校驗(yàn)碼在單片機(jī)中的程序?qū)崿F(xiàn)的求取
CRC校驗(yàn)原理及步驟
CRC校驗(yàn)原理及其C語言實(shí)現(xiàn)-機(jī)電之家網(wǎng)PLC技術(shù)網(wǎng)
基于PLC控制的垂直軸風(fēng)力發(fā)電控制系統(tǒng)中通訊系統(tǒng)研究
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服