《微机原理课程设计报告.doc》由会员分享,可在线阅读,更多相关《微机原理课程设计报告.doc(10页珍藏版)》请在三一办公上搜索。
1、 目 录一 理论部分11课题要求与内容12 系统方案设计13 系统硬件的设计14 系统软件设计1二 实践部分11 系统硬件原理简介12 系统硬件调试中出现的问题及解决措施13 系统软件1 3.1 软件设计1 3.2 软件调试中出现的问题及解决措施1三 附录1 模拟电梯一、理论部分 1课题要求与内容 1.1设计基本要求(可用实验箱小键盘) 用键盘、按钮、八段码和LED模拟电梯工作过程。楼层设为8层,键盘数字键18用来键入希望停的楼层,8个LED显示希望停的楼层,2位八段码指示电梯当前所在楼层,按钮用来启、停电梯。电梯正常运行时以每2秒1层的速度上升或下降。要求“电梯”能按以下方式运行:(1) 设
2、当前电梯停在某层(2位八段码显示相应楼层,8个LED全灭)。键入18数字键,如键入的数字与当前电梯停层相同,则什么亦不动作,若不同则相应楼层的LED亮;如再按运行键,则电梯自动判别上升或下降(在运行过程中八段码显示楼层变化)一直到达希望停的楼层(八段码显示该楼层,相应LED灭);(2) 设当前电梯正在上升或下降运行(此时八段码显示楼层变化,LED指示希望抵达的楼层),若键入新的希望停的楼层数字(相应的LED亮),则对同方向(上升或下降)未到的楼层能停,对其它情况则先停原希望停的楼层,然后按运行键后继续运行。比如: 设电梯当前在2层,向上运行,LED指示希望在6层停,此时若键入4,则电梯将在4楼
3、停,若再按运行键,则继续运行至6层停; 同上情况,若键入的不是4而是8,则电梯将先停在6层,再按运行键,运行至8层停。 同上情况,若键入的不是4(或8),而是1,则电梯先停在6层,再按运行键,运行至1层停。 1.2进一步设计要求 除运行按钮外,再设计几个按钮,模拟更多的电梯运行功能,如:(1) 同步在8*8点阵显示器显示上升和下降箭头,当停止时显示当前所在楼层号。(2) 直达按钮。若按此按钮,电梯按直达方式运行,即对运行期间新键入的停靠楼层(即使是同方向未到楼层)亦不停,直达终点楼层。(3) 急停按钮。电梯运行中,若按此按钮,则电梯立即停在下一层到达的楼层。(4) 断电维修按钮。按下该按钮电梯
4、不能工作,再按一下才能重新工作。(5) 设置急停开关(K0-K7),引入中断处理,立即响应,就近停靠。(6) 设置时钟显示。 2 系统方案设计三、电梯的工作方式 1假设当前电梯停在某层(LED显示相应楼层,数码管显示相应数字),键入数字键,如键入的数字与当前电梯停靠层相同,则什么也不做,若不同则相应楼层的LED亮;电梯自动判别上升或下降,一直到达希望停的楼层(数码管显示该楼层,相应 LED 灭)。 2断电待修按钮:假设当前电梯正在上升或下降运行(此时数码管显示楼层变化, LED 指示希望抵达的楼层),若在此时突然断电,则电梯停止在断电时的楼层,有可能不是目标楼层,只有断电维修后才可继续运行。二
5、 实践部分1 系统硬件原理简介四、总体设计思路(设计原理)本设计主要是利用微机应用实验平台来模拟电梯的运行,用到了平台上的一个非编码键盘、LED显示器、八段数码管等模块。设计有8个楼层,需要用8个按键模拟电梯中的请求按钮。由于中断级别在随着电梯所处楼层的不同而变化,而且中断源比较多。所以用每一个中断源直接和中断控制器相连,需要用到多个8259A级联,很不方便。为解决这个问题,首先定义三个单字节变量REQ_U、REQ_D和REQ_IN分别存储电梯每一层向上、向下和内部的请求,每一个变量用低5位,每一位代表一层。例如,REQ_U为 00000110B,这代表在2层和3层有向上的请求。8253定时器
6、每隔20ms产生一次中断,中断程序便去执行扫描键盘,当扫描到有电梯按键时,将请求存储到变量中。每到一个状态时再检查请求变量REQ_U、REQ_D和REQ_IN的值,根据电梯的运行方向和变量中的请求,来决定电梯下一步的运行。设电梯的当前楼层为floor(floor=18),运行方向为dir(dir=0,向上;dir=1,向下),在电梯运行的工程中,用数码管输出floor值显示当前的楼层。LED输出REQ_IN的值显示电梯内已经请求的楼层。当电梯静止初始状态时,无论哪一层有请求,电梯都由静止状态转入运行的状态,直到到达请求的楼层;设置一个断电待修按键,在运行过程中出现断电情况,电梯立刻停止运行,此
7、时电梯处于断电待修状态,不能完成请求。五、系统硬件电路设计 六、程序流程图 七、系统软件设计(编程实现);Keyscan.asm;键盘扫描及数码管显示实验;按键16设置为模式识别按键,按下表示当下为直达模式,直到到达后方可再选择;.386PINTR_IVADD EQU 01C8H ;INTR对应的中断矢量地址INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址INTR_IM EQU 0FBH ;INTR对应的中断屏蔽字IOY1 EQU 3040H ;片选IOY0对应的端口始地址M
8、Y8254_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控制寄存器端口地址IOY2 EQU 3080H ;片选IOY0对应的端口始地址IOY0 EQU 3000H ;片选IOY0对应的端口始地址MY8255_A EQU IOY0+00H*4 ;8255的A口地址MY8255_B EQU IOY0+01H*4 ;8255的B口地址MY8255
9、_C EQU IOY0+02H*4 ;8255的C口地址MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址STACK1 SEGMENT STACK DW 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,71H,3FHNOW_FLOOR DB 02H-01H ;定义数据变量
10、DIR DB 1TARGET_FLOOR DB 02H-01H ;02H为初始层,出事情况当前层和目标层一样 F_FLOOR DB 1 ;模式选择,与16按键有关FF_FLOOR DB 1 ;进入直达模式后,此位置0,不受变化,直到到达相应楼层,置1CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量IM_BAK DB ? ;保存INTR原中断屏蔽字的变量STR1 DB COUNT: $ ;显示的字符串DATA ENDS ;键值表,0F对应的7段数码管的段位值CODE SEGMENT ASSUME CS:CO
11、DE,DS:DATASTART: MOV AX,DATA MOV DS,AX ;初始化中断处理 CLI MOV AX,0000H ;替换INTR的中断矢量 MOV ES,AX MOV DI,INTR_IVADD MOV AX,ES:DI MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址 MOV AX,OFFSET MYISR MOV ES:DI,AX ;设置当前中断处理程序入口偏移地址 ADD DI,2 MOV AX,ES:DI MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址 MOV AX,SEG MYISR MOV ES:DI,AX ;设置当前中断处理
12、程序入口段地址 MOV DX,INTR_OCW1 ;设置中断屏蔽寄存器,打开INTR的屏蔽位 IN AL,DX MOV IM_BAK,AL ;保存INTR原中断屏蔽字 AND AL,INTR_IM OUT DX,AL STI ;初始化8254 MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,0B6H ;计数器2,方式3 OUT DX,AL MOV DX,MY8254_COUNT2 ;装入计数初值 MOV AL,00H ;18432分频 OUT DX,AL MOV AL,48H OUT DX,AL MOV DX,MY8254_MODE ;初始化8254工作方式 MO
13、V AL,36H ;计数器0,方式3 OUT DX,AL MOV DX,MY8254_COUNT0 ;装入计数初值 MOV AL,0C8H ;100分频 OUT DX,AL MOV AL,00H OUT DX,AL ;初始化8255 MOV DX,MY8255_MODE ;初始化8255工作方式 MOV AL,81H ;方式0,A口、B口输出,C口低4位输入 OUT DX,AL MOV DX,IOY2 ;用IO-32输出控制8个LED,刚开始默认为全灭 MOV AL,0 OUT DX,AL MOV DX,MY8255_MODE MOV AL,00001110B ;PC7=0 OUT DX,AL
14、 MOV AL,NOW_FLOOR MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,BX ;将键值作为偏移和键值基地址相加得到相应的键值 MOV DX,MY8255_B OUT DX,AL BEGIN: CALL CCSCAN ;扫描按键 JNZ GETKEY1 ;有键按下则跳置GETKEY1 MOV AH,1 ;判断PC键盘是否有按键按下 INT 16H JZ BEGIN ;无按键则跳回继续循环,有则退出;退出程序前的一个太子换狸猫QUIT: CLI MOV AX,0000H ;恢复INTR原中断矢量 MOV ES,AX MOV DI,I
15、NTR_IVADD MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址 MOV ES:DI,AX ADD DI,2 MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址 MOV ES:DI,AX MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字 MOV AL,IM_BAK OUT DX,AL STI MOV AX,4C00H ;返回到DOS INT 21HGETKEY1: CALL DALLY CALL DALLY CALL CCSCAN ;再次扫描按键 JNZ GETKEY2 ;有键按下则跳置GETKEY2 JMP BEGIN ;否则跳
16、回开始继续循环GETKEY2:MOV CH,0FEH MOV CL,00H ;设置当前检测的是第几列COLUM: MOV AL,CH ;选取一列,将X1X4中一个置0 MOV DX,MY8255_A OUT DX,AL MOV DX,MY8255_C ;读Y1Y4,用于判断是哪一行按键闭合 IN AL,DXL1: TEST AL,01H ;是否为第1行 JNZ L2 ;不是则继续判断 MOV AL,00H ;设置第1行第1列的对应的键值 JMP KCODEL2: TEST AL,02H ;是否为第2行 JNZ L3 ;不是则继续判断 MOV AL,04H ;设置第2行第1列的对应的键值 JMP
17、 KCODEL3: TEST AL,04H ;是否为第3行 JNZ L4 ;不是则继续判断 MOV AL,08H ;设置第3行第1列的对应的键值 JMP KCODE L4: TEST AL,08H ;是否为第4行 JNZ NEXT ;不是则继续判断 MOV AL,0CH ;设置第4行第1列的对应的键值KCODE: ADD AL,CL ;将第1列的值加上当前列数,确定按键值 CMP F_FLOOR,1 ;16按键识别后置挝 JNZ KON2 CALL PUTBUF ;保存按键值 JMP KON4KON2: CMP FF_FLOOR,1 JNZ KON4 CALL PUTBUF KON4: PUS
18、H AXKON: CALL CCSCAN ;扫描按键,判断按键是否弹起 JNZ KON ;未弹起则继续循环等待弹起 POP AXNEXT: INC CL ;当前检测的列数递增 MOV AL,CH TEST AL,08H ;检测是否扫描到第4列 JZ KERR ;是则跳回到开始处 ROL AL,1 ;没检测到第4列则准备检测下一列 MOV CH,AL JMP COLUMKERR: JMP BEGINMYISR PROC NEAR ;中断处理程序MYISR PUSH AX MOV AL,DIR CMP AL,0 JZ DOWN CMP AL,2 JZ UP JMP OVERDOWN: MOV AL
19、,NOW_FLOOR DEC AL MOV NOW_FLOOR,AL MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,BX MOV DX,MY8255_B OUT DX,AL JMP BIJIAOUP: MOV AL,NOW_FLOOR INC AL MOV NOW_FLOOR,AL MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,BX MOV DX,MY8255_B OUT DX,ALBIJIAO: MOV AL,NOW_FLOOR MOV AH,TARGET_FLOOR CMP AH
20、,AL JZ GUANBI JMP OVERGUANBI: MOV DX,MY8255_MODE MOV AL,00001110B ;PC7=0 OUT DX,AL MOV DIR,1H MOV AL,0 MOV DX,IOY2 ;用IO-32输出控制8个LED,显示目标楼层 OUT DX,AL MOV F_FLOOR,1 ;置1,恢复按键有效 MOV FF_FLOOR,1OVER: MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令 MOV AL,20H OUT DX,AL MOV AL,20H OUT 20H,AL POP AX IRETMYISR ENDP CCSC
21、AN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4列全选通,X1X4置0 OUT DX,AL MOV DX,MY8255_C IN AL,DX ;读Y1Y4 NOT AL AND AL,0FH ;取出Y1Y4的反值 RETCCSCAN ENDPPUTBUF PROC NEAR ;保存键值子程序 ,AL即为目标楼层 CMP AL,15 JNZ KON3 ;不是16第按键,则进入正常灵活可调模式 MOV F_FLOOR,0 ;如是第16按键,置0,按键失效,则进入单向模式,直达某层 MOV DX,MY8255_MODE MOV AL,
22、00001110B ;PC7=0 OUT DX,AL JMP ENDDKON3: MOV FF_FLOOR,0 ;直达模式时置0MOV TARGET_FLOOR,AL MOV AH,NOW_FLOOR ;0-7对应1-8层,和当前楼层比较, CMP AH,AL JNZ PANDUAN ;不同层就处理,同层不处理 JMP ENDDPANDUAN: CMP AL,AH JB XIAOYU MOV DIR,2 JMP CHULIXIAOYU: MOV DIR,0CHULI: ;显示目标楼层的灯 MOV CL,AL MOV AL,01H SHL AL,CL MOV DX,IOY2 ;用IO-32输出控
23、制8个LED,显示目标楼层 OUT DX,AL MOV DX,MY8255_MODE MOV AL,00001111B ;PC7=1,启动定期是2s定时 OUT DX,AL ENDD: PUTBUF ENDPDALLY PROC NEAR ;软件延时子程序 PUSH CX MOV CX,00FFHD1: MOV AX,00FFHD2: DEC AX JNZ D2 LOOP D1 POP CX RETDALLY ENDPCODE ENDS END START八、设计心得 本次课程设计我们模拟了日常生活中常见的电梯运行过程。这次的课程设计让我对程序的设计,调试有了更深刻的认识,尤其是写单片机这类与硬件相关的程序。在调试的时候会有不少意想不到的结果,这就要求我们除了对程序充分了解,还要对硬件的特性,电路的连接也深刻认识。 关于程序,总结如下:必须在写之前仔细分析,了解其运作过程,画出流程图,明确各个模块的作用,然后分块细化,否侧很难写出程序,或者程序写了一半发现理解出错,使功能达不到所求,另外可根据需要加上注释,不然可能之后自己也看不懂程序。写完程序运行调试之后可能会有错误,这时可以边修改边调试,使程序更完善。 通过这次课程设计,不仅让我把已经学过的微机原理的知识重新复习了一下,也让我对这门课有了更深的了解和应用。