单片机原理与应用技术13章习题与思考题Word格式.docx
《单片机原理与应用技术13章习题与思考题Word格式.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用技术13章习题与思考题Word格式.docx(22页珍藏版)》请在冰点文库上搜索。
F43H=15*16^2+4*16^1+3*16^0=3907D
F43H=111101000011B
(3)1001H
1001H=1*16^3+1*16^0=4097D
1001H=1000000000001B
(4)64H
64H=6*16^1+4*16^0=100D
64H=1100100B
1.3完成以下运算
(1)1DH+1D
1DH+1D=1DH+1H=11101B+1B
11101B
+00001B
11110B
∴1DH+1D=11110B=1EH
(2)1BH+1H
1BH+1H=11011B+1B
11011B
11100B
∴1BH+1H=11100B=1CH
(3)1B+1BH
1H+1BH=11011B+1B
∴1H+1BH=11100B=1CH
(4)3A6H+BFH
3A6H+BFH=1110100110B+10111111B
1110100110B
+0010111111B
10001100101B
∴3A6H+BFH=10001100101B=465H=1125D
(5)404H-2FBH
404H–2FBH=10000000100B–1011111011B
10000000100B
-01011111011B
100001001B
∴404H–2FBH=100001001B=109H
(6)3H*4H
3H*4H=11B*100B
100B
*11B
100
1100B
∴3H*4H=1100B=CH
(7)A0H∧B0H
A0H∧B0H=10100000B–10110000B
10100000B
∧10110000B
10100000B
∴A0H∧B0H=10100000B=A0H
(8)C0H∨D0H
C0H∨D0H=11000000B–11010000B
11000000B
∨11010000B
11010000B
(9)∴C0H∨D0H=11010000B=D0H
(10)E0H⊕F0H
E0H⊕F0H=11100000B–11110000B
11100000B
⊕11110000B
00010000B
∴E0H⊕F0H==10000B=10H
1.4用十进制数写出下列补码所表示的机器数真值
48H
[X]补=48H=01001000H
∵符号位为0
∴[X]原=[X]反=[X]补=48H
∴X=72D
7FH
[X]补=7FH=01111111H
∴[X]原=[X]反=[X]补=7FH
∴X=127D
80H
根据补码的定义80H定义为-128的补码,所以80H的真值是-128。
8AH
[X]补=8AH=10001010H
∵符号位为1
∴[X]反=[X]补–1=10001001H
∴[X]原=11110110H
∴X=-118D
9FH
[X]补=9FH=10011111H
∴[X]反=[X]补–1=10011110H
∴[X]原=11100001H
∴X=-97D
A0H
[X]补=A0H=10100000H
∴[X]反=[X]补–1=10011111H
∴[X]原=11100000H
∴X=-96D
FFH
[X]补=FFH=11111111H
∴[X]反=[X]补–1=11111110H
∴[X]原=10000001H
∴X=-1D
1.5选取字长为8位,求下列十进制的原码、反码和补码
X=-45
∵X=-101101B
∴[X]原=10101101B=ADH
∴[X]反=11010010B=D2H
∴[X]补=11010011B=D3H
X=68
∵X=1000100B
∴[X]原=[X]反=[X]补=1000100B=44H
X=-3
∵X=-0011B
∴[X]原=10000011B=83H
∴[X]反=11111100B=FCH
∴[X]补=11111101B=FDH
1.6已知[X]原、[Y]原,,求[X]补+[Y]补,判断结果是否产生溢出
(1)[X]原=18H,[Y]原=2BH
∵[X]原=18H<
80H,[Y]原=2BH<
80H
∴[X]补=[X]反=[X]原=18H=00011000B
[Y]补=[Y]反=[Y]原=2BH=00101011B
00011000B
+00101011B
01000011B
01000011B=43H<
两个正数相加得正数,没有溢出
(2)[X]原=83H,[Y]原=2BH
∵[X]原=83H>
80H,[Y]原=2BH<
∴[X]原=10000011B
[X]反=11111100B
[X]补=11111101B
11111101B
100101000B
00101000B=28H<
一个正数加一个负数得正数,没有溢出
(3)[X]原=18H,[Y]原=BBH
80H,[Y]原=BBH>
[Y]原=10111011B
[Y]反=11000100B
[Y]补=11000101B
+11000101B
11011101B
11011101B=DDH>
一个正数加一个负数得负数没有溢出
(4)[X]原=83H,[Y]原=BBH
80H,[Y]原=BBH>
111000010B
11000010B=C2H>
两个负数相加得负数没有溢出
1.7P18
1.8P20表1-8
1.9P22-26
1.10P25表1-9
1.11P24
1.12P23
1.13P25
1.14P262)20H~2FH的16个单元
1.15P263)30H~7FH的80个单元
1.16P26表1-10
1.17P27~P28
1.18P28
1.19P28
1.20
1.21P25
1.22P23
1.23P30
1.24P32~P33
1.25P33
1.26P32~P35
1.27P34~P35
1.28T=1/fosc=1/8M=0.125*10-6s=125ns
S=2T=250ns
1个机器周期=6S=1.5us
1个指令周期=1~4个机器周期=1.5us~6us
1.29P37~P38
2.9
ORG0000H
LJMPSTART
ORG0100H
START:
LCALLINITIAL;
调用初始化子程序
MOVA,20H;
把字节地址20H单元的内容传给A,A=(20H),(20H)原来的内容保持不变。
执行结果:
A=58H;
(20H)=58H
MOVC,20H;
把位地址为20H的内容传给C,C=(20H),位地址20H单元的内容保持不变。
执行结果:
C=0;
(20H)=1
MOV21H,C;
把C的内容传给位地址21H,(21H)=C,C的内容保持不变。
执行结果:
(21H)=0
把字节地址20H单元的内容传给A,A=(20H),(20H)原来的内容保持不变。
(20)=58H
MOVA,21H;
把字节地址21H单元的内容传给A,A=(21H),(21H)原来的内容保持不变。
A=0AAH;
(21H)=0AAH
LCALLINITIAL
MOVDPL,R0;
对数据指针寄存器DPTR低8位DPL赋值,即将工作寄存器R0的的内容传给DPL,DPL=R0,RO的的内容保持不变,执行结果:
DPL=39HR0=39H
LOOP:
MOVDPH,A;
对数据指针寄存器DPTR高8位DPH赋值,即将寄存器A的的内容传给DPH,DPH=A,A的的内容保持不变,执行结果:
DPH=06HA=06H
DJNZR0,LOOP;
当R0不为0时跳转到LOOP标号所示的地方,直到R0=0时程序往下执行,此语句每执行一次R0=R0-1
INCDPTR;
DPTR加1执行结果:
dptr=063ah
LCALLINITIAL
MOV20H,B;
把寄存器B的的内容赋给字节地址20单元,(20H)=B,寄存器B的的内容保持不变执行结果:
B=0BBH;
(20H)=0BBH
MOVR0,#20H;
把立即数20H赋给工作寄存器R0,R0=20H,执行结果:
R0=20H
XCHDA,@R0;
累加器A的低四位与字节地址20H单元的内容的低四位互换执行结果:
A=0BH;
(20H)=0B6H
RRA;
累加器A右移一位00001011→10000101执行结果:
A=85H
A=0B6H;
MULAB;
执行A*B结果的低8位在A中,高8位在B中执行结果:
A=62H;
B=04H
ANLA,B;
AANLB01100010ANL00000100按位与执行结果:
A=00H;
B=04H
CLRC;
对位寄存器C清0,C=0执行结果:
C=0
ADDA,B;
执行A+B,A=A+B执行结果:
A=04H;
XCHA,21H;
累加器A中的内容与字节地址21H单元中的内容互换执行结果:
(21H)=06H
SUBBA,21H;
累加器A中的内容减去字节地址21H单元中的内容,再减去CY所得的结果送回A执行结果:
A=0A3H;
(21H)=06H
SWAPA;
累加器A的低四位和高四位的内容交换执行结果:
A=3AH;
ORL21H,A;
字节地址21H中的内容和A按位或,结果送回21H单元执行结果:
(21H)=3EH
MOVA,20H
MOVA,21H
;
为了能够看到寄存器里的具体值,现在按照题目要求初始化部分寄存器
INITIAL:
MOVA,#06H;
给寄存器A赋值A=06H
MOVB,#0BBH;
给寄存器B赋值B=0BBH
SETBC;
对位寄存器C进行置位操作,C=1
MOV20H,#58H;
给片内RAM区20H单元赋值(20H)=58H
MOV21H,#0AAH;
MOVR0,#39H;
给工作寄存器R0赋值R0=39H
MOVR1,#8CH;
RET
END
2.10
LCALLSETVALUE;
调用置数子程序
MOVR1,#20H;
取第一个数的地址,存放在R1中
MOVR2,#14H;
设置存储区中的数的个数,存放在R2中
MOVA,@R1;
从20H中读取数据,且传给A
JNBACC.7,POSITIVE;
在补码中最高位为符号位,可以通过此位来判断数的正负,正数此位为0,负数为1.如果为正数跳转到POSTITIVE进行正数处理
DECA;
如果为负数,根据补码计算法则,先减1后取反即可得原码
XRLA,#0FFH;
由于是要求绝对值,所以要对所有位取反
POSITIVE:
MOV@R1,A;
保存计算结果
INCR1;
地址加1,以便取下一个数
DJNZR2,LOOP
SETVALUE:
PUSHPSW;
对程序状态寄存器压栈
PUSH01H;
R0压栈
PUSH02H;
R1压栈
MOVR1,#20H
MOVR2,#14H
MOVA,#79H;
可以修改这个值来验证程序的正确性
LOOPSET:
MOV@R1,A
INCR1
INCA
DJNZR2,LOOPSET
POP02H;
R0出栈
POP01H;
R1出栈
POPPSW;
程序状态寄存器出栈
END
2.11
MOVR0,#20H
MOVR1,#21H
MOVR2,#02H
把21H单元中的内容传给A
RLCA;
A中的内容带C左移1位,即21H单元的中最高位移入C
MOVA,@R0;
把20H单元中的内容传给A
A中的内容带C左移1位,即21H单元的中最高位移入A,20H单元的中最高位移入C
MOV@R0,A;
把A的内容传给20H单元
MOVA,@R1;
A中的内容带C左移1位,即20H单元的中最高位移入A,21H单元的中最高位移入C
MOV@R1,A;
2.12
ORG0000H
LJMPSTART
ORG0100H
MOVA,30H;
从30H中读取要判断的数,把30H单元中的内容传给A
JZZERO;
判断A是否为0,如果为0跳到0程序
JBACC.7,MINUS;
从符号位中判断是否为负数,如果为负数跳转到负数处理程序
DECA;
正数处理程序
LJMPSAVE;
保存结果
ZERO:
MOVA,#01H
LJMPSAVE
MINUS:
INCA
SAVE:
MOV30H,A
SJMP$
END
2.13
ORG0000H
JMPSTART
ORG0100H
MOVR1,#20H;
设置单元首地址
MOVR2,#1EH;
设置循环次数,按题意设置为30
MOV@R1,#00H;
循环清0
SJMP$
2.14
LCALLSETVALUE
设置数据块中的数据首地址
MOVR2,#14H;
设置数据块中的数据个数
MOVR7,#00H;
R7为大于10的个数计数器
MOVA,@R1;
从数据块中取出数据
CLRC;
清进位位
SUBBA,#0AH;
对所取得的数据-10处理
JBACC.7,SMALL;
判断是否为负数,如果为负数就直接认为是小于10
BIG:
INCR7;
如果是大于10则,计数器加1
SMALL:
INCR1;
地址加1以便从数据块中取下下一个数据
DJNZR2,LOOP;
;
ORG0300H
PUSHPSW
PUSH01H
PUSH02H
POP02H
POP01H
POPPSW
2