单片机问题

单片机问题,第1张

1写出下列要求的逻辑指令,要求不得改变未涉及的位的内容。
A、使累加器的低位置“1”。 答: ORL A, #00000001B
B、使累加器的高四位清“0”。 答: ANL A, #00001111B
C、使A2和A3置“1”。 答: ORL A, #00001100B
D、清除A3、A4、A5、A6。 答: ANL A, #10000111B
E、使累加器的高四位取反。 答: XRL A, #11110000B
2写出下列数补码的原码是多少:
A、FFH, B、79H, C、80H, D、00H, E、AAAAH
答:
A、81H, B、79H, C、无原码, D、00H, E、D556H
3设计一个由串行口接收,发带偶校验位的ASCII码数据块的程序,要求波特率为1200
答:条件不足,缺少晶振频率、数据块起始地址及长度。

你可需判断低12位就可以了,高位不管
你可以参考一下我的程序,18B20中的负温度是以补码表示的!!!!!!
/DS18B20程序读取温度/
uchar ReadTemperature(void)
{
uchar a;
uchar b;
uint t=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的 *** 作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar(); //低8位
b=ReadOneChar(); //高8位
t=b;
t<<=8;
t=t|a;
if(t>=2048)//最高位为一说明是个负温
{
t^=0xffff;
dis_buf[0]=17;//在数码管上显示“-”,你可以用一个程序标志位的0,1来表示正温负温
}
else
{
dis_buf[0]=16;
}
t=t>>4;//00625; //数值转换
return((uchar)t);
}

首先得说明的一点,原码、反码、补码都是有符号定点数的表示方法。是吧,没有符号而言就不会出现+0与-0了呀,呵呵。
原码就是这个数本身的二进制形式。
例如:0000001 就是+1 1000001 就是-1
首先要说明的是:正数的反码和补码都是和原码相同的;
还是再重申一下吧
〔1〕原码:这个数本身的二进制形式。 例如十进制的8的原玛就是01000,就是用二进制表示〔2〕反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
〔3〕补码:负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
正数没什么好讲的,就说说负数吧:负数的原码,依旧是一个数本身的二进制形式,也就是说十进制的-8的原码就是11000[注意,第一位1是符号'-'哦];反码呢,将二进制数按位取反,所得的新二进制数称为原二进制数的反码。取反 *** 作指:原为1,变为0;原为0,变为1。(1变0; 0变1),这个简单理解吧。实际上,这样说不够准确,因为我们还要除掉符号位再这样取反。
看好了-8的原码:11000----->-8的反码就是原码除了符号位之后的其他位都按位取反10111
符号位
-8原码 1 1 0 0 0
-8反码 1 0 1 1 1
现在懂什么是原码和反码了吧,我已经尽力了,呵呵。好啦,该补码登场啦。
补码,简单地说就是反码末位〔最后一位〕+1
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
我不知道朋友您看了上面的是否真的懂了,或许还不知道什么叫做”溢出”吧
所谓的溢出就是当我们要表示的数位不够表示了
我们的二进制的位数一般有个具体的范围:
例如一个字节就是8位,超过8位当然就溢出了
以8位为例子,看好啦
符号位
0 1 1 1 1 1 1 1 1
+ 0 1
------------------------------------
0 [1]0 0 0 0 0 0 0 0
[1]表示就是进位没地方放了,怎么说呢,好象在十进制中,我有99个盒子已经装了99对鞋子,当第 100双鞋子没地方放了一样,超出了盒子个数,这样就产生了所谓的溢出了
好,我们再回到上面反码的例子,(别忘记我们是在介绍反码了)
符号位
[ 1 0 0 0 0 0 0 0]补
=〔 1 0 0 0 0 0 0 0]反+1
= 1 1 1 1 1 1 1 1 ------看到反码的取反 *** 作在其中哦,0都变成1
+ 1
----------------------------------
= 1 (1) 0 0 0 0 0 0 0
= 0 0 0 0 0 0 0 0(最高位溢出了,符号位变成了0)
看到符号位也参与了计算一样1+1就变成了0,至于进位的1就丢失了
从而变成了全0
现在我们再来看看,原码 +0 的补码就是:0000 0000〔原因是补码和原玛是一样的〕
原玛 -0 的补码就是:0000 0000
是不是一样了,这样就消除了二异性了,不要说有-0与+0之分了
不知道朋友您是否还会觉得有什么不妥呢????
也许你会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个
原码,反码,补码 都是指二进制的形式,所以十进制的对应码为二进制数,注意负数的符号位,二进制数的码制转换就按照我上面说的啦,看仔细,多想一想,捡几个数做做练习一下,你就会啦,关键是练习。
其实就是这样的,单片机中的也就是计算机中的码制转换,单片机也叫微机嘛,即微型计算机,呵呵

可以用十进制的负数形式表示
举例说明:
定时器方式1时:
TH0
=
-10000/256;
TL0
=
-10000%256;
相当于
TH0
=(65536
-10000)/256;
TL0
=
(65536-10000)%256;
大家都知道计算机中的负数是以补码形式存储的,负数的补码为他的绝对值取反加1,|-10000|=二进制(0010011100010000),反码为1101100011101111,再加1为
补码
1101100011110000,对于有符号数来说最高位为符号位,对于计数器来说显然为无符号数,最高位为数据位,将补码转换为十进制正好
为55536。
这种表示方法往往更简洁,在单片机的编程中经常被应用,我在编程中就经常这样用,可以确认TH0和TLO用十进制的负数形式表示是没有问题的。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13325615.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-15
下一篇 2023-07-15

发表评论

登录后才能评论

评论列表(0条)

保存