793.可编程节日彩灯(完整设计报告包含小组成员报告源代码等).doc
计算机科学与技术学院硬件课程设计报告姓 名: 学 号:专 业: 信息安全 班 级: 设计题目: 可编程节日彩灯 成 员: 指导教师: 职 称: 高级工程师 2008年 6月 课程设计指导教师评阅书指导教师评语:成 绩: 指导教师签字: 年 月 日摘 要在日常生活中我们随处可以看到各种各样的彩灯,它们可以装饰舞台,形成彩灯带,LED音乐屏,彩虹管、瀑布等灯串等,使人们的视界更加多彩。节假日彩灯的循环实现,我们设计了两个方案:方案一:键盘控制彩灯的转换(其中Intel 8255A来判断按键和数码管位的选择,Intel 74LS377控制数码管段的选择);方案二:用延时来实现彩灯循环(Intel 8255A分别控制数码管的段和位的选择)。关键词: 彩灯循环;键盘;延时;Intel 8255A,74LS138,74LS377;4个八波段数码管目 录选题报告2总体设计部分31设计任务与要求32 需求分析32.1芯片分析32.2效果分析43总体方案43.1 Intel 8255A方案43.2 74LS377方案53.3 74LS138方案53.4 延时方案54 硬件方案54.1 电路连接图54.2 电路说明74.3 芯片说明 74.4 八波段数码管 94.5 键盘说明 105软件方案一115.1程序流程图125.2源程序代码146 专题设计部分18 方案说明18 6.1XXX196.2 XXX266.3 XXX317参考文献37选题报告 我们选的硬件课程设计题目是可编程节日彩灯,彩灯不仅可以应用在节假日的欣赏上,它还可以应用在彩灯带,LED音乐屏,河水两旁的LED灯装点,圣诞树及休闲娱乐场所夜晚的装饰以及形成彩虹管、瀑布等灯串;另外,也可以结合八波段发光数码管形成七彩字,外露打光字,广告牌宣传字,发光字等来作为商店或超市等的宣传上。总之,美妙的画面或文字、数字既可以陶冶人们的心情,又能使我们的视界更加多彩。有了在微机原理与接口实验课上通过利用8255来控制8个LED灯来形成“跑马灯”的小试牛刀;再加上随着现代社会的飞速发展,人们对节假日彩灯样式的新颖,多变也具有更多的期待,这同样也给设计者提供了更多追求的动力与目标。我们虽不是专业的设计人员,甚至可选用的芯片也十分有限,灯也仅有8个横排LED灯,和12个环行LED灯及4个八波段发光二极管,虽形不成像网上查到得那么美的灯光,但我们完全可以尝试利用8255的C端口来辅助A或B端口形成12个环形灯的多变样式;更进一步的还可以利用键盘来控制4个八波段发光二极管来依次形成具有某些特殊意义的数字(如 , )或图形( )等。 顺利的选题固然是重要的,接下来就要结合我们在微机原理与接口课堂上及实验课上所学的知识,在需求分析,概要、详细设计,测试总结,撰写报告等各阶段和自己的队员通力合作。争取在王老师和马老师的指导下,在查阅相关资料后,无论是在问题分析与解决方案的总体设计上,还是实际的接线和具体的编程上,在可运用的芯片和LED灯,八波段发光二极管及键盘等实验工具的辅助下,或利用软层面的或利用硬层面的知识尽本组最大努力来达到本组的课程设计目的。总体设计部分1 设计任务与要求 本次硬件课程设计,我们需要用芯片Intel 8255A,74LS377,74LS138译码器、4*4键盘以及4位8段数码管来实现彩灯不同图案的切换。我们的总体任务是用有限的简单工具来实现尽量丰富的图案变化,通过键盘按键来实现图案切换。具体要求如下:1.1在微型计算机原理与接口技术实验课的基础上,进一步了解各芯片的作用与工作方式及应用;1.2 实现彩灯不同图案和不同闪亮方式之间的切换,模拟一个节日彩灯; 1.3 通过此次硬件课程设计,对微机原理进一步理解,培养创新能力;1.4 通过此次课程设计锻炼动手能力与团队分工协作精神。2 需求分析2-1 芯片分析本硬件设计通过利用Intel 8086CPU 、芯片8255A、74LS377、4*4键盘、74LS138译码器,来实现彩灯变换输出的效果,由于受到实验箱限制,实现效果仅为四位八波段数码管的闪亮效果。 Intel 8086CPU控制各芯片的工作,控制控制字的输入和状态的输出。本设计拟实现8种效果的输出,利用4*4键盘实现效果间的切换(通过给16个按键编号,以其中8个键做切换键)。芯片8255与键盘相连,PA0-PA3与键盘的行相连,采用方式0,输入;PB0-PB3与键盘的列相连,输出。用8255检测按下的键,决定程序转向,输出预定效果。74LS377的八个端口与数码管的八段相连,用来选择哪段亮,实现效果输出。74LS138译码器与8255、74LS377的片选及数码管的4位相连,达到使数码管的4位分别亮灭的目的。2-2 效果分析 图 2-1 图 2-1为我们设计的七种图形效果,将通过键盘在各图形中切换3 总体方案 3.1 8255A的连接将8255A的A口和B口的低四位分别与键盘的四个行和列相连,通过检测按下的键值实现程序的跳转,来输出不同的图形。3.2 采用74LS377的八个管脚与数码管八段相连,控制图形输出。 3.3 把数码管的四位分别与74LS138译码器相连,每位作为一个端口,用来选位。3.4 每个图形输出后,采用软件延时使图形长时间停留。4 硬件方案41 可编程节日彩灯电路连接图PA0PA1PA2PA3 8255APB0PB1PB2PB374LS138Y Y Y Y Y Y 74LS377 图 4-14.1.1 数码管图 4.1.1F37BCDEA9865410PAPAPAPA 8255APBPBPBPB24.1.2键盘图4.1.24.2 电路说明4.2.14*4键盘与8255A芯片相连,A端口的PA0-PA3与键盘的行相连,采用方式0,输入;B端口的PB0-PB3与键盘的列相连,输出。通过给16个按键编号,以其中8个键做切换键决定程序转向,输出预定效果。4.2.2 74LS377的八个端口与数码管的八段相连,用来选择哪段亮,实现效果输出。置“0”,数码管的对应段亮,置“1”,数码管的对应段暗。例如,74LS377 端口中的数据为“01001001”,则数码管显示的图形为数字“5”。4.2.374LS138译码器与8255A,74LS377的片选及数码管的4位相连,除了有使这几个芯片正常工作的作用外,还可以选达到使数码管的4位分别亮灭的目的。例如,在输出图形“2008”时,需要逐位选通。也就是,先输出图形“2”,只选通第一位;再输出图形“0”,选通二、三位;最后输出图形“8”,选通最后一位。4.3 芯片说明4.3.1 Intel 8255A8255A有三种基本的工作方式:方式0、方式1和方式2。 1方式O 方式O为基本的输入输出方式,传送数据时不需要联络信号。A口、B口和C口(或C高4位口及C低4位口)均可独立设置成方式0输入口或方式0输出口。 2方式1 方式l为选通输入输出方式,即需要进行联络的输入输出。A组、B组的8位口(A口或B口)可被设置为方式1输人口或方式1输出口,而这时要用相应C口的3根线作联络线。 3方式2 方式2为双向传送。该方式要使用C口的5根线作联络线。由于C口只有8根线,因此只能有一组使用方式2确定为A组。当A组被设置成方式2时,A口被设置成双向端口,即既可以输入数据,也可以输出数据,C口的5根线被指定为联络线。 图 4-3-1 Intel 8255A各管脚4.3.2 74LS377 74LS377 为八D锁存器,可进行简单输出接口扩展。图为74LS377引脚及功能图,表给出了74LS377真值表: G VCC 1Q 8Q G CK D Q 1D 74LS 8D 2D 7D 1 X X Q(不变) 2Q 377 7Q 0 1 1 3Q 6Q 0 0 0 3D 6D X 0 X X 4D 5D 4Q 5Q GND CK 表 4-3-1 74LS377真值表 图4-3-2 74LS377引脚及功能图 4.3.3 74LS138译码器 图4- 74LS138引脚及功能图 表4-3-2 74LS138真值表 4.4 八波段数码管(LED显示器)LED显示器由八段字形排列的发光二极管组合而成。对于共阴极显示器,其公共端应接低电平(接地),adp端只要接高电平,其相应线段就发亮。一般情况下,adp端接在数据锁存器的输出线上,这个端口称为字形口或段控口;而几个LED显示器的公共端并列在一起,称为字位口或位控口, 它决定该LED显示器是否能发光。对于共阳极显示器,不同之处是各线段发光的电平要求正好全部相反,如图所示: gnd +5V g f a b a a b b c c d d e e f f g g e d c dpdp dp gnd 图 4-4-3八段LED显示器 图 4-4-1 共阴极 图 4-4-2 共阳极 用LED显示器显示多位字符时,通常采用动态扫描的方法进行显示,即逐个地循环点亮各位显示器。当扫描频率足够高时,利用人眼的视觉残留效应(约几十毫秒),看起来如同全部显示器同时显示一样。4.5 键盘说明4.5.1 键盘去抖动:首先我们来看一下,在键盘工作过程中会遇到什么问题呢?目前各种结构的键盘,主要是利用机械触点的合、断作用,产生一个电压信号,然后将这个电信号传送给CPU。由于机械触点的弹性作用,在闭合及断开的瞬间均有抖动过程。抖动时间长短,与开关的机械特性有关,一般约510ms之间。 图4-5 键闭合及断开时的电压抖动波形 按键的稳定闭合期,由操作人员的按键动作所确定,一般为十分之几秒至几秒时间。为保证CPU对键的一次操作仅作一次输入处理,必须去除抖动影响及人为的操作时间长短的影响。 通常去抖动影响的措施有硬、软件两种;可用基本RS触发器或单稳态电路构成硬件去抖动电路,也可采用软件延时的方法除去键盘抖动产生的影响。采用软件除去抖动影响的办法是,在检测到有键按下时,执行一个10ms左右的延时程序,然后再去判断该键电平是否仍保持闭合状态电平,如保持闭合状态电平则可确认该键为按下状态,从而消除了抖动影响。本设计采用软件延时。4.5.2 检测被按下的键盘按键 行列式键盘必须由软件来判断按下键盘的键值。其判别方法是这样的:首先由CPU从PA口输出一个全为0的数据,也就是说,这时PA7PA0全部为低电平,这时如果没有键按下,则PB0PB3全部处于高电平。所以当CPU去读8255A 的PB口时,PB3PB0全为1表明这时无键按下。 现在我们假设第1行第4列键是按下的。由于该键被按下,使第4根列线与第1根行线导通,原先处于高电平的第4根列线被第1根行线箝位到低电平。所以这时CPU读8255A的 PB口时 PB3 = 0;从硬件图中我们可以看到,只要是第4列键按下,CPU读8255A的 PB口时 PB3始终为0。其PB口的读得值为XXXX0111B,这就是第4列键按下的特征。如果此时读得PB口值为XXXX1101 B,显然可以断定是第2列键被按下。读取被按键盘的行值,可用扫描方法。即首先使8255A的A口输出仅PA0为0、其余位都是1然后去读PB口的值,如读得PB3PB0为全1;则接着使PA1为0其余位都是1,再读PB口,若仍为全1;再继续使PA2为0,其余位为1,再读PB口 直到读出PB0PB3不全为1或0位移到PA3为0为止。这种操作方式,就好像PA口为0的这根线,从最低位开始逐位移动(称作扫描),直到PA3为0为止。 5 软件方案5.1 程序流程图开始对键盘键号进行16进制编码初始化8255;方始0,A口作输出,B口和C口作输出向所有行送0读列,查看是否所有键均松开YN检测是否有键压下反复检测延时20ms,消抖动YN对压下的键进行编码(16进制)压下的键是F吗执行方案1,输出数字2008.YN压下的键是E吗执行方案2,输出数字08.08YN压下的键是D吗Y执行方案3,输出数字05.12N压下的键是C吗执行方案4,输出图形1YN压下的键是B吗执行方案5,输出图形2YN压下的键是A吗执行方案6,输出图形3YN压下的键是9吗Y执行方案7,输出图形4N压下的键是8吗执行方案8,输出图形5YN继续扫描所有键盘都扫描完YN5.2 程序源代码;端口地址PORT_A EQU 300H ;8255 A口地址PORT_B EQU 301H ;8255 B口地址PORT_CTL EQU 303H ;8255 控制口地址PORT_377 EQU 308H ;377的入口地址PORT_1 EQU 310H ;第一个八波段数码管的入口地址PORT_2 EQU 318H ;第二个八波段数码管的入口地址PORT_3 EQU 320H ;第三个八波段数码管的入口地址PORT_4 EQU 328H ;第四个八波段数码管的入口地址;数据段键盘扫描码表DATA SEGMENT ; 0 1 2 3 4 5 6 7 TABLE DB 77H , 7BH , 7DH , 7EH ,0B7H ,0BBH ,0BDH , 0BEH; 8 9 A B C D E F DB 0D7H , 0DBH ,0DDH ,0DEH ,0E7H ,0EBH , 0EDH ,0EEHDATA ENDS;堆栈段STACK SEGMENTST1 DB 100 DUP(0)STACK ENDS;代码段CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART1: MOV AX,STACK MOV SS,AX MOV AX,DATA MOV DS,AX;初始化8255,方始0,A口作输出,B口和C口作为输入 MOV DX,PORT_CTL ;指向控制口 MOV AL,10001011B ;控制字 OUT DX,AL ;写入控制字;向所有行送0START: MOV DX,PORT_A ;A口 MOV AL,00H OUT DX,AL ;向A口各位输出0;读列,查看是否所有键均松开 MOV DX,PORT_B WAIT_OPEN: IN AL,DX ;键盘状态读入B口 AND AL,0FH ;只查低四位(列值) CMP AL,0FH ;是否都为1(各键均松开)? JNE WAIT_OPEN ;否,继续查;各键均已松开,再查列是否有0,即是否有键压下WAIT_PRES: IN AL,DX ;读B口 AND AL,0FH ;只查低四位 CMP AL,0FH ;是否有键压下JE WAIT_PRES ;无,等待;有键压下,延时20ms,消抖动 MOV CX,16EAHDELAY: LOOP DELAY ;延时20ms;再查列,看键是否仍被压着 IN AL,DX AND AL,0FH CMP AL,0FH JE WAIT_PRES ;已松开,转出等待压键;键仍被压着,确定哪一个键被压下 MOV AL,0FEH ;先使D= 0 MOV CL,AL ;CL=1111 1110BNEXT_ROW: MOV DX,PORT_A ;A口 OUT DX,AL ;向一行输出低电平MOV DX,PORT_B ;B口IN AL,DX ;读入B口状态AND AL,0FH ;只截取列值 CMP AL,0FH ;是否均为1? JNE ENCODE ;否,表示有键压下,转去编码 ROL CL,01 ;均为1,使下行输出0 MOV AL,CL JMP NEXT_ROW ;查看下行;已找到有一列为低电平,对压键的行列值编码 ENCODE: MOV BX,000FH ;建立地址指针,先指向F键对应的地址 IN AL,DX ;从B口读入行列号NEXT_TRY: CMP AL,TABLEBX ;读入的行列值与表中查得的相等吗 JE STYLE_ONE ;相等,执行方案1 JCXZ START1 DEC BX ;不等,指向下一个(键值较小着)地址 CMP AL,TABLEBX ;读入的行列值与表中查得的相等吗 JE TWO ;相等,执行方案2JCXZ START1DEC BX ;不等,指向下一个(键值较小着)地址JNS NEXT_TRY ;若地址尚未减为负值,继续查 MOV AH,01 ;若减为负值,置出错码01到AH中 JMP START ;退出;八波段数码管的不同的亮暗方式选择 ONE: MOV CX,10HSTYLE_ONE: MOV AL,1 ;选通第一个八波段数码管MOV DX, PORT_1 ;送第一个数码管的端口地址OUT DX,AL MOV AL,00100101B ;显示数字2MOV DX, PORT_377 OUT DX,AL MOV AL,1 ;选通第二个八波段数码管 MOV DX, PORT_2 ;送第二个数码管的端口地址OUT DX,ALMOV AL,00000011B ;显示数字0MOV DX, PORT_377 OUT DX,ALMOV AL,1 ;选通第三个八波段数码管 MOV DX, PORT_3 ;送第三个数码管的端口地址OUT DX,ALMOV AL,00000011B ;显示数字0MOV DX, PORT_377 OUT DX,ALMOV AL,1 ;选通第四个八波段数码管 MOV DX, PORT_4 ;送第四个数码管的端口地址OUT DX,ALMOV AL, 00000000B ;显示数字8.MOV DX, PORT_377 OUT DX,AL LOOP STYLE_ONE TWO: MOV CX,10HSTYLE_TWO: MOV AL,1 ;选通第一个八波段数码管MOV DX, PORT_1 ;送第一个数码管的端口地址OUT DX,AL MOV AL,0110111101B ;显示图形MOV DX, PORT_377 OUT DX,AL MOV AL,1 ;选通第二个八波段数码管 MOV DX, PORT_2 ;送第二个数码管的端口地址OUT DX,ALMOV AL,01101101B ;显示图形MOV DX, PORT_377 OUT DX,ALMOV AL,1 ;选通第三个八波段数码管 MOV DX, PORT_3 ;送第三个数码管的端口地址OUT DX,ALMOV AL,01101101B ;显示图形MOV DX, PORT_377 OUT DX,ALMOV AL,1 ;选通第四个八波段数码管 MOV DX, PORT_4 ;送第四个数码管的端口地址OUT DX,ALMOV AL,01101101B ;显示图形MOV DX, PORT_377 OUT DX,ALLOOP STYLE_TWOMAIN ENDPCODE ENDS END6 专题部分设计方案说明方案一中打算使用键盘实现图形间的跳转,牵涉使用的芯片较多,程序调试也较麻烦。一直以来由于很难找到完好的实验仪器,难以验证程序的正确性。虽然方案一在原理上得到过马老师的肯定,但为了在实验箱上得到演示,于是我想到了只应用Intel 8255A实现一个图案的显示,完成部分演示。在尝试的过程中,发现可以简单的应用Intel 8255A,以程序控制实现各图案间的跳转,而不必使用键盘或其他辅助工具。由此形成了方案二。方案二以8255A的A端口进行选段,B端口的低四位进行选位。使用8255A选位使程序更加简单。选位和选段均以低电平,通过8255A直接将数据输出到数码管,实现图形输出。各图案通过延时和循环检测,使之在数码管上停留一段时间,一段程序执行完后,顺序执行下一段程序(下一图案)当设计的几种方案执行完后,跳转到第一种图案的开始,使各种图案循环显示。姓名: 学号: 班级: 主要负责方案一: 键盘控制的实现 方案二:Intel 8255A控制数码管位和段的实现 611 Intel 8255A的各种功能Intel 8255A有三种基本的工作方式:方式0、方式1和方式2。 (1)方式O为基本的输入输出方式,传送数据时不需要联络信号。A口、B口和C口(或C高4位口及C低4位口)均可独立设置成方式0输入口或方式0输出口。 (2) 方式l为选通输入输出方式,即需要进行联络的输入输出。A组、B组的8位口(A口或B口)可被设置为方式1输人口或方式1输出口,而这时要用相应C口的3根线作联络线。 (3)方式2为双向传送。该方式要使用C口的5根线作联络线。由于C口只有8根线,因此只能有一组使用方式2确定为A组。当A组被设置成方式2时,A口被设置成双向端口,即既可以输入数据,也可以输出数据,C口的5根线被指定为联络线。 与CPU连接的引脚: 数据引脚:D7D0 复位输入:RESET 片选信号:/CS 端口选择的地址信号:A1和A0 读信号:/RD 写信号:/WR 与外设连接的引脚: PA7PA0:端口A输入/输出 PB7PB0 :端口B输入/输出 PC7PC0 :端口C输入/输出 图6-1-1 Intel 8255A各管脚图6-1-2 Intel 8255A端口的部分操作功能图6-1-3 Intel 8255A的内部结构图6-1-4 8255 的工作方式控制字6.1.2 键盘各键值编码如下: 0 1 2 3 4 5 6 7 TABLE DB 77H , 7BH , 7DH , 7EH ,0B7H ,0BBH ,0BDH , 0BEH 8 9 A B C D E F DB 0D7H , 0DBH ,0DDH ,0DEH ,0E7H ,0EBH , 0EDH ,0EEH61.3 各方案主要负责部分说明方案1 用键盘来控制各彩灯图形间切换 在该方案中,我主要负责键盘控制的实现,通过给各4行*4列按键进行16进制编码,用Intel 8255A的端口A作输出,端口B作输入。矩阵的4条行线接到输出端口A的PAPA ,用程序能改变这4条行线上的电平。4条列线连到输入端口B的PBPB ,4条行线还同时接到输入端口B的PBPB上。这样用输入指令读取B口状态时,可同时读取键盘的行列信号。键盘的控制电路,及键盘扫描过程如下: 初始化8255的程序如下(采用方始0,A口作输出,B口和C口作为输入) MOV DX,PORT_CTL ;指向控制口 MOV AL,10001011B ;控制字 OUT DX,AL ;写入控制字 图 6-1-5 键盘扫描过程 图 6-1-6 键盘与Intel 8255A的连接电路图方案2 用延时来控制各彩灯图形间切换 本方案的设计思路与原理及芯片的使用都相对较简单,主要用Intel 8255A的端口A来作为输出,通过控制八波段数码管的8段的选择来实现不同数字的显示,用端口B(输出)的低4位来进行八波段数码管的4位选择,以期达到各个数码管的不同亮暗方式选择。各种方案的转换实现靠延时来实现。8255A初始化: MOV AL,10000000B ;初始化8255,方式0,A,B作为输出端口 MOV DX,CTL_8255 OUT DX,AL "数字"2的实现: MOV CX,50HSTY1: PUSH CX MOV AL,24H ;显示“数字2”; MOV DX,A_82