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
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
y=ACC<<1; /*ACC右移1位*/
lsb=P1_2; /*接收一位放在ACC的高位*/ P1_0=1; P1_0=O; }
return y; } 4.6 8051的片内数据存储器25H单元中放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存。 4.6 方法l:使用查表法
float code tab[11]={0,1,1.4142,1.7321,2,2.2361, 2.4495,2.6458,2.8284,3,3.1623}: main()
{char data*P1; float data*P2; P1=0x25; P2=0x30;
*P2=tab[*P1]; }
方法2:使用库函数
#lnclude
P1=0x25;
*P2=sqrt(*P1); }
4.7 完成逻辑表达式P1.2=P1.4×ACC.0+ACC.7(“×”表示逻辑与,“+”表示逻辑或)。 4.7 #include
{P12=~(P1^4&ACC^0)|ACC^7;}
4.8 将外部RAM的10H~15H单元的内容传送到内部RAM的10H~15H单元。 4.8 #lnclude
{
char pdata *m; char data *n; P2=0;
for(m=0x10;m<=0x15;m++) {n=m;*n=*m;}
}
4.9 内部RAM的20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。
16