← 1.22 已知(A)=7AH,(R0)=30H,(30H)=A5H,PSW=80H。
问执行(单独执行)以下各指令的结果XCH A,R0; A=30H, R0=7AHXCH A,30H; A=A5HXCH A,@R0; A=A5HXCHD A,@R0; A=75H ;二者低4位互换SWAP A; A =A7H;A高低4位互换ADD A, R0; A = AAH, Cy=0, OV=1(a6 a7 =1)ADD A,30H; A= 1FH, Cy=1, OV=0ADD A, A,#30H; A= AAH, Cy=0, OV=1;ADDC A,30H; A= 20H, Cy=1, OV=0; 因为PSW的Cy=1SUBB A,30H; A= D4H, Cy=1, OV=1; 因为PSW的Cy=1SUBB A,#30H; A= 49H, Cy=0, OV=0; 因为PSW的Cy=1← 1.24 已知(A)=83H,(R0)=17H,(17H)=34H。
执行以下指令后A=?ANL A,#17H ; 逻辑与(A)=03HORL 17H,A ;逻辑或(17H)=37HXRL A,@R0 ; 异或(A)=34HCPL A ; 取反(A)= CBH← 1.25 将内部RAM20H、21H、22H,连续三个单元的内容以此放入2FH、2DH、2EH单元MOV R0, #20HMOV R1, #2FHLOOP : MOV A, @R0MOV @R1, AINC R0DEC R1CJNE R0, #23H, LOOPSJMP $← 1.34 外部数据RAM在2000H~2100H区域有一个数据块,将他们移动到3000H~3100H区域解一:MOV DPTR, #2000HMOV P2,#30HMOV R1, #00HLOOP : MOVX A, @DPTRMOV X @R1, AINC DPTRINC R1CJNE R1, #00H, LOOPINC P2MOV X A, @DPTRMOVX @R1, A解二:MOV DPTR, #2000HMOV P2,#30HMOV R1, #00HLOOP : MOV X A, @DPTRMOV X @R1, AINC DPTRINC R1CJNE R1, #00H, LOOPINC P2MOV A, DPHCJNE A,#21H,NEXTNEXT1:MOVX A, @DPTRMOVX @R1, ASJMP $NEXT:INC DPTRSJMP NEXT1解三:MOV DPTR, #2000HMOV R5, #00HMOV A, #00HMOV R1,ALOOP : MOV A,R1MOV X A, @A+DPTRMOV X @R0, AMOV DPTR, #3000HMOV A, @R0MOVX @A+DPTR, AINC R1DJNZ R5, LOOPMOV DPTR, #2100HMOVX A, @DPTRMOV DPTR, #3100HMOVX @DPTR,A1.35 外部数据RAM从2000H开始有100个数据块,将他们移动到2030开始的单元解一:MOV DPTR, #2000H MOV R4,#64HMOV P2,#10H LOOP1: MOVX A, @R1MOV R1, #00H MOVX @DPTR, AMOV R4,#64H INC R1 LOOP : MOVX A, @DPTR INC DPTR MOV X @R1, A DJNZ R4, 64H, LOOP1INC DPTRINC R1DJNZ R4, 64H, LOOPMOV DPTR, #2030HMOV P2,#10HMOV R1, #00H解二:MOV DPTR, #2000H MOV R3,#64HMOV P2,#10H DJNZ R3, LOOPNEXT: MOV R1, #00H SJMP $MOV R4,#64HLOOP : MOV X A, @DPTRMOVX @R1, AINC DPTRINC R1NEXT1: DJNZ R4, LOOPLOOP1:MOV DPTR, #1000HMOV P2,#20HMOV R1, #30H习题参考答案(P.79)习题3. 8051主要的存储空间是什么?为什么两个RAM的空间不同?答:8051单片机的存储空间分为数据RAM和代码ROM,其中数据RAM又分为片内RAM 和片外RAM。
片内RAM的地址为8位,由单片机指令直接在单片机内部寻址访问,而片外RAM的地址为16位,只能由单片机的MOVX指令通过外部总线访问。
习题4. 编一段程序,把8位口新的输入值和前一次的输入值进行比较,然后产生一个8位数。
这个数中的位为“1”的条件是:仅当新输入的位为“0”,而前一次输入的位为“1”。
答:设该8位口为P1,新产生的8位数为x:unsigned char x;x=P1;x&=~P1;习题6. 按给定的存储类型和数据类型,写出下列变量的说明形式:up,down 整数,使用堆栈存储;first,last 浮点数,使用外部数据存储器存储;cc,ch 字符,使用内部数据存储器存储。
答:堆栈只能存储内部RAM字节内容,必须在idata区:(复位后SP=07H,但是07H中存放堆栈地址,上电复位后典型寄存器的值?)int idata up,down;float xdata first,last;char idata cc,ch; 或char data cc,ch;习题7.判断下列关系表达式或逻辑表达式的运算结果(1或0)1、10==9+1; →12、0&&0; →03、10&&8; →14、8||0; →15、!(3+2); →06、设x=10,y=9;x>=8&&y<=x; →1习题8.设x=4,y=8,说明下列各题运算后,x,y和z的值分别是多少?1、z=(x++)*(--y); → x=5,y=7,z=282、z=(++x)-(y--); → x=5,y=7,z=-33、z=(++x)*(--y); → x=5,y=7,z=354、z=(x++)+(y--); → x=5,y=7,z=12习题9. 分析下列运算表达运算顺序。
1、c=a|| (b); →( b)是为0或1(逻辑值),若a=0则a|| (b),结果赋给c2、x+=y-z; → y-z,x+(y-z),结果赋给x3、-b>>2; → -b,结果右移2位。
注:-b不是取反也不能确定为负数;取反一般是变成2进制然后按位取反。
如b=-3,即0FDH,则-b=3,而不是0FD按位取反4、c=++a%b--;→ a=a+1,a%b,b=b-1,%结果赋给c5、!m&n; → !m,若结果为1再和n相与。
X(不是&&)!m,再和n相与6、a<b||c&d; → a<b,若结果为0再c&d,结果相或习题参考答案(P.93)习题6. 用选择分支编写程序,把输入的一个数字按下列对应关系显示。
当输入Z时,程序结束。
#include <stdio.h>#include <reg51.h>main( ){unsigned char k;do{scanf(“%c”,&k);switch(k){case ‘1’: printf(“A”); break;case ‘2’: printf(“B”); break;case ‘3’: printf(“C”); break;case ‘4’: printf(“D”); break;default: printf(“?”); break;}}while( k ! = ‘Z’ );while( 1 );}习题7. 若在C中的switch操作漏掉break,会发生什么?答:若在case语句中漏掉break,则程序执行case选择部分程序后不会按照要求退出switch 语句,而是继续执行下一个case语句选择的内容。
习题8. 编写程序,输出x3数值表,x为0—10。
main(){unsigned char x;unsigned int y;for(x=0;x<11; x++){y=(unsigned int)x*x*x;pri ntf(“%c,%d\n”,x,y);}while(1);}习题9. 用三种循环方式分别编写程序,显示1—100的平方。
答:三种流程图如下:#define uint unsigned intmain(){unsigned int y;unsigned char x;for( x = 0 ; x < 101 ; x++){y=(unsigned int)x*x;printf(“%c,%d\n”,x,y);}while(1);}main( ){unsigned int y;unsigned char x=1;while(x<101){y=(unsigned int)x*x;printf(“%c,%d\n”,x,y);x++;}}main(){unsigned int y;unsigned char x=1;do{y = (unsigned int)x*x ;printf( “%c, %d\n”, x, y ) ;x++;} while(x<101);while(1);}习题9. 写出下列数组使用*运算的替换形式。
1.data[2];2.num[i+1];3.man[5][3]。
1、*(data+2) p1072、*(num+i+1)3、*(*(man+5)+3)习题10. 设下列运算表达式中p是指针,试分析各表达式的运算顺序。
1.b=*p--;2.x=*p++;3.a[++i]=*p++ ;4.y=*--*++p-6。
答:1、先取*p给b,再使p减1单元(注意不是*p减1单元);2、先取*p给x,再使p加1单元(注意不是*p加1单元);3、先使i加1,再取*p给a[i],再使p加1单元;4、这里p是指针的指针,先使p加1单元,再使*p减1单元,再使*(*p)减6后赋给y;习题12. 结构的定义和说明在程序中的作用是什么?在对结构初始化时应该注意些什么问题。
答:结构的定义和说明在程序中可以把一组关系密切的变量存放在一个连续的存储空间中,便于对这些变量的访问。
同一个结构中不能存在同名变量名称。
可以把具有相同结构的已知结构直接用“=”对结构进行赋值,或者通过其成员的逐个引用分别赋值。
在没有赋值前结构成员的值是不确定的,有可能被编译器启动代码初始化为0。