实验 并行IO口8255扩展
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三并行I/O口8255扩展
一、实验目的
1、了解8255A芯片的结构以及编程方法
2、掌握通过8255A并行口读取开关数据的方法
二、实验说明
本次实验用通过8255扩展接口,仅通过P0端口控制8只集成式7段数码管的显示控制。8255A的PA、PB端口分别连接8位数码管的段码和位码,程序控制数码管滚动显示一串数字。
//延时
void DelayMS (uint ms)
{uchar i;
while(ms--) for (i=0;i<120;i++);
}
/********主程序********/
void main( )
{
uchar i,j,k;
//8255工作方式选择:PA,PB均输出,工作方式0
COM=0x80;
while(1)
{
for (j=0;j<40;j++) //刷新一段时间,使显示内容不会滚动过快
{
for (k=0;k<8;k++) //在8只数码管上动态显示各字符
{
PB= DSY_Index[k]; //位码
PA= DSY_CODE_Queue[k+i]; //段码
DelayMS (1);
}
}
//刷新显示一段时间后递增1,形成滚动效果,最大索引为14
#define uint unsigned int
//PA,PB,PC端口及命令端口地址定义
#define PA XBYTE[0x0000]//定义8255A地址
#define PB XBYTE[0x0001]//定义8255B地址
#define PC XBYTE[0x0002]//定义8255B地址
0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//共阳极的7段集成式数码管对应编码
// 0:0xc0
// 1:0xcf
// 2:0xa4
// 3:0xb0
// 4:0x99
// 5:0x92
// 6:0x82
// 7:0xf8
// 8:0x80
DelayMS (1);
}
}
//刷新显示一段时间后递增1,形成滚动效果,最大索引为14
i= (i+1)%15;
}
}
//延时
void DelayMS (uint ms)
{uchar i;
while(ms--) for (i=0;i<120;i++);
}
/********主程序********/
void main( )
{
uchar i,j,k;
//8255工作方式选择:PA,PB均输出,工作方式0
COM=0x80;
0xA4,0xC0,0xC0,0x80,0xC0,0x80,0xF9,0x80,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//共阳极的7段集成式数码管对应编码
// 0:0xc0
// 1:0xcf
// 2:0xa4
// 3:0xb0
// 4:0x99
// 5:0x92
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
uchar code DSY_CODE_Queue_TIME[ ]=//时间段码
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xcf, 0x82, 0x7f, 0xa4, 0xb0,
while(1)
{
for (j=0;j<40;j++) //刷新一段时间,使显示内容不会滚动过快
{
for (k=0;k<8;k++) //在8只数码管上动态显示各字符
{
PA= DSY_Index[k];//位码
PC= DSY_CODE_Queue_DAY[k+i];//日期段码
PB= DSY_CODE_Queue_TIME[k+i]; //时间段码
// 6:0x82
// 7:0xf8
// 8:0x80
// 9:0x90
// A:0x88
// B:0x83
// C:0xc6
// D:0xa1
// E:0x86
// F:0x8e
// DOT:0x7f
//数码管选通
uchar DSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*******************************************
实验33:用8255实现接口扩展
******************************************/
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
i= (i+1)%15;
}
}
2、用Proteus软件仿真
经过Keil软件编译通过后,可利用Proteus软件仿真。在Proteus ISIS编辑环境中绘制仿真电路图。打开配套实验3仿真原理图文件“ex3.DSN”,将编译好的“ex3.hex”文件载入AT89C51,启动仿真。
五、思考题
本实验中仅使用了PA、PB端口,完成本次实验调试后,再加一组相同的8位数码管,用PA控制两组数码管,PB控制第一组数码管,PC控制第二组数码管,在两组数码管上同时显示出年月日和时分秒等信息。
// 9:0x90
// A:0x88
// B:0x83
// C:0xc6
// D:0xa1
// E:0x86
//来自百度文库F:0x8e
// DOT:0x7f
// -:0xaf
//数码管选通
uchar DSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#define PC XBYTE[0x0002] //定义8255B地址
#define COM XBYTE[0x0003] //定义8255B控制寄存器地址
//待显示字符队列编码
uchar code DSY_CODE_Queue[ ]=
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
//PA,PB,PC端口及命令端口地址定义
#define PA XBYTE[0x0000] //定义8255A地址
#define PB XBYTE[0x0001] //定义8255B地址
三、实验线路图
四、实验步骤
1、先建立文件夹“ex3”,然后建立“ex3”工程项目,最后建立源程序文件“ex3.c”,输入如下源程序;
/*******************************************
实验3:用8255实现接口扩展
******************************************/
#define COM XBYTE[0x0003]//定义8255B控制寄存器地址
//待显示字符队列编码
uchar code DSY_CODE_Queue_DAY[ ]=//日期段码
{0xff, 0xff, 0xff,
0xA4, 0xC0, 0xcf, 0xa4, 0xbf, 0xcf, 0xcf, 0xbf, 0xc0, 0x80,
一、实验目的
1、了解8255A芯片的结构以及编程方法
2、掌握通过8255A并行口读取开关数据的方法
二、实验说明
本次实验用通过8255扩展接口,仅通过P0端口控制8只集成式7段数码管的显示控制。8255A的PA、PB端口分别连接8位数码管的段码和位码,程序控制数码管滚动显示一串数字。
//延时
void DelayMS (uint ms)
{uchar i;
while(ms--) for (i=0;i<120;i++);
}
/********主程序********/
void main( )
{
uchar i,j,k;
//8255工作方式选择:PA,PB均输出,工作方式0
COM=0x80;
while(1)
{
for (j=0;j<40;j++) //刷新一段时间,使显示内容不会滚动过快
{
for (k=0;k<8;k++) //在8只数码管上动态显示各字符
{
PB= DSY_Index[k]; //位码
PA= DSY_CODE_Queue[k+i]; //段码
DelayMS (1);
}
}
//刷新显示一段时间后递增1,形成滚动效果,最大索引为14
#define uint unsigned int
//PA,PB,PC端口及命令端口地址定义
#define PA XBYTE[0x0000]//定义8255A地址
#define PB XBYTE[0x0001]//定义8255B地址
#define PC XBYTE[0x0002]//定义8255B地址
0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//共阳极的7段集成式数码管对应编码
// 0:0xc0
// 1:0xcf
// 2:0xa4
// 3:0xb0
// 4:0x99
// 5:0x92
// 6:0x82
// 7:0xf8
// 8:0x80
DelayMS (1);
}
}
//刷新显示一段时间后递增1,形成滚动效果,最大索引为14
i= (i+1)%15;
}
}
//延时
void DelayMS (uint ms)
{uchar i;
while(ms--) for (i=0;i<120;i++);
}
/********主程序********/
void main( )
{
uchar i,j,k;
//8255工作方式选择:PA,PB均输出,工作方式0
COM=0x80;
0xA4,0xC0,0xC0,0x80,0xC0,0x80,0xF9,0x80,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//共阳极的7段集成式数码管对应编码
// 0:0xc0
// 1:0xcf
// 2:0xa4
// 3:0xb0
// 4:0x99
// 5:0x92
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
uchar code DSY_CODE_Queue_TIME[ ]=//时间段码
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xcf, 0x82, 0x7f, 0xa4, 0xb0,
while(1)
{
for (j=0;j<40;j++) //刷新一段时间,使显示内容不会滚动过快
{
for (k=0;k<8;k++) //在8只数码管上动态显示各字符
{
PA= DSY_Index[k];//位码
PC= DSY_CODE_Queue_DAY[k+i];//日期段码
PB= DSY_CODE_Queue_TIME[k+i]; //时间段码
// 6:0x82
// 7:0xf8
// 8:0x80
// 9:0x90
// A:0x88
// B:0x83
// C:0xc6
// D:0xa1
// E:0x86
// F:0x8e
// DOT:0x7f
//数码管选通
uchar DSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/*******************************************
实验33:用8255实现接口扩展
******************************************/
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
i= (i+1)%15;
}
}
2、用Proteus软件仿真
经过Keil软件编译通过后,可利用Proteus软件仿真。在Proteus ISIS编辑环境中绘制仿真电路图。打开配套实验3仿真原理图文件“ex3.DSN”,将编译好的“ex3.hex”文件载入AT89C51,启动仿真。
五、思考题
本实验中仅使用了PA、PB端口,完成本次实验调试后,再加一组相同的8位数码管,用PA控制两组数码管,PB控制第一组数码管,PC控制第二组数码管,在两组数码管上同时显示出年月日和时分秒等信息。
// 9:0x90
// A:0x88
// B:0x83
// C:0xc6
// D:0xa1
// E:0x86
//来自百度文库F:0x8e
// DOT:0x7f
// -:0xaf
//数码管选通
uchar DSY_Index[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
#define PC XBYTE[0x0002] //定义8255B地址
#define COM XBYTE[0x0003] //定义8255B控制寄存器地址
//待显示字符队列编码
uchar code DSY_CODE_Queue[ ]=
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
//PA,PB,PC端口及命令端口地址定义
#define PA XBYTE[0x0000] //定义8255A地址
#define PB XBYTE[0x0001] //定义8255B地址
三、实验线路图
四、实验步骤
1、先建立文件夹“ex3”,然后建立“ex3”工程项目,最后建立源程序文件“ex3.c”,输入如下源程序;
/*******************************************
实验3:用8255实现接口扩展
******************************************/
#define COM XBYTE[0x0003]//定义8255B控制寄存器地址
//待显示字符队列编码
uchar code DSY_CODE_Queue_DAY[ ]=//日期段码
{0xff, 0xff, 0xff,
0xA4, 0xC0, 0xcf, 0xa4, 0xbf, 0xcf, 0xcf, 0xbf, 0xc0, 0x80,