利用8255和51单片机实现数码管显示按键值的实验.docx
《利用8255和51单片机实现数码管显示按键值的实验.docx》由会员分享,可在线阅读,更多相关《利用8255和51单片机实现数码管显示按键值的实验.docx(18页珍藏版)》请在冰豆网上搜索。
![利用8255和51单片机实现数码管显示按键值的实验.docx](https://file1.bdocx.com/fileroot1/2023-2/6/40b6be66-b94b-418b-b35f-7ad59a8dde60/40b6be66-b94b-418b-b35f-7ad59a8dde601.gif)
利用8255和51单片机实现数码管显示按键值的实验
物理与电子工程学院
单片机原理及其应用
利用8255和51单片机实现数码管显示按键值的实验
期
中
大
作
课题:
使用8255和51单片机实现对数码管显示案件数值控制
要求:
从0--15,数码管上分别显示0--9,A--F,4*4矩阵键盘
芯片资料
8255
一、简介
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
二、内部结构
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:
与CPU连接部分、与外设连接部分、控制部分。
1)与CPU连接部分
根据定义,8255能并行传送8位数据,所以其数据线为8根D0~D7。
由于8255具有3个通道A、B、C,所以只要两根地址线就能寻址A、B、C口及控制寄存器,故地址线为两根A0~A1。
此外CPU要对8255进行读、写与片选操作,所以控制线为片选、复位、读、写信号。
各信号的引脚编号如下:
(1)数据总线DB:
编号为D0~D7,用于8255与CPU传送8位数据。
(2)地址总线AB:
编号为A0~A1,用于选择A、B、C口与控制寄存器。
(3)控制总线CB:
片选信号、复位信号RST、写信号、读信号。
当CPU要对8255进行读、写操作时,必须先向8255发片选信号选中8255芯片,然后发读信号或写信号对8255进行读或写数据的操作。
2)与外设接口部分
根据定义,8255有3个通道A、B、C与外设连接,每个通道又有8根线与外设连接,所以8255可以用24根线与外设连接,若进行开关量控制,则8255可同时控制24路开关。
各通道的引脚编号如下:
(1)A口:
编号为PA0~PA7,用于8255向外设输入输出8位并行数据。
(2)B口:
编号为PB0~PB7,用于8255向外设输入输出8位并行数据。
(3)C口:
编号为PC0~PC7,用于8255向外设输入输出8位并行数据,当8255工作于应答I/O方式时,C口用于应答信号的通信。
3)控制器
8255将3个通道分为两组,即PA0~PA7与PC4~PC7组成A组,PB0~PB7与PC0~PC3组成B组。
如图
(1)所示,相应的控制器也分为A组控制器与B组控制器,各组控制器的作用如下:
(1)A组控制器:
控制A口与上C口的输入与输出。
(2)B组控制器:
控制B口与下C口的输入与输出。
图
(1)
三、工作方式
8255芯片有三种工作方式:
基本输入/输出方式(方式0)、选通工作方式(方式1)、双向传送方式(方式2)。
1)方式0:
相当于三个独立的8位简单接口,各端口既可设置为输入口,也可设置为输出口,但不能同时实现输入及输出。
C端口可以是一个8位的简单接口,也可以分为两个独立的4位端口。
方式0常用于连接简单外设(适于无条件或查询方式)。
常使A端口和B端口作为8位数据的输入或输出口,使C口的某些位作状态输入。
2)方式1:
利用一组选通控制信号控制A端口和B端口的数据输入输出,其中A口、B口作输入或输出口,C口的部分位用作选通控制信号,而A口、B口在作为输入和输出时的选通信号是不同的。
方式1主要用于中断控制方式下的输入输出,C口的8位除用作选通信号外,其余位可工作于方式0下,作为输入或输出口。
3)方式2:
此方式为双向输入输出方式——可以既作为输入口,又作为输出口,而只有A端口可工作在方式2下。
此种工作方式可使A端口作为双向端口所有,并且主要用于中断控制方式,当A口工作于方式2时,B口可工作于方式1(此时C口的所有位都用作选通控制信号的输入输出),也可工作于方式0(此时C口的剩余位也可工作于方式0)。
74LS373
74ls373是常用的地址锁存器芯片,它实质是一个是带三态缓冲输出的8D触发器,在单片机系统中为了扩展外部存储器,通常需要一块74ls373芯片,
<74ls373内部结构图><74ls373引脚图>
(1).1脚是输出使能(OE),是低电平有效,当1脚是高电平时,不管输入3、4、7、8、13、14、17、18如何,也不管11脚(锁存控制端,G)如何,输出2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q6)、19(Q7)全部呈现高阻状态(或者叫浮空状态);
(2).当1脚是低电平时,只要11脚(锁存控制端,G)上出现一个下降沿,输出2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q6)、19(Q7)立即呈现输入脚3、4、7、8、13、14、17、18的状态.
锁存端LE由高变低时,输出端8位信息被锁存,直到LE端再次有效。
当三态门使能信号OE为低电平时,三态门导通,允许Q0~Q7输出,OE为高电平时,输出悬空。
当74LS373用作地址锁存器时,应使OE为低电平,此时锁存使能端C为高电平时,输出Q0~Q7状态与输入端D1~D7状态相同;当C发生负的跳变时,输入端D0~D7数据锁入Q0~Q7。
51单片机的ALE信号可以直接与74LS373的C连接。
74ls373与单片机接口:
1D~8D为8个输入端。
1Q~8Q为8个输出端。
G是数据锁存控制端;当G=1时,锁存器输出端同输入端;当G由“1”变为“0”时,数据输入锁存器中。
OE为输出允许端;当OE=“0”时,三态门打开;当OE=“1”时,三态门关闭,输出呈高阻状态。
在MCS-51单片机系统中,常采用74LS373作为地址锁存器使用,其连接方法如上图所示。
其中输入端1D~8D接至单片机的P0口,输出端提供的是低8位地址,G端接至单片机的地址锁存允许信号ALE。
输出允许端OE接地,表示输出三态门一直打开。
74LS138
74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式,其工作原理如下:
当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低电平译出。
利用G1、/(G2A)和/(G2B)可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。
若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器用与非门组成的3线-8线译码器74LS1383线-8线译码器74LS138的功能表无论从逻辑图还是功能表我们都可以看到74LS138的八个输出引脚,任何时刻要么全为高电平1—芯片处于不工作状态,要么只有一个为低电平0,其余7个输出引脚全为高电平1。
如果出现两个输出引脚同时为0的情况,说明该芯片已经损坏。
当附加控制门的输出为高电平(S=1)时,可由逻辑图写出由上式可以看出,同时又是这三个变量的全部最小项的译码输出,所以也把这种译码器叫做最小项译码器。
71LS138有三个附加的控制端、和。
当、时,输出为高电平(S=1),译码器处于工作状态。
否则,译码器被禁止,所有的输出端被封锁在高电平,如表3.3.5所示。
这三个控制端也叫做“片选”输入端,利用片选的作用可以将多篇连接起来以扩展译码器的功能。
带控制输入端的译码器又是一个完整的数据分配器。
在图3.3.8电路中如果把作为“数据”输入端(同时),而将作为“地址”输入端,那么从送来的数据只能通过所指定的一根输出线送出去。
这就不难理解为什么把叫做地址输入了。
例如当=101时,门的输入端除了接至输出端的一个以外全是高电平,因此的数据以反码的形式从输出,而不会被送到其他任何一个输出端上。
【例3.3.2】试用两片3线-8线译码器74LS138组成4线-16线译码器,将输入的4位二进制代码译成16个独立的低电平信号。
解:
由图3.3.8可见,74LS138仅有3个地址输入端。
如果想对4位二进制代码,只能利用一个附加控制端(当中的一个)作为第四个地址输入端。
取第
(1)片74LS138的和作为它的第四个地址输入端(同时令),取第
(2)片的作为它的第四个地址输入端(同时令),取两片的、、,并将第
(1)片的和接至,将第
(2)片的接至,如图3.3.9所示,于是得到两片74LS138的输出分别为图3.3.9用两片74LS138接成的4线-16线译码器式(3.3.8)表明时第
(1)片74LS138工作而第
(2)片74LS138禁止,将的0000~0111这8个代码译成8个低电平信号。
而式(3.3.9)表明时,第
(2)片74LS138工作,第
(1)片74LS138禁止,将的1000~1111这8个代码译成8个低电平信号。
这样就用两个3线-8线译码器扩展成一个4线-16线的译码器了。
同理,也可一用两个带控制端的4线-16线译码器接成一个5线-32线译码器。
例2.74LS1383-8译码器的各输入端的连接情况及第六脚()输入信号A的波形如下图所示。
试画出八个输出引脚的波形。
解:
由74LS138的功能表知,当(A为低电平段)译码器不工作,8个输出引脚全为高电平,当(A为高电平段)译码器处于工作状态。
因所以其余7个引脚输出全为高电平,因此可知,在输入信号A的作用下,8个输出引脚的波形如下:
即与A反相;其余各引脚的输出恒等于1(高电平)与A的波形无关。
74LS138引脚图 74LS138为3线-8线译码器,共有54/74S138和54/74LS138两种线路结构型式, 其工作原理如下:
当一个选通端(G1)为高电平,另两个选通端(/(G2A)和/(G2B))为 低电平时,可将地址端(A、B、C)的二进制编码在一个对应的输出端以低 电平译出。
利用G1、/(G2A)和/(G2B)可级联扩展成24线译码器;若外接一个反 相器还可级联扩展成32线译码器。
若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器
80C51单片机引脚图及引脚功能介绍
首先我们来介绍一下单片机的引脚图及引脚功能(如下图所示),引脚的具体功能将在下面详细介绍
单片机的40个引脚大致可分为4类:
电源、时钟、控制和I/O引脚。
⒈电源:
⑴VCC-芯片电源,接+5V;
⑵VSS-接地端;
⒉时钟:
XTAL1、XTAL2-晶体振荡电路反相输入端和输出端。
⒊控制线:
控制线共有4根,
⑴ALE/PROG:
地址锁存允许/片内EPROM编程脉冲
①ALE功能:
用来锁存P0口送出的低8位地址
②PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵PSEN:
外ROM读选通信号。
⑶RST/VPD:
复位/备用电源。
①RST(Reset)功能:
复位信号输入端。
②VPD功能:
在Vcc掉电情况下,接备用电源。
⑷EA/Vpp:
内外ROM选择/片内EPROM编程电源。
①EA功能:
内外ROM选择端。
②Vpp功能:
片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
⒋I/O线
80C51共有4个8位并行I/O端口:
P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
拿到一块单片机,想要使用它,首先必须要知道怎样去连线,我们用的一块89C51的芯片为例,我们就看一下如何给它连线。
1、电源:
这当然是必不可少的了。
单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。
2、振蒎电路:
单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶体震荡器,电容,连上就能了,按图1接上即可。
3、复位管脚:
按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、EA管脚:
EA管脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?
单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。
(见图1,其中R1是限流电阻)
按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。
因此要1脚我们要能够控制,也就是说,我们要能够让1管脚按要求变为高或低电平。
即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?
叫它什么名字呢?
设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不能由我们来更改。
图1单片机简易应用电路图
单片机简易编程
名字有了,我们又怎样让它变'高'或变'低'呢?
叫人做事,说一声就能,这叫发布命令,要计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。
让一个管脚输出高电平的指令是SETB,让一个管脚输出低电平的指令是CLR。
因此,我们要P1.0输出高电平,只要写SETBP1.0,要P1.0输出低电平,只要写CLRP1.0就能了。
现在我们已经有办法让单片机去将P10输出高或低电平了,但是我们怎样才能计算机执行这条指令呢?
总不能也对计算机也说一声了事吧。
要解决这个问题,还得有几步要走。
第一,计算机看不懂SETBCLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算机去读。
计算机能懂什么呢?
它只懂一样东西——数字。
因此我们得把SETBP1.0变为(D2H,90H),把CLRP1.0变为(C2H,90H),至于为什么是这两个数字,这也是由51芯片的设计者--INTEL规定的,我们不去研究。
第二步,在得到这两个数字后,怎样让这两个数字进入单片机的内部呢?
这要借助于一个硬件工具"编程器"。
如果你还不知道是什么是编程器,我来介绍一下,就是把你在电脑上写出来来的代码用汇编器等编译器生成的一个目标烧写到单片机的eprom里面去的工具,80c51这种类型的单片机编程是一件很麻烦的事情,必要要先装到编程器上编程后才能在设备上使用,而目前最新的89s51单片机居然在线编程(isp)功能,不用拔出来利用简单的电路就可以实现把代码写入单片机内部.
我们将编程器与电脑连好,运行编程器的软件,然后在编缉区内写入(D2H,90H)见图2,写入……好,拿下片子,把片子插入做好的电路板,接通电源……什么?
灯不亮?
这就对了,因为我们写进去的指令就是让
图2
P10输出高电平,灯当然不亮,要是亮就错了。
现在我们再拨下这块芯片,重新放回到编程器上,将编缉区的内容改为(C2H,90H),也就是CLRP1.0,写片,拿下片子,把片子插进电路板,接电,好,灯亮了。
因为我们写入的()就是让P10输出低电平的指令。
这样我们看到,硬件电路的连线没有做任何改变,只要改变写入单片机中的内容,就能改变电路的输出效果。
实验电路图
实验源程序
/**
**时间:
2013年11月2
**陶航航
**因为8255C口是高位输出,低位输入,此处不可以用行列互换法进行键盘扫描
**/
#include
#include
#defineucharunsignedchar
#definePA8255XBYTE[0x4000]
#definePB8255XBYTE[0x4001]
#definePC8255XBYTE[0x4002]
#defineCOM8255XBYTE[0x4003]
volatileucharkey;
voiddisplay(uchar);
//voiddisplay1();
intkey_san();
/**/voiddelay10ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
voiddelay1ms(void)//误差0us
{
unsignedchara,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
voidmain(void)
{
COM8255=0x81;
PB8255=0xff;
while
(1)
{
key_san();
//display();
}
}
intkey_san()
{
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharscode,temp,i;
PA8255=0x00;
//PC8255=0xf0;
/*if((PC8255&0xf0)!
=0xf0)
{
delay10ms();gotoa;
if((PC8255&0xf0)!
=0xf0)
{
//PB8255=~table[0];gotoa;*/
scode=0xef;
i=4;
while(i--)//循环4次
{
PC8255=scode;
if((PC8255&0x0f)!
=0x0f)
{delay10ms();
temp=PC8255;
switch(temp)
{
case0xee:
PB8255=~table[15];break;//key=15;display(15)
case0xed:
PB8255=~table[11];break;//key=11;display(11)
case0xeb:
PB8255=~table[7];break;//key=7;display(7)
case0xe7:
PB8255=~table[3];break;//key=3;display(3)
case0xde:
PB8255=~table[14];break;//key=14;display(14)
case0xdd:
PB8255=~table[10];break;//key=10;display(10)
case0xdb:
PB8255=~table[6];break;//key=6;display(6)
case0xd7:
PB8255=~table[2];break;//key=2;display
(2)
case0xbe:
PB8255=~table[13];break;//key=13;display(13)
case0xbd:
PB8255=~table[9];break;//key=9;display(9)
case0xbb:
PB8255=~table[5];break;//key=5;display(5)
case0xb7:
PB8255=~table[1];break;//key=1;display
(1)
case0x7e:
PB8255=~table[12];break;//key=12;display(12)
case0x7d:
PB8255=~table[8];break;//key=8;display(8)
case0x7b:
PB8255=~table[4];break;//key=4;display(4)
case0x77:
PB8255=~table[0];break;//key=0;display(0)
default:
key=-1;
}
while(PC8255!
=temp);
}
else
scode=(scode<<1)|0x01;
}
/*}
a:
while
(1){PB8255=~table[1];PA8255=0x00;}
}*/
}
/*voiddisplay(ucharnum)//静态显示
{
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
COM8255=0x81;
PA8255=0x00;
PB8255=~table[key];
if(key==-1)
PB8255=0x8e;
}
voiddispaly1()//动态显示
{
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
ucharsel,i;
PA8255=0x00;
PB8255=~table[key];
sel=0x01;
for(i=0;i<6;i++)
{
PB8255=table[key];
PA8255=sel;
delay1ms();
sel=sel<<1;
}
}*/
实验结果
实验心得:
通过本次实验操作,初步完成了从理论到实际应用的实践,书本上的知识学的再好,没有实际操作还是不行的。
对于单片机的学习,还是需要多多上机操作,难度肯定有,只要有兴趣,就可以学好
实验总结:
这次试验中,第一次实际操作软件,这过程中遇到了很多问题,把程序输入电脑后出现了很多问题,自己也想办法去解决了,但还是有些没办法解决,只好请教实验室成员,最终才完成此次作业,达到了实验目的。
学会了74LS373扩展I/O口,掌握了行列式键盘,7段数码管显示借口的设计方法,总的来说,这次实验让我收获颇多!