一 : step7中bcd码和十六进制数
BCD码(Binary-Coded Decimal?6?0)是二进制编码的十进制数的缩写,BCD码用4位二进制数表示一位十进制数。BCD码各位的数值范围为2#0000~2#1001,对应于十进制数0~9。BCD码不能使用十六进制的A~F(2#1010~2#1111)这六个数字。BCD码本质上是十进制数,因此相邻两位逢十进一。
BCD码的最高位二进制数是符号位,负数的符号位为1,正数为0。16位BCD码的范围为–999~+999。
下图的拨码开关将显示的数字转换为4位二进制数。plc用十二个数字量输入点读取的是3位BCD码,它的值为2#1000 0010 1001,即十六进制数16#829。
BCD码没有单独的表示方法,而是借用了十六进制的表示方法,因此二者很容易混淆。
下图是S7-300/400的BCD码和整数的相互转换指令,可以看到在指令中BCD码均用十六进制的形式表示。
在程序中,怎么知道1个数字是BCD码还是十六进制数呢?
1)看数据的来源和用途。BCD码一般用于输入和输出,例如来自拨码开关的数据是BCD码,送给显示电梯楼层的译码器芯片的是BCD码。
2)看手册的规定,例如数据类型DATE_AND_TIME中的日期和时间值是BCD码,计数器的预设值PV和当前计数值CV(www.61k.com)_BCD为BCD码。
怎样监视BCD码?
在变量表和程序状态监控中,用十六进制格式监视BCD码。
怎样输入BCD码?
从上图可以看出,BCD码用十六进制格式输入,其最高位(符号位)为16#F(2#1111)。BCD码的低3位各位只能是0~9,如果是16#A~16#F则会出错。
计数器的预设值PV是0~999的BCD码,可以用格式为C#的常数(C#1~C#999)作为计数器的预设值。
下图用MW42提供计数器的预设值PV,如果用MOVE指令将十进制数348(对应的十六进制数为16#15C)传送给MW42,进入RUN模式时,操作系统将它转换为BCD码时出错(16#15C不是BCD码),不能切换到RUN模式。
输入预设值348时,应改为将C#348传送给MW42,它会自动地变为W#16#348,当然也可以直接输入16#348。没有必要用I_BCD指令将348转换为BCD码W#16#348后,再传送给MW42。
在看手册时说BCD码和16进制都可以用16#表示如果现在装载1个数<BR> L 16#296 如果是BCD码表示十进制296<BR> 如果是十六进制表示十进制663<BR> 系统是怎样区分那个数是BCD码还是十六进制的。
1. BCD 码是用2进制表示的十进制数,如果从最右端每4位转换成16进制数,则BCD 码也可以表示成16进制,例如:
16#123 , 转换成二进制应该是 2#0000 0001 0010 0011
2. 系统是怎样区分那个数是BCD码还是十六进制的。
这取决于使用的指令。例如: STEP7 中S5 定时器中的设定值,就是BCD数,而不是16进制数。
指令的规定与设计在最初一旦被定下来之后,就不能再修改。例如同样是定时器, 在GE 90-30 的PLC 中,它的设定值就是10进制数,而不是16进制数。
3 . 在每1个指令中都有使用的数据类型的规定。在那里,你就知道该使用16进制数还是BCD码了, 先列表如下:
WORD 可以是2进制数,或者16进制数,或者BCD码。
DWORD 可以是2进制数,或者16进制数,或者10进制数。
然而,
INT , DINT 只能是10进制数或者16进制数。
参考出处:
STEP7 中的帮助,在索引项的"输入要查找的关键字"中输入: INT
PLC本身是不用区分的,我觉得在通讯的时候比较有用到;比如上位机采集200的时间的时候,200提供的是BCD码的时间;而上位机跟200对时的时候也需要给200BCD码的时间。主要还是编程的时候,处于省时省力的考虑吧。
二 : Arduino-数码管和LED显示十六进制数
这个实验更麻烦,因为要将电位器采样值map到0~255后以16进制显示,其中高位用数码管显示,低位用4个LED显示(4位二进制)。
这里主要学习了表格的使用方法。第一个参数是行数,第二个参数是列数。如果点亮数字“5”的话,则要让table1中的第五行从右向左分别为a~h段输出,让b,e和h段不亮。
另一个要点为把十进制的数(0~255)变成十六进制的数,分别取高低位进行显示,变成两位十六进制数。将该数右移4位(8位二进制数右移4位,左边填0,即取高4位的值);再将二进制数“00001111”进行“与”运算,(即取低4位的值)。
程序如下:
#include
#define LED1 9
#define LED2 10
#define LED3 11
#define LED4 12
#define SEG_a 2 //IO命名
#define SEG_b 3
#define SEG_c 4
#define SEG_d 5
#define SEG_e 6
#define SEG_f 7
#define SEG_g 8
#define Pot A0
byte i;
byte a;
byte b;
int PotBuffer = 0;
//数码管0-9数字码值
unsigned char table1[16][8] =//表格1,16行8列
{
//hgfedcba
{0, 0, 1, 1, 1, 1, 1, 1}, //0
{0, 0, 0, 0, 0, 1, 1, 0}, //1
{0, 1, 0, 1, 1, 0, 1, 1}, //2
{0, 1, 0, 0, 1, 1, 1, 1}, //3
{0, 1, 1, 0, 0, 1, 1, 0}, //4
{0, 1, 1, 0, 1, 1, 0, 1}, //5
{0, 1, 1, 1, 1, 1, 0, 1}, //6
{0, 0, 0, 0, 0, 1, 1, 1}, //7
{0, 1, 1, 1, 1, 1, 1, 1}, //8
{0, 1, 1, 0, 1, 1, 1, 1}, //9
{0, 1, 1, 1, 0, 1, 1, 1},//A
{0, 1, 1, 1, 1, 1, 0, 0},
{0, 0, 1, 1, 1, 0, 0, 1},
{0, 1, 0, 1, 1, 1, 1, 0},
{0, 1, 1, 1, 1, 0, 0, 1},
{0, 1, 1, 1, 0, 0, 0, 1}//F
};
unsigned char table2[16][4] =//表格2,16行4列
{
//8421
{ 0,0, 0,0}, //0
{ 0,0, 0,1}, //1
{ 0,0, 1,0}, //2
{ 0,0, 1,1}, //3
{ 0,1, 0,0}, //4
{ 0,1, 0,1}, //5
{ 0,1, 1,0}, //6
{ 0,1, 1,1}, //7
{ 1,0, 0,0}, //8
{ 1,0, 0,1}, //9
{ 1,0, 1,0}, //A
{ 1,0, 1,1}, //B
{ 1,1, 0,0}, //C
{ 1,1, 0,1}, //D
{ 1,1, 1,0}, //E
{ 1,1, 1,1}//F
} ;
void setup()
{
pinMode(SEG_a,OUTPUT); //设置引脚为输出
pinMode(SEG_b,OUTPUT);
pinMode(SEG_c,OUTPUT);
pinMode(SEG_d,OUTPUT);
pinMode(SEG_e,OUTPUT);
pinMode(SEG_f,OUTPUT);
pinMode(SEG_g,OUTPUT);
扩展:arduino 十六进制 / arduino 十六进制转换 / arduino 串口十六进制
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
pinMode(LED4,OUTPUT);
}
void loop()
{
PotBuffer = analogRead(Pot); //读取AD值
i = map(PotBuffer, 0, 1023, 0, 255);
a = i >> 4;//a=v右移4位(8位二进制数右移4位,左边填0,即取高4位的值)
b = i & 0b1111;//v和二进制数“00001111”进行“与”运算,即取低4位的值)
digitalWrite(SEG_a,table1[a][7]); //数码管段a的输出
digitalWrite(SEG_b,table1[a][6]);
digitalWrite(SEG_c,table1[a][5]);
digitalWrite(SEG_d,table1[a][4]);
digitalWrite(SEG_e,table1[a][3]);
digitalWrite(SEG_f,table1[a][2]);
digitalWrite(SEG_g,table1[a][1]); //数码管段g的输出
digitalWrite(LED4,table2[b][3]);// LED4(bit0)的输出
digitalWrite(LED3,table2[b][2]);
digitalWrite(LED2,table2[b][1]);
digitalWrite(LED1,table2[b][0]); // LED1(bit3)的输出
delay(50);
}
测试视频(为了显示精确,用了一个多圈电位器):
扩展:arduino 十六进制 / arduino 十六进制转换 / arduino 串口十六进制
三 : BCD码写的最大十进制数是9999最大十六进制数也是9999
BCD码的最大值是9999,因为1个字十六个位,每4个为代表1个十进制的数;
1001100110011001:对应的就是9999,最大值
以上的二进制数,在十六进制里的表示也是16#9999,但是它十进制值不是9999,而是39321
1个字节的十六进制数最大值是:FFFF
9999十进制转换为十六进制数是270F没有错,这里9999不是BCD码,而是十进制的1个数值;数据在plc都是以二进制的形式存储的,格式上的不同,它的所表示的数也不同,比如某个数据时以BCD码的格式存储的,那么你要显示成十进制,就要进行转换,否者数值是不对的。以系统时钟为例,读取后的时间值是以BCD码存储的,假如取今年的年份,那么这个字节对应的BCD码就是,00010101对应BCD码的值为15,但是系统显示的是十进制数,是21;所以要经过转化;
///我的理解是,BCD是1种数据的存储格式,这数据可以被用到别的数据场合,那么它表示的意思就不同了。
BCD码(Binary-Coded Decimal)是二进制编码的十进制数的缩写,BCD码用4位二进制数表示一位十进制数。BCD码各位的数值范围为2#0000~2#1001,对应于十进制数0~9。BCD码不能使用十六进制的A~F(2#1010~2#1111)这六个数字。BCD码本质上是十进制数,因此相邻两位逢十进一。
BCD码的最高位二进制数是符号位,负数的符号位为1,正数为0。16位BCD码的范围为–999~+999。
下图的拨码开关将显示的数字转换为4位二进制数。PLC用十二个数字量输入点读取的是3位BCD码,它的值为2#1000 0010 1001,即十六进制数16#829。
BCD码没有单独的表示方法,而是借用了十六进制的表示方法,因此二者很容易混淆。
下图是S7-300/400的BCD码和整数的相互转换指令,可以看到在指令中BCD码均用十六进制的形式表示。
在程序中,怎么知道1个数字是BCD码还是十六进制数呢?
1)看数据的来源和用途。BCD码一般用于输入和输出,例如来自拨码开关的数据是BCD码,送给显示电梯楼层的译码器芯片的是BCD码。
2)看手册的规定,例如数据类型DATE_AND_TIME中的日期和时间值是BCD码,计数器的预设值PV和当前计数值CV_BCD为BCD码。
怎样监视BCD码?
在变量表和程序状态监控中,用十六进制格式监视BCD码。
怎样输入BCD码?
从上图可以看出,BCD码用十六进制格式输入,其最高位(符号位)为16#F(2#1111)。BCD码的低3位各位只能是0~9,如果是16#A~16#F则会出错。
计数器的预设值PV是0~999的BCD码,可以用格式为C#的常数(C#1~C#999)作为计数器的预设值。
下图用MW42提供计数器的预设值PV,如果用MOVE指令将十进制数348(对应的十六进制数为16#15C(www.61k.com])传送给MW42,进入RUN模式时,操作系统将它转换为BCD码时出错(16#15C不是BCD码),不能切换到RUN模式。
输入预设值348时,应改为将C#348传送给MW42,它会自动地变为W#16#348,当然也可以直接输入16#348。没有必要用I_BCD指令将348转换为BCD码W#16#348后,再传送给MW42。
四 : BCD码与二进制的区别
当用来表示十进制数字0——9时,用二进制代码与8421BCD代码完全相同。[www.61k.com)而当表示的十进制数字大于9时,用二进制代码与8421BCD代码表达就完全不同了。用二进制表示就是二进制数字安权重
求和,其值为十进制数字;用8421BCD代码则是每一位十进制数字都用4位8421BCD代码表示。如十进制数字15,转化为二进制为1111;用8421BCD码表示为0001 0101。
五 : 请问一下这段话怎么理解啊."十进制数25D,表示为压缩BCD码时为25H;
请问一下这段话怎么理解啊."十进制数25D,表示为压缩BCD码时为25H;
表示为非压缩BCD码时要占用两个字节".25H转化为十进制不是5+25*16吗?0205H转化为十进制不是2*16*16+5吗?
上面打错了 应该是这样"十进制数25D,表示为压缩BCD码时为25H;表示为非压缩制BCD码时要占用两个字节0205H"
请问一下这段话怎么理解啊."十进制数25D,表示为压缩BCD码时为25H;的参考答案
压缩BCD码是用4位二进制数0000—1001,表示十进制中的一位数字,标准非压缩BCD码是用0000 0000—0000 1001表示十进制中的一位数字.十进制数是一位一位的表示成BCD码.
题中25D,十位数字为2,压缩BCD码表示为0010B;个位数字为5,压缩BCD码表示为0101B,所以25D的BCD为0010 ****B=25H.
十位数字为2,标准非压缩BCD码表示为0000 0010B;个位数字为5,压缩BCD码表示为0000 0101B,所以25D的BCD为0000 0010 **** 0101B=0205H.
BCD码是按一位一位的表示成十进制数.
不明白,追问.
本文标题:
bcd码和十六进制-step7中bcd码和十六进制数 本文地址:
http://www.61k.com/1084565.html