导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→初学者:向您请教格雷码转二进制的问题[catb]

 *第8217篇: 初学者:向您请教格雷码转二进制的问题

  
楼 主:catb 2003年2月17日15:04
 初学者:向您请教格雷码转二进制的问题
将多转型绝对型旋转编码器的格雷码转成二进制,格雷码共25位其中12位为圈数,13位为位
置,我用的是51的8位机套用CRAY子程序感觉数据不对,所以想请教各位大侠该如何转换。
catb888@163.com
  
2楼:Kuang-chingTsui 2003年2月17日15:14
 格雷码属于无权编码
据我所知,格雷码属于无权编码,如果用查表法转换可能比较容易,而且表的体积也不大。
  
3楼:catb 2003年2月17日20:58
 格雷码
查表法转换可能比较容易,但是25位的格雷码要列出表去查,光表占用多少字节,实现起来
不容易吧?
  
4楼:Kuang-chingTsui 2003年2月18日21:10
 一个非常容易的方法
到c51bbs去找,我刚刚看到的,一个非常容易的方法。(注:多翻几页)
  
5楼:tm1300 2003年2月17日18:06
 建议
你可以到C51BBS上请教"liu1234",他比较清楚,呵呵。他给我讲过了,格雷码和二进制之
间很简单的对应关系,可是我忘了,抱歉!
  
6楼:catb 2003年2月18日20:12
 谢谢上面两位,还有高手的见解吗?
  
7楼:白莲 2003年2月19日09:02
 非权二进制码
在格雷码(有时叫做循环码)中,当从一个状态计数到下一个状态时,只改变一个数字的
值。与二进制的对应关系:
二进制          格雷码         十进制
0000            0000             0
0001            0001             1   
0010            0011             2  
0011            0010             3  
0100            0110             4      
0101            1110             5      
0110            1010             6
0111            1011             7
1000            1001             8  
1001            1000             9
从此对应关系来看,你的问题不难解决。
  
8楼:tm1300 2003年2月19日18:49
 呵呵,照你这么写,我随便写一个数,你能立刻说出它的格雷码吗?
  
9楼:白莲 2003年2月20日09:20
 你不要在这傻笑,如果照我写的不行,那么照你写一个来给大家看看!
  
10楼:tm1300 2003年2月20日10:10
 好,那我写255,511,1023等等,可以立刻写出格雷码吗?
呵呵,别误会,不是想消遣你,只是讨论而已:)
  
11楼:guest 2004年9月29日09:04
 格雷码是怎么转换的?当我们运算的时候!!
格雷码是怎么转换的?当我们运算的时候!!!!!!!怎么变换的??

  
12楼:tm1300 2003年2月20日11:29
 谢谢!
  
13楼:catb 2003年2月19日19:47
 格雷码的问题
首先感谢您,但是如果是8位的格雷码倒好办我有现成的转换子程序,超过8位我就觉得有困
难了,比如说‘203H’格雷码该如何转换?
  
14楼:白莲 2003年2月20日09:48
 请看。。。。。
(1)格雷碼為無權值碼,不適合做運算。
(2)是一種最小變化碼,其最主要特性是任意相鄰兩數,只有一個Bit改變,因此,適合做資
料傳輸、類比/數位轉換、輸出入裝置等。
(3)具有上下反射性,所以又稱為反射數碼

(4)二進碼轉換成格雷碼:

        1.二進碼之MSB即為格雷碼之MSB。

        2.二進碼之MSB起,兩兩Bit做互斥運算,即是相對應之格雷碼。

例 :    求27(D)之格雷碼

解:    27(D) = 1 1 0 1 1 B
          1  1  0  1  1  B
方法:先将低俩位进行异或,11异或得0,再01异或得1,再10异或得1,再11异或得0,然后
高位照写,结果为:10110(GRAY)。

          

    (5)格雷碼轉換成二進碼:

        1.格雷碼之MSB,即為二進碼的MSB。

        2.二進碼的MSB與格雷碼的次高Bit做互斥運算,其結果即是二進碼的次高Bit,以
此方式進行運算即可。

例 2:    將 1 1 0 1 0 1 (Gray)轉換成二進碼

解:       110101(G)=100110(B)

你的格雷码:203(G)=1100000010(G)转换为二进制为:10 0000 0011(B)
不明白再说。
 

 

 
 

  
15楼:upswjj 2005年10月7日15:53
 最优解 大家顶一下

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

中国科学院光电技术研究所 游志宇

示例工程下载

  在精确定位控制系统中,为了提高控制精度,准确测量控制对象的位置是十分重要的。目前,检测位置的办法有两种:其一是使用位置传感器,测量到的位移量由变送器经a/d转换成数字量送至系统进行进一步处理。此方法精度高,但在多路、长距离位置监控系统中,由于其成本昂贵,安装困难,因此并不实用;其二是采用光电轴角编码器进行精确位置控制。光电轴角编码器根据其刻度方法及信号输出形式,可分为增量式、绝对式以及混合式三种。而绝对式编码器是直接输出数字量的传感器,它是利用自然二进制或循环二进制(格雷码)方式进行光电转换的,编码的设计一般是采用自然二进制码、循环二进制码、二进制补码等。特点是不要计数器,在转轴的任意位置都可读出一个固定的与位置相对应的数字码;抗干扰能力强,没用累积误差;电源切断后位置信息不会丢失,但分辨率是由二进制的位数决定的,根据不同的精度要求,可以选择不同的分辨率即位数。目前有10位、11位、12位、13位、14位或更高位等多种。
  其中采用循环二进制编码的绝对式编码器,其输出信号是一种数字排序,不是权重码,每一位没有确定的大小,不能直接进行比较大小和算术运算,也不能直接转换成其他信号,要经过一次码变换,变成自然二进制码,在由上位机读取以实现相应的控制。而在码制变换中有不同的处理方式,本文着重介绍二进制格雷码与自然二进制码的互换。 

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

  在数字系统中只能识别0和1,各种数据要转换为二进制代码才能进行处理,格雷码是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。格雷码属于可靠性编码,是一种错误最小化的编码方式,因为,自然二进制码可以直接由数/模转换器转换成模拟信号,但某些情况,例如从十进制的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函数。

 

  
16楼:wujinlei 2005年10月8日18:47
 格雷码与二进制码的关系就是一个“异或”的
格雷码与二进制码的关系就是一个“异或”的关系
  
17楼:小豆丁 2008年7月16日20:34
 000
??
  
18楼:achillowy 2009年3月9日10:57
 看看这个 比较简单的
注 由二进制数转换为格雷码:从右到左检查,如果某一数字左边是0,该数字不变;如果是1,该数字改变(0变为1,1变为0)。例,二进制数11011的格雷码是10110.

  由格雷码表示变为二进制数:从右到左检查,如果某一数字的左边数字和是偶数,该数字不变;如果是奇数,该数字改变。

  例 格雷码11011表示为二进制数是10010.

  以上可以用口诀帮助记忆:2G一改零不改,G2奇变偶不变。


>>>>>>对该主题发表你的看法

本主题贴数18,分页: [第1页]


[上一篇主题]:硬件:各位帮帮忙!

[下一篇主题]:初学者:请问各位大侠,如何调节8019发送接收部分是否正确,在协议还没加入前???