ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:159.66KB ,
资源ID:9738669      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9738669.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第09章 单片机应用系统资源扩展 习题解答.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、第09章 单片机应用系统资源扩展 习题解答第09章 单片机应用系统资源扩展 习题解答一、填空题1. 8051单片机扩展I/O口时占用片外 数据 存储器的地址。2. 8051单片机寻址外设端口时用 寄存器间址 寻址方式。3. 8051单片机PSEN控制 程序 存储器读操作。4. 8051 单片机访问片外存储器时利用 ALE 信号锁存来自 P0 口的低八位地址信号。5. 12根地址线可选 4K 个存储单元,32KB存储单元需要 15 根地址线。6. 欲增加8KB8位的RAM区,请问选用Intel 2114(1KB4位)需购 16 片; 若改用Intel 6116(2KB8位)需购 4 片,若改用I

2、ntel 6264 (1KB8位)需购 8 片。 774LS164 是 串入并出 转换芯片,74LS165是 并入串出 转换芯片。 874LS138是具有3个输入端的译码器芯片,其输出作为片选信号时,最多可以选中 8 块芯片。 974LS273通常用来作简单 输出 接口扩展;而74LS244则常用来作简单 输入 接口扩展。 10片选方式通常有3种形式: 线选法 、 部分译码器法 、 全译码法 二、简答题1简述单片机并行扩展外部存储器时三总线连接的基本原则。答:P0口提供数据线,P0、P2口提供地址线,低位用于片内选择,高位用做片选信号,用控制程序存储器的读操作,用和控制数据存储器或I/O端口的

3、读写。2什么是全译码?什么是部分译码?什么是线选法?有什么特点?答:(1)全译码法:先将扩展芯片的地址线与单片机的地址总线从低位开始顺次相连后,剩余的高位地址线的全部经译码后连接到各扩展芯片的片选线上。全译码法扩展芯片的地址空间是唯一确定的,不会有地址重叠。但译码电路相对复杂。(2)部分译码法:与全译码法类似,先将扩展芯片的地址线与单片机的地址总线从低位开始顺次相连后,剩余的高位地址线的一部分经译码后连接到各扩展芯片的片选线上。部分译码使存储器芯片的地址空间也有重叠,但硬件上比全译码法简单,重叠情况与线选法相比较又有所改进。(3)线选法:先将扩展芯片的地址线与单片机的地址总线从低位开始顺次相连

4、后,剩余的高位地址线的一根或几根直接连接到各扩展芯片的片选线上。线选法的优点是简单明了,不需增加额外电路。缺点是存储空间不连续,存在地址重叠现象。适用于扩展存储容量较小的场合。3画出利用线选法,用3 片2764A 扩展24K8 位EPROM 的电路图。分析每个芯片的地址范围。答:电路如图所示U2地址:C000HDFFFHU3地址:A000HBFFFHU4地址:6000H7FFFH4采用2114芯片在8031片外扩展1 KB数据存储器,并分析地址范围。答:电路如图所示。地址范围:因为地址总线的高位P2.2P2.7均没用上,共存着26=64个重复地址区间,每个区间的范围为1K。 0000H03FF

5、H,0400H07FFH,0800H0BFFH,0C00H0FFFH FC00HFFFFH5采用2764和6264芯片在8031片外分别扩展24 KB程序存储器和数据存储器。答:电路如图所示外部ROMU2地址:C000HDFFFHU3地址:A000HBFFFHU4地址:6000H7FFFH外部RAM 芯片U5、U6、U7的地址范围分别与U2、U3、U4一致,但由于使用不同的指令访问,因此相互并无影响。三、Proteus仿真1. 在Proteus下,完成9.7节内容。答:全自动洗衣机控制器存储器扩展Proteus 仿真随着全自动洗衣机功能的不断丰富,需要的存储器容量也不断增加。当单片机内部存储器

6、不够用时,就需要在外部扩展。下面介绍对全自动洗衣机控制器扩展一片AT24C02的方法,并在Proteu下仿真实现。用8051单片机的P1.0和P1.1模拟I2C总线,扩展一片AT24C02,通过两个独立中断按钮对AT24C02进行读写控制。用一片并串转换芯片4014扩展一个8位数字量输入电路,输入8个拨码开关的状态。在P0口扩展8个LED发光二极管。当读按键按下时,从4014芯片读入8位拨码开关的状态信息,并写入AT24C02芯片。当写按键按下时,从AT24C02芯片中读出刚才保存的8位拨码开关状态信息,并送P0口显示。电路如图9-33所示。图 9-33 仿真电路原理图C语言参考程序代码如下:

7、#include /包含头文件,其中定义51特殊寄存器#define uchar unsigned char /简化无符号变量声明字#define uint unsigned int #define DELAY_TIME 60 /定义延时时间常数#define TRUE 1 /定义布尔常量#define FALSE 0 #define MYADDR 0x08 /定义AT24C02内部单元地址sbit SDA=P10; /用P1.0模拟I2C 总线的SDAsbit SCL=P11; /用P1.1模拟I2C 总线的SCLsbit SL=P17; /4014工作方式控制口sbit SD=P30; /

8、定义串口数据线sbit CLK=P31; /定义串口时钟线/*4014并转串输入子程序*/uchar get_input()uchar dat; /声明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; /将转换后的数据送datSL=1; /置401

9、4于并行输入工作方式return(dat); /返回 dat值/* I2C 相关子函数 */-延时函数-void DELAY(uint t) /输入定时时间t,无输出while(t!=0) t-; /当t不为0时自减1/* I2C_Start()函数的作用:产生I2C总线启动信号,当SCL为高电平时使SDA产生一个由高至低的电平跳变*/void I2C_Start(void) /无输入变量,无返回值 SDA=1; /置SDA口高电平SCL=1; /置SCL口高电平DELAY(DELAY_TIME); /延时,让SCL,SDA高电平持续一段时间SDA=0; /使SDA口输出低电平DELAY(DE

10、LAY_TIME); /延时,让SDA低电平持续一段时间SCL=0; /使SCL口输出低电平DELAY(DELAY_TIME); /延时,为传输数据做准备/* I2C_Stop()函数的作用:产生I2C总线停止信号,当SCL为高电平时使SDA产生一个由低至高的电平跳变*/void I2C_Stop(void) /无输入变量,无返回值SDA=0; /使SDA口输出低电平SCL=1; /置SCL口高电平DELAY(DELAY_TIME); /延时,电平持续一段时间SDA=1; /置SDA口高电平DELAY(DELAY_TIME); /延时,电平持续一段时间SCL=0; /使SCL口输出低电平DEL

11、AY(DELAY_TIME); /延时,电平持续一段时间/* SEND_0()函数:发送位数据“0”,在SCL为高电平时使SDA信号为低*/void SEND_0(void) /无输入变量,无返回值SDA=0; /使SDA口输出低电平SCL=1; /置SCL口高电平DELAY(DELAY_TIME); /延时,电平持续一段时间SCL=0; /使SCL口输出低电平DELAY(DELAY_TIME); /延时,电平持续一段时间/* SEND_1()函数:发送位数据“1”,在SCL为高电平时使SDA信号为高*/void SEND_1(void) /无输入变量,无返回值SDA=1; /置SDA口高电平

12、SCL=1; /置SCL口高电平DELAY(DELAY_TIME); /延时,电平持续一段时间SCL=0; /使SCL口输出低电平DELAY(DELAY_TIME); /延时,电平持续一段时间/* Check_Acknowledge()函数为ACK检验函数:每发送完一个字节数据后检验ACK应答信号,返回0表示无应答,返回1则表示有应答*/bit Check_Acknowledge(void) /无输入变量,返回一个布尔值(0或1)SDA=1; /置SDA口高电平SCL=1; /置SCL口高电平DELAY(DELAY_TIME/2); /短延时,电平持续一段时间F0=SDA; /读入SDA的状态

13、保存至PSW中的F0用户标志位DELAY(DELAY_TIME/2); /短延时,电平持续一段时间SCL=0; /使SCL口输出低电平DELAY(DELAY_TIME); /延时,电平持续一段时间if(F0=1) /根据F0的值返回布尔变量值 return FALSE; /SDA为1,则无应答信号,返回0return TRUE; /SDA为0,表示收到应答,返回1/* WriteI2CByte()函数的作用:向I2C总线写一个字节*/void WriteI2CByte(char b)reentrant /输入1字节数据b,无返回值,函数可重入char i; /声明变量i,用于循环计数for(i

14、=0;i8;i+) /8次循环 if(bi)&0x80) /逐一判断输入数据各位的值 SEND_1(); /若位值为1,向总线发送位数据“1” else /否则 SEND_0(); /位值为0,向总线发送位数据“0”/*从I2C总线读一个字节*/char ReadI2CByte(void)reentrant /无输入,返回8位数据,函数可重入char b=0,i; /声明两个变量:b用于数据接收缓冲,i用于循环控制 for(i=0;i8;i+) /循环8次 SDA=1; /置SDA口高电平 SCL=1; /置SCL口高电平 DELAY(10); /延时 F0=SDA; /将SDA值读至PSW的

15、F0位 DELAY(10); /延时 SCL=0; /使SCL口输出低电平 if(F0=1) /如果位值为1 /将“1”移入缓冲区的最低位 b=b1; / b左移1位 b=b|0x01; /左移后b的最低位置1 else /否则,位值为0,“0”移入缓冲区的最低位 b=b1; /b左移1位,低位填0 /下一次循环return b; /返回b的值 /函数调用返回/*以下为读写AT24c02的函数*/void Write_One_Byte(char addr,char thedata) /向AT24C02的addr单元写数据thedatabit acktemp=1; /定义位变量acktemp,用

16、于存放ACK检验结果,初始为1I2C_Start(); /发送I2C启动信号WriteI2CByte(0xa0); /向从设备写控制字acktemp=Check_Acknowledge(); /检查ACK值,确认从设备收到控制字WriteI2CByte(addr); /写地址acktemp=Check_Acknowledge(); /检查ACK值,确认从设备收到地址WriteI2CByte(thedata); /写数据acktemp=Check_Acknowledge(); /检查ACK值,确认从设备收到数据I2C_Stop(); /发送I2C停止信号char Read_One_Byte(ch

17、ar addr)bit acktemp=1;char mydata;I2C_Start(); /发送I2C启动信号WriteI2CByte(0xa0); /写控制字,方向为写出acktemp=Check_Acknowledge(); /检查ACK值,确认从设备收到控制字WriteI2CByte(addr); /写地址acktemp=Check_Acknowledge(); /检查ACK值,确认从设备收到地址I2C_Start(); /重启I2C WriteI2CByte(0xa1); /再次发送控制字,方向为读入acktemp=Check_Acknowledge(); /检查ACK值,确认从设

18、备收到控制字mydata=ReadI2CByte(); /读入1字节数据acktemp=Check_Acknowledge(); /相当于NOACK信号return mydata; /返回由AT24C02读出的数据I2C_Stop(); /发送I2C停止信号/*主程序:通过中断按钮控制,当读入按钮按下时,读入串口外部扩展8位并行数字量并保存到AT24C02某个单元内;当写出按钮按下时,从AT24C02同一单元读出数据,并写出至P0口LED*/void main() IE=0x85; /开外部中断:EA=1,EX1=1,EX0=1 即IE=10000101B=85H PX0=1; /提升外部中断

19、INT0优先级 PX1=1; /提升外部中断INT1优先级 IT0=1; /外部中断INT0设置为边沿触发 IT1=1; /外部中断INT1设置为边沿触发 P0=0xFF; /LED灭灯 while(1); /等待中断/* 中断服务子程序 */void int0() interrupt 0 / 外部中断0服务子程序 :当写入按钮按下时执行该子函数 uchar temp; /声明一个RAM变量,暂存读入的数据temp=get_input(); /由串行口读入8位(一字节)开关量的值Write_One_Byte(MYADDR,temp); /将读入的一字节数据写入AT2402的MYADDR单元 /

20、中断返回void int1() interrupt 2 / 外部中断1服务子程序:当读出按钮按下时执行该子程序uchar content; /声明变量,用于暂存读出的数据content=Read_One_Byte(MYADDR); /从AT24C02中MYADDR单元读出1字节数据P0=content; /读出的数据送P0口共阳极LED显示 /中断返回2. 在Proteus下,完成图9-28所示输入/输出接口扩展仿真。答:图9-28为采用74LS244作为扩展输入、74LS273作为扩展输出的I/O口扩展电路。图9-28I/O口扩展1芯片及连线在图9-28中采用的芯片为74LS244、74LS

21、273。其中,74LS244为8位缓冲驱动器(三态输出),、为低电平有效使能端。74LS273为8D触发器,为低电平有效的清零端,当=0时,输出全为0且与其它输入端无关;CP端是时钟信号,当CP由低电平向高电平跳变时,D端输入数据传送到Q输出端。P0口作为双向8位数据线,既能够从74LS244输入数据,又能够从74LS273输出数据。输入控制信号由P2.0和相“或”后形成。当二者都为0时,74LS244的控制端有效,选通74LS244,外部的信息输入到P0数据总线上。当与74LS244相连的按键都没有按下时,输入全为1,若按下某键,则他所在线输入为0。输出控制信号由P2.0和相“或”后形成。当

22、二者都为0后,74LS273的控制端有效,选通74LS273,P0上的数据锁存到74LS273的输出端,控制发光二极管LED,当某线输出为0时,相应的LED发光。2I/O口地址确定因为74LS244和74LS273都是在P2.0为0时被选通的,所以二者的口地址都为FEFFH(这个地址不是唯一的,只要保证P2.0=0,其它地址位无关),即占有相同的地址空间。但是由于分别由和控制,而这两个信号不可能同时为0(执行输入指令,如MOVX A,DPTR或MOVX A,Ri时,有效;执行输出指令,如MOVX DPTR,A或MOVX Ri,A时,有效),所以逻辑上二者不会发生冲突。3. 编程应用下面的汇编程

23、序实现的功能是按下任意键,对应的LED发光。ORG 0000H ;00H单元存储转移指令LJMP LOOP ;转至LOOP程序段ORG 0100H ;0100H开始存放主程序LOOP: MOV DPTR, #0FEFFH ; 数据指针指向I/O口地址 MOVX A, DPTR ;从74LS244读入数据 MOVX DPTR, A ;向74LS273输出数据,驱动LED SJMP LOOP ;循环ENDC参考源程序如下:#include /包含头文件,该文件中定义51寄存器#include /包含头文件,该文件中定义绝对地址变量类型#define SPIO XBYTE0xFEFF /声明74LS244和74LS273的16位地址变量#define uchar unsigned char /定义一个无符号字符类型宏void main() / 主程序while(1) / 上电后一直循环执行下列程序语句uchar temp; / 声明一个8位变量,编译器自动给该变量分配RAM内地址temp=SPIO; / 从74LS244读入数据SPIO=temp; / 将数据送至74LS273,驱动外部连接的LED

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

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