《单片微型计算机与接口技术》思考题与习题解答01

SJMP $ END

3.8 内部存储单元40H中有一个ASCII字符,试编一个程序给该数的最高位加上奇校验。 3.8 可直接用P标志判断(JB P,ret) ORG 0000H MOV A。40H

JB P,EN ;奇数个1转移

0RL A,#80H ;偶数个1最高位加“1” EN:SJMP$

3.9 编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在高地址)取补后送回原单元。

3.9 取补不同于求补码,求补码应区别正、负数分别处理,而取补不分正、负,因正、负数均有相对于模的补数。可用取反加l求补,也可用模(00H)减该数的方法求补。

ORG 0000H MOV R7,#03H MOV R0,#DATA MOV A,@RO CPL A ADD A,#01 MOV @RO,A AB:INC RO MOV A,@RO CPL A ADDC A,#O DJNZ R7,AB SJMP $

3.10 以BUFl为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一个程序,求其平均值并送BUF2单元,余数存在BUF2—1单元。 3.10 16个单字节累加应用ADD指令而不能用ADDC指令,和的低位存A,当和超过一个字节时,和的高字节存于B,并要加低位相加时产生的进位,16个单字节加完后,采用右移4次进行除16求平均值的运算,商在 BUF2单元,余数在BuF2-1单元。 0RG 0000H MoV R7,#0FH MOV R0,#BUFl MOV B,#0 MOV A,@R0

MOV R2,A

NEXT:MOV A,R2 INC R0 ADD A,@R0 MOV R2,A MOV A,B ADDC A,#0 MOV B,A

11

DJNZ R7,NEXT ;以上完成求和 MOV R6,#04H MOV BUF2,A

MOV BUF2-1,#O NEX:CLR C MOV A,B RRC A MOV B,A MOV A,BUF2 RRC A

MOV BUF2,A MOV A,BUF2-1 RRC A

MOV BUF2-l,A DJNZ R6,NEX SJMP $

;以上完成除16运算

3.11 将内部RAM的20H单元中的十六进制数变换成ASCII存入22H,21H单元,高位存入22H单元,要求用子程序编写转换部分。

3.11 将20H单元的内容分解为高4位和低4位,根据是否大于9分别进行加37H和30H处理。

0RG 0000H MOV A,20H ANL A,#0F0H SWAP A

ACALL ASCII MOV 22H,A MOV A.20H ANL A,#0FH ACALL ASCII MOV 21H,A SJMP $ END

ASCII:CJNE A,#0AH,NE NE:JC A30 ADD A,#37H RET

A30:ADD A,30H RET

3.12 编写一段程序,以实现图中硬件的逻辑运算功能。

12

3.12要注意,位的逻辑运算其中一个操作数必须在C。

ORG 0000H MOV C,20H ANL C,2FH CPL C

ORL C,/2FH CPL C

ANL C,53H MOV P1.0,C SJMP $ END

3.13 用位操作指令实现下面的逻辑方程(×表示逻辑乘,+表示逻辑加): P1.2=(ACC.3×P1.4×-ACC.5)+(-B.4×-P1.5) 3.13 ORG 0000H MOV C,ACC.3 ANL C。P1.4 ANL C,/ACC.5 MOV 20H,C MOV C,B.4 CPL C

ANL C,/P1.5 ORL C,20H MOV P1.2,C SJMP $

END

3.14 试编写一个三字节无符号数乘一字节的乘法程序。

3.14 设一字节乘数存放在R1,三字节的被乘数存放在data开始的内部RAM单元,且低字节存放在低位地址单元,R0作为被乘数和积的地址指针,用MUL指令完成一字节乘一字节,每一次部分积的低位加上一次部分积的高位,其和的进位加在本次部分积的高位上,并暂存,三字节乘一字节共需这样3次乘、加、存操作.以R7作循环3次的计数寄存器。 ORG 0000H MOV R7,#03H MOV R0,#data

MOV R2,#0 NEXT:MOV A,@R0

13

MOV B,R1 MUL AB ADD A,R2 MOV @RO,A

MOV A,#O ADDC;A,B MOV R2,A INC R0

DJNZ R7,NEXT MOV @R0,B SJMP $ END

第4章 单片机的C语言

4.1 改正下面程序的错误。

4.1 1:#include 本程序有如下错误: 2:main()

3:{a=c; ①变量a,c必须先定义再引用

4:int a=7,c; ②第5句调用函数后必须加分号 . 5:delay() ③main()函数没有反大括号

6:void delay(); ④被调函数delay()在main()后面,必须在前面先声明 7:{

8:char i; ⑤第6句函数说明语句后的分号应去掉 9:for(i=O;i<:255;i++); 10:}

4.2 试说明为什么xdata型的指针长度要用2个字节?

4.2 因为xdata是外部数据存储器,最大可有64KB的存储单元,xdata指针是表示外部数据存储单元的地址,要表示64KB个单元地址,所以必须用2个字节,共16位表示。

4.3 定义变量a、b、c; a为内部RAM的可位寻址区的字符变量; b为外部数据存储区浮点型变量;c为指向int型xdata区的指针。 4.3 bdata char a; xdata float b:

xdata int~c;

4.4 编程将8XX51的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(位置不固定)。 4.4 main()

{char data*pl,*p2; xdata int a; p1=0x20; p2=0x35; a=*p1*(*p2);

}

4.5 将如下汇编程序译成C程序(等效即可)。 ORG 0000H MOV P1,#04H

14

MOV R6,#0AH MOV R0,#30H CLR P1.O SETB P1.3 ACALL TLC SJMP $

TLC:MOV A,#0 CLR P1.3 MOV R5,#08

LOOP: MOV C,P1.2 RLC A SETB P1.0 CLR P1.O DJNZ R5,LOOP MOV @RO,A INC R0

DJNZ R6,TLC2543 RET END

4.5 #include(reg51.h)

#define uchar unsigned char sbit P1_0=P1^0;

sbit Pl_l=P1^1; sbit P1_2=P1^2; sbit P1_3=P1^3; sbit msb=ACC^7; sbit lsb=ACC^0; uchar tlc(void); main( ){ uchar *P; P1=0x04; P=0x30; P1_0=0;

Pl_3=1;

for(i=O;i<10;i++) {*P=tlc( ); P++:}

}

uchar tlc(void){ uchar i,y; ACC=0; Pl_3=0;

for(i=0:i<8:i++){

P1_1=msb; /*发出ACC的低位*/

15

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4