《单片机应用项目式教程——基于Keil和Proteus第2版习题答案第2章思考和练习解答.docx》由会员分享,可在线阅读,更多相关《单片机应用项目式教程——基于Keil和Proteus第2版习题答案第2章思考和练习解答.docx(8页珍藏版)》请在第壹文秘上搜索。
1、第2章思考和练习解答参阅本书P.34。2.1C51编程与80C51汇编语言相比,主要有什麽优势?答:C51编程与80C5I汇编语言相比,主要的优势是编程相对方便。具体如下:C51软件编程不需过多关注具体的存储单元。用汇编语言编程,几乎每一条指令(除NOP指令)操作都与具体的存储单元有关,80C51单片机的片内存储空间容量有限,编程之初即需安排好片内存储单元的用途,且一般不能重复使用。当一些应用项目较大时,片内存储单元有可能捉襟见肘,稍有不慎就将出错。因此,编程时,不但要注意用哪一条指令正确操作,而且要注意指令在哪一个存储单元操作,编程相对复杂。而C51编程能自动完成变量存储单元的分配和使用,且
2、对函数内局部变量占用的存储单元,仅在调用时临时分配,使用完毕即行释放,大大提高了片内有限存储空间的利用效率。使用者只需专注于软件编程,不需过多关注具体的存储单元及其操作指令。因此,编程相对方便。便于实现各种更杂的运算和程序。C语言有丰富且功能强大的运算符,能以简单的语句方便地实现各种复杂的运算和程序。相比之下,汇编语言要实现较复杂的运算和程序,就比较困难。例如,双字节的乘除法,汇编语言要用许多条指令操作才能完成;而C51只需一条语句便能实现。又例如,循环、查表和散转等程序,C51语句实现起来也相对简单方便。可方便地调用各己有程序模块。已有程序模块包括C51编译器中丰富的库函数、用户自编的常用接
3、口芯片功能函数和以前已开发项目中的功能函数。读者可能会说,汇编程序不也一样可以调用吗?不一样。汇编程序调用时,涉及到模块中具体的存储单元,这些存储单元很可能与主调用程序有重复,会引起冲突而出错。而C51程序函数中的变量一般为局部变量,主函数调用前不占用存储单元,仅在调用时由C51编译器根据空余情况临时分配,使用完毕即行释放,因而一般不会发生冲突而出错。因此,C51程序可方便地调用各已有程序模块,减少重复劳动,大大提高编程效率。(4)编译生成的代码效率比汇编语言低一些;实时时效不如汇编语言快捷;一条C语言指令编译后,会转换成很多机器码,占用单片机片内资源较多。2.2C51基本数据类型有哪几种?其
4、数据长度为多少?答:参阅教材书基础知识4.1,图2-32.3 C51标识符命名有何要求?答:在C51程序中,数据、变量和函数等常用标识符表示。实际上,标识符就是一个代号或名字。C51规定:标识符只能由字母、数字和下划线三种字符组成,且须以字母或下划线开头。标识符不能与“关键词”同名。英文字母区分大小写。即标识符中的英文字母大小写不能通用。2.4 怎样理解变量的存储器类型和编译模式?答:存储器类型和编译模式是确定变量存放在那一存储区域,不同的存储区域与访问速度有关。存储器类型是在变量定义时确定,而未定义存储器类型的变量由编译模式默认。存储种类与变量存放在那一存储区域基本无关(除寄存器类变量),与
5、变量值的生存期和作用范围有关。中、小型程序一般可采用默认的存储种类auto。变量的存储种类与变量的存储器类型、编译模式是两个完全不同的概念,不能混淆。2.5 为什么变量要尽量使用无符号字符型格式?答:C51变量的基本数据类型主要有字符型Cha八整型ini和长整型IOng,又可分别分为有符号Signed和无符号UnSigned。80C51是8位机,本身并不支持有符号运算。若变量使用有符号格式,C51编译器要进行符号位检测并需调用库函数,生成的代码比无符号时长得多,占用的存储空间会变大,程序运行速度会变慢,出错的机会也会增多。80C51单片机主要用于实时控制,变量一般为8bit无符号格式,16bi
6、t较少,有符号和有小数点的数值计算也很少。因此,在已知变量长度和正整数的情况下,应尽量采用无符号格式:UnSignedChar。2.6 为什么变量要尽量使用局部变量?答:与80C51汇编语言相比,C51编程的突出优点是能自动完成变量存储单元的分配和使用,对函数内局部变量占用的存储单元,仅在调用时临时分配,使用完毕即行释放,大大提高了片内有限存储空间的利用效率。使用者只需专注于软件编程,不需过多关注具体的存储单元及其操作指令。因此,编程相对方便。使用全局变量的缺点:一是始终占用一个固定的存储单元,降低了内部存储单元的利用率;二是降低了函数的通用性。若函数涉及某一全局变量,该函数移植到其他文件时需
7、同时将全局变量一起移植。否则,若全局变量名与其他文件中的变量同名,就会出现问题。三是过多使用全局变量,降低了程序的清晰度。若程序较大,人们较难清晰地判断程序执行过程中每个瞬间全局变量的变化状况,易出错。因此,应尽量减少全局变量的使用,能不用就尽量不用。2.7 for循环语句括号内3个表达式分别表示什麽含义?能否缺位?答:第一个表达式是循环变量初值,第二个表达式是循环终止条件,第三个表达式是循环变量更新。3个表达式之间必须用分号“;”分隔,允许有一个或多个缺位。2.8 while(1)和for(;)表示什麽含义?答:While(I)和for(;)均表示一个循环条件始终满足的无限循环。若后面有循环
8、体语句,则反复无限执行循环体语句;若后面无循环体语句,则表示程序在原地踏步。2.9 什麽是数组?如何定义和表示?答:数组是一组具有相同类型数据的有序集合。例如:inta(10=10,11.22,33.44,55.66,77,88,99;上式表示:数组名为a,数组内的数据类型为int,元素个数(也称为数组长度,即数组内数据的个数)有10个。10个数组元素分别为:a0=10,al=ll,a2=22,a3=33,a4=44,a5=55,a6=66,a7=77,a8=88,a9=99需要注意的是,数组定义时,方括号内是数组元素个数;数组元素引用时,方括号内是数组元素的序号。而且,数组元素序号是从0开始
9、编号的。因此,上述数组a10中没有a10这个数组元素,其最后一个数组元素是a9。2.10 函数参数传递,值传递与地址传递有什麽不同?答:函数的实参传递给形参,称为值传递。值传递是单向的,即不会影响主调用函数中实参值的变化。指针变量或数组作为实参传递给形参时,是将一个变量的地址传送到另一个函数中去,称为地址传递,其结果具有双向性。若在被调用函数中该地址存储单元中的内容发生了变化,在调用结束后这些变化将被保留下来,即其结果会被返回到主调用函数。P17.P1680C5LPl2PLbPLOUSO5限11录而笆毕N1=1黄徐N11-5VQ图双键控3灯电路.2.11 已知双键控3灯电路如图211所示,要求
10、实现:So单独按下,红灯亮,其余灯灭;Sl单独按下,绿灯亮,其余灯灭;So、Sl均未按下,黄灯亮,其余灯灭;So、Sl均按下,红绿黄灯全亮。试按任务4.1中3种形式编写C51程序,画出ProteusISIS虚拟电路,并仿真调试。解:if-else语句include头文件包含访问瓯库函数rcg51.hsO=P17;定义位标识符So为P1.7s1=P16;定义位标识符Sl为Pl.6R=P12;定义位标识符R为PL2G=P11;定义位标识符G为PI.1Y=P10;定义位标识符Y为PLOmain()无类型主程序while(l)无限循环if(sO!=O)(sl!=O)Y=0;R=G=I;)/SO、Sl均
11、未按下,黄灯亮,其余灯灭elseif(sO!=l)&(sl!=O)R=O;G=Y=1;/SO单独按下,红灯亮,其余灯灭elseif(sO!=0)&(sl!=l)G=0;R=Y=1;/Sl单独按下,绿灯亮,其余灯灭elseR=G=Y=05/SO、Sl均按下,3灯均亮if语句嵌套include reg5 l.h sbit sO=P17;shit SI=PIA6;sbit R=P12;sbit G=P11;sbit Y=P10;void main () while(l)if(s!=l)头文件包含访问或库函数reg51.h定义位标识符0为PL7定义位标识符Sl为PL6定义位标识符R为PI.2定义位标识
12、符G为PLI定义位标识符Y为PLO无类型主程序/无限循环若SO按下if(sl!=l)R=G=Y=0J/SO、Sl均按下,3灯均亮elseR=0;G=Y=IJS0按下,Sl未按下,则红灯亮,其余灯灭else若SO未按下if(81!=l)G=0;R=Y=1;/SO未按下,Sl按下,则绿灯亮,其余灯灭elseY=0;R=G=l;S0、Sl均未按下,则黄灯亮,其余灯灭(3)switch语句include void main ()unsigned char x:Pl=Pl0xc7;while(l)x=Pl0xc0;switch (x)case 0: Pl=Pl&0xf8 OxcOzbreak;头文件包含
13、访问政库函数reg5Lh无类型主程序定义无符号字符型变量X,.置PL7、PL6输入态,红球黄灯灭,其余端口状态不变无限循环读PI口中PI.7、P1.6开关状态“switch语句开头,根据表达式X的值判断/SOsSl均按下,3灯均亮,终止SWitCh语句CaSeoX80:PI=Pl&0xf80xc5;break;Sl单独按下,球灯亮,其余灯灭,终止SWitCh语句CaSeOX40:PI=Pl&Oxf8Oxc3;break;SO单独按下,红灯亮,其余灯灭,终止SWitCh语句default:Pl=Pl&0xf8|0xc6;/SO.SI均未按下,黄灯亮,其余灯灭2.12 求:SiIm=I+3+5+9
14、9。试用“while循环”编写、输入源程序并调试运行。解:void main () unsigned char n=l;unsigned int SUm=0;while (n=99) sum=sum+n;n=n+2;WhiIe(1);无类型主程序定义无符号字符型变量n,并赋初值定义无符号整型变量Sum,并赋初值循环条件判断:当nW99时循环,否则跳出循环循环体语句:累加求和修正循环变量,n=n+2,并返回循环条件判断原地等待2.13 求:SUm=2+4+6+100。试用dowhile循环”编写、输入源程序并调试运行。解:voidmain()/主程序*,unsignedcharn=2:-定义无符号字符型变量n,并赋初值”Unsignedintsum=0:定义无符号整型变量SUm,并赋初值Pdosum=sum+n:n=n+2:)/.循环体语句:累加求和,并修正循环变量Pwhile(n=100);/循环条件判断:当nW100时循环,否则跳出循环Pwhile(l);)-/原地等待,include reg5 l.h 彳 include void main () unsigned char n=l;unsigned long fec=l;unsigned long sum=0;fbr(; n=10; n+)j*=