基于單片機(jī)的CRC編解碼器_第1頁
基于單片機(jī)的CRC編解碼器_第2頁
基于單片機(jī)的CRC編解碼器_第3頁
基于單片機(jī)的CRC編解碼器_第4頁
基于單片機(jī)的CRC編解碼器_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、基于單片機(jī)的 CRC編解碼的實(shí)現(xiàn)在當(dāng)今信息社會(huì),單片機(jī)在計(jì)算機(jī)的網(wǎng)絡(luò)通訊與數(shù)據(jù)傳輸、工業(yè)自動(dòng)化過程的實(shí)時(shí)控制和數(shù)據(jù)處理等都有廣泛的應(yīng)用,它已經(jīng)滲透到人們生產(chǎn)生活的各個(gè)領(lǐng)域。而利用單片機(jī)進(jìn)行數(shù)據(jù)通訊的控制應(yīng)用得越來越廣泛。于此同時(shí),人們對信息傳遞的要求逐漸提高,使得通信傳輸過程中,可靠性和有效性這對矛盾日益凸顯。隨著對有效性不斷提高,每個(gè)碼元所占的時(shí)間越來越短,由于傳輸距離、現(xiàn)場狀況等諸多因素的影響 ,設(shè)備(通常為嵌入單片機(jī) )之間的通訊數(shù)據(jù)常會(huì)發(fā)生無法預(yù)測的錯(cuò)誤。為了防止錯(cuò)誤所帶來的影響 ,在數(shù)據(jù)的接收端必須保證其可靠性。但由于數(shù)據(jù)在一個(gè)有干擾的環(huán)境中進(jìn)行傳輸,任何數(shù)據(jù)中的任何信息包括確認(rèn)信息

2、都是不可靠的。這里舉一個(gè)紅軍和藍(lán)軍通信聯(lián)合進(jìn)攻山下的敵軍的經(jīng)典案例:第一天紅軍發(fā)認(rèn)信息”如果也不可靠而沒有成功到達(dá)紅軍那里,那自己不是很危險(xiǎn)?于是紅軍再發(fā)一條“對確認(rèn)的確認(rèn)信息” ,但同樣的問題還是不能解決,紅軍仍然不敢貿(mào)然行動(dòng)。對通信的可靠性檢查就需要“校驗(yàn)” ,校驗(yàn)是從數(shù)據(jù)本身進(jìn)行檢查,它依靠某種數(shù)學(xué)上約定的形式進(jìn)行檢查,校驗(yàn)的結(jié)果是可靠或不可靠,如果可靠就對數(shù)據(jù)進(jìn)行處理,如果不可靠,就丟棄重發(fā)或者進(jìn)行修復(fù)。數(shù)據(jù)在向單片機(jī)或其它設(shè)備進(jìn)行輸入時(shí),容易產(chǎn)生輸入錯(cuò)誤,為了減少輸入錯(cuò)誤,編碼專家發(fā)明了各種校驗(yàn)檢錯(cuò)方法,并依據(jù)這些方法設(shè)置了校驗(yàn)碼。 凡設(shè)有校驗(yàn)碼的信息校驗(yàn)碼則是附加在本體碼后邊,用來

3、校驗(yàn)本體碼在輸入過程中準(zhǔn)確性的號(hào)碼。每一個(gè)本體碼只能有一個(gè)校驗(yàn)碼,校驗(yàn)碼通過規(guī)定的數(shù)學(xué)關(guān)系得到。校驗(yàn)碼的校驗(yàn)原理是:系統(tǒng)內(nèi)部預(yù)先設(shè)置根據(jù)校驗(yàn)方法所導(dǎo)出的校驗(yàn)公式編制成的校驗(yàn)程序,當(dāng)帶有校驗(yàn)碼的代碼輸入系統(tǒng)時(shí),系統(tǒng)利用校驗(yàn)程序?qū)斎氲谋倔w碼進(jìn)行運(yùn)算得出校驗(yàn)結(jié)果之后,再將校驗(yàn)結(jié)果與輸入代碼的校驗(yàn)碼進(jìn)行對比來檢測輸入的正確與否。如果兩者一致,則表明代碼輸入正確,CRC 方法。由于 CRC 校驗(yàn)編碼和解碼方法簡單,檢錯(cuò)能力強(qiáng),開銷小,易于用編碼器及檢測CRC 的應(yīng)用。1福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)本論文主要研究基于單片機(jī)的 CRC 編解碼系統(tǒng)設(shè)計(jì)。根據(jù)CRC 循環(huán)冗余校驗(yàn)碼的原理結(jié)合單片機(jī)的

4、實(shí)際運(yùn)用,對如下幾個(gè)問題展開討論和研究:從 CRC 校驗(yàn)碼原理出發(fā),分析不同的CRC 編碼過程,確定一種適用于單片機(jī)語言的編解碼方法,然后制定具體的程序設(shè)計(jì)方案。結(jié)合編解碼程序設(shè)計(jì),設(shè)計(jì)實(shí)驗(yàn)性的編解碼器,驗(yàn)證編解碼程序在單片機(jī)上的可行性。其中涉及到輸入系統(tǒng),輸出系統(tǒng),通信系統(tǒng)。在實(shí)驗(yàn)性的編碼器中的基礎(chǔ)上進(jìn)一步拓展,結(jié)合傳感器模塊,設(shè)計(jì)一個(gè)結(jié)合CRC 校驗(yàn)的實(shí)時(shí)檢測通信系統(tǒng)。本論文第一章為緒論,介紹CRC 校驗(yàn)碼在單片機(jī)通訊中起到的重要作用以及本設(shè)計(jì)所實(shí)現(xiàn)的任務(wù)。第二章具體介紹 CRC 循環(huán)冗余校驗(yàn)碼。從其基本原理出發(fā),發(fā)現(xiàn)能夠?qū)崿F(xiàn)編解碼的計(jì)算方法,并分析每種計(jì)算方法。第三章主要介紹通過第二章所

5、介紹的不同算法,選擇一種適用于單片機(jī)語言的算法。分析其具體結(jié)構(gòu),并用 C 語言實(shí)現(xiàn)該算法。第四章詳細(xì)介紹了 CRC 編解碼在單片機(jī)上的實(shí)現(xiàn)。本章節(jié)以“輸入編碼傳輸解 CRC 編解碼驗(yàn)證系統(tǒng)”和“溫濕度實(shí)時(shí)檢測的編解碼系統(tǒng)” ,來驗(yàn)證 CRC 校驗(yàn)碼在單片機(jī)上的實(shí)現(xiàn)和具體應(yīng)用。2基于單片機(jī)的 CRC編解碼的實(shí)現(xiàn)循環(huán)冗余碼校驗(yàn)英文名稱為 Cyclical Redundancy ,簡稱 CRC,它是利用除法及余數(shù)的原理來作錯(cuò)誤偵測的。CRC K位信息碼后再拼接 R N位,因此,這種編碼又叫(N,K)碼。對于一個(gè)給定的(N,K)碼,可以證明存在一個(gè)最高次冪為 N-K=R的多項(xiàng)式 G(x)。根據(jù) G(x

6、)可以生成 K位信息的校驗(yàn)碼,而 G(x)叫做這個(gè) CRC碼的生成多項(xiàng)式。 校驗(yàn)碼的具體生成過程為:假設(shè)發(fā)送信息用信息多項(xiàng)式 C(X)表示,將C(x)左移 R位,則可表示成 C(x)*2的 R次方,這樣 C(x)的右邊就會(huì)空出 R位,這就是校驗(yàn)碼的位置。通過 C(x)*2的 R次方除以生成多項(xiàng)式 G(x)得到的余數(shù)就是校驗(yàn)碼。n位的 CRC校驗(yàn)碼產(chǎn)生的規(guī)則是先將要發(fā)送的二進(jìn)制序列數(shù)左移 n 2n再除以一個(gè)多項(xiàng)式,最后所得到的余數(shù)既是 CRC值,如式(2-1)式所示,其中 B(X)表示R(X)G(X) Q(X)基于以上原理可以知道:計(jì)算 CRC值的過程就是先將 K位信息碼 B(X)左移 R位,再

7、用 R位的校驗(yàn)碼 。它與算術(shù)除法的區(qū)別在于,將算術(shù)除法中的減運(yùn)算變成了 XOR(異或)運(yùn)算。而這個(gè)特殊除法的目的是逐步消掉最高位的 1或 0 XOR Q(X) R(X)就是 CRC R CRC值。在計(jì)算 CRC值的過程中,作為“除數(shù)”的生成多項(xiàng)式G(X)也是非常重要的。它是接收在發(fā)送方,利用生成多項(xiàng)式對信息多項(xiàng)式做模 2除生成校驗(yàn)碼。在接受方利用生成多項(xiàng)式對收到的編碼多項(xiàng)式做模 2除檢測和確定錯(cuò)誤位置。由于生成多項(xiàng)式的最高位必須為 1,而實(shí)際上在除法的每次 XOR時(shí),都要消掉,這個(gè)1可以不做參考,所以一般生成項(xiàng)簡寫時(shí)不寫最高位的 1。而 CRC計(jì)算時(shí)最后一次除法 XOR,最高位消除了,所以得到

8、的余數(shù)的位 CRC校驗(yàn)碼R(X)的位數(shù)=生成多項(xiàng)式 G(X)位數(shù)-1。接收方將接收到的二進(jìn)制序列數(shù)(包括信息碼和 CRC種生成多項(xiàng)式進(jìn)行一次 CRC計(jì)算,如果余數(shù)為 0,則說明傳輸中無錯(cuò)誤發(fā)生,否則說明傳3福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)按位計(jì)算法就是直接模擬 CRC 校驗(yàn)碼基本原理中除法的過程,來得到余數(shù)即 CRC 值。 G(X)有 g 要一直消掉的,所以只需要一個(gè) g-1 位的寄存器。以下是計(jì)算的過程:原始數(shù)據(jù)后擴(kuò)展 g-1 個(gè)比特 0;寄存器左移一位,并且右邊移入下一位數(shù)據(jù)。這樣最高位1 移出,由于最高位是1,故本次的商是 1,要用 G(X)來進(jìn)行 XOR,最高位肯定 XOR 得

9、0,故忽略最高位,只要用低g-1 位來進(jìn)行 XOR 就可以,其結(jié)果便是第一次XOR 后的結(jié)果。 如果移出的最高位是 0,則繼續(xù)移位,直到移出的最高位為 1。寄存器置0原始數(shù)據(jù)末擴(kuò)展g-1個(gè)0寄存器左移出一位否寄存器左移1位為1是有剩余原始數(shù)據(jù)無圖4基于單片機(jī)的 CRC編解碼的實(shí)現(xiàn)按位計(jì)算法是將被測數(shù)據(jù)一位一位放到寄存器中來做除法,現(xiàn)在來探究一種能處理多位的數(shù)據(jù)的方法。根據(jù)同樣的原理可以得到如下的算法:While (還有剩余沒有處理的數(shù)據(jù))Begin檢查 register頭字節(jié),并取得它的值 ;求不同偏移處多項(xiàng)式的 XOR;在這個(gè)算法中,需要討論的是求不同偏移處多項(xiàng)式的XOR這一步。我們可以通過

10、一個(gè)例子說明:假設(shè)生成多項(xiàng)式 R(X)為 1 0010 0011,即 CRC-8,待測數(shù)據(jù) B(X)是 1011 0100 1101,也就是說:B(X)與 R(X)相 XOR R(X)相 XOR重復(fù)進(jìn)行,最終消掉 4個(gè)比特中所有的 1,直到結(jié)果滿足要求?;诋惢蜻\(yùn)算的交換律,即(A XOR B) XOR C = A XOR (B XOR C),我們可以將 R(X)與適當(dāng)移位后的 R(X)先進(jìn)行 XOR,使其結(jié)果值的高位與 B(X)相同。然后與 B(X)相異或 。2現(xiàn)在換成這種算法:第一步:5福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)R(X)相 XOR后得到的值得到的結(jié)果值和上面是一樣的以上兩種算法

11、計(jì)算的結(jié)果是一致的,從后一種算法可以發(fā)現(xiàn):如果事先將 R(X)自行XOR后使其結(jié)果高 n位能夠連續(xù)地由低到高生成一張表,由于高 n位的原始數(shù)據(jù)和高 n位的表內(nèi)數(shù)據(jù)在計(jì)算時(shí)都是被消掉的,所以表內(nèi)數(shù)據(jù)只保留低位余數(shù)。然后計(jì)算CRC值時(shí)只需讓原始數(shù)據(jù)查這張表中對應(yīng)的值。接下來再將表內(nèi)的值XOR下一位原始數(shù)據(jù),重復(fù)該步驟,直到處理完所有數(shù)據(jù),這就是查表法。從以上的例子可以看出,查表法的高位決定了這里以生成多項(xiàng)式 CRC-8=X8 +X2+ X1+10000 0001 0000 0111)為例,介紹表的生成:4.0000 0010 0000 1110與 0001 0000 0111相 XOR, 低 8位

12、值為 0 x09 高 8位為 0 x035.0000 0100 0001 1100 低 8位值為 0 x1C 高 8位為 0 x046.0000010000011100 與 0000000101011100相 XOR,低 8位值為 0 x1B 高 8位為 0 x057.0000010000011100 與 0000001000001110 相 XOR,低 8位值為 0 x12 高 8位為 0 x068.0000 0100 0001 1100 與 0000 0010 0000 1110,0000 0001 0000 0111 相 XOR,低 8位值為0 x15 高 8位為 0 x07.其中,在每

13、一項(xiàng)XOR后所得到的高 8位代表每一項(xiàng)在表里的位置,并且決定了該表一次可以給一個(gè)字節(jié)編碼。所得到低8位代表每一項(xiàng)的值。通過這樣的不同偏移處的統(tǒng)一生成多項(xiàng)式的 XOR,遍歷高 8位的每一項(xiàng),即可求得 256個(gè)項(xiàng),以應(yīng)對原信息碼內(nèi)單字節(jié)內(nèi)表 0 x00,0 x07,0 x0E,0 x09,0 x1C,0 x1B,0 x12,0 x15,0 x38,0 x3F,0 x36,0 x31,0 x24,0 x23,0 x2A,0 x2D,0 x70,0 x77,0 x7E,0 x79,0 x6C,0 x6B,0 x62,0 x65,0 x48,0 x4F,0 x46,0 x41,0 x54,0 x53,0

14、 x5A,0 x5D,0 xE0,0 xE7,0 xEE,0 xE9,0 xFC,0 xFB,0 xF2,0 xF5,0 xD8,0 xDF,0 xD6,0 xD1,0 xC4,0 xC3,0 xCA,0 xCD,0 x90,0 x97,0 x9E,0 x99,0 x8C,0 x8B,0 x82,0 x85,0 xA8,0 xAF,0 xA6,0 xA1,0 xB4,0 xB3,0 xBA,0 xBD,0 xC7,0 xC0,0 xC9,0 xCE,0 xDB,0 xDC,0 xD5,0 xD2,0 xFF,0 xF8,0 xF1,0 xF6,0 xE3,0 xE4,0 xED,0 xEA,0

15、 xB7,0 xB0,0 xB9,0 xBE,0 xAB,0 xAC,0 xA5,0 xA2,0 x8F,0 x88,0 x81,0 x86,0 x93,0 x94,0 x9D,0 x9A,0 x27,0 x20,0 x29,0 x2E,0 x3B,0 x3C,0 x35,0 x32,0 x1F,0 x18,0 x11,0 x16,0 x03,0 x04,0 x0D,0 x0A,0 x57,0 x50,0 x59,0 x5E,0 x4B,0 x4C,0 x45,0 x42,0 x6F,0 x68,0 x61,0 x66,0 x73,0 x74,0 x7D,0 x7A,0 x89,0 x8E,0

16、 x87,0 x80,0 x95,0 x92,0 x9B,0 x9C,0 xB1,0 xB6,0 xBF,0 xB8,0 xAD,0 xAA,0 xA3,0 xA4,0 xF9,0 xFE,0 xF7,0 xF0,0 xE5,0 xE2,0 xEB,0 xEC,0 xC1,0 xC6,0 xCF,0 xC8,0 xDD,0 xDA,0 xD3,0 xD4,0 x69,0 x6E,0 x67,0 x60,0 x75,0 x72,0 x7B,0 x7C,0 x51,0 x56,0 x5F,0 x58,0 x4D,0 x4A,0 x43,0 x44,0 x19,0 x1E,0 x17,0 x10,0

17、 x05,0 x02,0 x0B,0 x0C,0 x21,0 x26,0 x2F,0 x28,0 x3D,0 x3A,0 x33,0 x34,6基于單片機(jī)的 CRC 編解碼的實(shí)現(xiàn)7福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)“按位計(jì)算法”雖然很直觀,但每一次只能對一位數(shù)據(jù)進(jìn)行運(yùn)算,每一次運(yùn)算,都需要很長的時(shí)間。由于CRC校驗(yàn)廣泛運(yùn)用于單片機(jī)通信中,如果傳輸?shù)男畔⒘看螅幋a的速度很慢,造成發(fā)送時(shí)間慢,當(dāng)與傳輸校驗(yàn)中的時(shí)間不匹配就會(huì)造成丟包。如MODBUS-RTU通訊協(xié)議中規(guī)定若超過 3.5個(gè)字符時(shí)間單片機(jī)仍沒有接收到新數(shù)據(jù),則認(rèn)為接收完成。假設(shè)在波特率為9600b/s的情況下進(jìn)行MODBUS-RTU

18、0.37ms的話,就會(huì)造成該次傳輸就丟包。而使用按位計(jì)算法在處理較大數(shù)據(jù)時(shí)有可能出現(xiàn)這種情況。由于“查表法”算法和“按位計(jì)算法”是完全一樣的,不僅結(jié)果完全一樣,處理方式也是完全一樣的,所以“查表法”是可以完全替代“按位計(jì)算法”的。查表法主要優(yōu)點(diǎn)是能夠快速計(jì)算。由于其一次能夠計(jì)算多位數(shù)據(jù),從而提高了速度,較好地克服了異步傳輸中校驗(yàn)和發(fā)送時(shí)間可能出現(xiàn)不匹配的問題。查表法的缺點(diǎn)是由于要存儲(chǔ)幾百個(gè)字節(jié)的參數(shù)表,需要更多的存儲(chǔ)空間,然而在單片機(jī)的應(yīng)用中,只要在程序存儲(chǔ)空間容量允許的情況下,這種以空間換取時(shí)間的方法是值得提倡的。單片機(jī),作為計(jì)算機(jī)的特殊分支,在各領(lǐng)域中的應(yīng)用越來越廣。單片機(jī)的正式名稱為微控

19、制器(Micro Controller Unit,MCU單片機(jī)廠商有:STC公司的單片機(jī)主要是基于8051內(nèi)核,是新一代增強(qiáng)型單片機(jī),指令代碼完全兼容傳統(tǒng) 8051,速度快 8至 12倍,雙串口,有全球唯一 ID號(hào),加密性好。II. Microchip公司Microchip公司 PIC系列單片機(jī),其突出特點(diǎn)是體積小,功耗低,精簡指令集,抗干擾能力強(qiáng),可靠性高,有較強(qiáng)的模擬接口,代碼保密性好,大部分芯片有其兼容的 FLASH程序存儲(chǔ)器的芯片。ATMEl公司的 8位單片機(jī) AT89系列是 8位 Flash單片機(jī),與 8051系列單片機(jī)相兼容,8基于單片機(jī)的 CRC 編解碼的實(shí)現(xiàn)系統(tǒng)由單片機(jī)實(shí)現(xiàn)控制

20、與計(jì)算,其中一個(gè)首要的工作就是選擇適合的單片機(jī)。目前國內(nèi)在使用單片機(jī)作控制系統(tǒng)的微處理器時(shí)多選擇 PIC51 系列單片機(jī),其中PIC 系列的單片機(jī)在多個(gè)方面較之其它系列單片機(jī)具有以下優(yōu)點(diǎn): MCS-51 系列及其它單片機(jī)相比,PIC 單片機(jī)內(nèi)集成了上電復(fù)位電路、I/O 引腳上拉電路、看門狗定時(shí)器,尤其是集成了 AD 模塊,在對模擬量進(jìn)行模/數(shù)轉(zhuǎn)換時(shí)可以更大程度的減少和免用外接器件,以便實(shí)現(xiàn)“純單片”化,這樣,不僅便于開發(fā),而且還可以節(jié)省電路板空間和制造成本。具有獨(dú)特的C 語言開發(fā)環(huán)境。使用C 語言這種高級(jí)綜上所述現(xiàn)有的單片機(jī)產(chǎn)品中,由于Microchip 公司的 PIC 系列單片機(jī)擁有強(qiáng)大的抗

21、干擾能力,而且穩(wěn)定性和可靠性高,同時(shí)擁有較強(qiáng)的模擬接口,與大部分芯片的兼容,鑒于以上優(yōu)勢,故在本裝置中選用 Microchip 公司的 PIC 系列單片機(jī)。由于本論文中的設(shè)計(jì)對模擬量進(jìn)行采集,同時(shí),設(shè)計(jì)外圍硬件也需要較多的I/O 資源以及考慮到今后的功能擴(kuò)展。因此,需要選用一款運(yùn)算速度快,模擬采集通道,I/O 引腳較多的單片機(jī)。經(jīng)過比較選擇,PIC 系列單片機(jī)中的 PIC16F877A。本論文中的設(shè)計(jì)采用基于 CRC-8=X8+X2+X1+1 的查表法。根據(jù)2.2.2 節(jié)對查表法的分析,我們可以總結(jié)出查表法的寄存器運(yùn)算模型:移位CRC8表具體描述:9福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)如果還

22、有未處理的數(shù)據(jù)則回到第一步繼續(xù)執(zhí)行。當(dāng)所有原始數(shù)據(jù)處理完后,八位寄存器中的值就是該數(shù)據(jù)的 CRC 值,把這個(gè)值加到原始數(shù)據(jù)的后面,便構(gòu)成 CRC 校驗(yàn)碼。當(dāng)接收端進(jìn)行CRC 解碼時(shí),只要將CRC 校驗(yàn)碼按上述查表法運(yùn)算模型再進(jìn)行一次相同的運(yùn)算。如果八位寄存器的最后結(jié)果是 0。這表明改 CRC 校驗(yàn)碼內(nèi)的原始數(shù)據(jù)無誤。3.2.3 CRC編解碼程序設(shè)計(jì)基于 PIC單片機(jī)所具有的具有獨(dú)特的 C PIC單片機(jī)時(shí)可以運(yùn)用C 語言來進(jìn)行程序設(shè)計(jì),可大大的提高工作效率。所以本次設(shè)計(jì)中采用的是C 語言對單片機(jī)進(jìn)行編譯。CRC=0I=0Counter是Counter=0否CRC=crc_table表內(nèi)數(shù)據(jù)輸出C

23、RC值圖基于單片機(jī)的 CRC編解碼的實(shí)現(xiàn)具體程序如下:unsigned char crc= 0;crc = CRCTablecrc*p;p+;return(crc);福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)通過以上章節(jié)的探究,已經(jīng)找到了適用于將 CRC 編解碼原理在 PIC單片機(jī)上實(shí)現(xiàn)的途徑。接下來將介紹 CRC 編解碼器的實(shí)際應(yīng)用。 該系統(tǒng)是為了實(shí)現(xiàn) CRC 校驗(yàn)原理在單片機(jī)上應(yīng)用,使單片機(jī)能夠進(jìn)行簡單的CRC 編解碼功能。其結(jié)構(gòu)框圖如下:解碼結(jié)果鍵盤輸入圖 框圖具體流程如下:由鍵盤輸入一串原始數(shù)據(jù);發(fā)送單片機(jī)將確定好的原始數(shù)據(jù)進(jìn)行適當(dāng)處理,使其轉(zhuǎn)換成可以被編碼的序列,然后進(jìn)行 CRC 編碼;

24、通過 PIC 單片機(jī)通信端口將編好的 CRC 校驗(yàn)碼發(fā)送到接收單片機(jī);接收單片機(jī)對 CRC 校驗(yàn)碼經(jīng)行解碼;鍵盤類型的選擇:基于單片機(jī)的 CRC 編解碼的實(shí)現(xiàn)鍵盤分為編碼式鍵盤和非編碼式鍵盤,編碼式鍵盤能夠由硬件邏輯電路完成鍵盤閉合無需占用系統(tǒng)資源。而非編碼鍵盤則由軟件完成上述任務(wù),其硬件電路比較簡單,但要占用 MCU 和簡化電路,所以采用非編碼鍵盤。鍵盤電路結(jié)構(gòu)的選擇:非編碼鍵盤的電路結(jié)構(gòu)非為獨(dú)立式和矩陣式結(jié)構(gòu)。獨(dú)立式鍵盤配置靈活,軟件簡單,但每個(gè)按鍵單獨(dú)占用一個(gè) I/O 口。矩陣鍵盤由行線和列線組成,按鍵位于行線與列線的交 n 個(gè)按鍵只需 2 n 個(gè) I/O 比獨(dú)立鍵盤節(jié)省很多 I/O 口

25、。本次設(shè)計(jì)中,按鍵輸入模塊需要實(shí)現(xiàn)能夠直接輸入 16 進(jìn)制數(shù)。由此鍵盤輸入模塊中需要16 個(gè)按鍵遍歷 0 x00 至 0 x0F,根據(jù)以上分析,本次設(shè)計(jì)選用鍵盤工作方式選擇:鍵盤工作方式可分為查詢工作方式和中斷工作方式,查詢工作方式是在一定的時(shí)間周期內(nèi),由主程序調(diào)用鍵盤鍵盤掃描程序,檢查是否有按鍵操作。若無按鍵操作退出程序;若有按鍵操作,則執(zhí)行相應(yīng)的按鍵處理程序。中斷工作方式是為了提高M(jìn)CU 的效率,大大減少 MCU 無謂的工作時(shí)間只有當(dāng)出現(xiàn)按鍵操作,才執(zhí)行中斷服務(wù)程序內(nèi)有關(guān)按鍵處理的操作,若無按鍵操作,則MCU 不進(jìn)行任何與按鍵有關(guān)的操作。另外中斷工作方式需要占用到一個(gè)外部中斷口。本次設(shè)計(jì)中

26、,該系統(tǒng)發(fā)送單片機(jī)的結(jié)構(gòu)是先輸入數(shù)據(jù)后處理數(shù)據(jù),在資源使用上是先后的關(guān)系。此外,PIC16F877A 單片機(jī)只有一個(gè)外部中斷口,而且本次設(shè)外部中斷口另有他用。所以采用查詢掃描的方式。綜上所訴本次設(shè)計(jì)采用 44 掃描鍵盤。圖福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)由于PIC單片機(jī)的I/OI/O口的方向,這里簡述在有按鍵按下的情況下,行、列掃描法:在有鍵盤操作之前,先執(zhí)行行、列掃描法步驟,即 RD 口值為 。當(dāng)有按鍵按下RD 口值改變,才開始執(zhí)行行、列掃描。此外,在按鍵沒有釋放之前需一直循環(huán)該次掃描。為了實(shí)現(xiàn)輸入多個(gè)數(shù)據(jù),就需要一直重復(fù)上述過程。該系統(tǒng)一次最多能處理 12 個(gè)字節(jié)的數(shù)據(jù),所以就需要一

27、個(gè)數(shù)組Input 存放每次鍵入的數(shù)據(jù)。當(dāng)輸入12 次之后便停止重復(fù),等待數(shù)據(jù)發(fā)送。此外再設(shè)置一個(gè)編碼允許按鍵控制數(shù)據(jù)編碼,其程序流程圖為:是無否是圖 基于單片機(jī)的 CRC 編解碼的實(shí)現(xiàn)在這里需先說明輸入數(shù)據(jù)的存儲(chǔ)格式,每次鍵入的數(shù)據(jù)都單獨(dú)存儲(chǔ)在一個(gè)數(shù)組中,即數(shù)組中每一個(gè)項(xiàng)都存放一個(gè)半字節(jié)值。為了便于之后的處理和顯示,將先入數(shù)據(jù)移入數(shù)組末端,采用壓棧形式存放數(shù)據(jù)。對輸入數(shù)據(jù)經(jīng)行編碼要進(jìn)行兩個(gè)步驟:將輸入數(shù)據(jù)序列轉(zhuǎn)化為可進(jìn)行 CRC 編碼的序列;將改好的序列進(jìn)行 CRC 編碼。由于采用的是 4X4 鍵盤,輸入的數(shù)據(jù)都是都是半字節(jié),所以一開始鍵入的數(shù)據(jù)是以半字節(jié)的形式保存在單片機(jī)中。而本次設(shè)計(jì)的CR

28、C 編碼一次能夠處理一字節(jié),且PIC 單片機(jī)位八位單片機(jī),也是能夠一次處理一個(gè)字節(jié)。為了提高效率,須將原先以半字節(jié)為單位的輸入數(shù)據(jù)合并成以單字節(jié)位單位的數(shù)據(jù)。解決上述要求,只需將相鄰數(shù)據(jù)兩兩結(jié)合:將其中一位左移 4 位再與另一位為低 4 位相或結(jié)合,就能得到一組 8 位的數(shù)據(jù)。算法流程圖如下:i=0指向原始數(shù)據(jù)數(shù)組第i位地址將i左移4位然后與i+1位相或i+所有數(shù)據(jù)是否合并完否圖 福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)當(dāng)生成新原始數(shù)據(jù)后,再按照3.2 節(jié)編解碼系統(tǒng)總體結(jié)構(gòu)中得出的 CRC 編碼方法去處理這些數(shù)據(jù)數(shù)據(jù),得出 CRC 值,具體實(shí)現(xiàn)方法參照 3.2 節(jié)。在將 CRC 值添加到原始數(shù)據(jù)

29、數(shù)組的最后一位,即構(gòu)成 CRC 校驗(yàn)碼。具體流程圖如下:開始輸入數(shù)據(jù)編碼值添加到輸入數(shù)據(jù)校驗(yàn)碼解碼器的解碼過程和編碼過程是相同的,但其處理的的對象為CRC 校驗(yàn)碼,而處理完所有數(shù)據(jù)后,若其 CRC 值為 0,則說明在原始數(shù)據(jù)正確,若 CRC 值不為 0 則說明在傳輸過程受到干擾,數(shù)據(jù)出錯(cuò)。在 CRC 在 PIC16F877A 能夠?qū)崿F(xiàn)異步串行傳輸方式和同步串行傳輸方式。異步傳輸方式中,發(fā)送方和接收方各自使用自己的時(shí)鐘,通過為每個(gè)字符設(shè)置起始和停止標(biāo)志來識(shí)別通信內(nèi)異步串行傳輸方式的好處是通信設(shè)備簡單、操作方便,但傳輸效率較低。同步串行傳輸方式可以實(shí)現(xiàn)高速度、大容量的數(shù)據(jù)傳送,但要求發(fā)生時(shí)鐘和接收

30、時(shí)鐘保持嚴(yán)格同步,同時(shí)硬件復(fù)雜。在本次設(shè)計(jì)中,由于所需傳數(shù)據(jù)量不大且不需要高速傳輸,為便于操作,故采用異步串行通信方式,通過 PIC16F877A 的串行通信模塊 USART 實(shí)現(xiàn)編解碼器的通信功能?;趩纹瑱C(jī)的 CRC 編解碼的實(shí)現(xiàn)在軟件上實(shí)現(xiàn) USART 發(fā)送,只需將CRC 校驗(yàn)碼從低位到高位依次輸入 TXREG 發(fā)送寄存器中,且每次發(fā)送一個(gè)字節(jié)的數(shù)據(jù)。的單片機(jī)會(huì)自動(dòng)將數(shù)據(jù)傳入串行發(fā)送移位寄存器 TSR中完成數(shù)據(jù)發(fā)送。接收數(shù)據(jù)時(shí),數(shù)據(jù)先傳入接收移位寄存器RSR 中,再將其傳入RCREG 接收寄存器。在軟件上實(shí)現(xiàn),只需讀取RCREG 寄存器內(nèi)的數(shù)據(jù)就能實(shí)現(xiàn)接收。但要注意在發(fā)送時(shí)需要適當(dāng)延時(shí),

31、否則接收數(shù)據(jù)時(shí)會(huì)出現(xiàn)接收溢出而無法接收數(shù)據(jù)?;谒栾@示的數(shù)據(jù)類型,可采用LCD1602 液晶顯示模塊為顯示模塊。本設(shè)計(jì)所使用的 LCD1602 使用的是 HD44870 液晶芯片。該芯片的接口特性及讀寫操作如以下兩表所示:表符號(hào)VSSVDDVO電源電壓: +5V液晶驅(qū)動(dòng)電壓:寄存器選擇:1:數(shù)據(jù)寄存器; 0:指令寄存器讀、寫操作選擇 1:讀; 0:寫使能信號(hào) ENABLE數(shù)據(jù)總線34RS5R/WEH/L6H/HLH/L7DB0DB1DB2DB3DB4DB5DB6DB78H/L9H/LH/LH/LH/LH/LH/L表RS0R/W0由以上兩表可知 LCD1602 顯示模塊與單片機(jī)的接口連接和讀寫

32、方式。 接口連接如下7圖所示:福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)圖 當(dāng)讀或?qū)懸粋€(gè)字符后地址指針加一,光標(biāo)加一。即寫入指令 0 x06。寫數(shù)據(jù)時(shí),先要確定數(shù)據(jù)在液晶面板里的位置,而液晶面板上的 32 個(gè)位置都映射在HD44870 的 RAM 緩沖區(qū)中。映射圖如下:圖控制器內(nèi)有一個(gè)數(shù)據(jù)地址指針,可通過它來訪問RAM。訪問指令碼的的格式是80H+地址碼。基于單片機(jī)的 CRC 編解碼的實(shí)現(xiàn)確定地址后,便可寫入數(shù)據(jù),而LCD1602 顯示的字符由其字符生成器 CGROM 決定。本設(shè)計(jì)中顯示的字符為 16 進(jìn)制數(shù)字、字母、符號(hào),這幾類字符在 CGROM 中都是 ASCII 碼的形式。其中字母、符號(hào)數(shù)據(jù)

33、為定量,16 數(shù)字?jǐn)?shù)據(jù)為變量。定量數(shù)據(jù)可用字符串形式輸出,而變量的 16 進(jìn)制數(shù)據(jù)再加上 0 x30 后便能在 LCD 上顯示。在簡易 CRC CRC CRC校驗(yàn)正確時(shí),顯示原始數(shù)據(jù)和CRC 值;當(dāng)CRC 校驗(yàn)錯(cuò)誤時(shí),顯示受到干擾的原始數(shù)據(jù)和錯(cuò)誤提示。圖) 圖以圖 4-7 為例,原始數(shù)據(jù)位 0 xFA50C963,圖 為校驗(yàn)正確結(jié)果;圖 4-7(b)中,原始數(shù)據(jù)第 5 位在傳輸過程中出錯(cuò),顯示模塊便顯示錯(cuò)誤標(biāo)識(shí)。本節(jié)具體介紹了 CRC 編解碼原理在單片機(jī)上具體實(shí)現(xiàn)的一個(gè)簡易實(shí)驗(yàn)系統(tǒng)。包括按鍵輸入模塊、編解碼模塊、單片機(jī)通信模塊以及顯示模塊。結(jié)合本設(shè)計(jì)制定的任務(wù)和要求確定了硬件系統(tǒng)的總體結(jié)構(gòu),完

34、成了硬件電路的設(shè)計(jì)。為了模擬傳輸受干擾的狀態(tài),在編碼器生成 CRC 校驗(yàn)碼后,由一個(gè)按鍵控制其中一位數(shù)據(jù)是否發(fā)生改變,然后再將數(shù)據(jù)發(fā)送。以此驗(yàn)證 CRC 編碼在傳輸過程中檢錯(cuò)的特性。該系統(tǒng)是為了實(shí)現(xiàn) CRC 校驗(yàn)的實(shí)時(shí)溫濕度檢測系統(tǒng)。該系統(tǒng)是在4.1 節(jié)簡易 CRC 編解碼驗(yàn)證系統(tǒng)的基礎(chǔ)上改進(jìn)為能夠?qū)崟r(shí)檢測環(huán)境溫濕度的系統(tǒng)。其結(jié)構(gòu)框圖如下:福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)圖 由結(jié)構(gòu)框圖可知,該系統(tǒng)與簡易CRC 編解碼驗(yàn)證系統(tǒng)結(jié)構(gòu)相似,區(qū)別在于將按鍵輸入改為 A/D 溫濕度傳感器,發(fā)送方式改為實(shí)時(shí)發(fā)送,以及一些相應(yīng)改變。實(shí)時(shí)發(fā)送時(shí)需要注意:如果接收到錯(cuò)誤數(shù)據(jù),接收單片機(jī)不能將其傳送給顯示模

35、塊,等待下一次發(fā)送的正確數(shù)據(jù),再將正確數(shù)據(jù)發(fā)送給顯示模塊。4.2.2 A/D溫濕度傳感器設(shè)計(jì)本設(shè)計(jì)采用廣州西博臣科技有限公司的 CHTM02 型 A/D CHR01型濕敏電阻,并可自行選配熱敏電阻。響應(yīng)速度快,耐水性好,可靠性高,一致性好,濕表 圖基于單片機(jī)的 CRC編解碼的實(shí)現(xiàn)由表 4-3可知,濕敏電阻 H-V輸出呈線性。本設(shè)計(jì)測量溫度范圍為 0至 40 ,而熱敏電阻 T-V輸出在該范圍內(nèi)呈非線性,而單片機(jī)是無法識(shí)別非線性數(shù)據(jù)的。由于非線性的 T-V曲線在測試范圍內(nèi)局部上近似線性,故可采用折線法的方法:將曲線轉(zhuǎn)化為多段直線。通過觀察可發(fā)現(xiàn)曲線可在 0至 8和 9至 40取兩條直線。PIC16

36、f877A單片機(jī)的 A/D轉(zhuǎn)換模塊有 8路的模擬信號(hào)采集通道,它們可采集0V至 5V的模擬電壓,然后量化成1024級(jí),并以10級(jí)的二進(jìn)制即 0 x000至 0 x3FF編碼,最后保存在和 ADRESL這兩個(gè)寄存器中。ADRESH保存 A/D結(jié)果的高 2位, ADRESL保存余下低 8下面具體介紹第步中處理數(shù)據(jù)方法:如前文所述,最后得到的數(shù)字信號(hào)數(shù)據(jù)中,濕度數(shù)據(jù)成線性,溫度線段由折現(xiàn)法亦可轉(zhuǎn)化為線性數(shù)數(shù)據(jù),所以采用線性變換方法:若被測量的變換范圍為A A (即傳感器的測量下限為A ,上限為A 0m0m值為A ;而A 對應(yīng)的數(shù)字量為N ,A 對應(yīng)的數(shù)字量為N ,A 對應(yīng)的數(shù)字量為N 。x0mmxx

37、xm0 x0m00A =A (N -N (N -N )xmx0m0由于 PIC16F877A沒有除法指令,執(zhí)行除法運(yùn)算實(shí)際上編譯工具調(diào)用了移位方法的除法子程序,效率非常低。所以可以用另外一種算法:kkkWhile(N 大于N )0 xkxk這種算法的執(zhí)行只使用了單片機(jī)的加法器,大大加快單片機(jī)的運(yùn)算速度。但該算法不適用于精度要求非常高的運(yùn)算。由此便得到到處理數(shù)字信號(hào)將數(shù)字信號(hào)轉(zhuǎn)換為實(shí)際測量值福州大學(xué)至誠學(xué)院本科生畢業(yè)設(shè)計(jì)(論文)本系統(tǒng)編解碼單片機(jī)設(shè)計(jì)與簡易 CRC編解碼驗(yàn)證系統(tǒng)相似,由于該系統(tǒng)的實(shí)時(shí)性,故在對收發(fā)單片機(jī)設(shè)計(jì)時(shí)需要改動(dòng),本小節(jié)特別說明:但不是每時(shí)每刻的數(shù)據(jù)都需要采集因?yàn)榻邮芏艘恢碧?/p>

38、于接受待命狀態(tài),只要有數(shù)據(jù)傳入就進(jìn)行處理。而單片機(jī)工作速度極快,會(huì)使人無法看清顯示模塊上的數(shù)據(jù)。此外顯示模塊工作也需要時(shí)間,綜合以上考慮,需在一組數(shù)據(jù)處理完后經(jīng)過一段延時(shí)再發(fā)送數(shù)據(jù)。原先在簡易驗(yàn)證系統(tǒng)中的實(shí)現(xiàn)編碼允許功能的按鍵,在這里的功能也相應(yīng)改變?yōu)樵试S連續(xù)監(jiān)測功能。接收單片機(jī):由于發(fā)送端是將數(shù)據(jù)連續(xù)不斷地發(fā)送過來。這就要求在顯示時(shí)要處理好顯示刷新問題。顯示模塊如圖所示:圖 圖 4-10中“humid: %” T: ” CRCCRC值。在顯示時(shí)是固定不變的,而在它們之后是不斷變化的數(shù)據(jù)。這就要求在編寫程序時(shí)要先刷新一次固定不變的量,并在之后保持它們不變。在此之后的每次刷新都只去刷新變化量的值。當(dāng)接收單片機(jī)接收信息,通過計(jì)算發(fā)現(xiàn)其為錯(cuò)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論