单片机原理与应用及C51程序设计(第二版)课后答案

{

unsigned char number[10]; unsigned char name[10]; unsigned int grade; }p1[3]; main() {

unsigned char i,j=0; SCON=0x52; TMOD=0x20; TH1=0XF3; TR1=1;

printf(\for (i=0;i<3;i++) {

printf(\scanf(\printf(\scanf(\printf(\scanf(\}

for (i=1;i<3;i++) {

if (p1[i].grade>p1[j].grade) j=i; }

printf(\成绩最高的学生是:%s,成绩是:%d\printf(\} while(1); }

//串口初始化

第五章

1.单片机C语言与汇编语言混合编程有哪几种方式?通常采用什么方式?

答:单片机C语言和汇编语言混合编程分为汇编中调用C51函数和C51程序中引用汇编,通常使用的是在C51程序中引用汇编。在C51程序中使用汇编语言有两种

情况:一种是汇编程序部分和C51程序部分为不同的模块,或不同的文件,通常由C51程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C51程序中嵌入一段汇编语言程序。

2.简述C51程序调用汇编程序时如何实现参数传递。

答:C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值的相关约定。行参数传递的方式有两种,一种是通过寄存器传递参数,C51中不

同类型的实参会存入相应的寄存器,在汇编中只需对相应寄存器进行操作,即可达到传递参数的目的;第二种是通过固定存储区传递。

3.简述嵌入式汇编的实现方法。

答:在C51程序中嵌入汇编程序通常的处理方法如下。 第一步:在C文件中以如下方式嵌入汇编程序。

第二步:在Keil C51软件的Project 窗口右击嵌入汇编程序的C文件,在弹出的快捷菜单中选择Options for ...命令,选中右边的Generate Assembler SRC

File和Assemble SRC File复选框,使检查框由灰色变成黑色(有效)状态。

第三步:根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\\C51\\Lib\\C51S.Lib)加入到工程中,该文件必须作为工程的最后文件。 4.简述C51中调用汇编程序的实现方法。

答:编写为C51调用的汇编程序,参数须按规定的寄存器或存储器传送,程序格式有相应的规则,这些规则比较繁琐,为了便于处理,在实际中我们往往先用C51

写出这个程序的主体,然后用SRC控制指令编译产生asm文件,修改这个asm文件得到我们所要的汇编函数。处理过程具体如下。

第一步:先用C语言程序编写出程序框架,如文件名为a1.c(注意参数)。

第二步:在Keil C51的Project窗口中右击该C语言文件,在弹出的快捷菜单中选择Options for ...,右边的Generate Assembler SRCFile和Assemble SRC

File,使检查框由灰色变成黑色(有效)状态;

第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是Keil\\C51\\Lib\\ C51S.Lib)加入工程中,该文件必须作为工程的最后文件。库文件与编译模式

的关系如前面。

第四步:编译后将会产生一个SRC的文件,将这个文件扩展名改为ASM。这样就形成了可供C51程序调用的汇编程序。随后可在该文件的代码段中加入所需的指令

代码。

第五步:将该汇编程序与调用它的主程序一起加到工程文件中,这时工程文件中不再需要原来的C语言文件和库文件,主程序只需要在程序开始处用EXTERN对所

调用的汇编程序中的函数作声明,在主程序中就可调用汇编程序中的函数了。

第六章

1. 何为“准双向I/O接口”?在MCS-51单片机的四个并口中,哪些是“准双向I/O接口”?

答:准双向I/O接口是能实现输入输出功能,但在使用时只能从输入和输出中选择一个。MCS-51单片机的四个并口中P1、P2、P3是准双向I/O接口。 2.

80C51单片机内部有几个定时/计数器?它们由哪些功能寄存器组成?怎样实现定时功能和计数功能?

答:80C51单片机内部有两个16位的可编程定时/计数器,由TH0,TL0,TH1,TL1,TMOD和TCON功能寄存器组成。通过TMOD中的C/T位选择对机器周期计数实现计数

功能,选择对外部脉冲计数实现计数功能。

3.

定时/计数器T0有几种工作方式?各自的特点是什么?

答:有四种工作方式,特点见下表:

M1 0 0 1 1 4.

0 1 0 1 M0 0 1 2 3 工作方式 13位定时/计数器 16位定时/计数器 8位自动重置定时/计数器 方式说明 两个8位定时/计数器(只有T0有) 定时/计数器的四种工作方式各自的计数范围是多少?如果要计10个单位,不同的方式初值应为多少?

答:有四种方式。方式0计数范围:1~8192;方式1计数范围:1~65536;方式2计数范围:1~256;方式3计数范围:1~256。 5.

如果计10个单位,方式0初值为:8192-10=8182;方式1初值为:65536-10=65526;方式2初值为:256-10=246;方式2初值为:256-10=246。 设振荡频率为12MHz,如果用定时/计数器T0产生周期为100ms的方波,可以选择哪几种方式,其初值分别设为多少?

答:只能选择方式1,初值为65536-50000=15536。 6.

何为同步通信?何为异步通信?各自的特点是什么?

答:异步通信方式的特点是数据在线路上传送时是以一个字符(字节)为单位,未传送时线路处于空闲状态,空闲线路约定为高电平“1”。特点是对发送时钟和接

收时钟的要求相对不高,线路简单,但传送速度较慢。

同步通信方式的特点是数据在线路上传送时以字符块为单位,一次传送多个字符,传送时须在前面加上一个或两个同步字符,后面加上校验字符。特点是对发送时钟

和接收时钟要求较高,往往用同一个时钟源控制,控制线路复杂,传送速度快。

7.

单工、半双工和全双工有什么区别?

答:单工方式只有一根数据线,信息只能单向传送;半双工方式也只有一根数据线,但信息可以分时双向传送;全双工方式有两根数据线,在同一个时刻能够实现数

据双向传送。

8.

设某异步通信接口,每帧信息格式为10位,当接口每秒传送1000个字符时,其波特率为多少?

答:10000波特 9.

串行口数据寄存器SBUF有什么特点?

答:发送数据寄存器和接收数据寄存器合起用一个特殊功能寄存器SBUF(串行口数据寄存器),执行MOV SBUF,A发送时为发送数据寄存器,执行MOV A, SBUF接收

时为接收数据寄存器。

10.

MCS-51单片机串行口有几种工作方式?各自特点是什么?

答:有四种工作方式,分别是方式0、方式1、方式2和方式3。其中:

方式0,称为同步移位寄存器方式,一般用于外接移位寄存器芯片扩展I/O接口。 方式1,称为8位的异步通信方式,通常用于双机通信。 方式2和方式3,称为9位的异步通信方式,通常用于多机通信。 11.

说明SM2在方式2和方式3对数据接收有何影响。

答:通过SM2对方式2和方式3数据接收进行控制, SM2=1,那么只有接收的第9位为“1”才接收有效。如SM2=0,接收的第9位无论为1还是0都接收有效。 12.

怎样来实现利用串行口扩展并行输入/输出口?

答:利用串行口在方式0时,当外接一个串入并出的移位寄存器,就可以扩展并行输出口;当外接一个并入串出的移位寄存器时,就可以扩展并行输入口。 13.

什么是中断、中断允许和中断屏蔽?

答:在计算机中,由于计算机内外部的原因或软硬件的原因,使CPU从当前正在执行的程序中暂停下来,而自动转去执行预先安排好的为处理该原因所对应的服务

程序。执行完服务程序后,再返回被暂停的位置继续执行原来的程序,这个过程称为中断,实现中断的硬件系统和软件系统称为中断系统。中断允许是允许中断请求送CPU产生中断,中断屏蔽是禁止中断请求信号送CPU产生中断。

14.

8051有几个中断源?中断请求如何提出?

答:MCS-51单片机提供5个硬件中断源:两个外部中断源

INT0(P3.2)和INT1(P3.3),两个定时/计数器T0和T1中断;1个串行口中断。

外部中断源和的中断请求信号从外部引脚P3.2和P3.3输入;两个定时/计数器T0和T1的溢出中断TF0和TF1定时/计数器T0(或T1)溢出时

提出;串行口中断由发送中断标志T1和接收中断标志R1产生。

15.

8051的中断源中,哪些中断请求信号在中断响应时可以自动清除?哪些不能自动清除?应如何处理?

INT0INT1答:工作在边沿触发方式下的两个外部中断源和两个定时/计数器中断中断请求信号在中断响应时可以自动清除,工作在电平触发方式下的两个外部中断源和串行

口中断不能自动清除。工作在电平触发方式下的两个外部中断源的中断请求信号通过外加硬件和加软件的方式清除,串行口中断标志T1和标志R1完全由软件清除。

16.

8051的中断优先级有几级?在形成中断嵌套时各级有何规定?

答:8051的中断优先级有两级;形成中断嵌套时规定(1) 正在进行的中断过程不能被新的同级或低优先级的中断请求所中断,直到该中断服务程序结束,

返回了主程序且执行了主程序中的一条指令后,CPU才响应新的中断请求。

(2) (3) 17.

正在进行的低优先级中断服务程序能被高优先级中断请求所中断,实现两级中断嵌套。 CPU同时接收到几个中断请求时,首先响应优先级最高的中断请求。

设8051的P1中各位接发光二极管,分别用汇编语言和C语言编程实现逐个轮流点亮二极管,并循环显示。

参考程序:

ORG 0000H LJMP MAIN

ORG 0100H ;主程序

MAIN: MOV A,#01H LOOP:MOV P1,A

CALL DELAY

RL A SJMP LOOP SJMP $

DELAY:MOV R7,#0FFH END

C语言程序:

DJNZ R7,$ RET

#include

void delay(unsigned int x); void main() {

unsigned char i,j; while(1) {i=01;

for (j=0;j<8;j++)

{P1=i; delay(100); i=i*2; }

}

void delay(unsigned int x) {

unsigned char j; while(x--)

{for (j=0;j<125;j++);} }

18.

}

//包含特殊功能寄存器库

8051系统中,已知振荡频率为12MHz,用定时/计数器T0,实现从P1.0产生周期为2ms的方波。要求分别用汇编语言和C语言进行编程。

解:分析:从P1.0输出周期为2ms的方波,只须P1.0每1ms取反一次则可。当系统时钟为12MHZ,定时/计数器T0工作于方式1时,最大的定时时间为

65.536ms,满足1ms的定时要求,方式控制字应设定为00000001B(01H)。定时1ms,计数值N为1000,初值X=65536-1000=64536,则TH0=FCH,TL0=18H。

采用中断处理方式: 程序如下:

ORG 0000H LJMP MAIN

ORG 000BH ;中断处理程序 MOV TH0,#0FCH MOV TL0,#18H CPL P1.0 RETI

ORG 0100H ;主程序

MAIN: MOV TMOD,#01H

MOV TH0,#0FCH MOV TL0,#18H SETB EA SETB ET0 SETB TR0 SJMP $ END

C语言程序:

#include sbit P1_0=P1^0; void main() {

TMOD=0x01; TH0=0xFC;TL0=0x18; EA=1;ET0=1; TR0=1; while(1);

}

//包含特殊功能寄存器库

void time0_int(void) interrupt 1 {

TH0=0xFC;TL0=0x18;

} 19. 解:

P1_0=!P1_0;

//中断服务程序

8051系统中,已知振荡频率为12MHz,用定时/计数器T1,实现从P1.1产生周期为2s的方波。要求分别用汇编语言和C语言进行编程。

从P1.1产生2s的方波,应产生500ms的周期性的定时,定时到对P1.1取反就可实现。由于定时时间较长,一个定时/计数器T1不能直接实现,采用定时/计数器

T1产生周期性为10ms的定时,然后用一个寄存器R2对10ms计数100次来实现。系统时钟为12MHZ,定时/计数器T1定时10ms,计数值N为10000,只能选方式1,方式控制字为00010000B(10H),初值X:

X=65536-10000=55536=1101100011110000B 则TH1=11011000B=D8H,TL1=11110000B=F0H。 定时/计数器T1采用中断处理方式。 汇编程序:

ORG 0000H LJMP MAIN

ORG 001BH LJMP INTT1

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4