单片机原理与应用课后习题_第1页
单片机原理与应用课后习题_第2页
单片机原理与应用课后习题_第3页
单片机原理与应用课后习题_第4页
单片机原理与应用课后习题_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第一章

1.给出下列有符号数的原码、反码和补码(假设计算机字长为8位)。+45-89-6

+112

答:[+45]原=00101101,[+45]反=00101101,[+45]#=00101101[-89]原=11011001,

[-89]反=10100110,[-89]#=10100111[-6]原=10000110,[-6]反=11111001,[-6]

补=11111010[+112]原=01110000,1+45]反=01110000,[+45]补=01110000

2.指明下列字符在计算机内部的表示形式。AsENdfJFmdsvl20

答:41H73H45H4EH64H66H4AH46H6DH64H73H76H31H32H30H

3.什么是单片机?

答:单片机是把微型计算机中的微处理器、存储器、I/O接口、定时器/计数器、串行接口、

中断系统等电路集成到一个集成电路芯片上形成的微型计算机。因而被称为单片微型计算

机,简称为单片机。

4.单片机的主要特点是什么?

答:主要特点如下:1)在存储器结构上,单片机的存储器采用哈佛(Harvard)结构2)在芯

片引脚上,大部分采用分时复用技术3)在内部资源访问上,采用特殊功能寄存器(SFR)的

形式4)在指令系统上,采用面向控制的指令系统5)内部一般都集成•个全双工的串行接

口6)单片机有很强的外部扩展能力

5.指明单片机的主要应用领域。

答:单机应用:1)工业自动化控制;2)智能仪器仪表;3)计算机外部设备和智能接口;4)家

用电器多机应用:功能弥散系统、并行多机处理系统和局部网络系统。

第二章

1.MCS-51单片机由哪几个部分组成?

答:MCS-51单片机主要山以下部分组成的:时钟电路、中央处理器(CPU)、存储器系统(RAM

和ROM)、定时/计数器、并行接口、串行接口、中断系统及一些特殊功能寄存器(SFR)。

2.MCS-51的标志寄存器有多少位,各位的含义是什么?

答:MCS-51的标志寄存器PSW有8位;D7D61)5D4D31)2DIDO;CAFR;

C0SISOV;0-P含义如下:C(PSW.7):进位或借位标志位。AC(PSW.6):辅助进

位或借位可标志位。F0(PSM5):用户标志位。是系统预留给用户自己定义的标志位。RS1、

RS0(PSW.4、PSW.3):寄存器组选择位。可用软件置位或清零,用于从四组工作寄存器中选

定当前的工作寄存器组。OV(PSW.2):溢出标志位。在加法或减法运算时,如运算的结果超

出8位二进制数的范围,则0V置1,标志溢出,否则0V清零。P(PSW.O):奇偶标志位。用于记

录指令执行后累加器A中1的个数的奇偶性。若累加器A中1的个数为奇数,则P置位,若累加

器A中1的个数为偶数,贝UP清零。其中PSW.1未定义,可供用户使用。

3.在8051的存储器结构中,内部数据存储器可分为几个区域?各有什么特点?答:片内数

据存储器按功能可以分成以下几个部分:工作寄存器组区、位寻址区、一般RAM区和特殊功

能寄存器区,其中还包含堆栈区。工作寄存器组区,00H〜1FH单元,可用R0〜R7等8个寄存

器访问;位寻址区,20H〜2FH单元,可按位方式访问;•般RAM区,30H〜7FH单元:堆栈区,

可从08到7F单元;特殊功能寄存器区位于80H〜FFH单元。

4.什么是堆栈?说明MCS-51单片机的堆栈处理过程。

答:堆栈是按先入后出、后入先出的原则进行管理的一段存储区域。CS-51单片机的堆

栈是向上生长型的,存入数据是从地址低端向高端延伸,取出数据是从地址高端向低端延伸。

入栈和出栈数据是以字节为单位的。入栈时,SP指针的内容先自动加1,然后再把数据存入

到SP指针指向的单元;出栈时,先把SP指针指向单元的数据取出,然后再把SP指针的内容自

动减1。

5.MCS-51单片机有多少根I/O线?它们和单片机的外部总线有什么关系?答:MCS-51单片

机有32根I/O线,由P0口经地址锁存器提供低8位(A7〜AO),P2口提供高8位(A15〜A8)而形

成。数据总线宽度为8位,由P0口直接提供。控制总线山第二功能状态下的P3口和4根独立

的控制线RST、EA、ALE和PSEN组成。6.什么是机器周期?MCS-51单片机的一个机器周期

包括多少个时钟周期?答:机器周期:机器周期是单片机的基本操作周期,每个机器周期包

含Sl、S2、、S66个状态,每个状态包含两拍P1和P2,每一拍为一个时钟周期(振荡周期)。

因此,一个机器周期包含12个时钟周期。

如果时钟周期的频率为12MHz,那么ALE信号的频率为多少?答:2MHz

第三章

1.在MCS-51单片机中,寻址方式有几种?其中对片内RAM可以用哪几种寻址方式?对片外

RAM可以用哪儿种寻址方式?

答:寻址方式可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数

寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)

和位寻址,指令的寻址有绝对寻址和相对寻址。片内RAM寻址有:寄存器寻址、直接寻址方

式和寄存器间接寻址方式。片外RAM寻址有:寄存器间接寻址方式。

2.在对片外RAM单元寻址中,用Ri间接寻址与用DPTR间接寻址有什么区别?

答:片外数据存储器寻址中,用Ri间接寻址只能访问低端的256字节单元,而用DPTR作指

针间接访问可访问整个64K字节。

3.在位处理中,位地址的表示方式有哪几种?

答:1.直接位地址(OOH'OFFH).例如:20H

2.字节地址带位号。例如:20H.3表示20H单元的3位。

3.特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。

4.位符号地址。例如:TR0是定时/计数器T0的启动位。

4.写出完成下列操作的指令。

(1)R0的内容送到R1中。

MOVA,RO

MOVRI,A

(2)片内RAM的20H单元内容送到片内RAM的4011单元中。

MOV40H,20H

(3)片内RAM的30H单元内容送到片外RAM的50H单元中。

MOVA,30H

MOVR0,#50H

MOVX@R0,A

(4)片内RAM的50H单元内容送到片外RAM的3000H单元中。

MOVA,50H

MOVDPTR,#3000H

MOVX@DPTR,A

(5)片外RAM的2000H单元内容送到片内RAM的20H单元中。

MOVDPTR,#2000H

MOVXA,@DPTR

MOV20H,A

(6)片外RAM的1000H单元内容送到片外RAM的4000H单元中。

MOVDPTR,#1000H

MOVXA,@DPTR

MOVDPTR,#4000H

MOV@DPTR,A

(7)ROM的1000H单元内容送到片内RAM的50H单元中。

MOVA,#0

MOVDPTR,#1000H

MOVCA,@A+DPTR

MOV50H,A

(8)ROM的1000H单元内容送到片外RAM的1000H单元中。

MOVA,#0

MOVDPTR,#1000H

MOVCA,@A+DPTR

MOVX@DPTR,A

5.区分下列指令有什么不同?

(1)MOVA,20H和MOVA,#20H

答:前者源操作数是直接寻址,后者源操作数立即寻址。

(2)MOVA,@R1和MOVXA,@R1

答:前者源操作数是访问片内数据存储器,后者源操作数访问片外数据存储器低

256字节。

(3)MOVA,R1和MOVA,@R1

答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。

(4)MOVXA,@R1和MOVXA,©DPTR

答:前者源操作数是访问片外数据存储器低256字节,后者源操作数访问片外数据

存储器整个64K字节。

(5)MOVXA,@DPTR和MOVCA,@A+DPTR

答:前者源操作数是访问片外数据存储器,后者源操作数访问程序数据存储器。

6.设片内RAM的(20H)=40H,(40H)=10H,(10H)=50H,(Pl)=0CAHo分析下列指令

执行后片内RAM的20H、40H、10H单元以及Pl、P2中的内容。

MOVRO,#20H;R0=20H

MOVA,@R0;A=40H

MOVRI,A;Rl=40H

MOVA,@R1;A=10H

MOV@R0,Pl;(40H)=OCAH

MOVP2,Pl;P2=0CAII

MOV10H,A;(10H)=10H

MOV20H,10H;(20H)=10H

结果:(20H)=10H、(10H)=10H>(40H)=OCAH、P2=0CAH和P1=OCAH

7.已知(A)=0211,(R1)=7FH,(DPTR)=2FFCH,片内RAM(7FII)=70H,片外RAM(2FFEH)

=11H,ROM(2FFEH)=64H,试分别写出以下各条指令执行后目标单元的内容。

(1)MOVA,@R1结果:累加器A等于70H

(2)MOVX@DPTR,A结果:片外RAM(2FFCH)单元等于02H

(3)MOVCA,©A+DPTR结果:累加器A等于64H

(4)XCHDA,@R1结果:累加器A等于OOH,片内RAM(7FH)单元等于72H

8.已知:(A)=78H,(RI)=78H,(B)=04H,CY=1,片内RAM(78H)=ODDH,(80H)=6CH,

试分别写出下列指令执行后目标单元的结果和相应标志位的值。

(1)ADDA,@R1;累加器A等于55H,CY等于1

(2)SUBBA,#77H;累加器A等于OOH,CY等于0

(3)MULAB;累加器A等于EOH,B寄存器等于01H,CY等于1,OV等

于0

(4)DIVAB;累加器A等于1EH,B寄存器等于OOH,CY、OV等于0

(5)ANL78H,#78H;片内RAM(78H)单元等于58H

(6)ORLA,#OFH;累加器A等于7FH

(7)XRL80H,A;片内RAM(80H)等于14H

9.设(A)=83H,(RO)=17H,(17H)=34H,分析当执行完下面指令段后累加器A、RO、

17H单元的内容。

ANLA,#17H;A=O3H

ORL17H,A;(17H)=37H

XRLA,@R0;A=34H

CPLA;A=CBH

结果:A=CBH,(RO)=17H,(17H)=37H

10.写出完成下列要求的指令。

(1)累加器A的低2位清零,其余位不变。

ANLA,#11111100B

(2)累加器A的高2位置“1”,其余位不变。

ORLA,#11000000B

(3)累加器的高4位取反,其余位不变。

XRLA,ttllllOOOOB

(4)累加器第0位、2位、4位、6位取反,其余位不变。

XRLA,S01010101B

11.说明LJMP指令与AJMP指令的区别?

答:LJMP指令后面提供的是16位目标地址,所以可以转移到64KB程序存储器的

任意位置,缺点是:执行时间长,字节数多。

AJMP指令后带的是11位直接地址,执行时,先将程序指针PC的值加2(该指

令长度为2字节),然后把指令中的11位地址addrll送给程序指针PC的低11位,而程序

指针的高5位不变,只能在当前2K范围内转移。

12.设当前指令CJNEA,#12H,10H的地址是0FFEH,若累加器A的值为10H,则该指

令执行后的PC值为多少?若累加器A的值为12H呢?

答:指令执行后的PC值为1011H,若累加器A的值为12H,则指令执行后的PC值

为lOOlHo

13.用位处理指令实现Pl.4=PL0A(Pl.lvP1.2)v/PL3的逻辑功能。

程序:

MOVC,Pl.1

ORLC,Pl.2

ANLC,P1.0

ORLC,/Pl,3

MOVPl.4,C

14.下列程序段汇编后,从1000H单元开始的单元内容是什么?

ORG1000H

TAB:DB12H,34H

DS3

DW5567H,87H

答:(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=00,(1004H)=00,

(1005H)=67H,(1006H)=55H,(1007H)=87H,(1008H)=00H

15.试编一段程序,将片内RAM的20H、21H、22H单元的内容依次存入片外RAM的20H、

21H、22H中。

程序:

MOVRO,#20H

MOVR2,#03H

LOOP:MOVA,@R0

MOVX@R0,A

INCRO

DJNZR2,LOOP

SJMP$

16.编程实现将片外RAM的2000H~2030H单元的内容,全部搬到片内RAM的20H单元开

始位置,并将源位置清零。

程序:

MOVR0,#20H

MOVDPTR,#200011

MOVR2,#31H

LOOP:MOVXA,©DPTR

MOV@R0,A

MOVA,#00

MOVX@DPTR,A

INCDPTR

INCR0

DJNZR2,LOOP

SJMP$

17.编程将片外RAM的1000H单元开始的100个字节数据相加,结果放于R7R6中。

程序:

MOVDPTR,#100011

MOVR2,#100

MOVR7,#00

MOVR6,#00

LOOP:MOVXA,©DPTR

ADDA,R6

MOVR6,A

MOVA,R7

ADDCA,#0

MOVR7,A

INCDPTR

DJNZR2,LOOP

SJMP$

18.编程实现R4R3xR2,结果放于R7R6R5中。

程序:

ORG0100H

MUL1:MOVA,R2

MOVB,R3

MULAB;R2xR3,结果的低字节直接存入积的R5

MOVR5,A;结果的高字节存入R6中暂存起来

MOVR6,B

MUL2:MOVA,R2

MOVB,R4

MULAB;R2xR4,结果的低字节与R6相加后,再存入R6中

ADDA,R6

MOVR6,A

MOVA,B;结果的高字节加上进位位后存入R7中

ADDCA,#00

MOVR7,A

SJMP$

19.编程实现把片内RAM的20H单元的。位、1位,21H单元的2位、3位,22H单元的

4位、5位,23H单元的6位、7位,按原位置关系拼装在一起放于R2中。

程序:

MOVC,20H.0

MOVA.0,C

MOVC,20H.1

MOVA.1,C

MOVC,21H.2

MOVA.2,C

MOVC,21H.3

MOVA.3,C

MOVC,22H.4

MOVA.4,C

MOVC,22H.5

MOVA.5,C

MOVC,23H.6

MOVA.6,C

MOVC,23H.7

MOVA.7,C

MOVR2,A

20.用查表的方法实现一位十六进制数转换成ASCH。

程序:(设一位十六进制数放在R2中,轮换的ASCH也放于R2中)

C16STASC:MOVDPTR,#TAB

MOVA,R2

MOVCA,©A+DPTR

MOVR2,A

RET

TAB:DB30H,31H,32H,33H,34H,35H,36H,37H

DB38H,391H,41H,42H,43H,44H,45H,46H

21.编程统计从片外RAM2000H开始的100个单元中“0”的个数放于R2中。

程序:

MOVDPTR,#2000H

MOVR3,#100

MOVR2,#00

LOOP:MOVXA,©DPTR

JNZNEXT

INCR2

NEXT:INCDPTR

DJNZR3,LOOP

SJMP$

第四章

1.C语言有哪些特点?

答:C语言具有以下特点:

1)语言简洁、紧凑,使用方便、灵活

2)运算符丰富

3)数据结构丰富,具有现代化语言的各种数据结构

4)可进行结构化程序设计

5)可以直接对计算机硬件进行操作

6)生成的目标代码质量高,程序执行效率高

7)可移植性好

2.有哪些数据类型是MCS-51单片机直接支持的?

答:MCS-51单片机宜接支持的数据类型标准分为基本数据类型和组合数据类型,基本数

据类型有字符型char、短整型short、整型int、长整型long、浮点型float、双精度型double、

特殊功能寄存器型和位类型,其中char型与short型相同,float型与double型相同。组合数

据类型有数组类型、结构体类型、共同体类型和枚举类型,另外还有指针类型和空类型。

3.C51特有的数据类型有哪些?

答:C51特有的数据类型有特殊功能寄存器型和位类型。

4.C51中的存储器类型有几种,它们分别表示的存储器区域是什么?

答:C51中的存储器类型有6种,分别如下:

data:直接寻址的片内RAM低128B,访问速度快

bdata:片内RAM的可位寻址区(20H〜2FH),允许字节和位混合访问

idata:间接寻址访问的片内RAM,允许访问全部片内RAM

pdata:用Ri间接访问的片外RAM低256B

xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM

code:程序存储器ROM64KB空间

5.在C51中,bit位与sbit位有什么区别?

答:bit位类型符用于定义一般的位变量。存储器类型只能是bdata、data、idata,只

能是片内RAM的可位寻址区,严格来说只能是bdata。

sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地

址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。

6.在C51中,通过绝对地址来访问的存储器有几种?

答:通过绝对地址来访问存储器有三种方法:1.使用C51运行库中预定义宏。2.通过

指针访问。3.使用C51扩展关键字.at

7.在C51中,中断函数与一般函数有什么不同?

答:中断函数在定义时后面带interruptm修饰符,m的取值为。〜31,对应的中断情况

如下:0——外部中断0,1——定时/计数器TO,2——外部中断1,3—定时/计数器T1,4—

串行口中断,5——定时/计数器T2,其他值预留。

编写MCS-51中断函数需要注意如下几点。

(1)中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译

出错。

(2)中断函数没有返回值。

(3)在任何情况下都不能直接调用中断函数

(4)如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数

相同,否则会产生不正确的结果。

(5)C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。

(6)C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt

后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。

(7)中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其他程序

调用.

8.按给定的存储类型和数据类型,写出卜列变量的说明形式。

(1)在data区定义字符变量vail。

chardatavail;

(2)在idata区定义整型变量val2。

intidataval2;

(3)在xdata区定义无符号字符型数组val3[4]。

unsignedcharxdataval3[4];

(4)在xdata区定义一个指向char类型的指针px。

charxdata*px;

(5)定义可寻址位变量flag。

bitflag;

(6)定义特殊功能寄存器变量P3。

sfrP3=0xa0;

(7)定义特殊功能寄存器变量SCON。

sfrSCON=0x98;

(8)定义16位的特殊功能寄存器TO。

sfrl6T0=0x8a;

9.写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5o

(1)a+b>c&&b==c结果:假

(2)a||b+c&&b-c结果:真

(3)!(a>b)&&!c||1结果:真

(4)!(a+b)+c-l&&b+c/2结果:假

10.写出下列C51程序的执行结果。

(1)

ftinclude<stdio.h>

externserial_initial();

main()

{intx,y,z;

serialinitial();

x=y=8;z=++x;

printfC\n%d%d%d〃,y,z,x)

x=y二8;z=x++;

printfC\n%d%d%d”,y,z,x)

x=y=8;z=-x;

printf(,z\n%d%d%d〃,y,z,x)

x=y二8;z二x一;

printf(,z\n%d%d%d”,y,z,x)

printf(〃\n〃);

while(l);

结果:899

889

877

887

ttinclude<stdio.h>

externserialinitial();main()

(

intx,y,z;

serial_initial();

printf("inputdatax,y?\n〃);

scanf("%d%d〃,&x,&y);

printf(z/\nxyx<yx<=yx>yx>=yx!=yx=y〃);

printf(〃\n〃);

printf(,z\n%3d%3dz/,x,y);

z=x<y;printf(〃%5d〃,z);

z=x<=y;printf(〃%5d〃,z);

z=x>y;printf(〃%5d〃,z);

z=x>=y;printf(〃%5d〃,z);

z=x!=y;printf(,z%5d,z,z);

z=x==y;printfC%5dz,,z);

while(l);

)

执行结果:

inputdatax,y?

12

xyx<yx<=yx>yx>=yx!=yx==y

12110010

(3)

ftinclude<stdio.h>

externserial_initial0;

main()

(

intx,y,z;

serial_initial();

printf(z,inputdatax,y?\n〃);

scanf(〃%d%d〃,&x,&y);

printf(,z\nxy!xx||yx&&y〃);

printf(,z\n%3d%3dz,,x,y);

z=!y;printf(〃%5d〃,z);

z=xIIy;printf(zz%5dz/,z);

z=x&&y;printf("%5d〃,z);

printf(〃\n");printf(〃\n");

printf(,/Thatisall\n〃);

while(l);

)

执行结果:

inputdatax,y?

xy!xxI'yx&&y

12011

Thatisall

(4)

#include<stdio.h>

externserial_initial();

main()

(

inta,b;

unsignedintx,y;

serial_initial();

a=b=0xaa55;x=y=0xaa55;

printf(,z\na=%4xb=%4xx=%4xy=%4x”,a,b,x,y);

a=a<<l;b=b»l;

x=x«l;y=y»l;

printf(〃\na=%4xb=%4xx=%4xy=%4x〃,a,b,x,y);

printf(,z\nz/);

printf(〃\n〃);

printf(,zThatisall.\n");

while(l);

)

执行结果:

a=aa55b=aa55x=aa55y=aa55

a=54aab=d52ax=54aay=552a

Thatisall.

11.break和continue语句的区别是什么?

答:break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。break

语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。

continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执

行的语句,直接进行下一次是否执行循环的判定。

continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整

个循环;break语句则是结束循环,不再进行条件判断。

12.用分支结构编程实现:输入“1”显示“A”,输入“2”显示,输入“3”显

示“C”,输入“4”显示“D”,输入“5”结束。

参考程序:

#include<reg52.h>

ftinclude<stdio.h>

voidmain(void)

(

unsignedcharx;

SC0N=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

while(l)

(

printf(,zinputx:\n〃);〃输出提示信息

scanf(〃%c〃,&x);

switch(x)

(

case'r:printf(〃A\n〃);break;

case'2':printf(〃B\n〃);break;

case'3':printf(〃C\n〃);break;

case'4':printf(〃D\n,z);break;

case'5':printfCQUIT\n,z);break;

default:printfCRETRY\n〃);;

)

if(x='5')break;

)

while(l);

)

13.输入3个无符号的字符数据,要求按由大到小的顺序输出。

参考程序:

#include<reg52.h>

#include<stdio.h>

voidmain(void)

(

unsignedcharx,y,z,m;

SC0N=0x52;〃串口初始化

TMOD=0x20;

TH1=OXF3;

TR1=1;

printf(,zinputx,y,z:〃);〃输出提示信息

scanfC%c,%c,%c",&x,&y,&z);

printf(〃\n〃);

if(x<y){m=x;x=y;y=m;}

if(y<z){m=y;y=z;z=m;}

if(x<y){m=x;x=y;y=m;}

printf("output%c,%c,%c\rT,x,y,z);〃输出

while(1);

)

14.用3种循环结构编写程序实现输出1到10的平方之和。

参考程序:

(1)while循环

ttinclude<reg52.h>〃包含特殊功能寄存器库

#include<stdio.h>〃包含I/O函数库

voidmain(void)〃主函数

(

inti,s=0;〃定义整型变量

i=l;

SC0N=0x52;//串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

while(i<=10)〃累加1到10的平方之和在s中

(

s=s+i*i;

i++;

)

printf("1到10的平方之和=%d\n”,s);

while(l);

)

(2)dowhile循环

ttinclude<reg52.h>〃包含特殊功能寄存器库

ttinclude<stdio.h>〃包含I/O函数库

voidmain(void)〃主函数

(

inti,s=0;〃定义整型变量

i=l;

SC0N=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

do〃累加1到10的平方之和在s中

s=s+i*i;

i++;

)

while(i<=10);

printf("1到10的平方之和=%d\n",s);

whiled);

)

(3)for循环

ttinclude<reg52.h>〃包含特殊功能寄存器库

tfinclude<stdio.h>〃包含I/O函数库

voidmain(void)〃主函数

inti,s=0;〃定义整型变量

SCON=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

for(i=l;i<=10;i++)s=s+i*i;〃累加1到10的平方之和在s中

printf(〃1到10的平方之和二%d\n〃,s);

while(l);

)

15.对一个由5个元素组成的无符号字符数组按山小到大的顺序进行排序。

参考程序:

#include<reg52.h>〃包含特殊功能寄存器库

#include<stdio.h>〃包含I/O函数库

main()

(

unsignedcharf[5],m,i,j;

SC0N=0x52;〃串口初始化

TM0D=0x20;

TH1=OXF3;

TR1=1;

printf(〃输入任意5个字符:〃);

scanfC%c,%c,%c,%c,%c〃,&f[2],&f[3],&f[4]);

printf(〃\n〃);

for(i=0;i<5;i++)

for(j=0;j<5-i;j++)

if(f[j]>f[j+l])

printf(〃由小到大的顺序为*c,%c,%c,%c,枇〃,f[0],f[l],f[2],f[3],f[4]);

printf(〃\n");

while(l);

16.用指针实现,输入3个无符号字符数据,按由大到小的顺序输出。

参考程序:

^include<reg52.h>〃包含特殊功能寄存器库

#include<stdio.h>〃包含I/O函数库

main()

{

unsignedcharx,y,z;

unsignedchar*p,*p1,*p2,*p3;

SC0N=0x52;〃串口初始化

TM01>0x20;

TH1=OXF3;

TR1=1;

printf("inputx,yandz:\n〃);

scanfC%c,%c,&x,&y,&z);

printf(〃\n〃);

pl=&x;p2=&y;p3=&z;

if(*pl<*p2){p=pl;pl=p2;p2=p;}

if(*p2<*p3){p=p2;p2=p3;p3=p;}

if(*pl<*p2){p=pl;pl=p2;p2=p;}

printf(z,maxtominis:%c,%c,%c\n,z,*pl,*p2,*p3);

while(l);

)

17.有3个学生,每个学生都包括学号、姓名和成绩,要求找出成绩最高的学生的姓名

和成绩。

参考程序:

tfinclude<reg52.h>〃包含特殊功能寄存器库

#include<stdio.h>〃包含I/O函数库

structstudent

unsignedcharnumber[10];

unsignedcharname[10];

unsignedintgrade;

}pl[3];

main()

unsignedchari,j=0;

SC0N=0x52;〃串口初始化

TM01>0x20;

TH1=OXF3;

TR1=1;

printf(z/input3studendnumber,nameandgrade:\nz/);

for(i=0;i<3;i++)

(

printf(/zinputnumber:\nz,);

scanfpl[i].number);

printf("inputname:\nz/);

scanfpl[i].name);

printf(z/inputgrade:\n/z);

scanf&pl[i].grade);

}

for(i=l;i<3;i++)

(

if(pl[i].grade>pl[j],grade)j=i;

}

printf("成绩最高的学生是:%s,成绩是:%d",pl[j].name,pl[j].grade);

printf;

)

while(l);)

第五章

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

答:单片机C语言和汇编语言混合编程分为汇编中调用C51函数和C51程序中引用汇编,

通常使用的是在C51程序中引用汇编。在C51程序中使用汇编语言有两种情况:一种是汇编程

序部分和C51程序部分为不同的模块,或不同的文件,通常山C51程序调用汇编程序模块的变

量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C51程序中嵌入一段汇编语

言程序。

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

答:C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值的相关

约定。行参数传递的方式有两种,一种是通过寄存器传递参数,C51中不同类型的实参会存

入相应的寄存器,在汇编中只需对相应寄存器进行操作,即可达到传递参数的目的;第二种

是通过固定存储区传递。

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

答:在C51程序中嵌入汇编程序通常的处理方法如下。

第一步:在C文件中以如下方式嵌入汇编程序。

第二步:在KeilC51软件的Project窗口右击嵌入汇编程序的C文件,在弹出的快捷菜

单中选择Optionsfor...命令,选中右边的GenerateAssemblerSRCFile和AssembleSRC

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

第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是

Keil\C51\Lib\C51S.Lib)加入到工程中,该文件必须作为工程的最后文件。

4.简述C51中调用汇编程序的实现方法。

答:编写为C51调用的汇编程序,参数须按规定的寄存器或存储器传送,程序格式有相

应的规则,这些规则比较繁琐,为了便于处理,在实际中我们往往先用C51写出这个程序的

主体,然后用SRC控制指令编译产生asm文件,修改这个asm文件得到我们所要的汇编函数。

处理过程具体如下。

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

第二步:在KeilC51的Project窗口中右击该C语言文件,在弹出的快捷菜单中选择

Optionsfor...,右边的GenerateAssemblerSRCFile和AssembleSRCFile,使检查框由

灰色变成黑色(有效)状态;

第三步:根据选择的编译模式,把相应的库文件(如Small模式时,是Keil\C51\Lib\

C51S.Lib)加入工程中,该文件必须作为工程的最后文件。库文件与编译模式的关系如前面。

第四步:编译后将会产生一个SRC的文件,将这个文件扩展名改为ASM。这样就形成了可

供C51程序调用的汇编程序。随后可在该文件的代码段中加入所需的指令代码。

第五步:将该汇编程序与调用它的主程序一起加到工程文件中,这时工程文件中不再需

要原来的C语言文件和库文件,主程序只需要在程序开始处用EXTERN对所调用的汇编程序中

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

第六章

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

口”?

答:准双向I/O接口是能实现输入输出功能,但在使用时只能从输入和输出中选择一个。

MCS-51单片机的四个并口中Pl、P2、P3是准双向I/O接口。

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

时功能和计数功能?

答:80c51单片机内部有两个16位的可编程定时/计数器,由THO,TLO,TH1,TL1,TMOD和

TCON功能寄存器组成。通过TMOD中的C/T位选择对机器周期计数实现计数功能,选择对外部

脉冲计数实现计数功能。

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

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

MlM0工作方式方式说明

00013位定时/计数器

01116位定时/计数器

1028位自动重置定时/计数器

113两个8位定时/计数器(只有T0有)

4.定时/计数器的四种工作方式各自的计数范围是多少?如果要计10个单位,不同的

方式初值应为多少?

答:有四种方式。方式0计数范围:广8192;方式1计数范围:P65536;方式2计数范围:

广256;方式3计数范围:「256。

如果计10个单位,方式0初值为:8192-10=8182;方式1初值为:65536-10=65526;方式

2初值为:256-10=246;方式2初值为:256-10=246。

5.设振荡频率为12MHz,如果用定时/计数器TO产生周期为100ms的方波,可以选择哪

几种方式,其初值分别设为多少?

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

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

答:异步通信方式的特点是数据在线路上传送时是以一个字符(字节)为单位,未传送时

线路处于空闲状态,空闲线路约定为高电平“1”。特点是对发送时钟和接收时钟的要求相

对不高,线路简单,但传送速度较慢。

同步通信方式的特点是数据在线路上传送时以字符块为单位,一次传送多个字符,传送

时须在前面加上一个或两个同步字符,后面加上校验字符。特点是对发送时钟和接收时钟要

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

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

答:单工方式只有一根数据线,信息只能单向传送;半双工方式也只有一根数据线,但

信息可以分时双向传送;全双工方式有两根数据线,在同•个时刻能够实现数据双向传送。

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

率为多少?

答:10000波特

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

答:发送数据寄存器和接收数据寄存器合起用一个特殊功能寄存器SBUF(串行口数据寄

存器),执行MOVSBUF,A发送时为发送数据寄存器,执行MOVA,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个硬件中断源:两个外部中断源INTO(P3.2)和INTI(P3.3),

两个定时/计数器TO和T1中断;1个串行口中断。

外部中断源INTO和1NT1的中断请求信号从外部引脚P3.2和P3.3输入:两个定时/计数

器T0和T1的溢出中断TFO和TF1定时/计数器T0(或T1)溢出时提出;串行口中断由发送中断标

志T1和接收中断标志R1产生。

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

除?应如何处理?

答:工作在边沿触发方式下的两个外部中断源和两个定时/计数器中断中断请求信号在

中断响应时可以自动清除,工作在电平触发方式下的两个外部中断源和串行口中断不能自动

清除。工作在电平触发方式下的两个外部中断源的中断请求信号通过外加硬件和加软件的方

式清除,串行口中断标志T1和标志R1完全由软件清除。

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

答:8051的中断优先级有两级;形成中断嵌套时规定(D正在进行的中断过程不能

被新的同级或低优先级的中断请求所中断,直到该中断服务程序结束,返回了主程序且执行

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

(2)正在进行的低优先级中断服务程序能被高优先级中断请求所中断,实现两级中断嵌

套。

(3)CPU同时接收到几个中断请求时,首先响应优先级最高的中断请求。

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

二极管,并循环显示。

参考程序:

ORG0000H

LJMPMAIN

ORGO1OOH;主程序

MAIN:MOVA,#O1H

LOOP:MOVPl,A

CALLDELAY

RLA

SJMPLOOP

SJMP$

DELAY:MOVR7,#OFFH

DJNZR7,$

RET

END

C语言程序:

#include<reg51.h>〃包含特殊功能寄存器库

voiddelay(unsignedintx);

voidmain()

(

unsignedchari,j;

while(l)

{i=01;

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

{Pl=i;

delay(100);

i=i*2;

)

)

)

voiddelay(unsignedintx)

unsignedcharj;

while(x一)

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

18.8051系统中,已知振荡频率为12MHz,用定时/计数器TO,实现从PL0产生周期为2ms

的方波。要求分别用汇编语言和C语言进行编程。

解:分析:从PL0输出周期为2ms的方波,只须P1.0每1ms取反一次则可。当系统时钟为

12MHZ,定时7计数器T0工作于方式1时,最大的定时时间为65.536ms,满足1ms的定时要求,

方式控制字应设定为OOOOOOOIB(OIH)。定时1ms,计数值N为1000,初值X=65536-1000=64536,

则THO=FCH,TL0=18Ho

采用中断处理方式:

程序如下:

ORG0000H

LJMPMAIN

ORGOOOBH;中断处理程序

MOVTHO,#OFCH

MOVTLO,#18H

CPLP1.0

RETI

ORG0100H;主程序

MAIN:MOVTMOD,#01H

MOVTII0,#OFCH

MOVTLO,#18H

SETBEA

SETBETO

SETBTRO

SJMP$

END

C语言程序:

#include<reg51.h>〃包含特殊功能寄存器库

sbitPl_0=Pr0;

voidmain()

TM0D=0x01;

TH0-0xFC;TL0=0xl8;

EA=1;ETO=1;

TRO=1;

while(l);

)

voidtimeO_int(void)interrupt1〃中断服务程序

(

TH0=0xFC;TL0=0xl8;

P1_O=!P1_O;

19.8051系统中,已知振荡频率为12MHz,用定时/计数器T1,实现从PL1产生周期为2s

的方波。要求分别用汇编语言和C语言进行编程。

解:

从PL1产生2s的方波,应产生500ms的周期性的定时,定时到对PL1取反就可实现。山

于定时时间较长,一个定时/计数器T1不能直接实现,采用定时/计数器T1产生周期性为10ms

的定时;然后用一个寄存器R2对10ms计数100次来实现。系统时钟为12MHZ,定时/计数器T1

定时10ms,计数值N为10000,只能选方式1,方式控制字为00010000B(10H),初值X:

X=65536-l0000=55536=1101100011110000B

则THl=H011000B=D8H,TLl=11110000B=F0Ho

定时/计数器T1采用中断处理方式。

汇编程序:

ORG0000H

LJMPMAIN

ORG001BH

LJMPINTT1

ORG01OOH

MAIN:MOVTMOD,#10H

MOVTH1,#0D8H

MOVTL1,#OFOH

MOVR2,#OOH

SETBEA

SETBET1

SETBTRI

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论