Ⅰ 单片机补码问题
你的追问的图片中的表示:1111 1111表示-7FH,那是原码的表示形式,最高位表示负号,低7位表示值,原码表示只是说明最高位是符号位,但是不实用,因为正负数相加不为0,就你的疑问的正7FH+(-7FH)并不是0,这不符合数学的计算规则,只是一种方法,不好用。
而用补码表示正负数即能用最高位表示符号,又符合数学规则。虽然补码的低7位表示数值,但并不等于将最高位的负号位去掉的数值,你图中的1111 1111并不是-7FH的补码,而是-1。-7FH是-127,而-127的补码是1000 0001。计算补码的值有个最好的方法,就是正负数相加为0,这么表示[正数]补+[负数]补=0,
这样;1111 1111+0000 0001=0,进位丢掉,即[-1]补+[+1]补=0,则1111 1111是-1的补码。
负数补码最小数是1000 0000,这是-128,这不能用[正数]补+[负数]补=0计算了。(其余都是对的。)
它的绝对值就要取反加1来计算了,取反是7FH,即127+1=128,则80H表示-128。
Ⅱ 单片机中的ADC是什么意思作用是什么
ADC即模拟数字转换器(英语:Analog-to-digital converter)是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。一个模拟数字转换器可以提供信号用于测量仿判。与之相对的设备成为数字模拟转换器。
ADC的作用是将连续变化的模拟信号转换为离散的数字信号。真实世界的模拟信号,例如温度、压激哪力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。
(上图为ADC针脚排布)
扩展备铅改资料:
ADC模拟数字转换器:
典型的模拟数字转换器将模拟信号转换为表示一定比例电压值的数字信号。然而,有一些模拟数字转换器并非纯的电子设备,例如旋转编码器,也可以被视为模拟数字转换器。
数字信号输出可能会使用不同的编码结构。通常会使用二进制二补数(也称作“补码”)进行表示,但也有其他情况,例如有的设备使用格雷码(一种循环码)。
参考资料来源:
网络-ADC
Ⅲ 为什么单片机中CJNE,JNB,JB这几条指令可实现的转移范围是负的128到127
单片机跳转指令解析
控制转移类指令
条件转移指令Jcc根据指定的条件确定程序是否发生转移。如果满足条件则程序转移到目标地址去执行程序;不满足条件,则程序将顺序执行下一条指令。
其通用格式为:
Jcc LABEL ;条件满足,发生转移:IP?IP+8位位移量
;否则,顺序执行:IP?IP+2 其中,LABEL表示目标地址(8位位移量)。因为Jcc指令为2个字节,所以顺序执行就是指令偏移指针IP加2。条件转移指令跳转的目标地址只能用前面介绍的段内短距离跳转(短转移),即目标地址只能是在同一段内,且在当前IP地址-128~+127个单元的范围之内。这种寻址方式由于是相对于当前IP 的,所以被称为相对寻址方式。条件转移指令不影响标志,但要利用标志。条件转移指令Jcc中的cc表示利用标志判断的条件,共16种。如下图:
1、判断单个标志位状态
这组指令单独判断5个状态标志之一,根据某一个状态标志是0或1决定是否跳转。
(1)JZ/JE和JNZ/JNE利用零标志ZF,判断结果是否为零(或相等)
JE指令(相等时转移)
JZ指令(等于0时转移)
这是当ZF=1时转移到目标地址的条件转移指令的两种助记符。这条指令既适用于判断无符号数的相等,又适用于判断带符号数的相等。
JNE指令(不相等转移)
JNZ指令(不等于0转移)
这是当ZF=0时能转移到目标地址的条件转移指令的两种助记符。这条指令也是既适用于判断无符号数,又适用于判断带符号数。
(2)JS和JNS利用符号标志SF,判断结果是正是负。
JS指令(为负转移)——当满足SF=1时,转移到目标地址
JNS指令(为正转移)——满足SF=0时,转移到目标地址
(3)JO和JNO利用溢出标志,判断结果是否产生溢出
JO指令(溢出转移)——OF=1时,转移到目标地址 JNO指令(未溢出转移)——OF=0时,转移到目标地址
(4)JP/JPE和JNP/JPO利用奇偶标志PF,判断结果中“1”的个数是偶是奇
JP/JPE指令(为偶转移)——满足PF=1时转移 JNP/JPO指令(为奇转移)——满足PF=0时转移 数据通讯为了可靠常要进行校验。常用的校验方法是奇偶校验,即把字符ASCII码的最高位用作校验位,是包括校验位在内的字符中为“1”的个数恒为奇数(奇校验),或恒为偶数(偶校验)。若采用奇校验,在字符ASCII中为“1”的个数已为奇数时,则令其最高位为“0”;否则令最高位为“1”。
(5)JC/JB/JNAE和JNC/JNB/JAE,利用进位标志CF,判断结果是否进位或借位,CF标志是比较常用的一个标志。 JC——满足CF=1时转移 JNC——满足CF=0时转移
JB(低于转移) JNB(不低于转移) JNAE(不高于等于转移) JAE(高于等于转移) 2、用于比较无符号数高低为区别有符号数的大小,无符号数的大小用高(Above)、低(Below)表示,它需要利用CF确定高低、利用ZF标志确定相等(Equal)。两数的高低分成4种关系:低于(不高于等于)、不低于(高于等于)、低于等于(不高于)、不低于等于(高于);也就分别对应4条指令:JB(JNAE)、 JNB(JAE)、JBE(JNA)、JNBE(JA)。 JA/JNBE
JA即高于转移,JNBE即不低于且不等于转移,高于则没有进位产生,即CF=0,不等于则ZF=0,所以这两条指令满足CF=0且ZF=0时转移
JAE/JNB
高于或等于转移/不低于转移是当CF=0(高于就不产生进位)或ZF=1(等于)时转移。
JB/JNAE
即低于/不高于且不等于转移,是当CF=1(产生借位)且ZF=0(不相等)时转移。
JBE/JNA
即低于或等于/不高于转移,是当CF=1(借位产生)或ZF=1(相等)时转移。
3、用于比较有符号数大小
判断有符号数的大(Greater)、小(Less),需要组合OF、SF标志、并利用ZF标志确定相等与否。两数的大小分成4种关系:小于(不大于等于)、不小于(大于或等于)、小于等于(不大于)、不小于等于(大于);也就分别对应4条指令:JL(JNGE)、JNL(JGE)、JLE(JNG)、 JNLE(JG)。
由上可见,条件转移指令之前常有CMP、TEST、加减运算、逻辑运算等影响标志的指令,利用这些指令执行后的标志或其组合状态形成条件。
JG/JNLE
大于/不小于且不等于转移,是当标志SF与OF同号(即<SF异或OF>=0)且ZF=0时转移
JGE/JNL大于或等于/不小于转移,是当标志SF与OF同号(即<SF异或OF>=0)或ZF=0时转移
JL/JNGL
小于/不大于也不等于时转移,是当标志SF与OF异号(即<SF异或OF>=1)且ZF=0时转移
JLE/LNG
小于或等于/不大于转移,是当标志SF与OF异号(即<SF异或OF>=1)或ZF=1时转移
4、判断计数器CX是否为0
JCXZ LABEL ;CX=0,则转移;否则顺序执行
Ⅳ 在单片机中,什么是补码最好能给出定义和例子,谢谢
补码,是正负数存入计算机时的一种形式。
利用补码,就可把减法,转换成加法。
利用补码,目的是减小硬件的复杂性。
补码,并不难理解,只是被计算机砖家搞乱了概念。
其实,小学生,都知道下面这些常识:
钟表,倒拨 1 小时,可以用正拨 11 小时来代替。
倒拨 20 分,可以用正拨 40 分来代替。
-π/2 处的三角函数,与+3π/4 处的函数值相同。
在两位十进制数的条件下,减一,可以用+99 代替。
如:24-1=2324+99=(1) 23。
在上面所说的,就是“补数”的概念。
为了求补数,还要知道一个“周期”,也可称为“模”。
-------
在计算机中,没有数字,都是二进制代码。
补数,也就改称为“补码”了。
八位二进制是一个字节。范围是:0000 0000~1111 1111。
写成十进制,就是 0~255,周期,就是 256。
-1,其补码就是 256-1=255=1111 1111。
-2,其补码就是 256-2=254=1111 1110。
-3,其补码就是 256-3=253=1111 1101。
... ...
-128,其补码就是 256-128=128=1000 0000。
-------
补码的定义式:
正数的补码 = 该数字本身。
负数的补码 = 模+这个负数。
-------
补码的应用:
6-2=4,用补码计算如下:
0000 0110
+1111 1110
----------
(1) 0000 0100
进位的 1,舍弃即可。
Ⅳ 对于ov表示有符号数的溢出,为什么采用C6⊕C7的方法标记
首先,你要知道在单片机里面的加减运算都是以补码形式进行的,补码就是:正数的补码不变,负数取反加1。八位数,第一位用来表示符号位,一般是0表示正数,1表示正数,求补码的时候符号位是不能变的。
举个例子:1111 1111 如果是有符号数的原码,它的补码就是1000 0001 ,这个数实际上是-127。再举个例子1000 0000 如果是有符号数,表示多少呢,你可能会说是﹣0,那0000 0000 也是表示0啊,你发现问题了没有,所以规定1000 0000 为-128的补码,如果让你写出-128的八位原码,你是写不出来的!!
好的,讲了这么多就是为了后面的运算做铺垫。另C6为D6位向D7位的进位或借位,C7为D7向C的进位或借位。八位数 D7 D6 D5 D4 D3 D2 D1 D0!!!!!!
怎么根据补码来快速判断数,先看第一位, 是0,直接算。是1,就先把后面算出来减去128就好了 哈哈哈啊哈哈啊哈哈哈哈哈哈
八位补码运算,0000 0000 ——0111 1111 是0到127;1000 0000——1111 1111 是-128到-1,好了,现在开始回答你的问题了。什么情况下会溢出呢,当然是结果超出补码的表示范围以后溢出。你来看:
第一种情况两个正数之和大于127,比如64+96 01 000 000+ 01 100 000,此时C6=1,c7=0;我来引导你思考一下,针对两个正数为什么这样设置是正确的,首先,正数的最高位是0,意味着什么啊,意味着两个,正数不管怎么加,c7必为0,而要想c6=1,必然要求两个数之和大于127,你想啊,C6进了一个位到了D7的位置,D7的权重就是128啊啊啊啊啊啊
第二种情况两个负数之和,负数最高位都是1,负数之和小于—128就好溢出,好的,看例子。-64+(-96)=11 000 000 +10 100 000 这时候会溢出,我们来看,C7=1,C6=0,符合;深入思考我们发现C7一定是1的,要想有溢出c6一定是0的。 因为11 000 000+11 000 000=-64+(-64)=-128恰巧不溢出,,,;这是没有溢出,因为都为1。我 们现在只考低7位,1 000 0000 到1 1111 1111 是-128到-1,1 1000 000 是-64 , 规律就 是 你要C6不为1,它就会溢出。1 000 0000 +1 000 0000 溢出。任何C6=1的负数相加都可以这么等效:::11 000 000+11 000 000=-64+(-64)=-128恰巧不溢出,,只有-128 或比-128大的情况出来;;;;11 000 000 ~~~~后面的0若变1这个数是变大了,往-1去接近,懂了没,比较抽象一点。
最后一种情况,一正一负,正减负,负减正;;
正减负01 000 000 -11 000 000=64-(-64)此时会溢出,c7=1
c6=0; 这类里面c7必为1,C6只有正数小于64或负数大于64时才会有C6=1,或里面有好几种情况噢噢噢噢
负减正, 11 000 000 -01 000 000 c7=0 必然的
c6这时候是=0的没有溢出 这是-64-64 故不溢出
规律总结,只有负数小于-64或正数大于64时,c6才为1,注意这个或是很多种情况,你自己去想想,其实这么说不太准确,但我不想一一罗列 了 啊啊啊啊啊,
你怎么提这么个问题,真是复杂,好多东西 都是那么规定的,你就使用就行,很多都是工程上用,工科的搞的太细是不能做大工程的啊,你要注重应用,你又不搞理论 搞不了那么透, 还是陈景润厉害啊,搞理论的人头脑都是不简单的