3.11将内部RAM的20H单元中的十六进制数变换成ASCII码存入22H,21H单元中,高位存入22H单元中,要求用子程序编写转换部分。 答:
ORG 0000H
MOV A,20H ASCII:CJNE A,# 0AH,NE ANL A,# 0F0H NE:JC A30
SWAP A ADD A,#37H ACALL ASCII RET
MOV 22H,A A30:ADD A,30H MOV A,20H RET ANL A,#0FH END ACALL ASCII MOV 21H,A SJMP $
3.12 编写一段程序,以实现图3-8中硬件的逻辑运算功能。
答:
ORG 0000H MOV C,20H ANL C,2FH ORL C,/2FH CPL C
ANL C,53H MOV P1.0,C SJMP $ END
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字节无符号数乘1字节的乘法程序。 答:
ORG 0000H MOV R7,#03H MOV R0,#data MOV R2,#0
NEXT:MOV A,@R0 MOV B,R1
MUL AB ADD A,R2 MOV @R0,A MOV A,#0 ADDC A,B MOV R2,A
INC R0
DJNZ R7,NEXT MOV @R0,B SJMP $ END
4.4 编程将8XX51的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(位置不固定)。 答:
main() p2=0x35; {char data *p1,*p2; a=*p1*(*p2); xdata int a; }
p1=0x20;
4.5 讲将如下汇编程序译成C程序(等效即可)ORG 0000H SJMP $ CLR P1.0 MOV P1,#04H TLC:MOV A,#0 DJNZ R5,LOOP MOV R6,#0AH MOV @R0,A CLR P1.3 MOV R0,#30H MOV R5,#08 INC R0
LOOP:MOV C,P1.2 DJNZ R6,TLC2543 CLR P1.0
SETB P1.3 RLC A RET ACALL TLC SETB P1.0 END 答:
#include﹤reg51.h﹥ P1=0x04; For(i=0;i<8;i++) #define uchar unsigned char P=0x30; {P1_1=msb; sbit P1_0=P1^0; P1_0=0; y=ACC<<1; sbit P1_1=P1^1; P1_3=1; 1sb=P1_2; sbit P1_2=P1^2; for(i=0;i<10;i++) P1_0=1; sbit P1_3=P1^3; {*P=tlc(); P1_0=0; sbit msb=ACC^7; P++;} } sbit 1sb=ACC^0; } return y; uchar tlc(void); uchar tlc(void) } main() {uchar i,y; {uchar*P; ACC=0;P1_3=0;
4.6 8051的片内数据存储器25H单元中放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存。 答:
#include<math.h> P1=0x25; Main() *P2=sqrt(*P1); {float*P2; } Char*P1;