第09章 单片机应用系统资源扩展 习题解答-精品文档资料整理.doc

上传人:安*** 文档编号:28609077 上传时间:2022-07-28 格式:DOC 页数:12 大小:240KB
返回 下载 相关 举报
第09章 单片机应用系统资源扩展 习题解答-精品文档资料整理.doc_第1页
第1页 / 共12页
第09章 单片机应用系统资源扩展 习题解答-精品文档资料整理.doc_第2页
第2页 / 共12页
点击查看更多>>
资源描述

《第09章 单片机应用系统资源扩展 习题解答-精品文档资料整理.doc》由会员分享,可在线阅读,更多相关《第09章 单片机应用系统资源扩展 习题解答-精品文档资料整理.doc(12页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第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 片,若改用Intel 6264 (1KB8位)需购

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

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

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

5、BFFH,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语言参考程序代码如下:#include /包含头文件,其中

7、定义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; /定义串口数据线sbit CLK=P3

8、1; /定义串口时钟线/*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; /置4014于并行输入工作方式return(d

9、at); /返回 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(DELAY_TIME); /延时,让SD

10、A低电平持续一段时间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口输出低电平DELAY(DELAY_TIME); /延

11、时,电平持续一段时间/* 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口高电平SCL=1; /置SCL口高电平DE

12、LAY(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的状态保存至PSW中的F0用户标志位DEL

13、AY(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=0;i8;i+) /8次循环 if

14、(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的F0位 DELAY(10); /延时

15、 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,用于存放ACK检验结果,初始为1I2C

16、_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(char addr)bit acktem

17、p=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值,确认从设备收到控制字mydata=ReadI

18、2CByte(); /读入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; /提升外部中断INT0优先级 PX1=1; /提升

19、外部中断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单元 /中断返回void int1() in

20、terrupt 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、74LS273。其中,74LS244为8位缓

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

22、有效,选通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. 编程应用下面的汇编程序实现的功能是按下任意键,对应的LE

23、D发光。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

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com