分享

介绍二进制格雷码与自然二进制码的互换

 昵称12483407 2013-05-30

错开异或 得结果
  其中采用循环二进制编码的绝对式编码器,其输出信号是一种数字排序,不是权重码,每一位没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成其他信号,要经过一次码变换,变成自然二进制码,在由上位机读取以实现相应的控制。而在码制变换中有不同的处理方式,本文着重介绍二进制格雷码与自然二进制码的互换。

一、格雷码(又叫循环二进制码或反射二进制码)介绍

  在数字系统中只能识别01,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的3转换成4时二进制码的每一位都要变,使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它是一种数字排序系统,其中的所有相邻整数在它们的数字表示中只有一个数字不同。它在任意两个相邻的数之间转换时,只有一个数位发生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。另外由于最大数与最小数之间也仅一个数不同,故通常又叫格雷反射码或循环码。下表为几种自然二进制码与格雷码的对照表:

十进制数

自然二进制数

格雷码

十进制数

自然二进制数

格雷码

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


二、二进制格雷码与自然二进制码的互换

1
、自然二进制码转换成二进制格雷码
  自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。



2
、二进制格雷码转换成自然二进制码
  二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。



三、二进制格雷码与自然二进制码互换的实现方法
1
、自然二进制码转换成二进制格雷码
  A)
、软件实现法(参见示例工程中的 Binary to Gray)
  
根据自然二进制转换成格雷码的法则,可以得到以下的代码:

      static unsigned int DecimaltoGray(unsigned int x)

      {

         return x^(x>>1);

      }

     

     //以上代码实现了unsigned int型数据到格雷码的转换,最高可转换32位自然二进制码,超出32位将溢出。  

      static  int DecimaltoGray( int x)

      {

         return x^(x>>1);

      }

     

      //以上代码实现了 int型数据到格雷码的转换,最高可转换31位自然二进制码,超出31位将溢出。      

  上述代码即可用于VC控制程序中,也可以用于单片机控制程序中。在单片机程序设计时,若采用汇编语言编程,可以按相同的原理设计程序;若采用C语言编程,则可以直接利用上述代码,但建议用unsigned int函数。

 B)
、硬件实现法

  根据自然二进制转换成格雷码的法则,可以得到以下电路图:



  上图所示电路图即可用异或集成电路74ls136实现,也可以利用可编程器件PLD等编程实现。

2
、二进制格雷码转换成自然二进制码
A)
、软件实现法(参见示例工程中的 Gray to Binary )
  根据二进制格雷码转换成自然二进制码的法则,可以得到以下的三种代码方式:

·             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;

·             }       

  //以上代码实现了unsigned int型数据到自然二进制码的转换,最高可转换32位格雷码,超出32位将溢出。将数据类型改为int型即可实现31位格雷码转换。
  上述代码即可用于VC控制程序中,也可以用于单片机控制程序中。在单片机程序设计时,若采用汇编语言编程,可以按相同的原理设计程序;若采用C语言编程,则可以直接利用上述代码,但建议用unsigned int函数。

B)
、硬件实现法
  根据二进制格雷码转换成自然二进制码的法则,可以得到以下电路图:



上图所示电路图即可用异或集成电路74ls136实现,也可以利用可编程器件PLD等编程实现。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多