利用8255和51单片机实现数码管显示按键值的实验.docx
- 文档编号:6838105
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:16
- 大小:435.78KB
利用8255和51单片机实现数码管显示按键值的实验.docx
《利用8255和51单片机实现数码管显示按键值的实验.docx》由会员分享,可在线阅读,更多相关《利用8255和51单片机实现数码管显示按键值的实验.docx(16页珍藏版)》请在冰豆网上搜索。
利用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段数码管显示借口地设计方法,总地来说,这次实验让我收获颇多!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 8255 51 单片机 实现 数码管 显示 按键 实验