2940.可编程作息时间控制器 设计报告包含源代码设计背景完整报告等内容.doc
计算机科学与技术学院硬件课程设计报告姓 名: 专 业: 计算机科学与技术 班 级: 设计题目: 可编程作息时间控制器 成 员: 指导教师: 职 称: 2008年 6月30日 课程设计指导教师评阅书指导教师评语:成 绩: 指导教师签字: 年 月 日可可编程作息时间控制器摘 要在本次可编程作息时间控制器的设计的过程中我们三人分工合作,完成了:1、键盘的扫描程序的设计,利用8255A并行口做一个扫描键盘程序,把按键输入的键码,通过8255 PC口输出显示在七段数码管上。8255PA口低4位做键盘行的输入线,PB口低4位作为键盘的列输入线,同时其高4位读取键盘的行信息,这样一来,用输入指令读取B口状态时,可同时读取键盘的行列信息。8255 PA口高4位作为四位七段数码管的位选线。编写程序通过逐行逐列扫描,可获得所按键的行列信息,及该键所对应的键号并利用查表找出其所对应的数码管显示码。将该信息通过8255 PC口输出到七段数码管上,显示当前按键值。每次按键输出键值时,通过改变8255 PA口高4位状态,使四位七段数码管轮流显示不同的键值。 2、定时计时程序,通过上述所设计的键盘输入定时时间,计算初值,利用可编程的计数/定时器8253A进行计时,实现定时报告。完成可编程作息时间控制器的设计。 本设计实现了设定时间的显示,到时提示等功能,基本上到达了我们最初设计的要求。 3、本设计中所用芯片:8255,8253,74LS138; 利用了4×4矩阵的小键盘,及指示灯。所用做图工具:PROTELL99SE、WORD关键词8255A ;8253 ;键盘 ;设置定时时间 ;计数定时目 录总体设计部分1 设计任务与要求1 1.1、题目理解1 1.2、任务要求12 总体方案1 2.1、设计思路1 2.2、总体设计电路图13硬件方案2 3.1、所用芯片简介2 3.1.1、8255芯片简介2 3.1.2、8253芯片简介4 3.2、各部分电路图 7 3.2.1、键盘部分电路图7 3.2.2、键盘及显示部分电路图9 3.2.3、计时部分电路图10 4软件方案1041、设计的原理104.1.1、键盘的设计原理104.1.2、显示部分的设计原理124.1.3、计时部分的设计原理134.2、程序流程图144.2.1、键盘扫描流程图144.2.2、显示部分程序图15专题设计部分1 硬件(软件)详细设计161.1、程序清单及相应的说明16 1.2、设计方案测试22 1.2.1、单个程序测试22 1.2.2、总体程序测试232总结23 2.1、本设计的可行性与优点分析232.2、设计中的不足分析与改进233.心得体会26参考文献26总体设计部分1 设计任务与要求1.1、题目理解可编程作息时间控制器可理解为可编程即可设置且可重置的闹钟。设置一个时间,到设置时间时机器自动叫响且伴有指示灯亮。1.2、任务要求 利用键盘输入预设定的时间,设计一个具有时.分计时,4位数字显示的时钟电路,能按设定时间自动叫响且伴有指示灯亮.2 总体方案2.1、设计思路利用8255A设计4行×4列的矩阵键盘,并与4位七段数码管相连,实现按键的判断及显示。8255A是的A口低4位连接键盘的行,C口低4位连接键盘的列;A口高4位连接4位七段数码管的位选端口,实现数码管的选择;B口8位连接七段数码管的8个段信号引脚。输入4个数字由4个七段数码管分别显示,前两位为小时,后两位为分钟。在由此及与系统时间的比较,判断到时转8253程序控制指示灯亮。选用8253的0、1、2计数器,0计数器采用方式2,用系统时钟脉冲f=1MHZ,计数初值为2000,其输出端作为1计数器的输入脉冲,1计数器采用方式2,计数初值为2000,输出一个周期为2S的时钟脉冲。2计数器采用方式0,产生定时中断,其OUT端连接一个发光二极管,到设定时间时发光。2.2、总体设计电路图 CS 8253实现计数定时 CS 8255实现键盘设置闹铃时间显示时间300-307308-315CSCS 3 硬件方案3.1、所用芯片简介3.1.1、8255芯片简介(1)、8255可编程并行接口芯片简介:8255是一种通用可变成并行输入输出接口芯片,通过对它进行编程,芯片可工作于不同的工作方式,用8255作接口时,通常不需要附加外部逻辑电路就可直接为CPU与外设之间提供数据通道。8255可编程并行接口芯片有三个输入输出端口,即A口、B口和C口,对应于引脚PA7PA0、PB7PB0和PC7PC0。其内部还有一个控制寄存器,即控制口。通常A口、B口作为输入输出的数据端口。C口作为控制或状态信息的端口,它在方式字的控制下,可以分成4位的端口,每个端口包含一个4位锁存器。它们分别与端口A配合使用,可以用作控制信号输出或作为状态信号输入。(2)、8255可编程并行接口芯片方式控制字格式说明:8255有两种控制命令字;一个是方式选择控制字;另一个是C口按位置位复位控制字。其中C口按位置位复位控制字方式使用较为繁难,说明也较冗长,故在此不作叙述。方式控制字格式说明如表1:表1 D7D6D5D4D3D2D1D0 D7:设定工作方式标志,1有效。 D6、D5:A口方式选择 0 0 方式0 0 1 方式1 1 ×方式2 D4:A口功能 (1=输入,0=输出) D3:C口高4位功能 (1=输入,0=输出) D2:B口方式选择 (0=方式0,1=方式1) D1:B口功能 (1=输入,0=输出)D0:C口低4位功能 (1=输入,0=输出) (3)、8255可编程并行接口芯片工作方式说明: 方式0:基本输入输出方式。适用于三个端口中的任何一个。每一个端口都可以用作输入或输出。输出可被锁存,输入不能锁存。 方式1:选通输入输出方式。这时A口或B口的8位外设线用作输入或输出,C口的4条线中三条用作数据传输的联络信号和中断请求信号。方式2 :双向总线方式。只有A口具备双向总线方式,8位外设线用作输入或输出,此时C口的5条线用作通讯联络信号和中断请求信号。3.1.2、8253芯片简介(1)、可编程计数器/定时器8253芯片简介8253是一种利用硬件电路和中断方法控制定时,定时时间和范围完全由软件来确定和改变,并有微处理器的时钟信号提供时间基准。但该时钟信号频率太高,所以还可用8253进行分频。8253内部有3个独立的16位计数器通道,通过对他进行编程,每个计数器通道均可按6种不同的方式工作,并且都可以按2进制或10进制格式进行计数,最高计数频率能达到2MHZ.8253还适用于许多其他场合,如用作可编程方波频率产生器、分频器、程控单脉冲发生器等等。(2)、8253A控制字的格式说明在对8253进行编程时,由CPU用输出指令向他写入控制字,来选定计数器通道,规定各计数器通道的工作方式,读写格式和数制。控制字格式如表2:表2: -通道选择位,00,01,10分别表示向8253的计数器通道0-2写入控制字,11无效。-读/写操作位,01表示只读/写低8位字节数据,只写入低8位时,高8位自动置为0;10表示只读/写高8位字节数据,只写入高8位时,低8位自动置为0;11允许读/写16位数据。00把通道中当前数据寄存器的值送到16位锁存器中,供CPU读取该值。BCD-计数方式选择位。1表示采用BCD码计数; 0表示采用二进制格式计数。-工作方式选择位。 000 方式0 001 方式1 X10 方式2 X11 方式3100 方式4101 方式5(3)、8253 六种工作方式的说明8253有6种工作方式,对它们的操作遵守以下3条基本原则: (1)当控制字写入8253时,所有的控制逻辑电路自动复位,这时输出端OUT进入初始态。 (2)当初始值写入计数器以后,要经过一个时钟周期,减法计数器才开始工作,时钟脉冲的下降沿使计数器进行减1计数。计数器的最大初始值是0,用二进制计数时0相当于216,用BCD码时,0相当于104。 (3)对于一般情况下,在时钟脉冲CLK的上升沿时,采样门控信号。对门控信号(GATE)的触发方式是有具体规定的: 门控信号为电平触发的有:方式0,方式4。 门控信号为上升沿触发的有:方式1,方式5。 门控信号可为电平触发也可为上升沿触发的有:方式2,方式3。 计数方式的有:方式0,方式1,方式4,方式5 定时方式的有:方式2,方式3。8253的工作方式:方式0(计数结束产生中断的计数器)- - -写入方式控制字后,输出端OUT为低电平;写入计数常数后,开始计数。计数器减为0之前,输出端OUT维持低电平。当计数值为0时,输出端OUT才变为高电平,向CPU发出中断请求,直到CPU写入新的控制字或者写入新的计数值为止。方式0可由门控信号控制暂停,GATE为低电平时,计数器暂停,GATE信号变高后,就接着计数。方式1(可重复编程的单脉冲)- -设定工作方式和写入计数值后,OUT输出高电平,GATE(触发信号)变为高电平后,OUT变为低电平,开始计数。当计数器减到0时,OUT才输出高电平。输出低电平期间,写入新计数值,不会影响原记数过程。只有第一次计数完,GATE再来一个正跳变时才使用新的计数值计数若在第一次计数末完成之前,GATE又产生正跳变(即下一个脉冲信号又到来)时,则从新的GATE的上升沿以后,开始重新计数,OUT端输出的低电平保持不变,2次的计数过程合在一起,因此使输出的负脉冲宽度加宽了方式2 (分频器)-写入方式2的控制字后,OUT变高,设GATE为高先到,计数器对CLK计数,设计数初值为N。当计数器计到(N一1)个CLK信号时,OUT输出变低,计数器的值为l。最后一个CLK信号输入后,计数器减到0,OUT回到高,计数器又自动从初值开始计数。因此OUT端在每N个CLK信号中输出一个宽度等于CLK信号周期的负脉冲。负脉冲的周期=计数值N×时钟CLK的周期T。计数过程中要求门控脉冲GAT置保持为高,当GATE为低电平时,则计数被中止暂停,在GATE再变高后,计数器又被置入初值,重新计数。方式3(方波发生器)-写入方式3的控制字后,OUT变高,设GATE为高电平,则在写入计数初值后的下一个时钟脉冲时,将计数初值装入执行部件,并开始计时。与方式2类似,但输出端得到的是方波或基本对称的矩形波。初值为偶数时,每输入一个时钟脉冲,均使计数值减2,减为0时,OUT输出引脚由高电平变低电平,同时自动重新装入计数初值,继续计数。初值为计数时,第一个时钟脉冲使计数器减1,以后均减2.方式4(软件触发选通)-写入方式4的控制字后,OUT变高,设GATE为高电平,则在写入计数初值后的下一个时钟脉冲时,将计数初值装入执行部件,并开始计时。当计数初值减为0时,OUT端输出变低,经一个时钟周期又回到高电平,形成一个负脉冲。一次计数,重新装入初值才可继续计数。方式5(硬件触发选通)-写入方式5的控制字后,OUT变高,装入计数初值后,只有当GATE从到到高跳变时才能在下一个时钟脉冲后把计数初值装入执行部件,并开始计时。当计数初值减为0时,OUT端输出变低,经一个时钟周期又回到高电平,形成一个负脉冲。自动重新装入初值,当再经历GATE从低到高跳变时继续减1计数。3.2、各分电路图3.2.1、键盘部分电路图.PA0PA1PA2PA38255APB7PB6PB5PB4PB3PB2PB1PB010K10K40159O637C28+5V键盘各键作用说明:0-9数字键O(0A)四个数输入完成,(小时、分钟各两位)执行显示程序C(0B)输入显示完成,执行计数程序0C-0F未用3.2.2、键盘及显示部分电路图3.2.3、计时部分电路图4 软件方案4.1、 设计的原理4.1.1、键盘的设计原理我们所设计的键盘是一个16位键的,分别为16进制数字09和AF,其中,F键为复位键,键盘的排列,连线及接口电路如下图所示,16个键排成4行×4列的矩阵,接到微机的一对端口上。端口由8255A构成,其中端口A作输出,端口B作为输入,端口C作为输出。矩阵4条行线到输出端口A口的PA3PA0,用程序能改变这4条线上的电平。4条列线连到输入端口B口的PB7PB4. 编写程序通过逐行逐列扫描,可获得所按键的行列信息,及该键所对应的键号。在无键压下时,由于接到+5V上的上拉电阻的作用,列线被置成高电平。压下某一键后,该键所在列线和行线接通。这时,如果向下键所在的行线上输出一个低电平信号,则对应的列线也呈现低电平。当从B口读取列线信号时,便能检测到该列线的低电平。说明该行列对应的键即为所按下的键。 识别键盘上哪个键被压下的过程称为键盘扫描,上述键盘的扫描包含以下几步:a 、检测是否所有键都松开了,若没有则反复检测。b、当所有键都松开了,再检测是否有键压下,若无键压下则反复检测。c、若有键压下,要消除键抖动,确认有键压下。d、对压下的键进行编码,将该键行列的信号转换16进制码,由此确定哪一个键被压下了。如出现多键重按的情况,只有在其他键均释放后,仅剩下一个键闭合时,才把此键当作本次压下的键。e、该键释放后,再回到b。检测矩阵中是否有键压下的一种简单方法,自输出口A向所有行线输出0电平,再通过B口的低4位读取列值,若其中有0值,便是有键压下了。 在开始一次扫描时,先应确认上一次压下的键是否已松开。既先向所有行线输出低电平,再读入各列线值,只有当所有的行线和列线均为高电平,表示以前压下的键都已释放,才开始检测是否有键压下。 当检测到有键压下后,必须消除键抖动(DEBANCE)。即当检测到有键按下后,延长一定时间(通常延迟20MS),再检查该键是否仍被压者。若是,才认定该键确实被按下后,而不是其他的振动干扰。确认有键按下后,再确定被压下键所在的行号。为获取行列信息,先从A口输出一个低电平到一行线上,再从B口读入各列的值,若没有一列为低电平,说明压下的键不在此行。于是,再向下一行输出一个低电平,再检测各列线上是否有低电平,依次对每一行重复这个过程,直至查到某一列线上出现低电平为止。被置成低电平的行和读到该低电平的列,便是被压下键所在的行列值。 已被压下的键所在的行号(03)和列号(03)后,就能得到该键扫描码。例如,对于数字0,它位于3行,3列,压下“0”键时,从B口可读得D7位和D3为0,其余位为1,所以数字0的编码为01110111B,即77H;对于数字6,处于2行,1列,压下“6”键时,D6为和D1位为0,其余位为1,所以数字6的编码为10111101B=BDH。类似地,其余各键的编码也可一求得。将 这些编码值列成键盘扫描表(TABLE),放在数据段中,用查表程序来查对,便能确定压下的位置。键盘扫描码表:表10123456777H7BH7DH7EH0B7H0BBH0BDH0BEH89ABCDEF0D7H0DBH0DDH0DEH0E7H0EBH0EDH0EEH4.1.2、显示部分的设计原理根据七段LED显示器的原理,对16进制数字(0F)进行编码,根据下图典型的七段LED,例如,对于数字“0”,二极管a, b, c, d, e ,f亮,g,h(DP)灭 ,故数字”0”的编码为0011111B,即为3FH,类似地,其余各键的编码也可一一求得.将这些编码值列成七段显示代码表(LED_CODE),通过编写程序实现键盘扫描表(TABLE)与七段显示代码表(LED_CODE)进行转换,并通过PC口输出显示到七段数码管上。每次按键输出键值时,通过改变8255 PA口高4位状态,使四位七段数码管轮流显示不同的键值。 典型的七段LED 图2LED显示码表:表2012345673FH06H5BH4FH66H6DH7DH0EH89ABCDEF7FH6FH77H7CH39H5EH79H71H要想使多位7段数码管在尽量简单的接口电路驱动下显示不同的内容,多数利用了逐位快速轮循显示的方式。即在一个轮循显示周期中让每位数码管显示一次各自的数。当轮循显示周期的数目大于每秒50次时,人的眼睛就因视觉惰性而无法察觉显示的变化,从而感觉到现实的事多位静止的7段数。将四个数码管的8个段信号引脚链接在一起,并共同由一个段驱动器提供8位的段显示码数据。而每个数码管则各自都有独立的位选通信号。无论段驱动器的输出什么显示码数据,只要位选通信号有效的数码管才会发亮。所以只要先逐个送出每个数码管将要显示的段显示码数据后紧跟着仅送出使该位数据管位选信号有效的数据,并且保持一个短暂的时间(几毫秒到几十毫秒),就会让段码数据在数码管上显示一个短暂的时间。当每位数码管显示的内容每秒轮循显示的次数大于50次时,我们就会看到每位数码管都稳定的地显示各自的内容4.1.3、计数部分设计原理利用8253的计数作用,实现倒计时功能。通过设定时间与系统时间的比较,计算出计数初值。利用8253的0、1计数器实现时钟的分频,选择工作方式2。8253的2计数器利用1计数器的输出脉冲作为其输入脉冲,选择工作方式0,实现定时作用。在OUT2端连接一个发光二极管,当定时结束时,OUT2输出变为高电平,二极管发光。实验完成。4.2 、程序流程图4.2.1、键盘扫描流程图图5开 始初始化8255AA口作为输入,B口和C口作为输出读键盘WAIT_OPEN检测是否所有键均松开WAIT_PRES检测是否有键按下由NEXT_ROW确定键的键值 , 查TABLE表确定按键的位置编码将该位置编码转换成LED_TABLE表的LED显示码检测是否为复位键F显示该按键结 束若有键被按下,继续等待若均松开有按下若没有则继续等待若是复位F若不是 延时20MS是否仍有键按下仍有4.2.2、显示部分程序图相应数码管的各段信号置0判断CX是否为0按键,显示键号初始化8255AA口作为输出,B口作为输出选中第一个数码管开 始设置循环次数CX=4是选中下一位数码管不是 专题设计部分1 硬件(软件)详细设计 1.1、 程序清单及相应的说明 ;8255A端口地址PORT_A EQU 300H ;8255A口地址PORT_B EQU 301H ;8255B口地址PORT_C EQU 302H ;8255C口地址PORT_CTL EQU 303H ;8255控制口地址;8253A端口地址PORT_C3 EQU 311H ;8253A控制口地址PORT_0 EQU 308H ;8253A通道0地址PORT_1 EQU 309H ; 8253A通道1地址PORT_2 EQU 310H ; 8253A通道2地址;数据段;键盘扫描码表DATA SEGMENT; 0 1 2 3 4 5 6 7TABLE DB 77H, 7BH, 7DH, 7EH, 0B7H, 0BBH, 0BDH, 0BEH; 8 9 A B C D E FDB 0D7H, 0DBH, 0DDH, 0DEH, 0E7H, 0EBH, 0EDH, 0EEH;LED_CODE显示码表; 0 1 2 3 4 5 6 7 LED_CODE DB 3FH,06H, 5BH, 4FH, 66H, 6DH,7DH, 0EH; 8 9 A B C D E F DB 7FH, 6FH, 77H, 7CH,39H,5EH, 79H, 71H;定时时间缓存区TIME DB 4 DUP (0)DATA ENDS;堆栈段STACK SEGMENT STACK DW 50 DUP(0)TOP_STACK LABEL WORDSTACK ENDS;代码段CODE SEGMENT MAIN PROC FAR ASSUME CS: CODE, DS: DATA, SS: STACKSTART: MOV AX, STACK MOV SS, AX LEA SP, TOP_STACK MOV AX, DATA MOV DS, AX CALL INIT ;调用数码管初始化子程序 MOV CX,4 ;循环次数ROTATE: CALL KEY ;调用键盘部分子程序,用于监视是否有键按下 LOOP ROTATE ;循环 RET ;返回MAIN ENDP;INIT PROC NEAR ;数码管初始化子程序,将数码管全部置灭 MOV CX,4 ;循环次数 MOV AH,10HNEXT: MOV AL,AH MOV DX, PORT_CTL ;指向控制口 MOV AL, 10001011B ;控制字 OUT DX, AL ;写入控制字 MOV DX,PORT_A ;A口地址 OUT DX,AL MOV DX,PORT_B ;B口地址 MOV AL,00H ;0FFH对应于数码管的全灭 OUT DX,AL ROR AH,1 ;位选选中下一个数码管 LOOP NEXT RETINIT ENDPKEY PROC NEAR;初始化8255A,方式0,A口和C口作为输出,B口作为输入 MOV DX, PORT_CTL ;指向控制口 MOV AL, 10001011B ;控制字 OUT DX, AL ;写入控制字;向所有行送0 MOV DX, PORT_A ;指向A口MOV AL, 00H ;向A口各位输出0OUT DX, AL ;读列,查看是否所有键均松开MOV DX, PORT_B WAIT_OPEN: IN AL, DX ;键盘状态读入B口AND AL, 0FH ;只查低4列位(列值)CMP AL, 0FH ;是否都为1(各键均松开)JNE WAIT_OPEN ;否,继续查;各键均已松开,在查列是否有0,即是否有键按下WAIT_PRESS: IN AL, DX ;读B口状态 AND AL, 0FH ;只查低4位CMP AL, 0FH ;是否有键按下JE WAIT_PRES ;无,等待;有键按下,延时20MS,去抖动MOV CX, 16EAH DELAY: LOOP DELAY;再查列,看键是否仍被按着IN AK, DX AND AL, 0FHCMP AL, 0FHJE WAIT_PRES ;若松开了,转出等待压键;若键仍被压着,确定哪一个键被压下MOV AL, 0FEH ;先使=0MOV 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,使下一行输出0MOV AL, CL JMP NEXT_ROW ;查看下一行;已找到有一列为低电平,对压键进行编码ENCODE: MOV BX, 000FH ;建立地址指针,先指向F键对应地址IN AL, DX ;从B口读入行列号NEXT_TRY: CMP AL, TABLEBX ;读入的行列值列值与;表中查得的相等吗?JE DONE ;相等,转出DEC BX ;不等,指向下一个(键值较小者)地址JNS NEXT_TRY ;若地址尚未减为负数继续查MOV AH, 01 ;若减为负数,置错误码01-AH中JMP EXIT ;退出DONE: MOV AL, BL ;AL存放按键的偏移量 CMP AL, 0AH ;判断是否为数字键 JS BAOCUN ;若是,转出将定时时间保存 JZ DISPLAY ;若是确定键,转去显示 CMP AL,0BH