第四章习题

更新时间:2023-11-30 17:21:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习 题

1. C语言有哪些特点? 答:C语言具有以下特点:

1) 语言简洁、紧凑,使用方便、灵活 2) 运算符丰富

3) 数据结构丰富,具有现代化语言的各种数据结构 4) 可进行结构化程序设计

5) 可以直接对计算机硬件进行操作

6) 生成的目标代码质量高,程序执行效率高 7) 可移植性好

2. 有哪些数据类型是MCS-51单片机直接支持的?

答:MCS-51单片机直接支持的数据类型标准分为基本数据类型和组合数据类型,基本数据类型有字符型char、短整型short、整型int、长整型long、浮点型float、双精度型double、特殊功能寄存器型和位类型,其中char型与short型相同,float型与double型相同。组合数据类型有数组类型、结构体类型、共同体类型和枚举类型,另外还有指针类型和空类型。

3. C51特有的数据类型有哪些?

答:C51特有的数据类型有特殊功能寄存器型和位类型。

4. C51中的存储器类型有几种,它们分别表示的存储器区域是什么? 答:C51中的存储器类型有6种,分别如下: data:直接寻址的片内RAM低128B,访问速度快

bdata:片内RAM的可位寻址区(20H~2FH),允许字节和位混合访问 idata:间接寻址访问的片内RAM,允许访问全部片内RAM pdata:用Ri间接访问的片外RAM低256B

xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM code:程序存储器ROM 64KB空间

5. 在C51中,bit位与sbit位有什么区别?

答:bit位类型符用于定义一般的位变量。存储器类型只能是bdata、data、idata,只能是片内RAM的可位寻址区,严格来说只能是bdata。

sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。

6. 在C51中,通过绝对地址来访问的存储器有几种? 答:通过绝对地址来访问存储器有三种方法:1. 使用C51运行库中预定义宏。2. 通过指针访问。3. 使用C51扩展关键字_at_

1

7. 在C51中,中断函数与一般函数有什么不同?

答:中断函数在定义时后面带interrupt m修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断0,1——定时/计数器T0,2——外部中断1,3——定时/计数器T1,4——串行口中断,5——定时/计数器T2,其他值预留。

编写MCS-51中断函数需要注意如下几点。

(1) 中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。

(2) 中断函数没有返回值。

(3) 在任何情况下都不能直接调用中断函数

(4) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同,否则会产生不正确的结果。

(5) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。 (6) C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。

(7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其他程序调用。

8. 按给定的存储类型和数据类型,写出下列变量的说明形式。 (1) 在data区定义字符变量val1。 char data val1;

(2) 在idata区定义整型变量val2。

int idata val2;

(3) 在xdata区定义无符号字符型数组val3[4]。 unsigned char xdata val3[4];

(4) 在xdata区定义一个指向char类型的指针px。 char xdata *px;

(5) 定义可寻址位变量flag。 bit flag;

(6) 定义特殊功能寄存器变量P3。 sfr P3=0xa0;

(7) 定义特殊功能寄存器变量SCON。 sfr SCON=0x98;

(8) 定义16位的特殊功能寄存器T0。

sfr16 T0=0x8a;

9. 写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。 (1) a+b>c&&b= =c 结果:假 (2) a||b+c&&b-c 结果:真 (3) !(a>b)&&!c||1 结果:真 (4) !(a+b)+c-1&&b+c/2 结果:假 10. 写出下列C51程序的执行结果。

2

(1)

#include

extern serial_initial(); main() { int x,y,z; serial_initial(); x=y=8;z=++x; printf(\ x=y=8;z=x++; printf(\ x=y=8;z=--x; printf(\ x=y=8;z=x--; printf(\ printf(\ while(1); }

结果: 8 9 9 8 8 9 8 7 7

8 8 7

(2)

#include

extern serial_initial();main() { int x,y,z; serial_initial(); printf(\ scanf(\ printf(\ printf(\ printf(\ z=xy; printf(\ z=x>=y; printf(\ z=x!=y; printf(\ z=x==y; printf(\ while(1); }

执行结果:

input data x,y? 1 2

x y xy x>=y x!=y x==y 1 2 1 1 0 0 1 0

3

(3)

#include

extern serial_initial(); main() {

int x,y,z;

serial_initial();

printf(\scanf(\

printf(\printf(\

z=!y; printf(\z=x||y; printf(\z=x&&y; printf(\printf(\printf(\while(1); }

执行结果:

input data x, y ?

x y !x x||y x&&y 1 2 0 1 1 That is all

4

(4)

#include

extern serial_initial(); main() {

int a,b; unsigned int x,y; serial_initial(); a=b=0xaa55;x=y=0xaa55;

printf(\ a=a<<1;b=b>>1; x=x<<1;y=y>>1;

printf(\printf(\ printf(\ printf(\

while(1); }

执行结果:

a=aa55 b=aa55 x=aa55 y=aa55

a=54aa b=d52a x=54aa y=552a That is all.

11. break和continue语句的区别是什么?

答:break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。 continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。

continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。

12. 用分支结构编程实现:输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。

参考程序:

#include #include void main(void) {

unsigned char x; SCON=0x52; TMOD=0x20; TH1=0XF3; TR1=1; while(1) {

printf(\scanf(\

//串口初始化

//输出提示信息

5

本文来源:https://www.bwwdw.com/article/b4dt.html

Top