float xdata b; int xdata *c; 6.编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。
解:方法一:用嵌入式汇编语言实现 #include
{ #pragma asm MOV A,20H MOV B,35H MUL AB
MOV DPTR,#1234H MOVX @DPTR,A INC DPTR MOV A,B
MOVX @DPTR,A #pragma endasm }
方法二:单用C语言编程实现 #include
unsigned int xdata x; unsigned char *ptr,a,b; ptr=0x25; a=*ptr; ptr=0x30; b=*ptr; x=a*b; }
7.8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。 解:方法一:用C语言与汇编语言混合编程实现 //用C语言编写的主函数MAIN.C #include
char a=0x25,c;
13
float f;
c=getdata(a); f=sqrt(c); }
;用汇编语言编写的取数据子函数,只有一个地址参数在R7中,返回值为指定地址单元中的内容,用R7返回主函数。 PUBLIC _GETDATA DE SEGMENT CODE RSEG DE
_GETDATA: MOV A,R7 ;取地址参数 MOV R0,A MOV A,@R0 MOV R7,A ;返回地址单元中的内容 EXIT: RET END
方法二:单用C语言编程实现 //MAIN.C
#include
char n; char *ptr; float *ptr2; float f; ptr=0x25; n=*ptr; f=sqrt(n); ptr2=0x30; *ptr2=f; }
8.将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。 解:方法一:采用C语言与汇编语言混合编程 //用C语言编写的主函数MAIN.C #include
char movdata(char,char); void main() {
char a=0x10,b=0x06; movdata(a,b); }
;用汇编语言编写的移动数据子函数MOVDATA,其中第一个参数在R7中为首地址,第二个参数在R5中为字节数
14
PUBLIC _MOVDATA DE SEGMENT CODE RSEG DE
_MOVDATA: MOV A,R7 ;取参数 MOV R0,A LOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOP EXIT: RET END
方法二:单用C语言编程实现 //MAIN.C
#include
char n=6;
char *ptr1=0x10; char xdata *ptr2; ptr2=0x20; while(n--){
*ptr2++=*ptr1++; } }
9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一:
#include
unsigned int *ptr; //设置一个内部RAM指针 unsigned int x,y,z;
ptr=0x20; //指向0x20单元 x=*ptr; //取第一个数 ptr=0x22; //指向0x22单元 y=*ptr; //取第二个数
z=(x>y)?x:y; //将两数中的较大者赋给z ptr=0x24; //指向地址为0x24的目标单元 *ptr=z; //将大数存入目标单元 }
方法二:
#include
15
{
unsigned int x,y,z; x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23];
z=(x>y)?x:y; //将两数中的较大者赋给z DBYTE[0X24]=z/256; DBYTE[0X25]=z%6; }
方法三:
#include
unsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main() {
z=(x>y)?x:y; }
第4章 单片机的C51语言 习题
1.C语言的优点是什么?C程序的主要结构特点是什么?
答:C语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端口数据,可以直接驱动单片机的所有资源。
C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。
2.C51语言的变量定义包含哪些关键因素?为何这样考虑? 答:C语言的变量定义格式如下:
[存储种类] 数据类型 [存储类型] 变量名 其中:
存储种类与标准C语言相同,包括:自动型(auto)、外部型(extern)、静态型(static)、寄存器型(register)。
数据类型除了包含标准C语言类型的字符型(char),整型(int),长整型(long),浮点型(float),双精度型(double)外,还有二进制位型(bit),特殊功能寄存器型(sfr),SFR可位寻址的位类型(sbit)。
存储类型包括:片内RAM区(data)、片内可位寻址区(bdata),片内RAM间接寻址区(idata),片外RAM页寻址区(pdata),片外RAM区(xdata)、ROM区(code)。
只所以比标准C语言多了存储类型,就是因为MCS-51单片机的存储结构中有四个物理存储空间(片内RAM、片内ROM,片外RAM,片外ROM),三个逻辑地址空间(片内RAM,片外RAM,ROM),而且有多种寻址方式(直接寻址、间接寻址、页面寻址、位寻址)所致,所以在定义变量时,要根据其所在位置和寻址方式明确指定存储类型。
16