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