- (1)C51与汇编语言相比有哪些优势?怎样实现两者的互补提示
- C51语言具有结构化语言特点和机器级控制能力,代码紧凑,效率可与汇编语言媲美。由于接近真实语言,程序的可读性强,易于调试维护,编程工作量小,产品开发周期短。C51语言与汇编指令无关,易于掌握。但对于有较高程序代码执行速度要求的场合,如I/O 接口地址处理、中断向量地址安排,汇编语言仍有一定优势。可以采用在C51中调用汇编程序和在C51中嵌入汇编代码的方法实现两种语言优势互补。
- (2)写出至少5种Source Code程序调试命令,并分别说明其功能。 提示
- 1、运行仿真命令,可连续运行程序,遇到断点会停止运行;2、单步执行命令,在一行程序执行完后就停止运行;3、跳进函数命令,在单步运行到被调用的函数时,会进入函数后继续单步执行;4、跳出函数命令,在单步运行到被调用的函数时,可将函数看作是一条语句整体执行;5、跳到光标处命令,从当前程序行开始高速运行,到达提前放置光标的程序行时停止运行;6、连续单步命令,可一行程序执行完后不停地执行下一行的程序。
- (3)Source Code有几种工作界面?各有什么作用?有什么差异? 提示
- Source Code有两个工作界面,即程序编辑界面和代码调试界面,其标签名都是Source Code。程序编辑界面为白色桌面,含有三个工作窗口,即项目窗口、编辑窗口和输出窗口,主要用于项目管理、程序编辑和代码编译任务。代码调试界面为淡黄色桌面,可在其上打开多种调试显示窗,主要用于代码仿真调试任务,在界面的右上角有一个调试工具栏。
- (4)C51中有哪几类运算符和哪些表达式? 提示
- C51中有6类运算符,分别是算术运算符、关系运算符、逻辑运算符、位运算符、复合赋值运算符和杂项运算符。常用的5类表达式分别是,算术表达式、关系表达式、逻辑表达式、位表达式、复合赋值表达式。
- (5)C51中的while和do while语句的不同点是什么? 提示
- while语句和do-while语句的循环体是相同的,运算结果也相同,但由于do-while语句是先执行后判断,而while语句是先判断后执行,因而,对于关系表达式一开始就为“假”时,前者会执行一次循环体内容,而后者一次也不会执行。
- (6)若在C51的switch的语句组中漏掉break会发生什么问题? 提示
- 漏掉break后将会继续执行下一个case,除非遇到break或不再有case时才会跳出swith结构。
- (7)C51变量的定义包含哪些要素?其中哪些是不能省略的? 提示
- 变量定义中包含着存储种类、数据类型、存储类型和变量名4项要素,其中数据类型和变量名在变量定义时是不能省略的,存储种类和存储类型在变量定义时可以采用相应缺省值。
- (8)sbit型变量与bit型变量都是位变量,但二者的不同点在哪里? 提示
- bit型变量的位地址是由编译器为其随机分配的(定义时不能由用户指定),位地址是在片内RAM的可位寻址区(bdata区)中;而sbit型变量的位地址则是由用户指定的,位地址是在可位寻址的SFR单元内(但利用bdata限定变量存储类型后,可将位地址范围扩大到bdata区)。
- (9)在C51中为何要尽量采用无符号的字节变量或位变量? 提示
- 这两种变量占用内存少,代码长度短,执行效率高。有符号的字节变量虽然也只占用1字节,但CPU需要进行额外的操作来测试代码的符号位,这会降低代码效率。使用浮点型的变量时,编译系统还将调用相应的库函数来保证运算精度,这会明显增加运算时间和代码长度。
- (10)为了加快程序的运行速度,C51中频繁使用的变量应定义在哪个存储区? 提示
- 由于片内存储器的数据传送多为单周期指令,而片外存储器多为双周期指令,CPU处理前者数据的速度要快于后者,因此频繁操作的变量应尽量定义在片内存储器中,选择如data,bdata或idata等存储类型的变量。
- (11)何为自动型变量?它有哪些特点? 提示
- 具有auto属性的变量称为自动型变量。自动型变量的作用域是在定义该变量的函数体或语句组内。当函数调用结束或语句组执行完毕时,自动型变量所占用的存储单元就被释放。由于存储单元中的值是随机的,因此自动型变量在赋初值前的值也是随机的。自动型是“存储种类”的默认选项,如果变量定义时“存储种类”项省略,则变量被默认为是自动型的。。
- (12)对于C51来讲,指针变量定义还应该包括标准C以外的哪些信息? 提示
- C51指针变量定义的一般形式为:数据类型〔存储类型1〕*〔存储类型2〕指针变量名〔=&被指向变量名〕;。其中,“数据类型”是被指向变量的数据类型;“存储类型1”是指被指向变量所在的存储类型,默认时根据被指向变量的定义语句确定;“存储类型2”是指针变量所在的存储类型,默认时根据C51编译模式的默认值确定;指针变量名可按C51变量名的规则选取。
- (13)求数组元素中最大值时常采用“打擂台算法”,其编程原理是什么? 提示
- 编程原理是,先将第一个元素(任意元素均可,常选取首元素)作为“擂主”,把它的值赋给变量max。然后循环让下一个元素与max比较。如果下一元素值>max,则把它的值赋给max,取代max的当前值。以此类推直到全部比对完成后,max中保存的就是最大的值。
- (14)何为库函数?怎样使用库函数? 提示
- 库函数(也叫标准函数)是由C51系统提供的,可满足用户的通用性要求。使用时需在程序中开头处用#include指令将库函数的文件名包含进来,然后按一般调用规则使用即可。
- (15)函数定义与函数声明有何不同?什么情况下需要函数声明? 提示
- 函数声明与函数的定义语句是基本相同的。写函数声明时,可以简单地照写函数的定义语句后再加一个分号即可。由于编译系统只关心和检查形参个数和形参类型而不检查形参名,因此函数声明中的形参名也可省略,只写形参的类型即可。当函数调用出现在函数定义之前时必须先进行函数声明。这是因为程序进行编译时是从上到下逐行进行的,如果没有函数的声明,当编译到函数调用行时,编译系统就无法确定它是函数还是变量,也无法进行虚实结合检查。这样,在运行阶段出现错误时就很难找到相应原因。
- (16)怎样打开Source Code界面中的变量监视窗?它有何特点?对于程序调试能起到什么作用? 提示
- 单击菜单【调试】→【8051CPU】→【Variables】可以打开变量监视窗。它的最大特点是能自动添加当前程序中的所有变量。当程序运行时,这些变量的内容会随之发生变化,且会用红色字体显示当前的变化。与单步运行、断点运行等调试工具配合后,可以根据这种变化规律判断程序的走向是否正确,从而容易找出程序中的逻辑错误,使调试效率大大加快。
- (17)何为程序编译的Debug状态和Release状态?两者有何不同?如何发挥两者的作用? 提示
- 当程序编译器设为Debug状态时,编译后能产生可仿真的固件,便于进行代码调试,但其中的仿真信息会影响代码运行效率。而当程序编译器设为Release状态时,编译后能产生不含仿真信息的高效运行固件,适合于进行微控器的程序固化。为此在源程序编写完成后,应当先采用Debug方式进行“构建工程”操作,生成供程序调试的固件;而在程序调试完成后,再用Release方式进行一次“重新构建工程”操作,生成供程序固化的固件。
浏览次数: