微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 51单片机—8255A详细介绍(全!)—04

51单片机—8255A详细介绍(全!)—04

时间:11-25 来源:互联网 点击:
这个学期学的微机原理~~,课件很是给力啊~~呵呵

8255A的原程序设计什么的网上很多~~也有好多Proteus仿真的,但是这里面的大多数都是简单的几行搞定的~~我晕咧,里面的好多东西其实都没有用到~~,呵呵,其实我也就是做个小小的实验,先把原理贴出来,供以后用,其中Proteus仿真真的不给力啊~~浪费了我好多时间,定时计数器竟然一会快,一会慢~~shit,让我白白调了半天~~这么简单的程序

看看我的仿真的程序~~(c语言程序在最后~~)



其中有两个可以控制移位方向的,就是为了验证那个Proteus仿真51的时候定时器不准确的

然后就是详细介绍了

8255A的详细介绍

1、引脚图:



2、内部结构和引脚



3、连接外设的数据端口(也就是ABC口呗,这里的三种方式,会在下面的图片补充的



4、端口寻址



6、工作方式



7、控制字







8、三种方式介绍(说到这里,具体应该说是贴到这里,呵呵,重点就是上面的7!!!8就是一种提高了~~
























9、就是应用了呗



最后来个程序就哦了,里面带有注释~~

//------------------------------------------------------------------------------
//实现由8255的PA、PB、PC作为输出口的可控流水灯的设计,采用灌电流的方法
//c语言部分
#include"reg52.h"
#include"delay.h"
#include"macroandconst.h"
#include"foot.h"
//------------------------------------------------------------------------------
uchar pdatain_reg; //定义片外存储空间
uchar temp,temp1; //用于写数据的临时数值
bit flag=1; //定义标志位
//------------------------------------------------------------------------------
//定时器0初始化函数
void timer0_init()
{
TMOD=0x02; //定时器0,8位自动装初值
TH0=(256-50)/256; //50us定时
TL0=TH0;
ET0=1;
TR0=1;

IT1=0; //外部中断1控制为电平触发方式
EX1=1; //外部中断1中断允许位
EA=1;
}
//------------------------------------------------------------------------------
//main
void main()
{
uchar i;
timer0_init();
reset=0;
reset=1; //复位
reset=0;

a0=1;
a1=1;//选择8255控制寄存器
in_reg=0x82;//写入控制寄存器,PA、PC作为输出口,PB口作为输入口,并写入控制寄存器
//这里可能不是很明白吧,呵呵,其实很简单,这个是51系列单片机的特有功能,反正我用AVR单片机没用到过
//,呵呵,相信都知道51系列单片机的PA口是个A/D口,那就对了,这里还省去了控制WR和RD了,而且还省去了
//用上拉电阻,要是别的I/O口就得按照WR和RD的协议办~~~ (从根本来说就是单片机自己控制WR和RD,其实
//这个东西用的最多的就是扩展了~~~呵呵,不说了,因为我当时扩展也给失败了~~哭

while(1)
{
a0=0;
a1=0;//选中PA口的寄存器
if(flag==0)//标志位为0,流水灯从上向下循环
{
temp=0xfe;
i=0;
while(i<8)//循环移动8位
{
in_reg=temp;
temp=~temp;
temp=temp<1;
temp=~temp;
delay(100);
i++;
//if(flag!=0) //可以加或者不加,加上后就是从当前亮的地方转向开头或者结尾
//break;
}
}
else //标志位为1,流水灯从上向下循环
{
temp=0x7f;
i=0;
while(i<8) //循环移动8位
{
in_reg=temp;
temp=~temp;
temp=temp>>1;
temp=~temp;
delay(100);
i++;
//if(flag!=1) //同理就哦了
//break;
}
}
}
}
//------------------------------------------------------------------------------
//定时器0中断函数,由于用的Proteus仿真,我看着它进入中断有时间长的,有时间短的,所以所以这个
void timer0()interrupt 1
{
EA=0; //关闭总中断
a0=1;
a1=0;//选中PB口寄存器
temp1=in_reg;//读取PB口的数据
if(((~temp1)&0x01)==1)//按键检测(由于这里的8255当设置为输入的时候都是输入高电平~~,所以还是取个反
{
//delay(5);//这里就是按键检测的一个延时防抖动的,但是我加上跟不加,差别真的好大啊~~晕了~~
if(((~temp1)&0x01)==1)
{
flag=~flag; //取反标志位,让它的循环方向改变,下面就不加按键松手检测了~~因为加不上~~呵呵
}

}
a0=0;
a1=0;
EA=1;
}
//------------------------------------------------------------------------------
//外部中断1,这个是我另加上去的,真的要累死了,我用的外部中断1,它和上面的按键检测是一样的,看来我是对的,Proteus仿真的时候,定时器还是有问题的,有时候根本不执行中断!!!
void int1() interrupt 2
{
flag=~flag;
}


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top