河南工程学院计算机科学与工程系接口技术及其应用实训报告册学期: 2011-2012第二学期课程: 接口技术及其应用专业: 计算机科学与技术班级: 0941学号: 200910913103姓名: 李赛指导教师: 何莉实训(习)报告评语等级评阅人:职称年月日河南工程学院实训(习)报告实训目的(内容):1.掌握七段数码管工作原理;2.掌握计算机对输入信号检测和输出控制的基本方法;3.掌握常用按钮、发光二极管的使用方法。
4.提高学生的动手能力,达到理论和实践紧密结合。
实训时间:自6月18日至6月21日实训地点:校内机房3B402实训单位:计算机科学与工程系指导教师:何莉系主任:曲宏山目录一、实训目的 (5)二、实训内容及步骤 (5)三、总体设计思路 (6)1、系统硬件的设计 (7)2、系统软件设计 (8)四、实训过程出现的问题和解决措施 (12)1、系统硬件方面 (12)2、软件调试方面 (12)五、程序清单 (12)六、实训总结 (26)一、实训目的1.掌握七段数码管工作原理;2.掌握计算机对输入信号检测和输出控制的基本方法;3.掌握常用按钮、发光二极管的使用方法。
4.提高学生的动手能力,达到理论和实践紧密结合。
二、实训内容及步骤1、设计基本要求用键盘、按钮、七段数码管和发光二极管模拟电梯工作过程。
楼层设为8 层,键盘数字键1~8用来键入希望停的楼层,8 个LED 显示希望停的楼层,八段码指示电梯当前所在楼层,按钮用来启、停电梯。
电梯正常运行时以每 2 秒1层的速度上升或下降。
结合实际了解电梯的工作方式,现假设以下几种运行情况:(1)假设当前电梯停在某层(LED显示相应楼层, 8个发光二极管全灭)。
键入数字键,如键入的数字与当前电梯停靠层相同,则什么也不做,若不同则相应楼层的发光二极管亮;电梯自动判别上升或下降(在运行过程中用八段码来显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应 LED 灭)。
(2)假设当前电梯正在上升或下降运行(此时八段码显示楼层变化, LED 指示希望抵达的楼层),若键入新的希望停靠的楼层数字(相应的 LED 亮),则对同方向(上升或下降)未到的楼层能停靠,对其它情况则先停靠原先希望停的楼层,然后继续运行)。
如下几例:1)设电梯当前在 2层,向上运行,LED指示希望在4层停,此时若键入3,则电梯将在3楼停,然后继续运行至4层停;2)同上情况,若键入的不是 3而是5,则电梯将先停在4层,然后运行至5层停;3)同上情况,若键入的不是 3(或5),而是1,则电梯先停在4层,然后运行至1层停。
2、提高要求除运行按钮外,再设计几个按钮,模拟更多的电梯运行功能,如:1)直达按钮,若按此按钮,电梯按直达方式运行,即对运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层。
2)急停按钮,电梯运行中,若按此按钮,则电梯即停在下一到达的楼层。
3)断电待修按钮,按下该钮电梯不能工作,再按一下才能重新工作。
3、连接线路并行接口电路选择 8255 芯片,七段数码管、LED 指示灯连接线路由学生自己设计,可参考实验指导书的相关内容。
楼层数字键和运行按钮都可由PC 机键盘代替。
4、编写程序5、调试程序。
汇编、连接后执行程序,观察电梯运行情况。
三、总体设计思路本设计主要是利用微机应用实验平台来模拟电梯的运行,用到了平台上的一个非编码键盘、LED显示器、八段数码管等模块。
有8个楼层,需要用8个按键模拟电梯中的请求按钮,用5个按键模拟8个楼层每层向上请求的按钮,再用8个模拟8个楼层每层向下请求的按钮。
非编码键盘有16个键,可以用1-8号键模拟电梯内的按钮,用8-0号键模拟每层向上请求的按纽,A-H模拟每层向下请求的按纽。
当电梯静止状态时,无论外部哪一层有请求,电梯都由静止状态转入向上或向下运行的状态,直到到达请求的楼层;当电梯处于向上运行的状态时,此时高于该楼层向上的请求和内部请求级别最高,其次是所有楼层向下的请求,再次是低于该楼层向上的请求;当电梯处于向下运行的状态时则情况相反。
由于中断级别在随着电梯所处楼层的不同而变化,而且中断源比较多。
所以用每一个中断源直接和中断控制器相连,需要用到多个8259A级联,很不方便。
为解决这个问题,首先定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存储电梯每一层向上、向下和内部的请求,每一个变量用低8位,每一位代表一层。
例如,REQ_U为 00000110B,这代表在2层和3层有向上的请求。
8253定时器每隔20ms产生一次中断,中断程序便去执行扫描键盘,当扫描到有电梯内部或者外部按键时,将请求存储到变量中。
每到一个状态时再检查请求变量REQ_U、REQ_D 和REQ_IN的值,根据电梯的运行方向和变量中的请求,来决定电梯下一步的运行。
设电梯的当前楼层为floor(floor=1~8),运行方向为dir(dir=0,向上;dir=1,向下),在电梯运行的工程中,用数码管输出floor值显示当前的楼层。
LED输出REQ_IN的值显示电梯内已经请求的楼层。
1、系统硬件的设计由于采用了PC机资源和微机实验平台,不需要其他的硬件电路。
利用了微机平台上的8254定时/计数器、8255并行接口单元、LED单元、非编码键盘、数码管显示单元等等。
系统结构框图,如图1所示。
图1 系统结构框图主要的模块如下:1.可编程定时/计数器8254定时/计数器8254主要是用于定时20ms,触发中断进行键盘扫描。
电路连线是CLOCK0接Q6,分频后频率为46875Hz,OUT0接中断IRQ2,每20ms中断一次,GATE0接5v。
计数器的初值应该是3A9H。
2.8255并行接口单元8255主要是用于键盘的扫描和发光二极管的数据输出。
所以用8255A口的低8位接8个发光二极管,B口低4位接非编码键盘的列线,高4位接键盘的行线。
3.LED显示系统虽然只用了1格LED显示器,但为了数字更新更方便,主程序更加简单,故此系统选用动态显示方式。
由于系统的软件部分的运行时的核心程序是一直循环的,因此显示程序也是在循环过程中一直被调用,从而实时地被显示出来。
4.非编码键盘本系统采用的是行反转法来扫描键盘的,调用键盘扫描的程序TESTKEY后,程序中的变量KEY的值就是按下的键的值,如果KEY为0FFH则表示无键盘输入,为0~15 则按照上往下从左往右的顺序分别代表每一个按键按下的信息。
不过此扫描程序没有考虑到多个按键同时按下的情况。
又因为模拟电梯的按键一般不会有两个按键同时按下的情况,所以,多个按键的情况可以不予考虑。
2、系统软件设计本设计的软件设计的思路:通过软件编程使8254输出定时信号申请中断,在中断服务程序中扫描键盘,如果有按键,修改相应的变量位,并输出内部请求变量REQ_IN到发光二极管显示当前的内部请求楼层。
在主程序中,查询变量的值,根据电梯调度算法运行电梯。
1.主要设计模块程序主要包括以下主要模块:键盘扫描程序、LED显示程序、电梯调度算法。
1)键盘扫描程序:采用的是行反转法来扫描键盘的,相应的程序设计请参考实验指导书上实验3中的相关介绍。
2)LED显示程序:本设计只用到了一个LED,只要将floor转换为相应的段码。
先输出位码,再输出段码,循环输出就可以动态显示。
为了循环的显示,将LED显示程序放在中断服务程序中。
3)电梯调度算法:在设计时将电梯一次从下到上视为一次运行(注意不一定从底层到顶层),同理,电梯一次从上到下也视为一次运行(注意不一定从顶层到底层)。
当电梯向上运行时:a)位于当前层以下的向上请求都被忽略留到下次向上运行时处理。
b)位于当前层以上的向上请求都被记录留到此次运行处理。
c)无论哪层的向下请求都被忽略留到下次向下运行时处理。
当电梯向下运行时:a)位于当前层以上的向下请求都被忽略留到下次向下运行时处理。
b)位于当前层以下的向下请求都被记录留到此次运行处理。
c)无论哪层的向上请求都被忽略留到下次向上运行时处理。
2.程序流程图1)主程序框图如图2开始系统初始化查询电梯请求变量电梯运行图2 主程序框图2)中断服务程序框图如图3中断保护现场LED 输出显示floor键盘扫描有键按下?修改请求变量点亮相应的发光二极管恢复现场中断返回是否图3 中断服务程序框图3)电梯算法流程图如图4其中,dir 代表电梯的运行方向,0代表电梯向上运行,1代表向下运动。
设REQ_U(n)代表第n 层向上的请求,同样,REQ_D(n) 代表第n 层向下的请求,REQ_IN(n) 代表第n 层内部的请求。
求next 的方法为:电梯向上时,next 为内部请求的最小值和向上请求的大于floor 的最小值之间的小者。
电梯向下时,next 为内部请求的最大值和向下请求中小于floor 的最大值之间的大者。
没有满足要求的时返回0。
查询请求变量有请求?dir =0?求next next =0?floor ++floor=next?延时清除请求变量相应位并延时求nextN dir =1YYN求next next =0?floor --floor=next?延时清除请求变量相应位并延时求nextN dir =0YYNYNYN图4 电梯算法流程图四、实训过程出现的问题和解决措施1、系统硬件方面线路连接错误,无法实现预期功能,解决措施:仔细检查电路,查找错误并改正。
在接线的时候8254的GATE0没有接5V电源,导致相关芯片无法工作,经细心排查,将错误找错并改正。
有一次调试时试验箱的电源没开就运行软件关联进行调试,结果认为是某个芯片坏了,后来才发现时低级错误。
解决措施:重启电脑,打开试验箱电源,重新运行。
2、软件调试方面程序编写的时候,指令写错,导致软件调试出现问题,解决措施:认真阅读程序,把错误找出并改正。
实验仪器的电源没打开就开始运行程序,结果造成死机,解决措施:重新正确运行。
相关参数设计错误导致流水灯与声音无法同时满足实验要求。
解决措施:经过老师指出,发现是相关的指令与参数错误所致,经同学帮助,将其改正。
五、程序清单MY8255_A EQU 0FF28H ;8255的A口地址MY8255_B EQU 0FF29H ;8255的B口地址MY8255_C EQU 0FF2AH ;8255的C口地址MY8255_MODE EQU 0FF2BH ;8255的控制寄存器地址IOY1 EQU 3040H ;片选IOY0对应的端口始地址MY8254_COUNT0 EQU IOY1+00H*4 ;8254计数器0端口地址MY8254_COUNT1 EQU IOY1+01H*4 ;8254计数器1端口地址MY8254_COUNT2 EQU IOY1+02H*4 ;8254计数器2端口地址MY8254_MODE EQU IOY1+03H*4 ;8254控制寄存器端口地址STACK1 SEGMENT STACKDW 256 DUP(?)STACK1 ENDSDATA SEGMENT;DTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HDTABLE DB 06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HNOW_FLOOR DB 01H-01H ;定义数据变量DIR DB 1TARGET_FLOOR DB 01H-01H ;02H为初始层,出事情况当前层和目标层一样F_FLOOR DB 1 ;按键有效,空闲FREQ_LIST DW 371,495,495,495,624,556,495,556,624 ;频率表DW 495,495,624,742,833,833,833,742,624DW 624,495,556,495,556,624,495,416,416,371DW 495,833,742,624,624,495,556,495,556,833DW 742,624,624,742,833,990,742,624,624,495DW 556,495,556,624,495,416,416,371,495,0TIME_LIST DB 4, 6, 2, 4, 4, 6, 2, 4, 4 ;时间表 DB 6, 2, 4, 4, 12, 1, 3, 6, 2DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4DB 6, 2, 4, 4, 6, 2, 4, 4, 12DATA ENDS ;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: CALL dispredJMP SERIAL;-------------------------------------------------------------------- SERIAL: MOV DS:[077AH],1717H ;置显示初值1--1--,存放左边第4和5的值MOV DS:[077CH],0117H ;存放左边第2个和第3个要显示的值MOV DS:[077EH],0117H ;存放左边第0个和第1个要显示的值redikey:call dispkey ;调显示键扫子程序cmp byte ptr ds:[0752h],10h ;判功能键还是数字键jc wattxd ;转数字键处理jmp funckey ;转功能键处理WATTXD: nop ;数字键处理jmp redikey ;循环回去继续键扫funckey:CMP BYTE PTR DS:[0752H],1FH ;判是MON功能键否?JNZ REDIKEY ;不是功能键MON返回JMP redikey;----------------------------------------dispred:mov dx, 0FF2BH;8255初始化,c口输出开始红灯亮mov al,80Hout dx,almov dx,0FF2AHmov al,01hout dx,alcall dispdispblue:mov dx, 0FF2BH;8255初始化,c口输出绿灯亮mov al,80Hout dx,almov dx,0FF2AHmov al,01hout dx,alretMOV AX,DATAMOV DS,AX;初始化8254MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,0B6H ;计数器2,方式3 OUT DX,ALMOV DX,MY8254_COUNT2 ;装入计数初值MOV AL,00H ;18432分频OUT DX,ALMOV AL,48HOUT DX,ALMOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,36H ;定时器0、方式3OUT DX,ALMOV SI,OFFSET FREQ_LIST ;装入频率表起始地址MOV DI,OFFSET TIME_LIST ;装入时间表起始地址MOV DX,0FH ;输入时钟为1.0416667MHz,1.0416667M = 0FE502H MOV AX,0E502HDIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率 MOV DX,MY8254_COUNT0OUT DX,AL ;装入计数初值MOV AL,AHOUT DX,ALMOV DX,MY8254_COUNT1 ;装入计数初值MOV AL,0C8H ;100分频OUT DX,ALMOV AL,00HOUT DX,AL;初始化8255MOV DX,MY8255_MODE ;初始化8255工作方式MOV AL,81H ;方式0,A口、B口输出,C口低4位输入OUT DX,ALMOV DX,1300H ;用IO-32输出控制8个LED,刚开始默认为全灭MOV AL,0OUT DX,ALMOV DX,MY8255_MODEMOV AL,00001110B ;PC7=0OUT DX,ALMOV AL,NOW_FLOORMOV BX,OFFSET DTABLEAND AX,00FFHADD BX,AXMOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值MOV DX,MY8255_BOUT DX,AL;---------------------------------------;先显示存储区域的值,再扫描键值,键值保存在[0752h]中,同时把数值存在第2个;数码管对应的存储区域[077dh],即当前输入值显示在第0个数码管中dispkey:call disp ;调显示子程序call key ;调键扫子程序mov ah,al ;newkey,al放置键盘输入值mov bl,ds:[0748h] ;ltime,键盘消抖处理mov bh,ds:[0749h] ;lkeymov al,01hmov dx,0ff21hout dx,alcmp ah,bhmov bh,ah ;bh=new keymov ah,bl ;al=timejz disk4mov bl,88hmov ah,88hdisk4: dec ahcmp ah,82hjz disk6cmp ah,0ehjz disk6cmp ah,00hjz disk5mov ah,20hdec bljmp disk7disk5: mov ah,0fhdisk6: mov bl,ahmov ah,bhdisk7: mov byte ptr ds:[0748h],blmov byte ptr ds:[0749h],bhmov byte ptr ds:[0752h],bh ;保存键值在[0752h]mov byte ptr ds:[077dh],bh ;第2个数码管对应存储区域mov al,ahret ;返回;----------------------------------------------;显示子程序;要显示的值存放在[077fh],[077eh],[077dh],[077ch],[077bh],[077ah] disp: push cx ;显示子程序mov dx,077fhmov ah,20h ;显示在左边第一个数码管disp0: mov cx,00ffh ;循环显示次数mov bx,dxmov bl,ds:[bx] ;取要显示的值mov bh,0hpush dxmov dx,0ff22h ;向数码管数据输出lea si,data1mov al,cs:[bx+si] ;转换为数码管显示值out dx,almov dx,0ff21h ;选个显示在哪个数码管上mov al,ahout dx,aldisp1: loop disp1 ;循环显示pop dxdec dx ;取下一个值shr ah,01h ;数码管往右边移一个用于显示jnz disp0pop cxretdata1: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h db 80h,90h,88h,83h,0c6h,0a1h,86h,8ehdb 0ffh,0ch,89h,0deh,0c7h,8ch,0f3h,0bfhdb 90h,0a3h,0a1h,86h,8fh;键盘扫描程序key: mov al,0ffhmov dx,0ff22hout dx,al ;关显示mov bl,00hmov ah,0fehmov cx,08h ;置计数初值key1: mov al,ahmov dx,0ff21hout dx,al ;置第0列为低电平shl al,01hmov ah,al ;左移一列nopnopnopnopnopnopmov dx,0ff23h ;读取键行值in al,dxnot alnopnopand al,0fh ;判有键否?jnz key2inc bl ;无键,扫描次数加1 loop key1 ;不满8列继续jmp nkey ;转无键处理key2: test al,01h ;计算键值je key3mov al,00hjmp key6key3: test al,02hje key4mov al,08hjmp key6key4: test al,04hje key5mov al,10hjmp key6key5: test al,08hje nkeymov al,18hkey6: add al,blcmp al,10hjnc fkeymov bl,almov bh,0hlea si,data2mov al,cs:[bx+si] ;键值存在AL中retnkey: ;mov al,20h ;无键值为20Hmov al,byte ptr ds:[077dh]fkey: retdata2: db 07h,04h,08h,05h,09h,06h,0ah,0bh ;键值表(数字键)DB 01h,00h,02h,0fh,03h,0eh,0ch,0dhMYISR PROC NEAR ;中断处理程序MYISRPUSH AXMOV AL,DIRCMP AL,0JZ DOWNCMP AL,2JZ UPjmp redikeyDOWN:MOV AL,NOW_FLOORDEC ALMOV NOW_FLOOR,ALAND AX,00FFHADD BX,AXMOV AL,[BX]MOV DX,MY8255_BOUT DX,ALJMP BIJIAOUP:MOV AL,NOW_FLOORINC ALMOV NOW_FLOOR,ALMOV BX,OFFSET DTABLE AND AX,00FFHADD BX,AXMOV AL,[BX]MOV DX,MY8255_BOUT DX,ALBIJIAO:MOV AL,NOW_FLOORMOV AH,TARGET_FLOOR CMP AH,ALJZ GUANBIjmp redikey GUANBI:MOV AL,00001110B ;PC7=0OUT DX,ALMOV DIR,1HMOV AL,0MOV DX,1300H ;用IO-32输出控制8个LED,显示目标楼层OUT DX,ALMOV F_FLOOR,1 ;置1,恢复按键有效MOV DX,MY8254_MODE ;初始化8254工作方式MOV AL,36H ;定时器0、方式3OUT DX,ALMOV SI,OFFSET FREQ_LIST ;装入频率表起始地址MOV DI,OFFSET TIME_LIST ;装入时间表起始地址MOV DX,0FH ;输入时钟为 1.0416667MHz,1.0416667M = 0FE502HMOV AX,0E502HDIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率MOV DX,MY8254_COUNT0OUT DX,AL ;装入计数初值MOV AL,AHOUT DX,ALMOV DL,[DI] ;取出演奏相对时间,调用延时子程序CALL DALLYADD SI,2INC DICALL DALLY1MOV DX,MY8254_MODE ;退出时设置8254为方式2,OUT0置0 MOV AL,10HOUT DX,ALMYISR ENDPDALLY PROC NEAR ;软件延时子程序PUSH CXMOV CX,00FFHD1: MOV AX,00FFHD2: DEC AXJNZ D2LOOP D1POP CXRETDALLY ENDPDALLY1 PROC ;延时子程序D00: MOV CX,200HD10: MOV AX,0FFFFHD20: DEC AXJNZ D20LOOP D10DEC DLJNZ D00RETDALLY1 ENDPCODE ENDSEND START六、实训总结在本次为期四天的微机原理实训期间,通过自己的动手操作、连线和编程,渐渐了解了七段数码管工作原理,知道了计算机对输入信号检测和输出控制的基本方法,掌握了常用按钮、发光二极管的使用方法。