单片机课后练习题及答案.docx
《单片机课后练习题及答案.docx》由会员分享,可在线阅读,更多相关《单片机课后练习题及答案.docx(23页珍藏版)》请在冰豆网上搜索。
单片机课后练习题及答案
第9、10章习题
一、问答题
1.ALE端的作用是什么
答:
ALE是地址锁存允许信号端/编程脉冲输入端。
当89C51上电正常工作后,ALE引脚不断向外输出正脉冲信号,此频率为振荡器频率的六分之一。
CPU访问片外存储器时,会丢失一个脉冲。
当对片外RAM进行读/写时,ALE信号不是周期性的。
在其他情况下,ALE信号是一种周期信号,可以用做其他外部设备的时钟信号。
2.总线接口部件的用途是什么
答:
总线接口部件负责CPU与存储器、I/O接口之间的数据传送,即从内存单元或者外设端口中取数据,传送给执行部件。
或者把执行部件的操作结果传送到指定的内存单元或外设端口中。
这样的功能部件叫做总线接口部件。
3.为什么在存储系统中要进行片选控制
答:
一个存储系统往往需要一定数量的存储芯片。
CPU每次只能对其中的一片存储器进行访问,因此CPU首先要选择的是访问那些芯片,这就需要进行片选控制。
一般用空出的高位地址或地址译码器输出的控制信号形成片选信号。
只有片选信号有效时,才能对所连芯片的存储单元进行读写。
4。
5.芯片74LS373、74LS164、74LS138、8255、27512、62128的基本功能以及通常使用在MCS-51系统中的作用。
答:
74LS373为地址锁存器,通常用作扩展外部Rom、Ram或IO口用;
74LS164为串行输入并行输出转换器,常用在将串口扩展为并口;
74LS138为3选8译码器,常用来做地址译码器;
8255为可编程并行IO口扩展芯片,常用来扩展IO口;
27512为64k的EPROM程序存储器;
62128为16k的RAM,数据存储器。
6.在MCS-51单片机系统中,外接程序存储器和数据存储器共用16位地址线和8位数据线,会不会发生冲突,并说明为什么
答:
不会,因为控制信号线的不同:
外扩的RAM芯片既能读出又能写入,所以通常都有读写控制引脚,记为OE和WE。
外扩RAM的读、写控制引脚分别与MCS-51的RD和WR引脚相连。
外扩的EPROM在正常使用中只能读出,不能写入,故EPROM芯片没有写入控制引脚,只有读出引脚,记为OE,该引脚与MCS-51单片机的PSEN相连。
7.8031在使用外部数据存储器时,最多还有多少条通用I/O线可供用户使用并说明原因。
答:
8031使用外部程序存储器时,P0口和P2口要作数据总线和地址总线,所以只有P1口和P2口可用作I/O口,共16条I/O线。
在使用外部数据存储器时,除了占用P0和P2之外,还需要用
和
控制线,而这两条线就是P3口中的两条:
和,所以这时只有14条I/O可用使用。
当然,P2口的8条线并不一定全部占用,但即使如此,这几条线也不能再作I/O线,而只能系统扩展时再用。
8.能否把继电器直接接在89C51的某一口线上来用为什么
答:
不能。
因为89C51的I/O所提供的电压不足于驱动继电器,必须加驱动电路,如一个功率三极管或74LS06等。
9.ADC0809的主要性能
答:
ADC0809、ADC0808是8位逐次逼近式、单片CMOS集成的A/D转换器。
主要性能为:
▲分辨率为8位;
▲精度:
ADC0809小于±1LSB(ADC0808小于±1/2LSB,其余性能与ADC0809一样);
▲单+5V供电,模拟输入电压范围为0~+5V;
▲具有锁存控制的8路输入模拟开关;
▲可锁存三态输出,输出与TTL电平兼容;
▲功耗为15mW;
▲不必进行零点和满刻度调整;
▲转换速度取决于芯片外接的时钟频率。
时钟频率范围:
10~1280kHz。
典型值为时钟频率640kHz,转换时间约为100s。
10.D/A转换器的主要技术指标。
答:
主要技术指标有:
(1)分辨率
(2)建立时间(SettingTime)
(3)精度
其它指标还有线性度、温度系数、漂移等。
11.DAC0832与单片机的接口有哪几种方式
答:
单缓冲器方式:
使数据直接写入DAC寄存器,立即进行D/A转换。
此方式适用于只有一路模拟量输出,或有几路模拟量输出但并不要求同步的系统。
双缓冲器方式:
可以使两路或多路并行D/A转换器同时输出模拟量。
直通方式:
单片机不对DA的控制端进行控制,数量一旦输入,就直接进入DAC寄存器进行DA转换。
12.某8位AD转换器采用的正参考电压为5v,负参考电压为0v,当输入的电压为5v,0v,时,此AD转换器获得的转换值是多少(用16进制表示)
答:
A/D转换中,输入模拟量
与n位输出数字量
的关系式为:
这里:
-输入模拟量;
-转换后输出数字量;
-AD转换器的正、负参考电压;
INTEGER-取整。
当:
时,转换值
时,转换值
时,转换值
13.某8位DA转换器采用的正参考电压为5v,负参考电压为0v,当数字量为127,FFH时,此DA转换器获得的转换值是多少
答:
D/A转换中,输入数字量
与输出转换值
的关系式为:
这里:
-输出模拟量值;
-输入数字量;
-DA转换器的位数;
-DA转换器的正、负参考电压;
当:
时,转换值
时,转换值
14.为什么采用集电极开路门(OC-Open-Collecto)要采用上拉电阻
答:
OC门电路的输出级是一个集电极开路的晶体三极管,如图实线部分所示。
三极管T2集电极什么都不接,所以叫做集电极开路(左边的三极管为反相之用,使输入为“0”时,输出也为“0”)。
当输入端为“0”时,三极管T1截止(即集电极C跟发射极E之间相当于断开),所以5V电源通过1K电阻加到三极管T2上,三极管T2导通(相当于一个开关闭合);当输入端为“1”时,三极管T1导通,三极管T2截止(相当于开关断开)。
很明显,当T2导通时,输出直接接地,所以输出电平为0。
而当T2截止时,则输出端悬空了,即高阻态。
这时电
T2
1k
+V
VCC
1k
输入
输出
T1
OC门输出驱动电路
平状态未知,如果后面一个电阻负载(即使很轻的负载)到地,那么输出端的电平就被这个负载拉到低电平了,所以这个电路是不能输出高电平的。
所以组成电路时,OC门输出端必须外加一个接至正电源的上拉电阻(如图虚线所示)才能正常工作。
15.什么是光电耦合器简述主要结构
答:
在计算机应用系统中,为防止现场强电磁的干扰或工频电压通过输出通道反串到测控系统,一般采用通道隔离技术。
输出通道的隔离最常用的元件是光电耦合器,简称光耦。
光电耦合器件是以光为媒介传输信号的器件,它把一个发光二极管与一个受光源(如光敏三极管、光敏晶闸管或光敏集成电路等)封装在一起,构成电-光-电转换器件。
根据受光源结构的不同,可以将光电耦合器件分为晶体管输出的光电耦合器件和可控硅输出的光电耦合器件两大类。
16.绘出单片机与直流继电器的接口电路,并说明二极管的作用。
VDD
1k
D
1
5
2
4
J
Vcc
89C51
9013
4N25
T
1N4001
1k
150
1
2
直流继电器的接口电路
答:
接口电路如下:
二极管D的作用是保护三极管T,称为续流二极管。
原理如下:
当输出低电平时,T导通,继电器J吸合;当输出高电平时,T截止,继电器断开。
在继电器吸合到断开的瞬间,由于线圈中的电流不能突变,将在线圈产生下正上负的感应电压,使晶体管集电极承受高电压,有可能损坏驱动三极管T。
为此在继电器J线圈两端并接一个续流二极管D,使线圈两端的感应电压被箝位在V左右。
正常工作时,线圈上的电压上正下负,二极管D截止,对电路没有影响。
机械继电器可在继电器节点两端并接火花抑制电路,减少电火花影响,如图的电容。
17.什么是固态继电器
固态继电器(SSR-SolidStateRelay)是一种全部由固态电子元件组成的新型无触点开关器件,它利用电子元件(如开关三极管、双向可控硅等半导体器件)的开关特性,可达到无触点无火花地接通和断开电路的目的,因此又被称为“无触点开关”。
二、选择题
1.8031在扩展外部数据存储器后,还有14条通用I/O线可供用户使用。
2.区分片外程序存储器和数据存储器的最可靠方法是D。
(A)其芯片型号是RAM还是ROM。
(B)看其位于地址范围的低端还是高端。
(C)看其离MCS51芯片的远近。
(D)看其是被RD还是被PSEN信号连接。
3.大多数微型机的总线由A组成的。
(A)地址总线、数据总线、控制总线(B)IO总线、计算总线、扩展总线
(C)CPU总线、存储器总线、I/O总线(D)CPU总线、显示总线、打印机总线
4.ALE是地址锁存允许信号端。
当80C51上电正常工作后,ALE引脚不断向外输出正脉冲信号,此频率为振荡器频率的 C 。
CPU访问片外存储器时,会丢失一个脉冲。
A、四分之一 B、五分之一 C、六分之一 D、七分之一 答案:
C
5.总线接口部件负责CPU与存储器、 B 之间的数据传送,即从内存单元或者外设端口中取数据,传送给执行部件。
。
B、I/O接口 C.ROM。
D. CPU。
6.一个存储系统往往需要一定数量的 A 。
在进行访问时,首先要选择是那些芯片工作,这就需要进行片选控制。
A、存储芯片。
B.存储对象。
C.存储目标。
D. 存储结果。
7.一般用空余的 C 输出一些控制信号形成片选信号。
只有片选信号有效时,才能对所连芯片的存储单元进行读写。
A.普通地址译码。
B.低位地址译码。
C、高位地址译码。
D.特殊地址译码。
8.区分MCS-51单片机片外程序存储器和片外数据存储器的最可靠的方法是D
A、看其芯片的生产厂家
B、看其离MCS-51芯片的远近
C、看其位于地址范围的低端还是高段
D、看其是与RD信号连接还是与PSEN信号连接
9.EA是外部程序存储器地址允许输入端。
当EA引脚接高电平时,CPU从片内程序存储器地址 C 单元开始执行程序,当地址超过4KB时,将自动执行片外程序存储器的程序。
A、1000H B、0030H C、0000H D、0007H
10.能够用紫外光擦除ROM中程序的只读存储器称为(C)。
A、掩膜ROMB、PROMC、EPROMD、EEPROM
11、在片外扩展一片27128程序存储器芯片要(D)地址线。
A、8根B、12根C、16根D、14根
三、填空题
1.CPU与外存或I/O接口连接的系统总线通常由地址总线、数据总线、控制总线三种总线组成。
2.74LS373芯片通常作为地址锁存器之用;ADC0809通常作为AD转换器之用;
DAC0832通常作为DA转换器之用。
3.74LS138是具有3位输入、多位输出的译码器芯片,其输出作为片选信号时,最多可以选中8个芯片。
4.使用双缓冲方式的D/A转换器,可实现多路模拟信号的 同步输出。
5.16KBRAM存储器的首地址若为3000H,则末地址为 6FFFH。
5.8K字节的存储器共有地址线 13 根。
7.3—8译码器74LS138在全译码寻址方式中,译码器的输出端通常与单片机接口芯片的 片选 端连接。
8.单片机P0口为 数据 总线和 地址总线的复用端口,74LS373与P0口连接,其输出线作为系统的 地址 ,74LS373的G端与单片机 ALE 连接。
四、综合题
1.设计一个电路和程序,用51单片机通过光电耦合器和小功率三极管驱动继电器,通过继电器控制一台直流电机。
系统有一个按键,按一次键电机转动,再按一次键电机停止,需绘出原理图,编写出程序。
解:
电路如右图:
程序如下:
#include<>
sbitkey=P1^1;
sbitMOTOR=P1^0;
voiddelayms(unsignedintx)//毫秒延时函数
{
unsignedcharj;
while(x--)
{
for(j=0;j<123;j++){;}
}
}
voidmain(void)
{
MOTOR=1;
while
(1)
{
key=1;
if(key==0)
{
delayms(5);//延时5ms
key=1;
if(key==0)
MOTOR=~MOTOR;
}
}
}
2.在一个扩展的MCS-51系统中,需使用8031,EPROM27128,RAM62128各一片(可增加必要的芯片),请画此单片机系统全部完整的硬件连接图,并给出RAM62128各自的地址的分布(全部用二进制及十六进制表达)。
解:
连接图如下:
地址如表:
由于未用,所以有两个地址。
3.请用89c51设计一个单片机应用系统:
3个按键,1个继电器(1A)控制接口。
画出此系统的硬件原理图。
解:
原理图如下:
4.下图为89c51扩展3片8K的数据存储器6264,图中硬件电路已经连接了一部分,请用片选法将剩下的相关硬件电路连接完成,并写出每一片6264的地址范围(写出确定地址的过程)。
解:
图如下:
地址如下:
A7A6A5A4A3A2A1A0
1:
1100000000000000=C000H
~1101111111111111~DFFFH
2:
1010000000000000=A000H
~1011111111111111~BFFFH
3:
0110000000000000=6000H
-0111111111111111~7FFFH
5.ADC0809与89c51单片机的连接方式如图所示,89c51采用6M晶振。
请编写程序,采用外部中断方式的方法读取通道IN0的转换数据。
图ADC0809与单片机的接口电路
解:
根据电路连接图可计算出ADC0809的8个模拟量输入通道的地址为:
7F00H~7F07H(0xxxx000xxxxxxxx~0xxxx111xxxxxxxx其中x可1、0任选)
通道0的地址为00ffH。
/*------------------------------------------------------------
文件名:
功能:
ADC0809的头文件和驱动函数
-------------------------------------------------------------*/
#ifndef_ADC0809_H_
#define_ADC0809_H_
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
/*-----------------------------------------------------------
AD0809模拟通道的地址
-------------------------------------------------------------*/
uintAD_ch[8]={0x00ff,0x01ff,0x02ff,0x03ff,
0x04ff,0x05ff,0x07ff,0x07ff};
/*-----------------------------------------------------------
功能:
启动ADC0809
参数:
ADC0809模拟通道的地址,可用AD_ch[]查找;
-------------------------------------------------------------*/
voidStart_AD0809(uintch)
{
XBYTE[ch]=0;
}
/*------------------------------------------------------------
功能:
读ADC0809的转换值
参数:
ch-ADC0809模拟通道的地址,可用AD_ch[]查找;
返回值:
ADC0809的转换结果(ox00-oxff)
------------------------------------------------------------*/
ucharRead_AD0809(uintch)
{
ucharaddate;
addate=XBYTE[ch];
return(addate);
}
/*------------------------------------------------------------
功能:
延时xms
-------------------------------------------------------------*/
voiddelayms(uintx)
{
unsignedcharj;
while((x--)!
=0)
{
for(j=0;j<123;j++);
}
}
#endif
#include<>
#include""
unsignedcharAdData;
voidmain(void)
{
EA=1;
EX1=1;
IT1=1;
Start_AD0809(AD_ch[0]);//启动Ch0通道
while
(1);//等ADC0809转换结束的中断
}
voidAD_int1(void)interrupt2//中断服务程序
{
EX1=1;//关中断
AdData=Read_AD0809(AD_ch[0]);//读ch0的转换值
delayms(500);
Start_AD0809(AD_ch[0]);//启动Ch0通道
EX1=1;//开中断
}
6.单片机与ADC0832的连接原理图如下:
请编写以下程序:
产生矩形波、锯齿波、三角波、正弦波的程序。
解:
#include<>
#include<>
#defineucharunsignedchar
#definedata_OUTXBYTE[0x7FFF]
charcodesindat[]={//正弦波数据(256个)
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf3,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
bitflag=0;
voiddelay(unsignedintN)//延时程序
{
inti;
for(i=0;i}
voidconversion_once_0832(unsignedcharout_data)//DA转换程序
{
data_OUT=out_data;//输出数据
delay(10);//延时等待转换
}
ucharkeyscan()//键盘扫描程序
{
ucharkey;
if(P2!
=0xff)
{
delay(10);
key=P2;
if(key!
=0xff)
flag=~flag;
return(key);
}
elsereturn(key=0xff);
}
voidfun_triangle(void)//产生三角波程序
{
uchark;
for(k=0;k<255;k++)
conversion_once_0832(k);
for(;k>0;k--)
conversion_once_0832(k);
}
voidfun_rectangular(void)//产生矩形波程序
{
conversion_once_0832(0xff);
delay(1000);
conversion_once_0832(0x00);
delay(1000);
}
voidfun_sawtooth(void)//产生锯齿波