1、一、单项选择题:(每小题 2 分,共 10 分。在每小题备选答案中选出一个正确答案,并将正确答案的代码填在题中括号内。选对得分,不选、选错均不得分。) 1 利用下列( D )关键字可以改变工作寄存器组 A、 interrupt B、 sfr C、 while D、 using 2 C51 中一般指针变量占用 ( C )字节存储。 A、一个 B、两个 C、三个 D、四个 3 使用宏来访问绝对地址时,一般需包含的库文件是( B ) A、 reg51.h B、 absacc.h C、 intrins.h D、 startup.h 4 执行 #define PA8255 XBYTE0x3FFC; PA
2、8255=0x7e; 后存储单元 0x3FFC 的值是( A ) A、 Ox7e B、 8255H C、未定 D、 7e 5 设有 int i;则表达式 i=1,+i,+i|+i,i 的值为 ( C) A、 1 B、 2 C、 3 D、 4 6 设有 int a =10,11,12,*p=*p+=1;后 a0,a1,a2的值依次是 ( C) A、 10,11,12 B、 11,12,12 C、 10,12,12 D、 11,11,12 7 设有 int i;则表达式 i=1,+i,i|+i,i 的值为 ( B) A、 1 B、 2 C、 3 D、 4 二、判断题:(每小题 1 分,共 10 分
3、。正确的在括号内打 “”,错误的打 “”。判对得分,不判、判错均不得分。) 1 若一个函数的返回类型为 void,则表示其没有返回值。( ) 2 特 殊功能寄存器的名字,在 C51 程序中,全部大写。( ) 3 “sfr”后面的地址可以用带有运算的表达式来表示。( ) 4 #include 与 #include “reg51.h”是等价的。( ) 5 sbit 不可以用于定义内部 RAM 的可位寻址区,只能用在可位寻址的 SFR 上。( ) 6 Continue 和 break 都可用来实现循环体的中止。 ( ) 7 若一个函数的返回类型为 void,则表示其没有返回值。 ( ) 8 所有定义
4、在主函数之前的函数无需进行声明。( ) 9 int i,*p=则表达式 i=10,j=20,k=30,k*=i+j 的值为 _ 900_。 7 数组 是一组有固定数目和相同类型成分分量的有序集合。 8变量的指针就是变量的 地址 ; 指针变量的值是 指针 。 9在 C 语言中,把多个不同类型的变量结合在一起形成的一个组合型变量,称为 结构变量 ,简称 结构 。 10 C51 的数据类型有 基本类型 、 构造类型 、 指针类型 、 空类型 。 11 C51 的基本数据类型有 位型 、 字符型 、 整形 、 长整形 、 浮点型 、 双精度浮点型 。 12 C51 的构造数据类型有 数组类型 、 结构
5、类型 、 共用体型 、 梅举型 。 13 C51 的存储类型有 data 、 bdata 、 idata 、 pdata 、 xdata 、 code 。 14 C51 的存储模式有 SMALL 、 COMPACT 和 LARGE 。 15 C51 程序与其他语言程序一样,程序结构也分为 顺序结构 、 选择结构(或分支结构) 、 循环结构 三种。 16数组的一个很重要的用途就是 查表 。 17 四 、 问 答 题(共 20 分) 1 简述 C51 语言和汇编语言的比较 ( 5分) 使用 C51 语言进行嵌入式系统的 开发,有着汇编语言所不可比拟的优势: 编程调试灵活方便; 生成的代码编译效率高
6、; 模块化开发; 可移植性好; 便于项目的维护; 2 简述单片机的 C语言的特点 ( 7分) 单片机的 C语言的特点主要体现在以下几个方面: 无需了解机器硬件及其指令系统,只需初步了解 MCS-51 的存储器结构; C51 能方便的管理内部寄存器的分配、不同存储器的寻址和数据类型等细节问题,但对硬件控制有限;而汇编语言可以完全控制硬件资源; C51 在小应用程序中,产生的代码量大,执行速度慢;但在较大的程序中代码效 率高; C51 程序由若干函数组成,具有良好的模块化结构,便于改进和扩充; C51 程序具有良好的可读性和可维护性;而汇编语言在大应用程序开发中,开发难度增加,可读性差; C51
7、有丰富的库函数,可大大减少用户的编程量,显著缩短编程与调试时间,大大提高软件开发效率; 使用汇编语言编制的程序,当机型改变时,无法直接移植使用,而 C语言程序是面向用户的程序设计语言,能在不同机型的机器上运行,可移植性好。 3 哪些变量类型是 51单片机直接支持的? ( 5分) 答: C51编译器支持的数据类型有:位型( bit)、无符号字符型( unsigned char)、有符号字符型( signed char)、无符号整型( unsigned int)、有符号整型( signed int)、无符号长整型( unsigned long)、有符号长整型( signed long)、浮点型(
8、float)和指针型等。 C51编译器支持的数据类型、长度和值域如表 1-1所示。 表 1-1 C51的数据类型 数据类型 长度 /bit 长度 /byte 值域 bit 1 0,1 unsigned char 8 1 0 255 signed char 8 1 -128 127 unsigned int 16 2 0 65 535 signed int 16 2 -32 768 32 767 unsigned long 32 4 0 4 294 967 295 signed long 32 4 -2 147 483 648 2 147483 647 float 32 4 1 176E-38
9、3 40E+38( 6位数字) double 64 8 1 176E-38 3 40E+38( 10位数字) 一般指针 24 3 存储空间 0 65 535 4 简述 C51的数据存储类型 ( 10分) 答: 我们都知道, 8051单片机存储区可分为内部数据存储区、外部数据存储区以及程序存储区。 8051单片机内部的数据存储区是可读写的, 8051派生系列最多可有 256字节的内部数据存储区,其中低 128字节可直接寻址,高 128字节(从 0x80到 0xFF)只能间接寻址,从 20H开始的 16字节可位寻址。内部数据区可分为 3个不同的存储类型: data、 idata和 bdata。 外
10、部数据区也是可读写的,访问外部数据区 比访问内部数据区慢,因为外部数据区是通过数据指针加载地址来间接访问的。 C51 提供两种不同的存储类型 xdata和 pdata访问外部数据。 程序存储区是只能读不能写。程序存储区可能在 8051 单片机内部或者在外部或者内外都有,这由 8051 单片机的硬件决定。 C51 提供了 code 存储类型来访问程序存储区。 每个变量可以明确地分配到指定的存储空间,对内部数据存储器的访问比对外部数据存储器的访问快许多,因此应当将频繁使用的变量放在内部存储器中,而把较少使用的变量放在外部存储器中。各存储区的简单描述如表 1-2所示。 表 1-2 C51 存储类型与
11、 8051 存储空间的对应关系 存储区 描述 DATA 片内 RAM的低 128字节,可在一个周期内直接寻址 BDATA 片内 RAM的位寻址区, 16字节 IDATA 片内 RAM的 256字节,必须采用间接寻址 XDATA 外部数据存储区,使用 DPTR间接寻址 PDATA 外部存储区的 256个字节,通过 P0口的地址对其寻址。使用 MOVX Ri,需要两个指令周期 CODE 程序存储区,使用 DPTR寻址。 以上介绍的是 C51 的数据存储类型, C51 存储类型及其大小和值域如表 1-3所示。 表 1-3 C51存储类型及其大小和值域 存储类型 长度 /bit 长度 /byte 值域
12、 data 8 1 0 255 idata 8 1 0 255 pdata 8 1 0 255 code 16 2 0 65 535 xdata 16 2 0 65 535 5 简述 C51对 51单片机特殊功能寄存器的定义方法 ( 5分) 答: MCS-51通过其特殊功能寄存器( SFR)实现对其内部主要资源的控制。 MCS-51单片机有 21个 SFR,有的单片机还有更多的 SFR,它们分布在片内 RAM的高 128字节中,其地 址能够被 8整除的 SFR一般可以进行位寻址。关于 MCS-51单片机的特殊功能寄存器参看附录 A。对 SFR只能用直接寻址方式访问。 C51允许通过使用关键字
13、sfr、 sbit或直接引用编译器提供的头文件来实现对 SFR的访问。 ( 1)使用关键字定义 sfr 为了能直接访问特殊功能寄存器 SFR, C51提供了一种自主形式的定义方法。这种定义方法与标准的 C语言不兼容,只适用于对 8051系列单片机进行 C编程。这种定义的方法是引入关键字 “sfr”,语法如下: sfr 特殊功能寄存器名字 = 特殊功能寄存器地址; 如: sfr SCON=0x98; /*串口控制寄存器地址 98H*/ sfr TMOD=0X89; /*定时器 /计数器方式控制寄存器地址 89H*/ ( 2)通过头文件访问 SFR 8051系列单片机的寄存器数量与类型是极不相同的
14、,因此对单片机特殊功能寄存器的访问可以通过对头文件的访问来进行。 为了用户处理方便, C51编译器把 MCS-51单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个 “reg51.h”或 “reg52.h”的头文件中。当用户要使用时,只需要在使用之前用一条预处理命 令 “#include ”把这个头文件包含到程序中,然后就可以使用特殊功能寄存器名和特殊位名称了。用户可以通过文本编辑器对头文件进行增减。 ( 3) SFR中位定义 在 8051单片机的应用问题中,经常需要单独访问 SFR中的位, C51的扩充功能使之成为可能,使用关键字 “sbit”可以访问位寻址对象。特殊位( sbit)的
15、定义,像 SFR一样不与标准 C兼容。 与 SFR定义一样,用关键字 “sbit”定义某些特殊位,并接受任何符号名, “=”号后将绝对地址赋给变量名。这种地址分配有三种方法: 第一种方 法: sbit 位名 =特殊功能寄存器名 位置; 当特殊功能寄存器的地址为字节( 8位)时,可使用这种方法。特殊功能寄存器名必须是已定义的 SFR的名字。 “”后的 “位置 ”语句定义了基地址上的特殊位的位置。该位置必须是 0 7的数。如: 第二种方法: sbit 位名 =字节地址 位置; 这种方法是以一个整常数为基地址,该值必须在 0x80 0xFF之间,并能被 8整除,确定位置的方法同上。 第三种方法: s
16、bit 位名 =位地址; 这种方法将位的绝对地址赋给变量,地址必须在 0x80 0xFF之间。 6 C51 的 data、 bdata、 idata 有什么区别? ( 6分) 答: data、 bdata、 idata是表明数据的存储类型, data是指 片内 RAM的低 128字节,可在一个周期内直接寻址; bdata是指 片内 RAM的位寻址区, 16字节; idata是指 片内 RAM的 256字节,必须采用间接寻址。 7 C51中的中断函数和一般的函数有什么不同? ( 6分) 答: C51编译器允许用 C51创建中断服务函数,中断函数是由中断系统自动调用的。 中断函数的定义格式为: 函
17、数类型 函数名 interrupt n using n 其中: interrupt和 using为关键字; interrupt后面的 n 为中断源的编号,即中断号; using后面的 n所选择的寄存器组,取值范围为 0 3。 定义中断函数时, using是一个选项,可以省略不用。如果不用 using选项,则由编译器选择一个寄存器组作为绝对寄存器组。 8051的中断过程通过使用 interrupt关键字和中断号( 0 31)来实现,中断号告诉编译器中断函数的入口地址。 8 按照给定的数据类型和存储类型,写出下列变量的说明形式 ( 6分) ( 1)在 data区定义字符变量 val1 答: cha
18、r data vall; ( 2)在 idata区定义整型变量 val2 答: int idata val2; ( 3)在 xdata区定义无符号字符型数组 val34。 答: unsigned xdata val34; ( 4)在 xdata区定义一个指向 char类型的指针 px。 答 : char xdata *px; ( 5)定义可位寻址变量 flag。 答: bit flag; ( 6)定义特殊功能寄存器变量 P3。 答: Sfr P3=0xB0; 9 什么是重入函数?重入函数一般什么 情况下使用,使用时有哪些需要注意的地方? 答: 多个函数可以同时使用的函数,称为重入函数。 ( 6
19、 分) 通常情况下, C51 函数不能被递归调用,也不能应用导致递归调用的结构。有此限制是由于函数参数和局部变量是存储在固定的地址单元中。重入函数特性允许你声明一个重入函数。即可以被递归调用的函数。 重入函数可以被递归调用,也可以同时被两个或更多的进程调用。重入函数在实时应用中及中断服务程序代码和非中断程序代码必须共用一个函数的场合中经常用到。 10 如何消除键盘的抖动? ( 5 分) 答:由于按键是机械开关结构,所以当用手 按下其中一个键时,往往会出现所按键在闭合位置和断开位置之间发生跳几下后才会稳定到闭合状态的情况。在释放一个键时,也会出现类似的情况,这就是键的抖动,抖动的持续时间不一,但
20、通常不会大于 10ms。 若抖动问题不解决,就会引起对闭合键的多次读入。对于键抖动最方便的解决方法就是当发现有键按下后,不是立即进行扫描,而是延时大约 10ms 后再进行。由于一个键按下的时间一般会持续上百毫秒,所以延迟 10ms 后再扫描处理并不迟。 11 在使用 8051 的定时器 /计数器前,应对它进行初始化,其步骤是什么? ( 4 分) 答: (1)确定 T/C 的工作方式 编程 TMOD 寄存器; (2)计算 T/C 中的计数初值,并装载到 TH和 TL; (3)T/C 在中断方式工作时,须开 CPU 中断和源中断 编程 IE 寄存器; (4)启动定时器 /计数器 编程 TCON 中
21、 TR1 或 TR0 位。 五、程序分析题( 10 分) 1 设单片机时钟频率为 6MHz,分析下面程序实现什么功能? #include “reg51.h“ sbit P10=P10; void main() TMOD=0x01; TH0=(65536-12500)/256; TL0=(65536-12500)%256; ET0=1; EA=1; TR0=1; while(1); void T0_srv(void)interrupt 1 using 1 TH0=(65536-12500)/256; TL0=(65536-12500)%256; P10=!P10; 解: P1.0 引脚输出 50
22、ms 周期的方波。 2 分析下面程序实现什么功能? #include “reg51.h“ #include “stdio.h“ void init_ser() SCON = 0x50; /*SCON:工作模式 1, 8-bit UART,允许接收 */ TMOD |= 0x20; /*TMOD:定时器 T1,工作模式 2, 8 位自动重载方式 */ TH1 = 0xf3; /*当波特率为 2400 时,定时器初值 */ TR1 = 1; /*定时器 T1 开始运行 */ TI = 1; /*允许发送数据 */ long factorial(int n) reentrant long resul
23、t; if(n=0) result=1; else result=n*factorial(n-1); return result; void main() int j; long tmp; long (*p)(int n); /*函数指针变量定义 */ init_ser(); p=(void*)factorial; /*函数指针变量 p 指向 factorial()函数 */ for(j=0;j sbit P1_1=P11; /定义位变量 unsigned char i; /定时次数 void timer0over(void); /函数声明(定时 50ms 函数) void main( ) /
24、主函数 i=0; TMOD=0x01; /定时器 T0 定时 50ms,方式 1 TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; /开 T0 for(;) if(TF0) timer0over( ); void timer0over(void) TH0=(65536-50000)/256; TL0=(65536-50000)%256; TF0=0; i+; if(i=20) /20 次到了吗? i=0; P1_1=!P1_1; 2 在 8051 系统中,已知振荡频率是 12MHz,用定时器 /计数器 T1 实现从 P1.1 产生高电平宽度是 10ms,低电平宽度是 20ms 的矩形波,试编程。 ( 10 分) 解: #include unsigned char i; sbit P1_1=P11; void main( ) /主函数 i=0; TMOD=0x10; /T1 定时方式 1,定时时间 10ms TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET1=1;