单片机原理与应用C语言版习题答案.docx
《单片机原理与应用C语言版习题答案.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用C语言版习题答案.docx(97页珍藏版)》请在冰豆网上搜索。
单片机原理与应用C语言版习题答案
第1章习题
1-1什么是单片机?
单片机是把微型计算机中的微处理器、存储器、I/O接口、定时器/计数器、串行接口、中断系统等电路集成在一块芯片上形成的单片计算机。
因此被称为单片微型计算机,简称为单片机。
1-2单片机的主要特点是什么?
单片机主要特点有:
在存储器结构上,单片机的存储器采用哈佛(Harvard)结构;在芯片引脚上,大部分采用分时复用技术;在内部资源访问上,通过采用特殊功能寄存器(SFR);在指令系统上,采用面向控制的指令系统;单片机内部一般都集成有一个全双工的串行接口;单片机有很强的外部扩展能力。
1-3指明单片机的主要应用领域。
单片机具有体积小、功耗低、面向控制、可靠性高、价格低廉、可以方便地实现多机和分布式控制等优点,使其广泛的应用于各种控制系统和分布式系统中,主要应用于以下这几个领域:
工业测控、智能设备、家用电器、商用产品以及网络与通信智能接口。
1-4C51单片机的分类。
C51单片机的分类,就是特指MCS-51系列。
那么MCS-51系列的单片机基本上没什么区别,至少内核都是一模一样的。
不同的就是功能模块稍有不同。
比如说:
有些具有AD/DA模块,有些没有;有些有EEPROM(STC89C52),有些没有(AT89S52);有些ROM有8K(AT89S52),有些只有2K;有些RAM有256B,而有些只有128BIT;有些40个管脚(AT89C51、89C52、89S52),有些20个管脚(AT89C2051、89C4051);有些有内部晶振,有些没有;但这些都是稍微一点点的区别,基本都还是算一样的。
1-580C51与8051的区别和联系。
MCS-51单片机是指美国INTEL公司生产的一系列单片机的总称,包括有8031,8051,8751,8032,8052,8752等,其中8051是最典型的产品,该系列其它单片机都是在8051的基础上发展来的,人们习惯于用8051来称呼MCS-51系列单片机。
INTEL公司将MCS-51的核心技术授权给了其它公司,所以有很多公司以8051为核心对单片机进行开发。
其中89C51就是以805为内核开发生产的。
联系:
80C51单片机是在8051的基础上发展起来的,8051单片机与80C51单片机从外形看是完全一样的,其指令系统、引脚信号、总线等完全一致(完全兼容),也就是说在8051下开发的软件完全可以在80C51上应用,反之相同。
区别:
8051与80C51单片机的主要差别在于芯片的制造工艺上。
8051系列单片机采用的是HMOS工艺,高速度、高密度;80C51系列单片机采用的是CHMOS工艺,高速度、高密度、低功耗;也就是说80C51单片机是一种低功耗单片机。
第2章习题
2-1C51单片机内部包含哪些主要功能部件,各功能部件主要完成什么功能。
C51单片机片内集成了中央处理器(CPU)、程序存储器(ROM)、数据存储器(RAM)、两个16位的定时器/计数器(T0和T1)、4个8位的并行I/0口(P0、P1、P2和P3)、串行口等组成。
2-2C51单片机的核心器件是什么?
它由哪些部分组成?
各部分的主要功能是什么?
1微处理器CPU包含有运算器和控制器。
运算器由算术逻辑单元ALU、累加器ACC、B寄存器、两个暂存寄存器、程序状态寄存器组成,完成算术运算(加,减,乘,除,乘除运算与寄存器B有关)、逻辑运算及移位运算等。
控制器由指令寄存器IR、指令译码器ID、定时及控制逻辑电路、程序计数器PC组成,是单片机的运行控制中心。
2片内存储器ROM和RAM;
3四个I/O端口电路;
4定时器/计数器:
2个16位的定时器/计数器
5中断控制系统:
5个中断源(两个外部中断、两个定时/计数器、1个串行口中断)
6串行口:
1个全功能异步串行口
⑦时钟电路:
为系统工作提供时钟。
⑧总线:
通过内部总线把系统的各个部分连成一个有机的整体。
2-3C51单片机有哪些信号需要芯片引脚以第二功能的方式提供。
(P3口引脚的第二功能)。
P3口的第二功能见P10页的表2.1所示。
2-4C51单片机的存储器有什么特点?
如何划分存储空间。
数据存储器和程序存储器分开编址,并有各自的寻址方式和寻址单元。
对存储器的划分在物理上分为4个空间:
片内数据存储器、片内程序存储器、片外数据存储器、片外程序存储器,在逻辑上划分为3个空间:
偏内外程序存储器、片外数据存储器、片内数据存储器。
题2-489C51单片机的存储器结构图
2-5片内RAM低128单元划分为哪三部分?
各部分主要功能是什么?
数据存储器是由RAM构成的,用来存放随机数据。
数据存储器分为内部数据存储器和外部数据存储器两部分。
对于89C51型单片机,内部数据存储器共有256个存储单元,通常把这256个存储单元再划分为低128单元(00H~7FH)和高128单元(80H~FFH),数据存储器的低128单元按用途可划分为3个区域,通用寄存器(00H~1FH)、位寻址区(20H~2FH)和用户RAM区。
2-6堆栈有什么功能?
堆栈指示器(SP)的作用是什么?
在程序设计中,为什么需要对堆栈进行重新赋值。
在单片机程序设计中,堆栈主要是为子程序的调用和中断操作设立的。
其具体功能主要有保护断点和保护现场。
堆栈指针的作用就是指向栈顶元素的,通过它还可以对栈顶元素进行出栈操作当堆栈中的元素进行出栈或入栈操作时,都会使栈顶元素发生变化,堆栈指针sp就需要重新赋值,让其指向新的栈顶元素。
如果嵌套太多,不重新赋值会引起死机的。
2-7单片机时钟电路有何用途?
2-8什么是指令周期、机器周期和时钟周期?
如何计算指令周期的准确时间?
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12us),是计算机中最基本的、最小的时间单位。
在一个时钟周期内,CPU仅完成一个最基本的动作。
8051单片机的时钟范围是1.2MHz-12MHz。
机器周期:
在计算机中,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。
例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。
完成一个基本操作所需要的时间称为机器周期。
80C51系列单片机的一个机器周期同6个S周期(状态周期)组成。
8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。
指令周期:
是执行一条指令所需要的时间,一般由若干个机器周期组成。
指令不同,所需的机器周期数也不同。
对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。
对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
2-9单片机复位有几种方法?
复位后各寄存器的状态如何?
复位方式有上电复位、手动复位、硬件电路复位等。
复位后各寄存器的状态与单片机的类型有关,具体参考器件手册。
2-1089C51单片机运行出错或程序“跑飞”时,如何摆脱困境?
软件方面:
设置看门狗;检查程序,是否有死循环
硬件方面:
在单片机电源输入位置加0.1u电容,最好在电源与地之间加一个100u的电解电容,防止因为电源的波动或干扰信号,引起出错。
2-11基于89C51单片机设计一个最小单片机系统。
题2-11基于AT89C51的单片机最小系统
2-12
引脚功能是什么
程序存储器分为片内存储和片外存储两部分,可通过
引脚的电平确定。
当
引脚为高电平时,程序从片内存储器开始执行,即访问片内存储器,当PC值超过片内存储器的范围时,自动跳转到片外程序存储器空间执行;
当
引脚为低电平时,系统全部执行片外程序存储器程序。
使用说明:
对于不含片内ROM的单片机,应将
引脚固定为低电平。
对于含有片内ROM的单片机,在正常运行时,应将
引脚置为高电平。
当处于调试状态时,可将
引脚置为低电平。
第3章习题
3-1C51单片机有哪几种寻址方式?
适用于什么地址空间?
C51单片机寻址方式主要有七种,即:
立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、位寻址、基址寄存器加变址寄存器间接寻址和相对寻址。
立即寻址适应于8位立即数对片内RAM地址单元的赋值,也可用于16位的立即数对DPTR赋值;直接寻址方式适应于片内RAM的所有地址空间;寄存器寻址适应于片内00H~1FH的32个字节,用R0,R1,…,R7表示;寄存器间接寻址只能使用寄存器R0或Rl作为地址指针,来寻址内部RAM(00H~FFH)中的数据,寄存器间接寻址也适用于访问外部RAM;位操作指令能对内部RAM中的位寻址区(20H~2FH)和某些有位地址的特殊功能寄存器进行位操作,实现位状态传送、状态控制、逻辑运算操作;基址寄存器加变址寄存器间接寻址用于访问程序存储器中的数据表格;相对寻址用于相对转移指令中,转移目标地址在当前地址的-128~127字节范围内的地址空间。
3-2C51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据单元的内容是否为零?
C51单片机的PSW程序状态字中无ZERO(零)标志位,判断某内部数据单元的内容是否为零,只能通过传递数据到累加器A,再判断A中的每一位是否为零,来确定其值是否为零。
3-3编程查找内部RAM的32H~41H单元中是否有0AAH这个数据,若有这一数据,则将50H单元置为0FFH,否则将50H单元清零。
设片内RAM指针R0,指向首地址32H,,比较@R0与#0AAH,若相等,则退出循环,给50H单元赋值0FFH,若不相等,则R0加1,为继续比较下一个字节做准备,直到地址为41H或到计数器设定的计数值,且给50H单元赋值00H。
程序1:
MOVR0,#32H;设地址指针的初值
CONT:
CJNE@R0,#0AAH,NEXT;比较查找值与指针所指单元的值,是否相等
MOVA,#0FFH;相等,赋值0FFH
SJMPDOWN;跳转到,保存结果
NEXT:
INCR0;修改地址指针
CJNER0,#42H,CONT;指针没有超过范围,则继续
MOVA,#00H;查找失败,将00H存入结果
DOWN:
MOV50H,A;将比较结果存入50H单元
SJMP$;暂停
END
程序2:
MOVR7,#16;计数器赋初值,从20H~30H共16个字节
MOVR0,#32H
CONT:
CJNE@R0,#0AAH,NEXT
MOVA,#0FFH
SJMPDOWN
NEXT:
INCR0
DJNZR7,CONT;计数器减1,非零,则继续查找
MOVA,#00H
DOWN:
MOV50H,A;将比较结果存入50H单元
SJMP$
END
3-4内部RAM从DATA开始的区域中存放着10个单字节十进制数,求其累加和,并将结果存入SUM和SUM+1单元。
程序如下:
注;R7计数,R6保存累加和的高8位,R0作为地址指针。
ORG0000H
LJMPMAIN
ORG1000H
SUMEQU30H
DATAAEQU40H
MAIN:
MOVR7,#10;设置计数器的初值
MOVR0,#DATAA;设片内RAM地址指针的初值
CLRA
MOVR6,A;R6存放高8位数据
COUNT:
ADDA,@R0;加RAM中的第一个字节到ACC
DAA
JNCNEXT
INCR6;有进位,高8位加1
NEXT:
INCR0
DJNZR7,COUNT
MOVSUM,A;保存低8位
MOVSUM+1,R6;保存高8位
SJMP$
END
3-5MOVX的指令的功能是什么?
试编程实现,将外部60H~6FH单元的内容搬移到3A0H~3AFH单元。
MOVX可以实现累加器A与外部数据存储器RAM单元或I/0口间的数据传送。
程序如下:
ORG0000H
MOVR0,#60H
MOVR7,#16
MOVDPTR,3A0H
LOOP:
MOVXA,@R0
MOVX@DPTR,A
MOVX@R0,#0FFH
INCR0
INCDPTR
DJNZR7,LOOP
SJMP$
END
3-6MOVC指令的功能是什么?
试编程实现,将程序存储器以TABLE为表首地址定义的16个字节,依次搬移至内部RAM中30H~3FH单元。
MOVC指令的功能可用来查找存放在程序存储器中的常用数据表格。
程序如下:
ORG0000H
MOVDPTR,#TABLE
MOVR7,#16
MOVR2,30H
MOVA,#0
MOVR0,A
LOOP:
MOVCA,@A+DPTR
MOVR2,A
MOVA,R0
INCA
INCR2
DJNZR7,LOOP
SJMP$
END
TABLE:
DB,…,…
3-7什么是位操作指令,有什么特点?
试编程实现:
(1)将从P1.0引脚连续输入的8个状态,按顺序依次存入内部RAM中31H单元,其中第一个输入状态存储在最高位,第8个输入状态存储在最低位;
(2)将内部RAM中31H单元的内容取反后,依次通过P1.0引脚输出,其中最低位D0先输出,最高位D7后输出。
位操作指令的操作对象是内部RAM的位寻址区,即字节地址为20H~2FH单元中连续的128位(位地址为00H~7FH),以及特殊功能寄存器中可进行位寻址的位。
位操作指令包括布尔变量的传送、逻辑运算、控制转移等指令,它共有17条指令,助记符有MOV、CLR、CPL、SETB、ANL、ORL、JC、JNC、JB、JNB和JBC,共11种。
(1)程序如下:
ORG0000H
MOVR7,#8
MOVR2,31H;读入的位地址
LOOP:
MOVC,P1.0
MOVR2,C
INCR2
DJNZR7LOOP
SJMP$
END
(2)程序如下:
ORG0000H
MOVR7,#8
MOVR2,31H;读入的位地址
MOVA,@R2
CPLA
LOOP:
RRCA
MOVP1.0,C
DJNZR7LOOP
SJMP$
END
3-8设在寄存器R3的低4位中存有数码0~F中的一个数,试将其转换成ASCII码,并存入片外RAM的2000H单元。
程序如下:
MOVA,R3;取4位二进制数
ANLA,#0FH;屏蔽高4位
PUSHA;保存A内容到堆栈
CLRC;清C
SUBBA,#0AH;(A)-10
POPA;恢复A内容
JCLOOP;若C=1,则数<10转到LOOP
ADDA,#07H;若C=0,则加37H
LOOP:
ADDA,#30H;转换成ASCII码
MOVDPTR,#2000H
MOVX@DPTR,A
3-9设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。
如果X<10,Y=X-1;如果15≥X≥10,Y=X+8;如果X>15,Y=41。
程序如下:
XEQU5AH
YEQU5BH
ORG0000H
MOVA,X
SUBBA,#10
JCLOOP1
MOVA,X
SUBBA,#15
JCLOOP2
MOVA,#41
MOVY,A
END
LOOP1:
MOVA,X
SUBBA,#01
MOVY,A
END
LOOP2:
MOVA,X
ADDA,#8
MOVY,A
END
3-10试编程把以2000H为首地址的连续50个单元的内容按升序排列,存放到以3000H为首地址的存储区中。
程序如下:
MOVDPTR,#2000H
MOVR0,#30H;读到片内的30H开始的单元
MOVR7,#50
L1:
;将2000H开始的单元数据存储到30H的内部单元
MOVXA,@DPTR
MOV@R0,A
INCR0
INCDPTR
DJNZR7L1
START:
;排序
CLR00H
CLRC
MOVR7,#49
MOVR0,#30H
MOVA,@R0
L3:
INCR0
MOVR2,A
SUBBA,@R0
MOVA,R2
JCNEXT
SETB00H
XCHA,@R0
DECR0
MOV@R0,A
INCR0
NEXT:
MOVA,@R0
DJNZR7,L3
JB00START
MOVDPTR,#3000H;送到片外3000H开始的单元
MOVR0,#20H
MOVR7,#50
L2:
MOVA,@R0
MOVX@DPTR,A
INCDPTR
INCR0
DJNZR7L2
RET
3-11设有100个无符号数,连续存放在以2000H为首地址的存储区中,试编程统计奇数和偶数的个数。
程序如下:
ODDEQU41H;奇数的统计
EVENEQU40H;偶数的统计
CountEQU100;个数
ORG0000H
LJMPMAIN
ORG0040H
Data_Filter:
PUSHPSW;函数调用时的现场保护
PUSHACC
MOVODD,#0
MOVEVEN,#0
MOVR2,#0
MOVDPTR,#0x2000
Loop:
MOVXA,@DPTR
ANLA,#01H
CJNEA,#0,ODD1;偶数
INCEVEN
JMPNEXT
ODD1:
INCODD
JMPNEXT
NEXT:
INCDPTR
INCR2
CJNER2,#Count,Loop
POPACC;恢复现场
POPPSW
RET
MAIN:
ACALLData_Filter
SJMP$;仅用于测试观察
END
第4章习题
4-1简述C51单片机直接支持的数据类型,并加以说明。
答:
字符型(char):
char有有符号字符型signedchar和无符号字符型unsignedchar之分,他们的长度都为一个字节。
对于signedchar,其字节的最高位是符号位,“0”表示正数,“1”表示负数,以补码表示,表示的数值范围是-128~127;对于unsignedchar,表示的数值范围是0~256,可以用来存放无符号的数值,也可存放西文字符。
整型(int):
int有有符号字整型signedint和无符号整型unsignedint之分,他们的长度均为双字节。
对于signedint,它存放双字节有符号的数值,以补码表示,表示的数值范围是-327698~32767;对于unsignedint,它存放双字节无符号的数值,表示的数值范围是0~65535。
长整型(long):
long有有符号字整型signedlong和无符号整型unsignedlong之分,他们的长度均为4个字节。
对于signedlong,它存放4字节有符号的数值,以补码表示,表示的数值范围是-2147483648~2147483647;对于unsignedlong,它存放双字节无符号的数值,表示的数值范围是0~4294967295。
浮点型(float):
float型数据长度为4个字节,格式符合IEEE-754标准的单精度浮点型数据,包含指数和尾数两部分,最高位为符号位,“0”表示正数,“1”表示负数,其余8位为阶码,最后23位为尾数的有效数位,由于尾数的整数部分隐含为“1”,所以尾数的精度为24位。
表示的数值范围是±1.175494E-38~±3.402823E+38(加38)。
双精度型(double):
double型占8个字节,其数值范围为1.7E-308~1.7E+308。
4-2简述C51语言对C51单片机特殊功能寄存器的定义方法。
答:
特殊功能寄存器型是C51扩展的数据类型,用于访问MCS-51单片机中的特殊功能寄存器数据。
它分为sfr和sfr16两种类型。
sfr为字节型特殊功能寄存器类型,占一个字节单元,利用它可访问单片机内部的所有特殊功能寄存器;sfr16为双字节型特殊功能寄存器类型,占两个字节单元,利用它可访问单片机内部占用两个字节的特殊功能寄存器,如定时器T0和T1。
C51中特殊功能寄存器的访问必须先用sfr和sfr16进行声明。
例如:
sfrP1=0x90,即:
约定P1为P1端口在片内的寄存器,在后面的语句编程中可通过对P1赋值,实现对P1端口的赋值。
如用P1=255对P1端口的所有引脚置“1”。
4-3简述C51中特有的数据类型有哪些。
答:
bit型,其值可以是“1”或“0”,bit定义的位变量在C51编译器编译时,在不同的时候位地址可以变化。
sbit型,其值可以是“1”或“0”,sbit定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可寻址的字节单元的某一位联系在一起,在C51编译器编译时,其对应的位地址不能变化。
sfr型,特殊功能寄存器声明(8位),范围就是特殊功能寄存器的范围。
sfr16型,特殊功能寄存器声明(16位),范围就是特殊功能寄存器的范围。
4-4简述C51中对51单片机位的定义方法。
答:
位类型bit是C51扩展的数据类型,用于访问MCS-51单片机中可寻址的位单元。
它分为bit和sbit两种类型,他们在内存中都只占一个二进制位,其值可以是“1”或“0”。
其中用bit定义的位变量在C51编译器编译时,在不同的时候位地址是可以变化的,而sbit定义的位变量必须与MCS-51单片机的一个可以寻址位单元或可寻址的字节单元的某一位联系在一起,在C51编译器编译时,其对应的位地址是不能变化的。
例如:
sfr P1= 0x90; //因P1端口的寄存器可位寻址,所以能定义
sbit P1_1=P1^1; //P1_1为