单片机原理及应用 - 第二版课后习题完整答案

更新时间:2023-10-21 08:21:01 阅读量: 综合文库 文档下载

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

第一章习题

1.什么是单片机?单片机和通用微机相比有何特点?

答:单片机又称为单片微计算机,它的结构特点是将微型计算机的基本功能部件(如中央处理器(CPU)、存储器、输入接口、输出接口、定时/计数器及终端系统等)全部集成在一个半导体芯片上。 虽然单片机只是一个芯片,但无论从组成还是从逻辑功能上来看,都具有微机系统的定义。与通用的微型计算机相比,单片机体积小巧,可以嵌入到应用系统中作为指挥决策中心,是应用系统实现智能化。

2.单片机的发展有哪几个阶段?8位单片机会不会过时,为什么? 答:单片机诞生于1971年,经历了SCM、MCU、SOC三大阶段,早期的SCM单片机都是8位或4位的。其中最成功的是INTEL的8031,此后在8031上发展出了MCS51系列MCU系统。基于这一系统的单片机系统直到现在还在广泛使用。随着工业控制领域要求的提高,开始出现了16位单片机,但因为性价比不理想并未得到很广泛的应用。90年代后随着消费电子产品大发展,单片机技术得到了巨大提高。随着INTEL i960系列特别是后来的ARM系列的广泛应用,32位单片机迅速取代16位单片机的高端地位,并且进入主流市场。 然而,由于各应用领域大量需要的仍是8位单片机,因此各大公司纷纷推出高性能、大容量、多功能的新型8位单片机。

目前,单片机正朝着高性能和多品种发展,但由于MCS-51系列8位单片机仍能满足绝大多数应用领域的需要,可以肯定,以MCS-51系

列为主的8位单片机,在当前及以后的相当一段时间内仍将占据单片机应用的主导地位。

3.举例说明单片机的主要应用领域。

答:单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域,大致可分如下几个范畴: 智能仪器

单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、电流、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。例如精密的测量设备(电压表、功率计,示波器,各种分析仪)。 工业控制

单片机具有体积小、控制功能强、功耗低、环境适应能力强、扩展灵活和使用方便等优点,用单片机可以构成形式多样的控制系统、数据采集系统、通信系统、信号检测系统、无线感知系统、测控系统、机器人等应用控制系统。例如工厂流水线的智能化管理,电梯智能化控制、各种报警系统,与计算机联网构成二级控制系统等。 家用电器

现在的家用电器广泛采用了单片机控制,从电饭煲、洗衣机、电

冰箱、空调机、彩电、其他音响视频器材、再到电子秤量设备和白色家电等。 网络和通信

现代的单片机普遍具备通信接口,可以很方便地与计算机进行数据通信,为在计算机网络和通信设备间的应用提供了极好的物质条件,现在的通信设备基本上都实现了单片机智能控制,从手机,电话机、小型程控交换机、楼宇自动通信呼叫系统、列车无线通信、再到日常工作中随处可见的移动电话,集群移动通信,无线电对讲机等。 医用设备领域

单片机在医用设备中的用途亦相当广泛,例如医用呼吸机,各种分析仪,监护仪,超声诊断设备及病床呼叫系统等等。 模块化系统

某些专用单片机设计用于实现特定功能,从而在各种电路中进行模块化应用,而不要求使用人员了解其内部结构。如音乐集成单片机,看似简单的功能,微缩在纯电子芯片中(有别于磁带机的原理),就需要复杂的类似于计算机的原理。如:音乐信号以数字的形式存于存储器中(类似于ROM),由微控制器读出,转化为模拟音乐电信号(类似于声卡)。在大型电路中,这种模块化应用极大地缩小了体积,简化了电路,降低了损坏、错误率,也方便于更换。 汽车电子

单片机在汽车电子中的应用非常广泛,例如汽车中的发动机控制器,基于CAN总线的汽车发动机智能电子控制器、GPS导航系统、abs

防抱死系统、制动系统、胎压检测等。

此外,单片机在工商、金融、科研、教育、电力、通信、物流和国防航空航天等领域都有着十分广泛的用途。

4.将十进制数37转换为二进制,BCD码和十六进制数,并对转换结果进行对比分析。

答:37=(100101)B=(25)H;BCD 码为 0011 0111; 可见,同一个数用不同进制表示,其结果也不同。

5.写出下列十进制数在8位微机中的原码,反码和补码形式。 (1)+36

原码 0010 0100B 反码 0010 0100B 补码 0010 0100B (2)-36

原码 1010 0100B 反码 1101 1011B 补码 1101 1100B (3)+127

原码 0111 1111B 反码 0111 1111B 补码 0111 1111B

(4)-128

原码 1000 0000B 反码 0111 1111B 补码 1000 0000B (5)-121

原码 1111 1001B 反码 1000 0110B

补码 1000 0111B

6.对于二进制数1000 1001B,若理解为无符号数,则该数对应十进制数为多少?若理解为有符号数,则该数对应十进制为多少?若理解为BCD数,则该数对应十进制数为多少? 答:1000 1001B无符号数:137; 有符号数:-9; BCD数:89;

7.对下列各组数进行“与”,“或”和“异或”运算。 (1) 1010 1010 和 0000 0000 与 0000 0000

或 1010 1010 异或 1010 1010

(2) 0111 0111 和 1000 1000 与 0000 0000 或 1111 1111 异或 1111 1111

(3) 1110 1110 和 0111 0111 与 0110 0110 或 1111 1111 异或 1001 1001

(4) 0011 1100 和 1111 0000 与 0011 0000 或 1111 1100 异或 1100 1100

8.Proteus ISIS的工作界面中包含哪几个窗口?菜单栏中包含哪几

个选项?

答:Proteus ISIS的工作界面主要包括标题栏、菜单栏、工具栏、状态栏、方位控制按钮、仿真进程控制按钮、对象选择窗口,原理图编辑窗口和预览窗口等。

主菜单栏包含文件、查看、编辑、工具、设计、图形、源文件、调试、库、模板、系统、帮助选项。

9.利用ISIS模块开发单片机系统需要经过哪几个主要步骤? 答:(1)启动ISIS; (2)绘制电路原理图;

(3)输入单片机程序; (4)进行源代码调试; (5)仿真运行。

10.何谓PCB?利用ARES模块进行PCB设计需要经过哪几个主要步骤?

答:PCB(Printed Circuit Board),中文名称为印制电路板,又称印刷电路板、印刷线路板,是重要的电子部件,是电子元器件的支撑体,是电子元器件电气连接的提供者。由于它是采用电子印刷术制作的,故被称为“印刷”电路板。

利用ARES模块进行PCB设计的主要步骤: (1)启动ARES; (2)元器件布局; (3)元器件布线; (4)铺铜; (5)三维效果图; (6)CADCAM输出。

第2章 MCS-51单片机结构及原理 习题

1. MSC-51单片机内部由哪些功能部件组成,各有什么功能? 答:以80C51单片机为例,其内部功能部件有:

控制器:是对取自程序存储器中的指令进行译码,在规定的时刻发出各种操作所需的控制信号,完成指令所规定的功能; 运算器:根据控制器发来的信号,执行算术逻辑运算操作; 存储器:包括程序存储和数据存储器;

定时器计数器:2个16位定时器/计数器,可对机器周期计数,也可对外部输入脉冲计数;

中断系统:可响应三个内部中断源和两个外部中断源的中断请求; 输入输出接口:4个8位并行口和一个全双工串行口;

2.MSC-51单片机外部引脚的名称是什么?各有什么功能? 答:(1) 电源及晶振引脚 VCC(40脚):+5V电源引脚 VSS(20脚): 接地引脚

XTAL1(19脚);外接晶振引脚(内置放大器输入端) XTAL2(18脚):外接晶振引脚(内置放大器输出端) (2) 控制引脚

RST/VPD(9)为复位/ 备用电源引脚

ALE/PROG(30)为地址锁存使能输出/ 编程脉冲输入 PSEN(29):输出访问片外程序存储器读选通信号 EA/ VPP (31):外部ROM允许访问/ 编程电源输入 (3) 并行I/O口引脚

P0.0~P0.7(39~32脚)——P0口;

P1.0~P1.7(1~8脚)——P1口; P2.0~P2.7(21~28脚)——P2口; P3.0~P3.7(10~17脚)——P3口。

3.51系列单片机的封装有哪些类型?请说明每一种封装引脚之间的距离。

答:51系列单片机的封装有:

40引脚双列直插封装(DIP——dual in-line package),引脚之间的距离是100mil(2.54mm);

44引脚方形扁平封装(QFP ——quad flat package)方式,引脚之间的距离是2.54mm;

44引脚带引线的塑料芯片载体PLCC(Plastic Leaded Chip Carrier)。

4.什么是复位?单片机复位电路有哪几种,工作原理分别是什么? 答:复位——使单片机恢复原始默认状态的操作。

单片机复位电路有:上电复位电路,由电阻和电容构成,通过上电时,电容相当于短路而使复位引脚在晶振有效的情况下保持2个机器周期的高电平;按钮开关复位电路,由两个电阻的分压构成,通过手工按下按钮,使复位引脚在晶振有效的情况下保持2个机器周期的高电平。

5.通常的微机系统存储器结构有哪几种?MCS-51单片机存储器属于哪一类?

CS-51可寻址多大空间?

答:通常的微机系统存储器结构有两种结构,即哈佛结构和冯诺依曼结构(也叫普林斯顿结构),MCS-51单片机存储器属于,MCS-51可寻址空间是两个64KB,即64KB的程序存储空间和64KB的数据存储空间。

6.片内RAM中低128个单元划分为哪三个主要部分?各部分的主要功能是什么?

答:片内RAM中低128个单元划分为三个部分:

①工作寄存器区(00H-1FH),四组,每组8个,可作用工作寄存器切换使用;

②可位寻址区(20H-2FH),16B,位地址为00H-7FH,用作为按位寻址的空间;

③用户RAM区(30H-7FH),80B,用作普通RAM单元或堆栈。

7.程序状态字寄存器PSW各位的定义是什么? 答:程序状态字寄存器PSW各位的定义如下:

PSW.7:进/借位标志CY,加法有进位时置1,减法有借位时置1; PSW.6:辅助进位标志AC,加法运算低四位向高上四位有进位时置1;

PSW.5、PSW.1:用户标志位F0和用户标志位F1, 保存用户的位数据;

PSW.4、PSW.3:工作寄存器选择控制位RS1和RS0,00至11分别选择四组工作之一作为当前工作寄存器

PSW.2 :溢出标志位OV,有符号数加、减运算结果有溢出或乘除上结果异常(乘法运算结果大于255即乘积在BA中,或除法运算除数为0)时置1

PSW.0:奇偶标志位P,累加器A中1的个数为奇数时置1。

8.什么是时钟周期?什么是机器周期?什么是指令周期?当振荡频率为12MHz时,一个机器周期为多少微秒?

答:时钟周期又叫振荡周期或拍,用P表示,是MCS-51单片机中最小的时间单位,在一个时钟周期内,CPU完成一个最基本的动作。 机器周期:由12个时钟周期构成,完成一个基本操作

指令周期:是执行一条指令所需的时间,根据指令的复杂性,可由1~4个机器周期构成。

当振荡频率为12MHz时,一个机器周期为1微秒。

9.P0、P1、P2和P3口的结构和功能分别是什么?

答:P0口的每一位由1个锁存器 、2个三态缓冲器 、1个输出控制电路(非门 X、与门、电子开关MUX、输出驱动电路构成,其功能既可以作为通用I/O口实现输入/输出功能,也可作为单片机地址线的

低8位和数据线实现外部扩展功能。在用作输入输出口时,需外接上拉电阻。

P1口的每一位由1个锁存器 、1个场效应管驱动器V和2个三态门缓冲器构成,其作用是用作输入输出口

P2口的每一位由1个锁存器、2个三态缓冲器、1个输出控制单元、1个输出驱动单元构成,其功能是用作输入输出口,或地址总线的高8位。

P3口的每一位由1个锁存器、2个三态缓冲器、1个第二功能控制单元 、1个输出驱动单元构成,其作用是用作输入输出口或第二功能。

10.80C51单片机引脚ALE的作用是什么?当80C51不外接存储器时,ALE上的输出的脉冲频率是多少?

答:80C51单片机引脚ALE的作用是对外部存储寻址时锁存P0口输出的低8位地址,当80C51不外接存储器时,ALE上的输出的脉冲频率是fosc/6。

第3章 单片机的汇编语言与程序设计 习题

1.MCS-51单片机有哪几种寻址方式?适用于什么地址空间? 答:MCS-51单片机有7种寻址方式:直接寻址、寄存器寻址、寄存器间接寻址、立即寻址、变址寻址、位寻址、相对寻址。

直接寻址方式:操作数的地址由指令直接给出,适用于片内RAM的所有地址空间;如 MOV A,68H

MOV A,PSW

寄存器寻址方式:指令给出的是寄存器的编码,操作数在编码指定的寄存器中,适用于片内00H至1FH的32个字节,用R0,?,R7表示,通过PSW的RS1和RS0选择组号确定对应32个字节中的其中8个,还有累加器A,以及乘除法指令中的A和B寄存器,位寻址方式中的布尔累加器C;

MOV A,R1 MUL AB INC DPTR

寄存器间接寻址方式:指令给出的是寄存器的编码,操作数地址在编码指定的寄存器中,适用于片内RAM的全部空间,其中52系列中的80H至FFH只能用寄存器间接寻址;如 MOV A,@R0

MOV A,@R1 MOVX A,@DPTR

立即寻址方式:操作数本身在指令中直接,给出适用于用8位立即数对片内RAM所有地址单元赋值,也可用16位立即数对DPTR赋值; 如

MOV A,#0E2H MOV DPTR,#2000H

变址寻址方式:以DPTR或PC作为基地址寄存器,以累加器A作为变址寄存器,将基址寄存器与变址寄存器的内容相加形成操作数的实际地址的一种寻址方式,变址寻址方式适用于程序存储器ROM,仅有三条指令如下:

MOVC A,@A+DPTR

MOVC A,@A+PC JMP @A+DPTR

位寻址方式:指令中直接给出操作数所在单元的位地址,适用于片内RAM中地址20H至2FH中的16个字节中的128个位地址空间和80H至FFH中地址中可以被8整除的所有SFR中的每个位地址空间;如

MOV C,7FH MOV F0,C MOV C,ACC.7

相对寻址方式:为相对转移指令而设,指令中直接给出转移的相对偏移量,其转移目标在当前指令-128至+127字节范围内的地址空间。如

SJMP START

HERE: SJMP HERE ;等效于: SJMP $

2.MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据单元的内容是否为零?

外部中断0,定时器T0,外部中断1,定时器T1,串行口五个中断源的中断向量地址依次为:0003H,000BH,0013H,001BH,0023H。

3.MCS-51中断的中断响应条件是什么? 答:(1) 中断源有中断请求;

(2) 此中断源允许位为1,即中断源可以向CPU发中断请求; (3) CPU开总中断,即EA=1; (4) 无同级或者更高级中断正在服务 4.MCS-51的中断响应过程是怎样的?

答:(1) 将相应的中断优先级状态触发器置1,以阻断后来的同级和低级中断请求;

(2) 由硬件清除相应的中断请求标志,串行口的发送和接收中断除外;

(3) 执行一条硬件LCALL指令,即把程序计数器PC的内容压入堆栈保存,再将相应的中断服务程序的入口地址送入PC;

5.编写出外部中断1为下跳沿触发的中断初始化程序。 解:

void Int1_init(){ IT1=1;

EA=1;EX1=1; //IE=0x84;// IE|=0x84; }

6.有一外部中断源,接入端,当其中有中断请求时,要求CPU

把一个从内部RAM 30H单元开始的50个字节的数据块传送到外部RAM从1000H开始的连续存储区。请编写对应的程序。 解:

#include void main(){ IT0=1 ;

EA=1; EX0=1; while(1) ; }

void intx0() interrupt 0 using 1{ char * ptr1=0x30; char xdata * ptr2=0x1000;

for(i=0;i<50;i++) *ptr2++=*ptr1++; }

7.设fosc = 12MHz,利用定时器,TO(工作在方式2)在P1.1引脚上获取输出周期为O.4ms的方波信号,定时器溢出时采用中断方式处理,请编写,T0的初始化程序及中断服务程序。

解:fosc = 12MHz,则机器周期=1us;当T0工作在方式2时,其最大定时时间为256us,要输出周期为0.4mS即400us的方波信号,则

其高、低电平应各为200us,显然当定时器T0按方式2工作时,只需计数达到200次即可,因此其时间常数初值为256-200=56。在T0的中断服务程序中,只需将P1.1引脚求反即可。 #include sbit P1_1=P1^1;

void timer0()interrupt 1 using 1{ P1_1=!P1_1; }

void main(){ P1_1=0; TMOD=0x02; TH0=56; TL0=56; IE=0x82; TR0=1; for(;;){} }

8.设fosc = 6MHz,要求每隔50ms,从内部RAM以30H开始的数据存储区传送一个字节数据到外部RAM以2000H开始的连续存储区,共传送50个数据。要求:采用定时器T1以方式2实现定时,数据传送在中断服务程序中完成。

解:fosc = 6MHz,机器周期=12/6*10-6S=2us,T1工作在方式2时,最大定时时间为512us,要定时50ms,可以计数100次,每次定时500us来实现,方式2定时500us需计数250次,故其时间常数为256-250=6。 #include char intcnt=0; char movcnt=0; char * ptr1=0x30; char xdata *ptr2=0x2000; void timer1()interrupt 3 using 1{ intcnt++; if(intcnt==100){ if(mocnt<50){

*ptr2++=*ptr1++; movcnt++;

}

else EX1=0; intcnt=0; } }

void main(){ TMOD=0x20; TH1=6;

TL1=6; IE=0x84; TR1=1; for(;;){} }

9.805l单片机只有两个外部中断源,若要扩展成8个外部中断源,请画出实现这种扩展的硬件线路图,并说明如何确定各中断源的优先级。

解:用按钮开关模拟中断源的中断请求,INT0单独作为一个中断源,INT1扩展成7个中断源,有中断请求时,借助于P2口识别是这七个中断源是哪个请求中断,为了验证正确性,如果是INT0中断,则在P0口的数码管上显示0,是INT1中断,则根据从上到下是哪个中断源在P0口的数码管上显示1—7。具体电路和程序如下:

解:从20H的指针用R0,从外部RAM7E01开始的指针用DPTR,计数器用R7

MOV R7,#0 ;字节计数器赋初值 MOV R0,#20H ;设片内RAM地址指针初值 MOV DPTR,#7E01H ;设片外RAM地址指针初值 CONT: MOV A,@R0 ;取片内RAM中的一个字节 MOVX @DPTR,A ;存入片外RAM指针所指单元 INC R7 ;长度计数器加1 INC R0 ;片内RAM地址指针加1 INC DPTR ;片外RAM地址指针加1 CJNE A,#0DH,CONT ;未达到结束标志 MOV A,R7 ;取块计数长度值 MOVX @DPTR,A ;保存 SJMP $ ;暂停 END

9.内部RAM从DATA开始的区域中存放着10个单字节十进制数,求其累加和,并将结果存入SUM和SUM+1单元。 解:R7计数,R6保存累加和高8位,R0用作地址指针 ORG 0000H LJMP MAIN ORG 100H SUM EQU 30H

DATAA EQU 40H

MAIN: MOV R7,#10 ;字节计数器赋初值 MOV R0,#DATAA ;设片内RAM地址指针初值 CLR A ;累加器清0 MOV R6,A ;累加结果的高8位 CONT: ADD A,@R0 ;加RAM中的一个字节到ACC DA A

JNC NEXT ;若无进位则不用管高8位 INC R6 ;有进位,高8位加1 NEXT: INC R0 ;片内RAM地址指针加1 DJNZ R7,CONT ;未完继续 MOV SUM,A ;保存低8位 MOV SUM+1,R6 ;保存高8位 SJMP $ ;暂停 END

10.内部RAM从DATA1和DATA2单元开始处存放着两个等长的数据块,数据块的长度在LEN单元中。请编程检查这两个数据块是否相等,若相等,将0FFH写入RESULT单元,否则将0写入RESULT单元。 解:从DATA1开始的指针用R0,从DATA2开始的指针用R1,计数器用R7

LEN EQU 10 DATA1 EQU 30H

DATA2 EQU 40H RESULT EQU 50H

MOV R7,#LEN ;字节计数器赋初值

MOV R0,#DATA1 ;设片内RAM地址指针初值 MOV R1,#DATA2 ;设片外RAM地址指针初值 CONT: MOV A,@R0 ;取片内RAM R0所指的的一个字节 MOV 7FH,@R1 ;将R1所指单元内容取到片内RAM地址7FH中

CJNE A,7FH,NOEQ ;比较,不相等则结束 INC R0 ;DATA1 RAM地址指针加1 INC R1 ;DATA2 RAM地址指针加1 DJNZ R7,CONT ;未完,继续

MOV A,#0FFH ;相等,准备写入FFH SJMP DOWN ;转写入结果处

NOEQ: MOV A,#0 ;不相等,准备写入00H DOWN: MOV RESULT,A ;保存比较结果标志 SJMP $ ;暂停 END

11.编制程序,将内部RAM中M1、M2、M3和M4单元中的无符号数xl、x2、x3和x4相加,并把和存入RO和R1(R0中为高8位)中。 解:

M1 EQU 30H

M2 EQU 40H M3 EQU 45H M4 EQU 4FH

MOV A,M1 ;取第一个数 ADD A,M2 ;与第二个数相加

JNC NEXT1 ;如果无进位,则转移至第三个相加 MOV R0,#1 ;有进位,高8位置1 NEXT1: ADD A,M3 ;与第三个数相加

JNC NEXT2 ;没有进位,则转至第四个数相加 INC R0 ;有进位,高8位加1 NEXT2: ADD A,M4 ;与第四个数相加 JNC NEXT3 ;没有进位,则转至结束 INC R0 ;有进位,高8位再加1 NEXT3: MOV R1,A ;低8位保存到R1 SJMP $ ;暂停 END

第4章 单片机的C51语言 习题

1.C语言的优点是什么?C程序的主要结构特点是什么?

答:C语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端口数据,可以直接驱动单片机的所有资源。

C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。

2.C51语言的变量定义包含哪些关键因素?为何这样考虑? 答:C语言的变量定义格式如下: [存储种类] 数据类型 [存储类型] 变量名 其中:

存储种类与标准C语言相同,包括:自动型(auto)、外部型(extern)、静态型(static)、寄存器型(register)。

数据类型除了包含标准C语言类型的字符型(char),整型(int),长整型(long),浮点型(float),双精度型(double)外,还有二进制位型(bit),特殊功能寄存器型(sfr),SFR可位寻址的位类型(sbit)。

存储类型包括:片内RAM区(data)、片内可位寻址区(bdata),片内RAM间接寻址区(idata),片外RAM页寻址区(pdata),片外RAM区(xdata)、ROM区(code)。

只所以比标准C语言多了存储类型,就是因为MCS-51单片机的存储结构中有四个物理存储空间(片内RAM、片内ROM,片外RAM,片外ROM),三个逻辑地址空间(片内RAM,片外RAM,ROM),而且有多种寻址方式(直接寻址、间接寻址、页面寻址、位寻址)所致,所以在定义变量时,要根据其所在位置和寻址方式明确指定存储类型。

3.C51与汇编语言的特点各有哪些?怎样实现两者的优势互补? 答:C51是结构化语言,代码紧凑;接近自然语言,程序可读性强,易于调试、维护;库函数丰富,编程工作量小,可使产品开发周期短;具有机器级控制能力,功能很强,适合于嵌入式系统开发;汇编指令无关,易于掌握,上手快。

汇编语言优点是编写的程序代码精炼、执行速度快,在相同功能下,汇编语言程序可能比C语言程序效率高。缺点是对程序员要求高,必须对单片机的硬件结构非常熟悉才能编程,不便于编写比较复杂的程序。

可根据需要对要求时间性很强的代码用汇编语言编写,其它部分用C语言编写,两者混合编程就可以实现优势互补。

4.指出下面程序的语法错误: #include main(){ a=C; int a=7,C delay(10) void delay();{ cgar i;

for(i=O; i<=255; ”++”);

} 答:

#include main(){

a=C; //a和C必须先定义才可使用 int a=7,C //缺分号,应该提在使用前说明

delay(10) //延时子程序必须先定义,或先有函数原型说明

void delay();{

//作为函数定义,有函数定义不能嵌套的问题,

//即不能在一个函数内定义另一个函数,而且“{”前不应有分号

//作为函数原型说明,应该放在函数调用之前,且其后不应该接函数体

cgar i; //字符型应该是unsigned char for(i=O; i<=255; ”++”);// ”++”应改成i++

}

//主函数没有结束,缺”}”

5.定义变量a,b,c,其中a为内部RAM的可位寻址区的字符变量,b为外部数据存储区浮点型变量,c为指向 int 型 xdata 区的指针。 答: char bdata a;

float xdata b; int xdata *c;

6.编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。 解:方法一:用嵌入式汇编语言实现 #include void main() { #pragma asm }

方法二:单用C语言编程实现 #include #include

MOV A,20H MOV B,35H MUL AB

MOV DPTR,#1234H MOVX INC

@DPTR,A DPTR

MOV A,B MOVX

@DPTR,A

#pragma endasm

int movdata(char); void main() {

unsigned int xdata x; unsigned char *ptr,a,b; ptr=0x25; a=*ptr; ptr=0x30; b=*ptr; x=a*b; }

7.8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。

解:方法一:用C语言与汇编语言混合编程实现 //用C语言编写的主函数MAIN.C #include #include char getdata(char); void main() {

char a=0x25,c; float f; c=getdata(a); f=sqrt(c); }

;用汇编语言编写的取数据子函数,只有一个地址参数在R7中,返回值为指定地址单元中的内容,用R7返回主函数。 PUBLIC _GETDATA DE SEGMENT CODE RSEG DE

_GETDATA: MOV A,R7 ;取地址参数 MOV R0,A MOV A,@R0

MOV R7,A ;返回地址单元中的内容 EXIT: RET END

方法二:单用C语言编程实现 //MAIN.C

#include #include int movdata(char); void main()

{ char n; char *ptr; float *ptr2; float f; ptr=0x25; n=*ptr; f=sqrt(n); ptr2=0x30; *ptr2=f; }

8.将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。 解:方法一:采用C语言与汇编语言混合编程 //用C语言编写的主函数MAIN.C #include char movdata(char,char); void main() {

char a=0x10,b=0x06; movdata(a,b); }

;用汇编语言编写的移动数据子函数MOVDATA,其中第一个参数在R7中为首地址,第二个参数在R5中为字节数 PUBLIC _MOVDATA DE SEGMENT CODE RSEG DE

_MOVDATA: MOV A,R7 ; MOV R0,A LOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOP EXIT: RET END

方法二:单用C语言编程实现 //MAIN.C

#include int movdata(char); void main() {

char n=6; char *ptr1=0x10; char xdata *ptr2; ptr2=0x20;

取参数

while(n--){ *ptr2++=*ptr1++; } }

9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一: #include void main() {

unsigned int *ptr; //设置一个内部RAM指针 unsigned int x,y,z; ptr=0x20; //指向0x20单元 x=*ptr; //取第一个数 ptr=0x22; //指向0x22单元 y=*ptr; //取第二个数

z=(x>y)?x:y; //将两数中的较大者赋给z ptr=0x24; //指向地址为0x24的目标单元 *ptr=z; //将大数存入目标单元 } 方法二:

#include

#include void main() {

unsigned int x,y,z; x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23]; z=(x>y)?x:y; //将两数中的较大者赋给z DBYTE[0X24]=z/256; DBYTE[0X25]=z%6; } 方法三:

#include unsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main() {

z=(x>y)?x:y; }

第4章 单片机的C51语言 习题

1.C语言的优点是什么?C程序的主要结构特点是什么?

答:C语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端口数据,可以直接驱动单片机的所有资源。

C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。

2.C51语言的变量定义包含哪些关键因素?为何这样考虑? 答:C语言的变量定义格式如下: [存储种类] 数据类型 [存储类型] 变量名 其中:

存储种类与标准C语言相同,包括:自动型(auto)、外部型(extern)、静态型(static)、寄存器型(register)。

数据类型除了包含标准C语言类型的字符型(char),整型(int),长整型(long),浮点型(float),双精度型(double)外,还有二进制位型(bit),特殊功能寄存器型(sfr),SFR可位寻址的位类型(sbit)。

存储类型包括:片内RAM区(data)、片内可位寻址区(bdata),片内RAM间接寻址区(idata),片外RAM页寻址区(pdata),片外RAM区(xdata)、ROM区(code)。

只所以比标准C语言多了存储类型,就是因为MCS-51单片机的存储结构中有四个物理存储空间(片内RAM、片内ROM,片外RAM,片外ROM),三个逻辑地址空间(片内RAM,片外RAM,ROM),而且有多

种寻址方式(直接寻址、间接寻址、页面寻址、位寻址)所致,所以在定义变量时,要根据其所在位置和寻址方式明确指定存储类型。

3.C51与汇编语言的特点各有哪些?怎样实现两者的优势互补? 答:C51是结构化语言,代码紧凑;接近自然语言,程序可读性强,易于调试、维护;库函数丰富,编程工作量小,可使产品开发周期短;具有机器级控制能力,功能很强,适合于嵌入式系统开发;汇编指令无关,易于掌握,上手快。

汇编语言优点是编写的程序代码精炼、执行速度快,在相同功能下,汇编语言程序可能比C语言程序效率高。缺点是对程序员要求高,必须对单片机的硬件结构非常熟悉才能编程,不便于编写比较复杂的程序。

可根据需要对要求时间性很强的代码用汇编语言编写,其它部分用C语言编写,两者混合编程就可以实现优势互补。

4.指出下面程序的语法错误: #include main(){ a=C; int a=7,C delay(10) void delay();{

cgar i;

for(i=O; i<=255; ”++”); } 答:

#include main(){

a=C; //a和C必须先定义才可使用 int a=7,C //缺分号,应该提在使用前说明

delay(10) //延时子程序必须先定义,或先有函数原型说明

void delay();{

//作为函数定义,有函数定义不能嵌套的问题,

//即不能在一个函数内定义另一个函数,而且“{”前不应有分号

//作为函数原型说明,应该放在函数调用之前,且其后不应该接函数体

cgar i; //字符型应该是unsigned char for(i=O; i<=255; ”++”);// ”++”应改成i++

}

//主函数没有结束,缺”}”

5.定义变量a,b,c,其中a为内部RAM的可位寻址区的字符变量,b为外部数据存储区浮点型变量,c为指向 int 型 xdata 区的指针。 答: char bdata a; float xdata b; int xdata *c;

6.编程将8051的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(任意位置)。 解:方法一:用嵌入式汇编语言实现 #include void main() { #pragma asm }

MOV A,20H MOV B,35H MUL AB

MOV DPTR,#1234H MOVX INC

@DPTR,A DPTR

MOV A,B MOVX

@DPTR,A

#pragma endasm

方法二:单用C语言编程实现 #include #include int movdata(char); void main() {

unsigned int xdata x; unsigned char *ptr,a,b; ptr=0x25; a=*ptr; ptr=0x30; b=*ptr; x=a*b; }

7.8051的片内数据存储器25H单元中存放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存中。

解:方法一:用C语言与汇编语言混合编程实现 //用C语言编写的主函数MAIN.C #include #include

char getdata(char); void main() {

char a=0x25,c; float f; c=getdata(a); f=sqrt(c); }

;用汇编语言编写的取数据子函数,只有一个地址参数在R7中,返回值为指定地址单元中的内容,用R7返回主函数。 PUBLIC _GETDATA DE SEGMENT CODE RSEG DE

_GETDATA: MOV A,R7 ;取地址参数 MOV R0,A MOV A,@R0

MOV R7,A ;返回地址单元中的内容 EXIT: RET END

方法二:单用C语言编程实现 //MAIN.C

#include

#include int movdata(char); void main() { char n; char *ptr; float *ptr2; float f; ptr=0x25; n=*ptr; f=sqrt(n); ptr2=0x30; *ptr2=f; }

8.将外部RAM 10H~15H单元的内容传送到内部RAM 10H~15H单元。 解:方法一:采用C语言与汇编语言混合编程 //用C语言编写的主函数MAIN.C #include char movdata(char,char); void main() {

char a=0x10,b=0x06;

movdata(a,b); }

;用汇编语言编写的移动数据子函数MOVDATA,其中第一个参数在R7中为首地址,第二个参数在R5中为字节数 PUBLIC _MOVDATA DE SEGMENT CODE RSEG DE

_MOVDATA: MOV A,R7 ; MOV R0,A LOOP: MOVX A,@R0 MOV @R0,A DJNZ R5,LOOP EXIT: RET END

方法二:单用C语言编程实现 //MAIN.C

#include int movdata(char); void main() {

char n=6; char *ptr1=0x10;

取参数

char xdata *ptr2; ptr2=0x20; while(n--){ *ptr2++=*ptr1++; } }

9.内部RAM 20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。 解:方法一: #include void main() {

unsigned int *ptr; //设置一个内部RAM指针 unsigned int x,y,z; ptr=0x20; //指向0x20单元 x=*ptr; //取第一个数 ptr=0x22; //指向0x22单元 y=*ptr; //取第二个数

z=(x>y)?x:y; //将两数中的较大者赋给z ptr=0x24; //指向地址为0x24的目标单元 *ptr=z; //将大数存入目标单元 }

方法二:

#include #include void main() {

unsigned int x,y,z; x=DBYTE[0X20]*256+DBYTE[0X21]; y=DBYTE[0X22]*256+DBYTE[0X23]; z=(x>y)?x:y; //将两数中的较大者赋给z DBYTE[0X24]=z/256; DBYTE[0X25]=z%6; } 方法三:

#include unsigned int x _at_ 0x20; unsigned int y _at_ 0x22; unsigned int z _at_ 0x24; void main() {

z=(x>y)?x:y; }

第5章 单片机的中断系统 习题

1.什么是中断、中断源、中断优先级和中断嵌套?

答:中断是指单片机内部有一个中断管理系统,它对内部的定时器事件、串行通信的发送和接收及外部事件(如键盘按键动作)等进行自动的检测判断。当CPU正在处理某件事情(例如正在执行主程序)的时候,外部或内部发生的某一事件(如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等)请求CPU迅速处理,于是,中断管理系统会置位相应标志通知CPU暂时中止当前的工作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。 引发中断的事件称为中断源。

将中断事件按轻重缓急分若干级别叫中断优先级。

允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌套。

2.什么叫中断源?MCS-51有哪些中断源?各有什么特点?它们的中断向量地址分别是多少? 答:中断源即引发中断的事件。

MCS-51单片机有5个中断源,它们是外部中断0,定时器T0,外部中断1,定时器T1,串行口。

外部中断源是由引脚的触发信号引起的中断,定时器中断源是由于定时器计数器的溢出引发的中断,串行口是由于串行通信的发送或接收引发的中断。

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

Top