找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6669|回复: 0
收起左侧

蓝桥杯单片机资源扩展方式说明(IO&MM)

[复制链接]
ID:355619 发表于 2018-6-20 23:21 | 显示全部楼层 |阅读模式
单片机资源扩展方式说明(IO&MM)
---CT107D单片机综合训练平台
  CT107D 单片机综合训练平台具有 IO 扩展模式和存储器映射(MM)扩展模式,可以通过调节板上跳线J13进行配置。其中 IO扩展模式较为容易理解,存储器映射扩展模式可以直接通过XBYTE 关键字来操作部分资源,能够大大简化外设资源程序设计,下面将举例说明两种扩展方式。

1.  IO口扩展方式
平台将单片机P25、P26、P27 接入到74HC138译码器的三线输入端口,由此我们 可以通过 P25、P26 和 P27 引脚控制 38 译码器的输出端口 Y[0...8];通过板上的扩展模式配置跳线J13,将译码器输出端口Y[0…8]与GND经过或非门输出,作为74HC573的片选信号,即实现了IO扩展方式:
#include "reg52.h"

sbit LCD_E = P1^7;
//主函数
void main(void)
{
LCD_E = 0; //将 LCD 模块禁能,防止LCD 模块对总线状态的影响
while(1)
{
/* 注释1:通过此句代码将P2.7 = 1,P2.6 = 0,P2.5 = 0,不改变P2口其它引脚
状态。由 138译码器的真值表可以知道此时译码器输出端Y4 处于低电平状态;因为
为 IO编程方式,所以Y4和 GND一起经过或非 门后,输出高电平,并连接到573
锁存器的使能端口,将573 锁存器“打通“,此时锁存器输出端与单片机P0口状态一
致。*/
P2 = ((P2&0x1f)|0x80);
/* 注释 2:因为 573 锁存器已经“打通“,现在通过 P0 口输出 0xff,573 锁存器的输
出端也将输出0xff,从而将所有LED熄灭。*/
P0 = 0xff;
/* 注释3:通过此句代码将P2.7 = 0,P2.6 = 0,P2.5 = 0,不改变P2口其它引脚
状态。由 138译码器的真值表可以知道此时译码器输出端Y4 处于高电平状态;因为
为 IO 编程方式,所以 Y4 和 GND 一起经过或非 门后,输出低电平,并连接到 573
锁存器的使能端口,将573 锁存器“锁存“,此时锁存器将输入锁存,输出端口数据不
再受到P0 口影响。*/   
P2 &= 0x1f;
/* 一小段延时函数  */
delay();
/*与注释1 相同*/
P2 = ((P2&0x1f)|0x80);
/* 注释2:因为 573锁存器已经“打通“,现在通过P0 口输出0x00,573锁存器的输
出端也将输出0x00,从而将所有LED点亮。*/
P0 = 0x00;
/*与注释3 相同*/
P2 &= 0x1f;
delay();
}
}
  与上例相同,如果想使用执行机构模块(蜂鸣器、继电器、电机等外设),需要做的无
非是“打通”与执行结构连接的锁存器,进行操作,操作结束后, “锁存” ,程序片段如下:  

#include "reg52.h"

sbit LCD_E = P1^7;
sbit RELAY = P0^4;
//主函数
void main(void)
{
LCD_E = 0; //将 LCD 模块禁能,防止LCD 模块对总线状态的影响
while(1)
{
/* 注释 1:通过此句代码将P2.7 = 1,P2.6 = 0,P2.5 = 1,不改变P2口其它引脚
状态。由 138译码器的真值表可以知道此时译码器输出端Y5 处于低电平状态;因为
为 IO编程方式,所以Y5和 GND一起经过或非 门后,输出高电平,并连接到573
锁存器的使能端口,将573 锁存器“打通“,此时锁存器输出端与单片机P0口状态一
致。*/
P2 = ((P2&0x1f)|0xA0);
/* 注释2:因为573锁存器已经“打通“,现在通过P0.4 输出高电平,相应的573 锁
存器的输出端也将输出高电平,控制继电器  */
RELAY = 1;
/* 注释 3:通过此句代码将P2.7 = 0,P2.6 = 0,P2.5 = 0,不改变P2口其它引脚
状态。由 138译码器的真值表可以知道此时译码器输出端Y5 处于高电平状态;因为
为 IO 编程方式,所以 Y5 和 GND 一起经过或非 门后,输出低电平,并连接到 573
锁存器的使能端口,将573 锁存器“锁存“,此时锁存器将输入锁存,输出端口数据不
再受到P0 口影响。*/   
P2 &= 0x1f;
/* 一小段延时函数  */
delay();
/*与注释1 相同*/
P2 = ((P2&0x1f)|0x80);
/* 注释2:因为573锁存器已经“打通“,现在通过P0.4 口输出低电平,相应的573
锁存器的输出端也将输出低电平,控制继电器  */
RELAY = 0;
/*与注释3 相同*/
P2 &= 0x1f;
delay();
}
}

2.  存储器映射扩展方式
51 单片机可以外扩64K 字节的RAM和ROM空间,传统的8051单片机具有16 位地
址总线和 8 位数据总线,其中 P0 口作为数据和地址低字节的复用端口,P2 口作为高 8 位
地址线。CT107D 单片机综合训练平台的存储器映射扩展方式(MM),是一种可以像操作
外部 RAM存储器一样, 操作LED指示灯、 执行结构 (蜂鸣器、 继电器等..)、 数码管、 82C55
等外设资源的扩展方式,当然实现这样的操作,是与 CT107D 单片机综合训练平台的硬件
设计具有关联性的。举例说明,在上面IO扩展方式里已经介绍过,如果我们希望通过程序
点亮或者熄灭LED 指示灯需要进行如下操作:
  2.1 IO扩展方式代码片段:
P2 = ((P2&0x1f)|0xA0);
P0 = 0x00;    // LED = 0xff;
P2 &= 0x1f;
  如果,我们将扩展方式配置跳线配置为存储器映射扩展方式(MM),我们可以通过以下
简单代码来实现其操作:
XBYTE[0x8000] = 0x00; // XBYTE[0x8000] = 0xff;
  到现在存在的疑问是,LED 指示灯模块的地址:0x8000是如何确定的呢?由CT107D
单片机综合训练平台的硬件电路图我们可以知道,当 P2.7 = 1; P2.6 = 0; P2.5 = 0;(其它地
址线不需要关心),即可将与 LED 指示灯模块连接的 74HC573“打通” ,此时可以通过 P0
口控制 LED 指示灯的状态,因此,LED 指示灯模块的地址为 0x8000;由此类推,我们可
以知道执行机构模块的操作地址为 0xA000,数码管段码端的操作地址为 0xE000,数码管
位选端口的操作地址为0xC000 等等。
  下面来看一个具体实例:
#include "reg52.h"
#include "absacc.h"
sbit LCD_E = P1^7;

//主函数
void main(void)
{
    LCD_E = 0; //将 LCD 模块禁能,防止LCD模块对总线状态的影响
    while(1)
    {
          XBYTE[0x8000] = 0x00;   //LED 指示灯全部点亮
          /* 一小段延时函数  */            
          delay();
           
          XBYTE[0x8000] = 0xff;   //LED指示灯全部熄灭
          delay();
    }
}
  MM编程方式,能够简化程序设计,这一点在数码管动态扫描显示的代码部分体现的尤
为明显,由于这种扩展方式占用单片机P3.6引脚,在使用4X4矩阵键盘时,不建议使用这
种扩展方式。
数码管显示程序片段
0.png

完整的pdf格式文档51黑下载地址:
Microsoft Word - MM&IO编程方式说明.pdf (119.72 KB, 下载次数: 29)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表