錯開異或 得結(jié)果 其中采用循環(huán)二進(jìn)制編碼的絕對式編碼器,其輸出信號是一種數(shù)字排序,不是權(quán)重碼,每一位沒有確定的大小,不能直接進(jìn)行比較大小和算術(shù)運算,也不能直接轉(zhuǎn)換成其他信號,要經(jīng)過一次碼變換,變成自然二進(jìn)制碼,在由上位機讀取以實現(xiàn)相應(yīng)的控制。而在碼制變換中有不同的處理方式,本文著重介紹二進(jìn)制格雷碼與自然二進(jìn)制碼的互換。
一、格雷碼(又叫循環(huán)二進(jìn)制碼或反射二進(jìn)制碼)介紹
在數(shù)字系統(tǒng)中只能識別0和1,各種數(shù)據(jù)要轉(zhuǎn)換為二進(jìn)制代碼才能進(jìn)行處理,格雷碼是一種無權(quán)碼,采用絕對編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補碼,它的循環(huán)、單步特性消除了隨機取數(shù)時出現(xiàn)重大誤差的可能,它的反射、自補特性使得求反非常方便。格雷碼屬于可靠性編碼,是一種錯誤最小化的編碼方式,因為,自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,但某些情況,例如從十進(jìn)制的3轉(zhuǎn)換成4時二進(jìn)制碼的每一位都要變,使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它是一種數(shù)字排序系統(tǒng),其中的所有相鄰整數(shù)在它們的數(shù)字表示中只有一個數(shù)字不同。它在任意兩個相鄰的數(shù)之間轉(zhuǎn)換時,只有一個數(shù)位發(fā)生變化。它大大地減少了由一個狀態(tài)到下一個狀態(tài)時邏輯的混淆。另外由于最大數(shù)與最小數(shù)之間也僅一個數(shù)不同,故通常又叫格雷反射碼或循環(huán)碼。下表為幾種自然二進(jìn)制碼與格雷碼的對照表:
十進(jìn)制數(shù) |
自然二進(jìn)制數(shù) |
格雷碼 |
十進(jìn)制數(shù) |
自然二進(jìn)制數(shù) |
格雷碼 |
0 |
0000 |
0000 |
8 |
1000 |
1100 |
1 |
0001 |
0001 |
9 |
1001 |
1101 |
2 |
0010 |
0011 |
10 |
1010 |
1111 |
3 |
0011 |
0010 |
11 |
1011 |
1110 |
4 |
0100 |
0110 |
12 |
1100 |
1010 |
5 |
0101 |
0111 |
13 |
1101 |
1011 |
6 |
0110 |
0101 |
14 |
1110 |
1001 |
7 |
0111 |
0100 |
15 |
1111 |
1000 |
二、二進(jìn)制格雷碼與自然二進(jìn)制碼的互換
1、自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼 自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼,其法則是保留自然二進(jìn)制碼的最高位作為格雷碼的最高位,而次高位格雷碼為二進(jìn)制碼的高位與次高位相異或,而格雷碼其余各位與次高位的求法相類似。
2、二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼 二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼,其法則是保留格雷碼的最高位作為自然二進(jìn)制碼的最高位,而次高位自然二進(jìn)制碼為高位自然二進(jìn)制碼與次高位格雷碼相異或,而自然二進(jìn)制碼的其余各位與次高位自然二進(jìn)制碼的求法相類似。
三、二進(jìn)制格雷碼與自然二進(jìn)制碼互換的實現(xiàn)方法 1、自然二進(jìn)制碼轉(zhuǎn)換成二進(jìn)制格雷碼 A)、軟件實現(xiàn)法(參見示例工程中的 Binary to Gray) 根據(jù)自然二進(jìn)制轉(zhuǎn)換成格雷碼的法則,可以得到以下的代碼:
static unsigned int DecimaltoGray(unsigned int x)
{
return x^(x>>1);
}
//以上代碼實現(xiàn)了unsigned int型數(shù)據(jù)到格雷碼的轉(zhuǎn)換,最高可轉(zhuǎn)換32位自然二進(jìn)制碼,超出32位將溢出。
static int DecimaltoGray( int x)
{
return x^(x>>1);
}
//以上代碼實現(xiàn)了 int型數(shù)據(jù)到格雷碼的轉(zhuǎn)換,最高可轉(zhuǎn)換31位自然二進(jìn)制碼,超出31位將溢出。
上述代碼即可用于VC控制程序中,也可以用于單片機控制程序中。在單片機程序設(shè)計時,若采用匯編語言編程,可以按相同的原理設(shè)計程序;若采用C語言編程,則可以直接利用上述代碼,但建議用unsigned int函數(shù)。
B)、硬件實現(xiàn)法
根據(jù)自然二進(jìn)制轉(zhuǎn)換成格雷碼的法則,可以得到以下電路圖:
上圖所示電路圖即可用異或集成電路74ls136實現(xiàn),也可以利用可編程器件PLD等編程實現(xiàn)。
2、二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼 A)、軟件實現(xiàn)法(參見示例工程中的 Gray to Binary ) 根據(jù)二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼的法則,可以得到以下的三種代碼方式:
· static unsigned int GraytoDecimal(unsigned int x)
· {
· unsigned int y = x;
· while(x>>=1)
· y ^= x;
· return y;
· }
· static unsigned int GraytoDecimal(unsigned int x)
· {
· x^=x>>16;
· x^=x>>8;
· x^=x>>4;
· x^=X>>2;
· x^=x^1;
· return x;
· }
· static unsigned int GraytoDecimal(unsigned int x)
· {
· int i;
· for(i=0;(1<<i)<sizeof(x)*8;i++)
· {
· x^=x>>(1<<i);
· }
· return x;
· }
//以上代碼實現(xiàn)了unsigned int型數(shù)據(jù)到自然二進(jìn)制碼的轉(zhuǎn)換,最高可轉(zhuǎn)換32位格雷碼,超出32位將溢出。將數(shù)據(jù)類型改為int型即可實現(xiàn)31位格雷碼轉(zhuǎn)換。 上述代碼即可用于VC控制程序中,也可以用于單片機控制程序中。在單片機程序設(shè)計時,若采用匯編語言編程,可以按相同的原理設(shè)計程序;若采用C語言編程,則可以直接利用上述代碼,但建議用unsigned int函數(shù)。
B)、硬件實現(xiàn)法 根據(jù)二進(jìn)制格雷碼轉(zhuǎn)換成自然二進(jìn)制碼的法則,可以得到以下電路圖:
上圖所示電路圖即可用異或集成電路74ls136實現(xiàn),也可以利用可編程器件PLD等編程實現(xiàn)。
|