(完整版)单片机原理及应用——基于Proteus和Keil_C林立_张俊亮版课后习题答案一至七章 下载本文

3.C51与汇编语言的特点各有哪些?怎样实现两者的优势互补?

答:C51是结构化语言,代码紧凑;接近自然语言,程序可读性强,易于调试、维护;库函数丰富,编程工作量小,可使产品开发周期短;具有机器级控制能力,功能很强,适合于嵌入式系统开发;汇编指令无关,易于掌握,上手快。

汇编语言优点是编写的程序代码精炼、执行速度快,在相同功能下,汇编语言程序可能比C语言程序效率高。缺点是对程序员要求高,必须对单片机的硬件结构非常熟悉才能编程,不便于编写比较复杂的程序。 可根据需要对要求时间性很强的代码用汇编语言编写,其它部分用C语言编写,两者混合编程就可以实现优势互补。

4.指出下面程序的语法错误: #include main(){ a=C; int a=7,C delay(10)

void delay();{ cgar i;

for(i=O; i<=255; ”++”); } 答:

#include main(){

a=C; //a和C必须先定义才可使用 int a=7,C //缺分号,应该提在使用前说明

delay(10) //延时子程序必须先定义,或先有函数原型说明 void delay();{

//作为函数定义,有函数定义不能嵌套的问题,

//即不能在一个函数内定义另一个函数,而且“{”前不应有分号 //作为函数原型说明,应该放在函数调用之前,且其后不应该接函数体

cgar i; //字符型应该是unsigned char for(i=O; i<=255; ”++”);// ”++”应改成i++

}

//主函数没有结束,缺”}”

5.定义变量a,b,c,其中a为内部RAM的可位寻址区的字符变量,b为外部数据存储区浮点型变量,c为指向 int 型 xdata 区的指针。 答: char bdata a; float xdata b; int xdata *c; 6.编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。

17

解:方法一:用嵌入式汇编语言实现 #include void main()

{ #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 #include int movdata(char); void main() {

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 #include char getdata(char); void main() {

char a=0x25,c; float f;

c=getdata(a); f=sqrt(c); }

18

;用汇编语言编写的取数据子函数,只有一个地址参数在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 #include int movdata(char); void main() {

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中为字节数 PUBLIC _MOVDATA DE SEGMENT CODE RSEG DE

_MOVDATA: MOV A,R7 ;取参数

19

MOV R0,A LOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOP EXIT: RET END

方法二:单用C语言编程实现 //MAIN.C

#include int movdata(char); void main() {

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 void main() {

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 #include void main() {

unsigned int x,y,z; x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23];

20