硬件连线图如下【注意最好按下面的连接,不然可能有bug存在】
其中74LS373是8位数据锁存器,让它的LE与89C51的ALE连接,实现并且,把它的输入与P0端一一连接,然后74LS373输出的Q0和Q1分别连接到A0和A1,其中A0和A1是控制选择位然后Q7连接到CS位,即位选位
端口地址是16位地址线,然后51单片机的P0是16位中的低8位,P2是16位中的高8位
所以端口地址的计算为:1111 1111 0111 1111 为0xff7f【CS必须为0】
然后PA的端口地址为:1111 1111 0111 1100为0xff7c【A1A0负责控制选择8255的那个输出端口,有四种可能 00 选PA口,01 选PB口,10 选PC口 ,11则为选择控制器,即确定8255整个端口地址的时候使用】
同理:得到PB的端口地址为:1111 1111 0111 1101 为0xff7d
同理:得到PC的端口地址为:1111 1111 0111 1110 为0xff7e
最终得到了4个端口地址:
0xff7f【8255控制】
0xff7c【8255的PA端口地址】
0xff7d【8255的PB端口地址】
0xff7e【8255的PC端口地址】
端口地址的使用【下面的是代码的一部分,端口地址的使用方法】
#include //在使用XBYTE的时候,一定要包含这个文件
#define com8255 XBYTE[0xff7f] //宏定义口地址
#define com8255_a XBYTE[0xff7c]
#define com8255_b XBYTE[0xff7d]
#define com8255_c XBYTE[0xff7e]
得到4个端口地址以后来确定8255控制字
下图为8255的8255控制字确定表
例1:想要确定PA、PB、PC都是输出模式,且都为方式0
注意:输出模式就是8255的端口往外输出,而输入模式就是外部往8255的输出端口里写数据
解:那么根据上面的图:就可以得到控制字应该为 1000 0000即0x80
那么现在就可以来写完整的流水灯代码了
#include
#include
#include
sbit KEY = P0 ^ 0;
#define com8255 XBYTE[0xff7f] //宏定义口地址
#define com8255_a XBYTE[0xff7c]
#define com8255_b XBYTE[0xff7d]
#define com8255_c XBYTE[0xff7e]
void Delay1ms(unsigned int xms) //@12.000MHz
{
unsigned char i, j;
while (xms)
{
i = 2;
j = 239;
do
{
while (--j)
;
} while (--i);
xms--;
}
}
void main()
{
unsigned char i = 0;
com8255 = 0x80;
com8255_a=0x00;
com8255_b=0x00;
com8255_c=0x00;
while (1)
{
Delay1ms(500);
com8255_a = 0xFE; // 1111 1110
Delay1ms(500);
com8255_a = 0xFD; // 1111 1101
Delay1ms(500);
com8255_a = 0xFB; // 1111 1011
Delay1ms(500);
com8255_a = 0xF7; // 1111 0111
Delay1ms(500);
com8255_a = 0xEF; // 1110 1111
Delay1ms(500);
com8255_a = 0xDF; // 1101 1111
Delay1ms(500);
com8255_a = 0xBF; // 1011 1111
Delay1ms(500);
com8255_a = 0x7F; // 0111 1111
Delay1ms(500);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)