第09章单片机应用系统资源扩展习题解答.docx

上传人:b****6 文档编号:4804232 上传时间:2022-12-09 格式:DOCX 页数:16 大小:989.67KB
下载 相关 举报
第09章单片机应用系统资源扩展习题解答.docx_第1页
第1页 / 共16页
第09章单片机应用系统资源扩展习题解答.docx_第2页
第2页 / 共16页
第09章单片机应用系统资源扩展习题解答.docx_第3页
第3页 / 共16页
第09章单片机应用系统资源扩展习题解答.docx_第4页
第4页 / 共16页
第09章单片机应用系统资源扩展习题解答.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

第09章单片机应用系统资源扩展习题解答.docx

《第09章单片机应用系统资源扩展习题解答.docx》由会员分享,可在线阅读,更多相关《第09章单片机应用系统资源扩展习题解答.docx(16页珍藏版)》请在冰豆网上搜索。

第09章单片机应用系统资源扩展习题解答.docx

第09章单片机应用系统资源扩展习题解答

一、填空题

1.8051单片机扩展I/O口时占用片外数据存储器的地址。

2.8051单片机寻址外设端口时用寄存器间址寻址方式。

3.8051单片机PSEN控制程序存储器读操作。

4.8051单片机访问片外存储器时利用ALE信号锁存来自P0口的低八位地址信号。

5.12根地址线可选4K个存储单元,32KB存储单元需要15根地址线。

6.欲增加8KBX8位的RAM区,请问选用Intel2114(1KBX4位)需购16片;若

改用Intel6116(2KBX8位)需购4片,若改用Intel6264(1KBX8位)需购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)线选法:

先将扩展芯片的地址线与单片机的地址总线从低位开始顺次相连后,剩余的

高位地址线的一根或几根直接连接到各扩展芯片的片选线上。

线选法的优点是简单明了,不

需增加额外电路。

缺点是存储空间不连续,

存在地址重叠现象。

适用于扩展存储容量较小的

si

地址范围:

因为地址总线的高位

6=64个重复地址区间,

P2.2〜P2.7均没用上,共存着2

场合。

U2地址:

C000H〜DFFFH

U3地址:

A000H〜BFFFH

U4地址:

6000H〜7FFFH

4.采用2114芯片在8031片外扩展1KB数据存储器,并分析地址范围答:

电路如图所示。

每个区间的范围为1K

,,,,,,,,,,,,,,,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仿真

随着全自动洗衣机功能的不断丰富,需要的存储器容量也不断增加。

当单片机内部存储

器不够用时,就需要在外部扩展。

下面介绍对全自动洗衣机控制器扩展一片AT24C02的方

法,并在Proteu下仿真实现。

2C总线,扩展一片AT24C02,通过两个独立中断

用8051单片机的P1.0和P1.1模拟I

4014扩展一个8位数字量输入电路,

按钮对AT24C02进行读写控制。

用一片并串转换芯片

芯片读入8位拨码开关的状态信息,并写入AT24C02芯片。

当写按键按下时,从AT24C02

图9-33仿真电路原理图

芯片中读出刚才保存的8位拨码开关状态信息,并送P0口显示。

电路如图9-33所示。

 

C语言参考程序代码如下:

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值

 

//延时函数

voidDELAY(uintt)//输入定时时间t,无输出

{

while(t!

=0)

t--;//当t不为0时自减1

}

/*I2C_Start()函数的作用:

产生I2C总线启动信号,当SCL为高电平时使SDA产生一个由高至低的电平跳变*/

 

//置SDA口高电平

//置SCL口高电平

//延时,让SCL,SDA高电平持续一段时间

voidI2C_Start(void)

{

SDA=1;

SCL=1;

DELAY(DELAY_TIME);

//无输入变量,无返回值

 

SDA=0;

//使SDA口输出低电平

SDA信号为低*/

SDA信号为高*/

SCL=0;

DELAY(DELAY_TIME);

}

/*

一个由低至高的电平跳变

voidI2C_Stop(void)

{

SDA=0;

SCL=1;

DELAY(DELAY_TIME);

SDA=1;

DELAY(DELAY_TIME);

SCL=0;

DELAY(DELAY_TIME);

}

/*SEND_0()函数:

发送位数据

voidSEND_0(void)

{

SDA=0;

SCL=1;

DELAY(DELAY_TIME);

SCL=0;

DELAY(DELAY_TIME);

}

/*SEND_1()函数:

发送位数据

voidSEND_1(void)

{

SDA=1;

SCL=1;

//使SCL口输出低电平//延时,为传输数据做准备

I2C总线停止信号,当

//无输入变量,无返回值

//使SDA口输出低电平//置SCL口高电平//延时,电平持续一段时间//置SDA口高电平//延时,电平持续一段时间//使SCL口输出低电平//延时,电平持续一段时间

“0”,在SCL为高电平时使//无输入变量,无返回值

//使SDA口输出低电平//置SCL口高电平//延时,电平持续一段时间//使SCL口输出低电平//延时,电平持续一段时间

“1”,在SCL为高电平时使//无输入变量,无返回值

//置SDA口高电平

//置SCL口高电平

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

I2C总线写一个字节*/

/*WriteI2CByte()函数的作用:

 

SEND_0();//位值为0,向总线发送位数据“0”

/*从I2C总线读一个字节*/

 

 

if(F0==1)

b=b<<1;

//如果位值为1

//将“1”移入缓冲区的最低位

//b左移1位

 

//下一次循环

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值,确认从设备收到控制字

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;

//外部中断INTO

设置为边沿触发

IT1=1;

//外部中断INT1

设置为边沿触发

P0=0xFF;

//LED灭灯

while

(1);

}

//等待中断

}

/*中断服务子程序

*/

voidint0()interrupt0

r

//外部中断

0服务子程序:

当写入按钮按下时执行该子函数

{

uchartemp;

〃声明一个RAM变量,暂存读入的数据

temp=get_input();

//由串行口读入8位(一字节)开关量的值

Write_One_Byte(MY

ADDR,temp);

//将读入的一字节数据写入AT2402的MYADDR

}

//中断返回

voidint1()interrupt2

r

//外部中断

1服务子程序:

当读出按钮按下时执行该子程序

{

ucharcontent;

//声明变量,用于暂存读出的数据

content=Read_One_Byte(MYADDR);

单元

//从AT24C02中MYADDR单元读出1字节数据

 

//中断返回

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发光。

 

END

C参考源程序如下:

#include

//包含头文件,该文件中定义51寄存器

#include

//包含头文件,该文件中定义绝对地址变量类型

#defineSPIOXBYTE[0xFEFF]//声明74LS244和74LS273的16位地址变量

#defineucharunsignedchar//定义一个无符号字符类型宏

voidmain()

f

//主程序

{

while

(1)

//上电后一直循环执行下列程序语句

{uchartemp;

//声明一个8位变量,编译器自动给该变量分配RAM内地址

temp=SPIO;}

//从74LS244读入数据

SPIO=temp;

//将数据送至74LS273,驱动外部连接的LED

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1