DJNZ R1,LOOP
4-10 将存放在R3、R2中的三位压缩BCD码转换为二进制形式。
W_BCD_BI:
LCALL B_BCD_BI;调用将R2中单字节BCD码转换为二进制数的子程序, ;转换的结果存放于A寄存器中 MOV R4, A ;把转换结果暂时保存到R4 MOV A, R3 ;取BCD码的高1位 MOV B, #100
MUL AB ;计算(a3*10+a2)*100 ADD A, R4 ;加低2位转换结果 MOV R2, A ;保存转换结果的低8位
MOV A, B ;取(a3*10+a2)*100的高8位 ADDC A, #0 ;加进位位
MOV R3, A ;保存转换结果的高8位 ... ... B_BCD_BI:
MOV A, R2 ;取BCD码
ANL A, #0F0H ;保留高4位(即十位) SWAP A
MOV B, #10
MUL AB ;十位*10,最大为90(即5AH),因此高8位为0 MOV B, A ;乘积暂存到B寄存器 MOV A, R2 ;取BCD码 ANL A, #0FH ;保留个位
ADD A, B ;个位加“十位*10”,结果在A寄存器中
RET
4-11 编写程序完成运算R0R1×R2R3,乘积存R4、R5、R6和R7中。
MUL: CLR A MOV R4, A MOV R5, A MOV R6, A MOV R7, A MUL1: MOV A, R1 MOV B, R3 MUL AB MOV R7, A MOV R6, B MUL2:
9
MOV A, R0 MOV B, R3 MUL AB ADD A, R6 MOV R6, A CLR A ADDC A, B MOV R5, A MUL3: MOV A, R1 MOV B, R2 MUL AB ADD A, R6 MOV R6, A MOV A, R5 ADDC A, B MOV R5, A CLR A ADDC A, 0 MOV R4, A MUL4: MOV A, R0 MOV B, R2 MUL AB ADD A, R5 MOV R5, A MOV A, R4 ADDC A, B MOV R4, A RET
习题五
5-1 在C51语言中支持哪些数据类型?C51特有的数据类型有哪些?
在C51语言中支持的数据类型有:char(字符型)、int(整型)、long(长整形)、float(浮点型)、特殊功能寄存器类型和位类型。 C51特有的数据类型有:特殊功能寄存器类型和位类型。
10
5-2 C51中的存储器类型有几种,它们分别表示的存储器区域是什么?
C51中的存储器类型有:data、bdata、idata、pdata、xdata、code 存储器类型 与硬件存储器空间的对应关系 data 直接寻址的片内RAM低128B,访问速度快 bdata 片内RAM可位寻址区(20H-2FH),允许字节和位混合访问 idata 用Ri间接寻址的片内RAM全部地址空间 pdata 用Ri间接访问的片内扩展RAM或片外扩展RAM低256B xdata 用DPTR间接访问的片内扩展RAM或片外扩展RAM(64K) code 程序存储器ROM空间(64KB) 5-3 在C51中,bit位与sbit位有什么区别?
两种位变量的区别在于,用bit定义的位变量,其地址由C51编译时予以安排,而用sbit定义位变量时必须同时定义其位地址,在C51编译器编译时,其位地址不可变化。 5-4 在C51中,中断函数与一般函数有什么不同?
(1) 中断函数不能进行参数传递 (2) 中断函数没有返回值
(3) 在任何情况下都不能直接调用中断函数
(4) 如果在中断函数中调用了其他函数,则被调用函数使用的工作寄存器必须与中断函数相同。否则会产生不正确的结果。
(5) 在中断函数中调用其他函数,被调函数最好设置为可重入的,因为中断是随机的,有可能中断函数所调用的函数出现嵌套调用。
(6) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。 (7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。
5-5 请分别定义下列变量:
(1)片内RAM中无符号字符型变量x; unsigned char idata x;
(2)片内RAM中位寻址区无符号字符型变量y,将y.0-y.2再分别定义为位变量key_in、key_up、key_down;
片内RAM中位寻址区无符号字符型变量y :unsigned char bdata y; 定义y.0-y.2为位变量key_in、key_up、key_down: sbit key_in=y^0;
sbit key_up=y^1; sbit key_down=y^2;
(3)片外RAM中整型变量x,并指定变量x的绝对地址为4000H; #define x XWORD[0X2000] 或:xdata int x _at_ 0x4000; (4)特殊功能寄存器变量PCON;
11
sfr PCON=0X87
5-6用C51语言写出整型变量a左移4位的语句。
int a; a= a<<4;
5-7用C51语言编程实现,片内扩展RAM的000EH单元和000FH单元的内容交换。
#include
char data c,d; AUXR&=0xFD;
c=XBYTE[0x000E]; d=XBYTE[0x000F]; XBYTE[0x000E]=d; XBYTE[0x000F]=c; }
5-8已知 x=375,y=589,用C51语言编写程序,计算z=x+y的结果。
int add() {
int x,y,z; x=375; y=589; z=x+y; return z; }
5-9 试用C51语言编写程序实现将片内RAM 21H单元存放的两位BCD码数转换为十六进制数存入30H单元。
data unsigned char y1 _at_ 0x21; data unsigned char y2 _at_ 0x30; void trans() {
unsigned char temp; temp=y1;
y1=(y1&0xf0)>>4;
y2=y1*10+(temp&0x0f);
12