第09章单片机应用系统资源扩展习题解答doc.docx
- 文档编号:25625258
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:44
- 大小:298.07KB
第09章单片机应用系统资源扩展习题解答doc.docx
《第09章单片机应用系统资源扩展习题解答doc.docx》由会员分享,可在线阅读,更多相关《第09章单片机应用系统资源扩展习题解答doc.docx(44页珍藏版)》请在冰豆网上搜索。
第09章单片机应用系统资源扩展习题解答doc
第09章单片机应用系统资源扩展习题解答
一、填空题
1.8051单片机扩展I/O口时占用片外数据存储器的地址。
2.8051单片机寻址外设端口时用寄存器间址寻址方式。
3.8051单片机PSEN控制程序存储器读操作。
4.8051单片机访问片外存储器时利用ALE信号锁存来自P0口的低八位地址信号。
5.12根地址线可选
6.欲增加8KB×8
改用Intel6116(2KB
4K位的×8
个存储单元,
RAM区,请问选用
位)需购4
32KB存储单元需要
Intel2114(1KB
片,若改用Intel
15根地址线。
×4位)需购16片;
6264(1KB×8位)需购8
若
片。
7.74LS164
是
串入并出
转换芯片,
74LS165
是
并入串出
转换芯片。
8.74LS138是具有3个输入端的译码器芯片,其输出作为片选信号时,最多可以选中8
块芯片。
9.74LS273通常用来作简单输出接口扩展;而74LS244则常用来作简单输入
接口扩展。
10.片选方式通常有3种形式:
线选法、部分译码器法、全译码法
二、简答题
1.简述单片机并行扩展外部存储器时三总线连接的基本原则。
答:
P0口提供数据线,P0、P2口提供地址线,低位用于片内选择,高位用做片选信号,
用PSEN控制程序存储器的读操作,用RD和WR控制数据存储器或I/O端口的读写。
2.什么是全译码?
什么是部分译码?
什么是线选法?
有什么特点?
答:
(1)全译码法:
先将扩展芯片的地址线与单片机的地址总线从低位开始顺次相连后,
剩余的高位地址线的全部经译码后连接到各扩展芯片的片选线上。
全译码法扩展芯片的地址
空间是唯一确定的,不会有地址重叠。
但译码电路相对复杂。
(2)部分译码法:
与全译码法类似,先将扩展芯片的地址线与单片机的地址总线从低位开
始顺次相连后,剩余的高位地址线的一部分经译码后连接到各扩展芯片的片选线上。
部分译
码使存储器芯片的地址空间也有重叠,但硬件上比全译码法简单,重叠情况与线选法相比较
又有所改进。
(3)线选法:
先将扩展芯片的地址线与单片机的地址总线从低位开始顺次相连后,剩余的
高位地址线的一根或几根直接连接到各扩展芯片的片选线上。
线选法的优点是简单明了,不
需增加额外电路。
缺点是存储空间不连续,存在地址重叠现象。
适用于扩展存储容量较小的
场合。
3.画出利用线选法,用3片2764A扩展24K×8位EPROM的电路图。
分析每个芯片的
地址范围。
答:
电路如图所示
U2地址:
C000H~DFFFH
U3地址:
A000H~BFFFH
U4地址:
6000H~7FFFH
4.采用2114芯片在8031片外扩展1KB数据存储器,并分析地址范围。
答:
电路如图所示。
地址范围:
因为地址总线的高位P2.2~P2.7均没用上,共存着2
6=64个重复地址区间,
每个区间的范围为1K。
0000H~03FFH,0400H~07FFH,0800H~0BFFH,0C00H~0FFFH
,
,
,
,
,
,
,
,
FC00H~FFFFH
5.采用2764和6264
芯片在
8031
片外分别扩展
24KB
程序存储器和数据存储器。
答:
电路如图所示
外部ROM
U2地址:
C000H~DFFFH
U3地址:
A000H~BFFFH
U4地址:
6000H~7FFFH
外部RAM芯片U5、U6、U7的地址范围分别与U2、U3、U4一致,但由于使用不同
的指令访问,因此相互并无影响。
三、
Proteus
仿真
7.在
Proteus
下,完成
9.7节内容。
答:
全自动洗衣机控制器存储器扩展Proteus仿真
随着全自动洗衣机功能的不断丰富,需要的存储器容量也不断增加。
器不够用时,就需要在外部扩展。
下面介绍对全自动洗衣机控制器扩展一片
法,并在Proteu下仿真实现。
当单片机内部存储
AT24C02的方
2C总线,扩展一片AT24C02,通过两个独立中断
用8051单片机的P1.0和P1.1模拟I
按钮对AT24C02进行读写控制。
用一片并串转换芯片4014扩展一个8位数字量输入电路,
输入8个拨码开关的状态。
在
P0口扩展
8个LED发光二极管。
当读按键按下时,从
4014
芯片读入8位拨码开关的状态信息,并写入
AT24C02
芯片。
当写按键按下时,从
AT24C02
芯片中读出刚才保存的
8位拨码开关状态信息,并送
P0口显示。
电路如图9-33
所示。
图9-33仿真电路原理图
C语言参考程序代码如下:
#include
//包含头文件,其中定义
51特殊寄存器
#defineucharunsignedchar
//简化无符号变量声明字
#defineuintunsignedint
#defineDELAY_TIME60
//定义延时时间常数
#defineTRUE1
//定义布尔常量
#defineFALSE0
#defineMYADDR0x08
//定义AT24C02内部单元地址
sbitSDA=P1^0;
//用P1.0模拟I2C
总线的SDA
sbitSCL=P1^1;
//用P1.1模拟I2C
总线的SCL
sbitSL=P1^7;
//4014工作方式控制口
sbitSD=P3^0;
//定义串口数据线
sbitCLK=P3^1;
//定义串口时钟线
/*4014并转串输入子程序*/
ucharget_input()
{
uchardat;
//声明RAM变量,用于存放转换后的
8位数据
SL=1;
//置4014于并行输入工作方式
CLK=0;
//串行口未启动之前,
P3.1上无同步移位脉冲
CLK=1;
//并行置数,软件产生一个脉冲上升沿
SL=0;
//置4014于串行移位工作方式
SCON=0x10;
//串口工作方式
0,允许接收
ES=0;
//关中断
while(RI==0);
//查询接收中断标志位
RI=0;
//全部接收完成,清零标志位
dat=SBUF;
//将转换后的数据送
dat
SL=1;
//置4014于并行输入工作方式
return(dat);
//返回dat值
}
/**********I2C
相关子函数************/
//--------------
延时函数--------------
voidDELAY(uintt)//输入定时时间t,无输出
{
while(t!
=0)
t--;//当t不为0时自减1
}
/*I2C_Start()函数的作用:
产生I2C总线启动信号,当SCL为高电平时使SDA产生
一个由高至低的电平跳变*/
voidI2C_Start(void)//无输入变量,无返回值
{
SDA=1;//置SDA口高电平
SCL=1;//置SCL口高电平
DELAY(DELAY_TIME);//延时,让SCL,SDA高电平持续一段时间
SDA=0;//使SDA口输出低电平
DELAY(DELAY_TIME);//延时,让SDA低电平持续一段时间
SCL=0;//使SCL口输出低电平
DELAY(DELAY_TIME);//延时,为传输数据做准备
}
/*I2C_Stop()函数的作用:
产生
I2C总线停止信号,当
SCL为高电平时使
SDA产生
一个由低至高的电平跳变*/
voidI2C_Stop(void)
//无输入变量,无返回值
{
SDA=0;
//使SDA口输出低电平
SCL=1;
//置SCL口高电平
DELAY(DELAY_TIME);
//延时,电平持续一段时间
SDA=1;
//置SDA口高电平
DELAY(DELAY_TIME);
//延时,电平持续一段时间
SCL=0;
//使SCL口输出低电平
DELAY(DELAY_TIME);
//延时,电平持续一段时间
}
/*SEND_0()函数:
发送位数据
“
0”,在SCL为高电平时使
SDA信号为低*/
voidSEND_0(void)
//无输入变量,无返回值
{
SDA=0;
//使SDA口输出低电平
SCL=1;
//置SCL口高电平
DELAY(DELAY_TIME);
//延时,电平持续一段时间
SCL=0;
//使SCL口输出低电平
DELAY(DELAY_TIME);
//延时,电平持续一段时间
}
/*SEND_1()函数:
发送位数据
“
1”,在SCL为高电平时使
SDA信号为高*/
voidSEND_1(void)
//无输入变量,无返回值
{
SDA=1;
//置SDA口高电平
SCL=1;//置SCL口高电平
DELAY(DELAY_TIME);//延时,电平持续一段时间
SCL=0;//使SCL口输出低电平
DELAY(DELAY_TIME);//延时,电平持续一段时间
}
/*Check_Acknowledge()函数为ACK检验函数:
每发送完一个字节数据后检验ACK应答
信号,返回0表示无应答,返回
1则表示有应答*/
bitCheck_Acknowledge(void)
//无输入变量,返回一个布尔值(
0或1)
{
SDA=1;
//置SDA
口高电平
SCL=1;
//置SCL
口高电平
DELAY(DELAY_TIME/2);
//短延时,电平持续一段时间
F0=SDA;
//读入SDA的状态保存至
PSW中的F0用户标志位
DELAY(DELAY_TIME/2);
//短延时,电平持续一段时间
SCL=0;
//使SCL
口输出低电平
DELAY(DELAY_TIME);
//延时,电平持续一段时间
if(F0==1)
//根据
F0
的值返回布尔变量值
returnFALSE;
//SDA
为1,则无应答信号,返回
0
returnTRUE;
//SDA
为
0,表示收到应答,返回
1
}
/*WriteI2CByte()函数的作用:
向
I2C
总线写一个字节
*/
voidWriteI2CByte(charb)reentrant
//输入1字节数据b,无返回值,函数可重入
{
chari;
//声明变量
i,用于循环计数
for(i=0;i<8;i++)
//8次循环
if((b<
SEND_1();//若位值为1,向总线发送位数据“1”
else//否则
SEND_0();//位值为0,向总线发送位数据“0”
}
/*从I2C总线读一个字节*/
charReadI2CByte(void)reentrant//无输入,返回8位数据,函数可重入
{
charb=0,i;//声明两个变量:
b用于数据接收缓冲,i用于循环控制
for(i=0;i<8;i++)//循环8次
{
SDA=1;//置SDA口高电平
SCL=1;//置SCL口高电平
DELAY(10);//延时
F0=SDA;//将SDA值读至PSW的F0位
DELAY(10);//延时
SCL=0;//使SCL口输出低电平
if(F0==1)//如果位值为1
{//将“1”移入缓冲区的最低位
b=b<<1;//b左移1位
b=b|0x01;//左移后b的最低位置1
}
else//否则,位值为0,“0”移入缓冲区的最低位
b=b<<1;//b左移1位,低位填0
}//下一次循环
returnb;//返回b的值
}//函数调用返回
/**********以下为读写AT24c02的函数**********/
voidWrite_One_Byte(charaddr,charthedata)//向AT24C02的addr单元写数据thedata
{
bitacktemp=1;//定义位变量acktemp,用于存放ACK检验结果,初始为1
I2C_Start();//发送I2C启动信号
WriteI2CByte(0xa0);//向从设备写控制字
acktemp=Check_Acknowledge();//检查ACK值,确认从设备收到控制字
WriteI2CByte(addr);//写地址
acktemp=Check_Acknowledge();//检查ACK值,确认从设备收到地址
WriteI2CByte(thedata);//写数据
acktemp=Check_Acknowledge();//检查ACK值,确认从设备收到数据
I2C_Stop();
//发送I2C停止信号
}
charRead_One_Byte(charaddr)
{
bitacktemp=1;
charmydata;
I2C_Start();
//发送I2C
启动信号
WriteI2CByte(0xa0);
//写控制字,方向为写出
acktemp=Check_Acknowledge();
//检查ACK
值,确认从设备收到控制字
WriteI2CByte(addr);
//写地址
acktemp=Check_Acknowledge();
//检查ACK
值,确认从设备收到地址
I2C_Start();
//重启I2C
WriteI2CByte(0xa1);
//再次发送控制字,方向为读入
acktemp=Check_Acknowledge();
//检查ACK
值,确认从设备收到控制字
mydata=ReadI2CByte();
//读入1字节数据
acktemp=Check_Acknowledge();
//相当于NOACK
信号
returnmydata;
//返回由AT24C02
读出的数据
I2C_Stop();
//发送I2C停止信号
}
/*主程序:
通过中断按钮控制,当读入按钮按下时,读入串口外部扩展8位并行数字量
并保存到AT24C02某个单元内;当写出按钮按下时,从AT24C02同一单元读出数据,并写
出至P0口LED*/
voidmain()
{
IE=0x85;//开外部中断:
EA=1,EX1=1,EX0=1即IE=10000101B=85H
PX0=1;//提升外部中断INT0优先级
PX1=1;//提升外部中断INT1优先级
IT0=1;
IT1=1;
//外部中断
//外部中断
INT0INT1
设置为边沿触发
设置为边沿触发
P0=0xFF;
//LED
灭灯
while
(1);
//等待中断
}
/*
中断服务子程序
*/
voidint0()interrupt0
//外部中断
0服务子程序
:
当写入按钮按下时执行该子函数
{
uchartemp;
//声明一个
RAM
变量,暂存读入的数据
temp=get_input();
//由串行口读入
8位(一字节)开关量的值
Write_One_Byte(MY
ADDR,temp);
//将读入的一字节数据写入
AT2402
的
MYADDR
单元
}
//中断返回
voidint1()interrupt2
//外部中断
1服务子程序:
当读出按钮按下时执行该子程序
{
ucharcontent;
//声明变量,用于暂存读出的数据
content=Read_One_Byte(MYADDR);
//从
AT24C02
中
MYADDR
单元读出
1字节数据
P0=~content;
//读出的数据送
P0
口共阳极
LED
显示
}
//中断返回
8.在
Proteus
下,完成图
9-28
所示输入
/输出接口扩展仿真
。
答:
图
9-28
为采用
74LS244
作为扩展输入、
74LS273
作为扩展输出的
I/O
口扩展电路。
图9-28I/O口扩展
1.芯片及连线
在图9-28中采用的芯片为74LS244、74LS273。
其中,74LS244为8位缓冲驱动器(三
态输出),G1、G2为低电平有效使能端。
74LS273为8D触发器,CLR为低电平有效的清零
端,当CLR=0时,输出全为0且与其它输入端无关;CP端是时钟信号,当CP由低电平向
高电平跳变时,D端输入数据传送到Q输出端。
P0口作为双向8位数据线,既能够从74LS244输入数据,又能够从74LS273输出数据。
输入控制信号由P2.0和RD相“或”后形成。
当二者都为0时,74LS244的控制端有效,选通
74LS244,外部的信息输入到P0数据总线上。
当与74LS244相连的按键都没有按下时,输
入全为1,若按下某键,则他所在线输入为0。
输出控制信号由P2.0和WR相“或”后形成。
当二者都为0后,74LS273的控制端有效,
选通74LS273,P0上的数据锁存到74LS273的输出端,控制发光二极管LED,当某线输出
为0时,相应的LED发光。
2.I/O口地址确定
因为74LS244和74LS273都是在P2.0为0时被选通的,所以二者的口地址都为FEFFH
(这个地址不是唯一的,只要保证P2.0=0,其它地址位无关),即占有相同的地址空间。
但
是由于分别由RD和WR控制,而这两个信号不可能同时为0(执行输入指令,如MOVXA,
@DPTR或MOVXA,@Ri时,RD有效;执行输出指令,如MOVX@DPTR,A或MOVX
@Ri,A时,WR有效),所以逻辑上二者不会发生冲突。
3.编程应用
下面的汇编程序实现的功能是按下任意键,对应的LED发光。
ORG0000H;00H单元存储转移指令
LJMPLOOP;转至LOOP程序段
ORG0100H;0100H开始存放主程序
LOOP:
MOVDPTR,#0FEFFH;数据指针指向I/O口地址
MOVXA,@DPTR;从74LS244读入数据
MOVX@DPTR,A;向74
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 09 单片机 应用 系统资源 扩展 习题 解答 doc