单片机重点作业题答案整理

更新时间:2023-03-20 07:06:01 阅读量: 实用文档 文档下载

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

第一章

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,【+45】反=01110000,【+45】补=01110000 2. 指明下列字符在计算机内部的表示形式。

AsENdfJFmdsv120

答:41H 73H 45H 4EH 64H 66H 4AH 46H 6DH 64H 73H 76H 31H 32H 30H 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位;

C(PSW.7):进位或借位标志位。

AC(PSW.6):辅助进位或借位可标志位。

F0(PSW.5):用户标志位。是系统预留给用户自己定义的标志位。

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

OV(PSW.2):溢出标志位。在加法或减法运算时,如运算的结果超出8位二进制数的范围,则OV置1,标志溢出,否则OV清零。

P(PSW.0):奇偶标志位。用于记录指令执行后累加器A中1的个数的奇偶性。若累加器A中1的个数为奇数,则P置位,若累加器A中1的个数为偶数,则P清零。

其中PSW.1未定义,可供用户使用。

3. 在8051的存储器结构中,内部数据存储器可分为几个区域?各有什么特点? 答:片内数据存储器按功能可以分成以下几个部分:工作寄存器组区、位寻址区、一般RAM区和特殊功能寄存器区,其中还包含堆栈区。工作寄存器组区,00H~1FH单元,可用R0~R7等8个寄存器访问;位寻址区,20H~2FH单元,

答:堆栈是按先入后出、后入先出的原则进行管理的一段存储区域。CS-51单片机的堆栈是向上生长型的,存入数据是从地址低端向高端延伸,取出数据是从地址高端向低端延伸。入栈和出栈数据是以字节为单位的。入栈时,SP指针的内容先自动加1,然后再把数据存入到SP指针指向的单元;出栈时,先把SP指针指向单元的数据取出,然后再把SP指针的内容自动减1。

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

答:MCS-51单片机有32根I/O线,由P0口经地址锁存器提供低8位(A7~A0),P2口提供高8位(A15~A8)而形成。数据总线宽度为8位,由P0口直接提供。控制总线由第二功能状态下的P3口和4根独立的控制线RST、EA、ALE和PSEN组成。

6. 什么是机器周期? MCS-51单片机的一个机器周期包括多少个时钟周期?

答:机器周期:机器周期是单片机的基本操作周期,每个机器周期包含S1、S2、 、S6六个状态,每个状态包含两拍P1和P2,每一拍为一个时钟周期(振荡周期)。因此,一个机器周期包含12个时钟周期。

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

第三章

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

答:寻址方式可分为数的寻址和指令寻址,

数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,

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

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

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

3.在位处理中,位地址的表示方式有哪几种? 答:1).直接位地址(00H~0FFH)。例如:20H

2).字节地址带位号。例如:20H.3表示20H单元的3位。 3).特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。 4).位符号地址。例如:TR0是定时/计数器T0的启动位。

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

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

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

(3)片内RAM的30H单元内容送到片外RAM的50H单元中。 MOV A,30H MOV R0,#50H MOVX @R0,A

(4)片内RAM的50H单元内容送到片外RAM的3000H单元中。 MOV A,50H MOV DPTR,#3000H MOVX @DPTR,A

MOVX A,@DPTR MOV 20H,A

(6)片外RAM的1000H单元内容送到片外RAM的4000H单元中。 MOV DPTR,#1000H MOVX A,@DPTR MOV DPTR,#4000H MOV @DPTR,A

(7)ROM的1000H单元内容送到片内RAM的50H单元中。 MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOV 20H,A

(8)ROM的1000H单元内容送到片外RAM的1000H单元中。 MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOVX @DPTR,A

5.区分下列指令有什么不同? (1)MOV A,20H和MOV A,#20H 答:前者源操作数是直接寻址,后者源操作数立即寻址。 (2)MOV A,@R1和MOVX A,@R1 答:前者源操作数是访问片内数据存储器,后者源操作数访问片外数据存储器低256字节。 (3)MOV A,R1和MOV A,@R1 答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。 (4)MOVX A,@R1和MOVX A,@DPTR 答:前者源操作数是访问片外数据存储器低256字节,后者源操作数访问片外数据存储器整个64K字节。 (5)MOVX A,@DPTR和MOVC A,@A+DPTR 答:前者源操作数是访问片外数据存储器,后者源操作数访问程序数据存储器。

6.设片内RAM的(20H)=40H,(40H)=10H,(10H)=50H,(P1)=0CAH。分析下列指令执行后片内RAM的20H、40H、10H单元以及P1、P2中的内容。

MOV R0,#20H

MOV A,@R0 ;A=40H MOV R1,A ;R1=40H MOV A,@R1 ;A=10H

MOV @R0,P1 ;(20H)=0CAH MOV P2,P1 ;P2=0CAH MOV 10H,A ;(10H)=10H MOV 20H,10H ;(20H)=10H

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

7.已知(A)=02H,(R1)=7FH,(DPTR)=2FFCH,片内RAM(7FH)=70H,片外RAM(2FFEH)=11H,ROM(2FFEH)=64H,试分别写出以下各条指令执行后目标单元的内容。

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

(2)MOVX @DPTR,A 结果:片外RAM(2FFCH)单元等于02H (3)MOVC A,@A+DPTR 结果: 累加器A等于64H

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

8.已知:(A)=78H,(R1)=78H,(B)=04H,CY=1,片内RAM(78H)=0DDH,(80H)=6CH,试分别写出下列指令执行后目标单元的结果和相应标志位的值。

(1)ADD A,@R1 ;累加器A等于55H,CY等于1 (2)SUBB A,#77H ;累加器A等于00H,CY等于0 (3)MUL AB ;累加器A等于E0H,B寄存器等于01H,CY等于1,OV等于0 (4)DIV AB ;累加器A等于1EH,B寄存器等于00H,CY、OV等于0 (5)ANL 78H,#78H ;片内RAM(78H)单元等于58H

9.设(A)=83H,(R0)=17H,(17H)=34H,分析当执行完下面指令段后累加器A、R0、17H单元的内容。

ANL A,#17H ;A=03H

ORL 17H,A ;(17H)=37H XRL A,@R0 ;A=34H CPL A ;A=CBH

结果:A=CBH,(R0)=17H,(17H)=37H ※10.写出完成下列要求的指令。※

(1)累加器A的低2位清零,其余位不变。与0与 ANL A,#11111100B

(2)累加器A的高2位置“1”,其余位不变。与1或 ORL A,#11000000B

(3)累加器的高4位取反,其余位不变。与1异或 XRL A,#11110000B

(4)累加器第0位、2位、4位、6位取反,其余位不变。与1异或 XRL A,#01010101B

11.说明LJMP指令与AJMP指令的区别? 答:LJMP指令后面提供的是16位目标地址,所以可以转移到64KB程序存储器的任意位置,缺点是:执行时间长,字节数多。

AJMP指令后带的是11位直接地址,执行时,先将程序指针PC的值加2(该指令长度为2字节),然后把指令中的11位地址addr11送给程序指针PC的低11位,而程序指针的高5位不变,只能在当前2K范围内转移。

12.设当前指令CJNE A,#12H,10H的地址是0FFEH,若累加器A的值为10H,则该指令执行后的PC值为多少?若累加器A的值为12H呢?笔记P17

答:指令执行后的PC值为1011H,若累加器A的值为12H,则指令执行后的PC值为1001H。 13.用位处理指令实现P1.4=P1.0 (P1.1 P1.2) /P1.3的逻辑功能。 程序: MOV C,P1.1 ORL C,P1.2 ANL C,P1.0 ORL C,/P1.3 MOV P1.4,C

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

ORG 1000H

TAB:DB 12H,34H ;笔记P21

DS 3 ;笔记p22,保留空间

DW 5567H,87H ;笔记p22,高字节→低地址 答:(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=00,(1004H)=00,(1005H)=55H,(1006H)=67H,(1007H)=00H,(1008H)=87H

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

MOV R0,#20H MOV R2,#03H MOV P2,#00H LOOP:MOV A,@R0 MOVX @R0,A INC R0 DJNZ R2,LOOP SJMP $

※16.编程实现将片外RAM的2000H~2030H单元的内容,全部搬到片内RAM的20H单元开始位置,并将源位置清零。

程序:

MOV R0,#20H MOV DPTR,#2000H

MOVX @DPTR,A INC DPTR INC R0 DJNZ R2,LOOP SJMP $

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

MOV DPTR,#1000H MOV R2,#100 MOV R7,#00 MOV R6,#00

LOOP: MOVX A,@DPTR ADD A,R6 MOV R6,A MOV A,R7 ADDC A,#0 MOV R7,A INC DPTR DJNZ R2,LOOP SJMP $

18.编程实现R4R3 R2,结果放于R7R6R5中。 程序:

ORG 0100H

MUL1:MOV A,R2

MOV B,R3

MUL AB ;R2 R3,结果的低字节直接存入积的R5 MOV R5,A ;结果的高字节存入R6中暂存起来 MOV R6,B

MUL2:MOV A,R2

MOV B,R4

MUL AB ;R2 R4,结果的低字节与R6相加后,再存入R6中 ADD A,R6 MOV R6,A

MOV A,B ;结果的高字节加上进位位后存入R7中 ADDC A,#00 MOV R7,A SJMP $

19.编程实现把片内RAM的20H单元的0位、1位,21H单元的2位、3位,22H单元的4位、5位,23H单元的6位、7位,按原位置关系拼装在一起放于R2中。

MOV C,20H.0 MOV A.0,C MOV C,20H.1 MOV A.1,C MOV C,21H.2 MOV A.2,C MOV C,21H.3 MOV A.3,C MOV C,22H.4 MOV A.4,C MOV C,22H.5

MOV A.7,C MOV R2,A

※20.用查表的方法实现一位十六进制数转换成ASCII。 程序:(设一位十六进制数放在R2中,轮换的ASCII也放于R2中) C16STASC:MOV DPTR,#TAB MOV A,R2 MOVC A,@A+DPTR MOV R2,A RET TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H

DB 38H,391H,41H,42H,43H,44H,45H,46H

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

MOV DPTR,#2000H MOV R3,#100 MOV R2,#00

LOOP: MOVX A,@DPTR

JNZ NEXT INC R2

NEXT:INC DPTR DJNZ R3,LOOP

SJMP $

第四章

1. 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:程序存储器ROM 64KB空间

5. 在C51中,bit位与sbit位有什么区别? 答:bit位类型符用于定义一般的位变量。存储器类型只能是bdata、data、idata,只能是片内RAM的可位寻址区,严格来说只能是bdata。

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

答:通过绝对地址来访问存储器有三种方法:1. 使用C51运行库中预定义宏。2. 通过指针访问。3. 使用C51扩展关键字_at_

7. 在C51中,中断函数与一般函数有什么不同? 答:中断函数在定义时后面带interrupt m修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断0,1——定时/计数器T0,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区定义字符变量val1。 char data val1;

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

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

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

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

(6) 定义特殊功能寄存器变量P3。 sfr P3=0xb0;

(7) 定义特殊功能寄存器变量SCON。 sfr SCON=0x98;

(8) 定义16位的特殊功能寄存器T0。 sfr16 T0=0x8a;

9. 写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。 (1) a+b>c&&b= =c 结果:假 (2) a||b+c&&b-c 结果:真 (3) !(a>b)&&!c||1 结果:真 (4) !(a+b)+c-1&&b+c/2 结果:假 10. 写出下列C51程序的执行结果。 (1)#include <stdio.h> extern serial_initial(); main() {

int x,y,z;

serial_initial(); x=y=8;z=++x;

printf("\n %d %d %d",y,z,x); x=y=8;z=x++;

printf("\n %d %d %d",y,z,x); x=y=8;z=--x;

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

printf("\n"); while(1); }

结果: 8 9 9 8 8 9 8 7 7 8 8 7

(2)#include <stdio.h>

extern serial_initial();main() {

int x,y,z;

serial_initial();

printf("input data x,y?\n"); scanf("%d %d",&x,&y);

printf("\n x y x<y x<=y x>y x>=y x!=y x==y"); printf("\n");

printf("\n%3d%3d",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("%5d",z); z=x==y; printf("%5d",z); while(1); }

执行结果:

input data x,y? 1 2

x y x<y x<=y x>y x>=y x!=y x==y 1 2 1 1 0 0 1 0 (3)#include <stdio.h> extern serial_initial(); main() {

int x,y,z;

serial_initial();

printf("input data x, y ?\n"); scanf("%d %d",&x,&y);

printf("\n x y !x x||y x&&y"); printf("\n%3d%3d",x,y);

z=!y; printf("%5d",z); z=x||y; printf("%5d",z); z=x&&y; printf("%5d",z); printf("\n");printf("\n"); printf("That is all\n"); while(1); }

执行结果:

input data x, y ?

x y !x x||y x&&y 1 2 0 1 1 That is all

(4)#include <stdio.h>

extern serial_initial(); main() {

int a,b;

unsigned int x,y; serial_initial();

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

printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y); a=a<<1;b=b>>1; x=x<<1;y=y>>1;

printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y); printf("\n"); printf("\n");

printf("That is all.\n");

while(1); }

执行结果:

a=aa55 b=aa55 x=aa55 y=aa55 a=54aa b=d52a x=54aa y=552a That is all.

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

答:break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。

continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。

continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。

12. 用分支结构编程实现:输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。

#include <reg52.h> #include <stdio.h> void main(void) {

unsigned char x;

SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; while(1) {

printf("input x:\n"); //输出提示信息 scanf("%c",&x); switch(x) {

case '1':printf(" A\n");break; case '2':printf(" B\n");break; case '3':printf(" C\n");break; case '4':printf(" D\n");break; case '5':printf(" QUIT\n");break; default: printf(" RETRY\n");; }

}

13. 输入3个无符号的字符数据,要求按由大到小的顺序输出。 #include <reg52.h> #include <stdio.h> void main(void) {

unsigned char x,y,z,m;

SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1;

printf("input x,y,z:"); //输出提示信息 scanf("%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\n", x,y,z); //输出 while(1); }

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

#include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 {

int i,s=0; //定义整型变量 i=1;

SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1;

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

s=s+i*i; i++; }

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

(2)do while循环

#include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 {

int i,s=0; //定义整型变量 i=1;

SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1;

i++; }

while (i<=10);

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

(3)for循环

#include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 {

int i,s=0; //定义整型变量 SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1;

for (i=1;i<=10;i++) s=s+i*i; //累加1到10的平方之和在s中 printf("1到10的平方之和=%d\n",s); while(1); }

15. 对一个由5个元素组成的无符号字符数组按由小到大的顺序进行排序。 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 main() {

unsigned char f[5],m,i,j;

SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1;

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

scanf("%c,%c,%c,%c,%c",&f[0],&f[1],&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+1])

{m=f[j];f[j]=f[j+1];f[j+1]=m;}

printf("由小到大的顺序为:%c,%c,%c,%c,%c ",f[0],f[1],f[2],f[3],f[4]); printf("\n"); while(1); }

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

#include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 main() {

unsigned char x,y,z;

TH1=0XF3; TR1=1;

printf("input x,y and z:\n"); scanf("%c,%c,%c",&x,&y,&z); printf("\n");

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

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

printf("max to min is:%c,%c,%c\n",*p1,*p2,*p3); while(1); }

17. 有3个学生,每个学生都包括学号、姓名和成绩,要求找出成绩最高的学生的姓名和成绩。 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 struct student {

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("input 3 studend number,name and grade:\n"); for (i=0;i<3;i++) {

printf("input number:\n"); scanf("%s",p1[i]. number); printf("input name:\n"); scanf("%s",p1[i].name); printf("input grade:\n"); scanf("%d",&p1[i].grade); }

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

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

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

while(1); }

第六章

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

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

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

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

4. 定时/计数器的四种工作方式各自的计数范围是多少?如果要计10个单位,不同的方式初值应为多少? 答:有四种方式。方式0计数范围:1~8192;方式1计数范围:1~65536;方式2计数范围:1~256;方式3计数范围:1~256。

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

5. 设振荡频率为12MHz,如果用定时/计数器T0产生周期为100ms的方波,可以选择哪几种方式,其初值分别设为多少?

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

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个串行口中断。

外部中断源INT0和INT1的中断请求信号从外部引脚P3.2和P3.3输入;两个定时/计数器T0和T1的溢出中断TF0和TF1定时/计数器T0(或T1)溢出时提出;串行口中断由发送中断标志T1和接收中断标志R1产生。

※15. 8051的中断源中,哪些中断请求信号在中断响应时可以自动清除?哪些不能自动清除?应如何处理? 答:工作在边沿触发方式下的两个外部中断源和两个定时/计数器中断中断请求信号在中断响应时可以自动清除,工作在电平触发方式下的两个外部中断源和串行口中断不能自动清除。工作在电平触发方式下的两个外部中断源的中断请求信号通过外加硬件和加软件的方式清除,串行口中断标志T1和标志R1完全由软件清除。

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

答:8051的中断优先级有两级;形成中断嵌套时规定(1) 正在进行的中断过程不能被新的同级或低优先级的中

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

※17. 设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 DJNZ R7,$ RET

END

C语言程序:

#include <reg51.h> //包含特殊功能寄存器库 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

SETB EA SETB ET0 SETB TR0 SJMP $ END

C语言程序:

#include <reg51.h> //包含特殊功能寄存器库 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; P1_0=!P1_0; }

19. 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

ORG 0100H

MAIN: MOV TMOD,#10H

MOV TH1,#0D8H MOV TL1,#0F0H MOV R2,#00H SETB EA SETB ET1 SETB TR1 SJMP $

INTT1: MOV TH1,#0D8H

MOV TL1,#0F0H INC R2

CJNE R2,#64H,NEXT

C语言程序:

#include <reg51.h> //包含特殊功能寄存器库 sbit P1_1=P1^1; char i; void main() {

TMOD=0x10;

TH1=0xD8;TL1=0xf0; EA=1;ET1=1; i=0; TR1=1; while(1); }

void time0_int(void) interrupt 3 //中断服务程序 {

TH1=0xD8;TL1=0xf0; i++;

if (i= =100) {P1_1=! P1_1;i=0;} }

20. 8051系统中,已知振荡频率为12MHz,用定时/计数器T1,实现从P1.1产生高电平宽度为10ms,低电平宽度为20ms的矩形波。要求分别用汇编语言和C语言进行编程。

解:本题处理方式有多种,这里采用对定时/计数器T1形成10ms周期定时,用R2对10ms计数,当计到1,则对P1.1置1,当计到2和3,则对P1.1置0来实现。用定时/计数器T1形成10ms周期定时见上题。

ORG 0000H LJMP MAIN

ORG 001BH LJMP INTT1

ORG 0100H

MAIN: MOV TMOD,#10H

MOV TH1,#0D8H MOV TL1,#0F0H MOV R2,#00H SETB EA SETB ET1 SETB TR1 SJMP $

INTT1: MOV TH1,#0D8H

MOV TL1,#0F0H INC R2

CJNE R2,#01H,NEXT SETB P1.1 SJMP EXIT

NEXT: CJNE R2,#02H,NEXT1

CLR P1.1 SJMP EXIT

NEXT1:CJNE R2,#03H,NEXT

C语言程序:

#include <reg51.h> //包含特殊功能寄存器库 sbit P1_1=P1^1; char i; void main() {

TMOD=0x10;

TH1=0xD8;TL1=0xf0; EA=1;ET1=1; i=0; TR1=1; while(1) {

if (i= =0) {P1_1=1;} if (i= =1) {P1_1=0;} if (i= =2) {P1_1=0;} } ; }

void time0_int(void) interrupt 3 //中断服务程序 {

TH1=0xD8;TL1=0xf0; i++;

if (i= =3) {i=0;} }

21. 用8051单片机的串行口扩展并行I/O接口,控制16个发光二极管依次发光,画出电路图,用汇编语言和C语言分别编写相应的程序。

解:

采用在串口连接两个CD4094来实现,电路图如下:

ORG 0000H LJMP MAIN

ORG 0100H

MAIN: MOV SCON,#00H

MOV R4,#10H MOV R3,#00H MOV R2,#01H CLR P1.0

LOOP: JNB TI,LOOP MOV A,R2

MOV SBUF,A

LOOP1:JNB TI,LOOP1

SETB P1.0 ACALL DELAY CLR TI CLR C MOV A,R2 RLC A MOV R2,A MOV A,R3 RLC A MOV R3,A CLR P1.0

DJNZ R4,START1 SJMP MAIN

DELAY:MOV R7,#05H LOOP2:MOV R6,#0FFH LOOP1:DJNZ R6,LOOP1

DJNZ R7,LOOP2 RET END

C语言程序:

#include <reg51.h>

void delay(unsigned int x); union {

unsigned int word;

struct{unsigned char high;unsigned char low;}bytes; }number;

void main() {

int i; SCON=0x00;

while(1) {

number.word=0x01; for (i=0;i<16;i++)

{SBUF=number.bytes.low; while(!TI); TI=0;

SBUF=number.bytes.high; while(!TI); TI=0;

delay(10);

number.word=number.word*2; } }

{

unsigned char j; while(x--)

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

第七章

1. 什么是MCS-51单片机的最小系统?

答:所谓最小系统,是指一个真正可用的单片机的最小配置系统。对于单片机内部资源已能够满足系统需要的,可直接采用最小系统。

2. 简述存储器扩展的一般方法。

答:存储器芯片与单片机扩展连接具有共同的规律。即不论何种存储器芯片,其引脚都呈三总线结构,与单片机连接都是三总线对接。另外,电源线接电源线,地线接地线。

3. 什么是部分译码法?什么是全译码法?它们各有什么特点?用于形成什么信号? 答:部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间的浪费。全译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线全部参加译码。这种译码方法中存储器芯片的地址空间是唯一确定的,但译码电路要相对复杂。译码形成存储器芯片的片选信号线CE。

4. 采用部分译码为什么会出现地址重叠情况,它对存储器容量有何影响? 答:部分译码就是存储器芯片的地址线与单片机系统的地址线顺次相接后,剩余的高位地址线仅用一部分参加译码。参加译码的地址线对于选中某一存储器芯片有一个确定的状态,而与不参加译码的地址线无关。也可以说,只要参加译码的地址线处于对某一存储器芯片的选中状态,不参加译码的地址线的任意状态都可以选中该芯片。正因为如此,部分译码使存储器芯片的地址空间有重叠,造成系统存储器空间减少。

5. 存储器芯片的地址引脚与容量有什么关系?

N

答:容量(Q)与地址线数目(N)满足关系式:Q=2。

6. MCS-51单片机的外部设备是通过什么方式访问的?

答:MCS-51单片机扩展的外部设备与片外数据存储器统一编址,即外部设备占用片外数据存储器的地址空间。按片外数据存储器的访问方式访问。

7. 何为键抖动?键抖动对键位识别有什么影响?怎样消除键抖动?

答:按键时,无论按下键位还是放开键位都会产生抖动,如果对抖动不作处理,必然会出现按一次键而输入多次,为确保按一次键只确认一次,必须消除按键抖动。消除按键抖动通常有硬件消抖和软件消抖两种方法。

8. 矩阵键盘有几种编码方式?怎样编码?

答:通常有以下两种方法进行编码;(1) 用连接键盘的I/O线的二进制组合进行编码。(2) 顺序排列编码。 9. 简述对矩阵键盘的扫描过程。 答:矩阵式键盘的工作过程可分为两步:第一步是CPU首先检测键盘上是否有键按下;第二步是识别哪一个键按下。 (1) 检测键盘上是否有键按下的处理方法是:将列线送入全扫描字,读入行线的状态来判别。

(2) 识别键盘中哪一个键按下的处理方法是:将列线逐列置成低电平,检查行输入状态,称为逐列扫描。 10. 共阴极数码管与共阳极数码管有何区别?

答:共阴极结构,8段发光二极管的阴极端连接在一起,阳极端分开控制,使用时公共端接地,要使哪根发光二极管亮,则对应的阳极端接高电平;共阳极结构,8段发光二极管的阳极端连接在一起,阴极端分开控制,使用时公共端接电源,要使哪根发光二极管亮,则对应的阴极端接地。

11. 简述LED数码管显示的译码方式。

答:所谓译码方式是指由显示字符转换得到对应的字段码的方式。对于LED数码管显示器,通常的译码方式有硬件译码方式和软件译码方式两种。

12. 简述LED动态显示过程。

答:LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O接口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O接口线控制,工作过程为:第一步使右边第一个数码管的公共端D0为1,其余的数码管的公共端为0,同时在I/O(1)上发送右边第一个数码管的字段码,这时,只有右边第一个数码管显示,其余不显示;第二步使右边第二个数码管的公共端D1为1,其余的数码管的公共端为0,同时在I/O(1)上发送右边第二个数码管的字段码,这时,只有右边第二个数码管显示,其余不显示,依此类推,直到最后一个,这样4个数码管轮流显示相应的信息,一次循环完毕后,下一次循环又这样轮流显示,从计算机的角度看是一个一个地显示,但由于人

答:使用2764(8K 8)芯片通过部分译码法扩展24KB程序存储器,须要3块。采用线译码,P2.5与第一片2764的CE相连,P2.6与第二片2764的CE相连,P2.7与第三片2764的CE相连,硬件连接如下:

第一片:

1100 0000 0000 0000~1101 1111 1111 1111;即C000H~DFFFH; 第二片:

1010 0000 0000 0000~1011 1111 1111 1111;即A000H~BFFFH; 第三片:

0110 0000 0000 0000~0111 1111 1111 1111;即6000H~7FFFH;

14. 使用6264(8KB 8)芯片通过全译码法扩展24KB数据存储器,画出硬件连接图,指明各芯片的地址空间范围。 答:使用6264(8K 8)芯片通过全译码法扩展24KB程序存储器,须要3块。采用138译码器译码,硬件连接如下:

地址空间如下: 第一片:

0000 0000 0000 0000~0001 1111 1111 1111;即0000H~1FFFH; 第二片:

0010 0000 0000 0000~0011 1111 1111 1111;即2000H~3FFFH; 第三片:

0100 0000 0000 0000~0101 1111 1111 1111;即3000H~5FFFH;

15. 试用一片74LS373扩展一个并行输入口,画出硬件连接图,指出相应的控制命令。

答:硬件电路图如下:74LS373的输入端为扩展的输入口,输出端接8051的数据总路线P0口,控制端接高电平,输出允许由片外数据存储器读信号RD和P2.0控制。当片外数据存储器读信号RD和P2.0同为低平时从74LS373中读入

输入数据的命令如下: MOV DPTR,#0FE00H MOVX A,@DPTR

16. 用8255A扩展并行I/O,实现把8个开关的状态通过8个二极管显示出来,画出硬件连接图,用汇编语言和C语言分别编写相应的程序。

答:硬件电路图如下:8051与8255的连接略,设8255的A,B,C和控制控口的地址为7F00H,7F01H,7F02H,7F03H。8255的A口接8个开关,B口接8个发光二极管。

程序如下: 汇编程序 ORG 0000H LJMP MAIN ORG 0100H

MAIN:MOV DPTR,#7F03H MOV A,#90H MOVX @DPTR,A

LOOP:MOV DPTR,#7F00H MOVX A,@DPTR MOV DPTR,#7F01H MOVX @DPTR,A SJMP LOOP SJMP $ END C语言程序:

#include <reg51.h> #include <absacc.h> main()

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

Top