用proteus实现AT89C51和8255进行通信,实现流水灯功能

用proteus实现AT89C51和8255进行通信,实现流水灯功能,第1张

硬件连线图如下【注意最好按下面的连接,不然可能有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);
	}
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/914796.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存