倒计时牌一、方案选择:1.1题目要求:显示距倒计时时刻还有多长时间(显示:时、分、秒)1.2总体初设方案和理由1.2.1处理器芯片选择8086微处理器的主要特点:8086为16位微处理器,数据总线16位,地址总线20位,可寻址1MB存储空间,时钟频率为5~10MHz。
8086 CPU的内部结构由执行单元EU(execution unit)和总线接口部件BIU(bus interface unit)两部分组成。
我们最熟悉的微处理器就是8086,所以选择8086CPU。
1.2.2通信接口芯片选择可编程并行通信接口8255,PA端口作为信号输入,PB端口做为数码管的位选信号输出端口,PC端口作为数码管的片选信号输出端口。
本系统设计以8086微处理器作为CPU, 8255做可编程并行接口显示时钟和键盘电路,接LED显示倒计时及小时、分钟、秒(各2位)和扩展调整键盘。
系统一运行就从23时59分59秒开始计时,并在数码管上显示当前值,而且,可以用键盘设置当前时间。
基本工作原理:每1秒对寄存器的内容减一,当减60次时,分减一,秒恢复到59;当分减60次时,时减一,分恢复到59;6个数码管动态显示时、分、秒的当前值二、硬件原理电路图的设计及分析:各部分电路的设计思想及功能特性及原理电路图:系统分为3个功能模块,分别为:主程序模块,小键盘控制模块,LED 显示模块。
2.1主程序模块主控模块是其心模块,对8255进行初始化,扫描键盘根据按键值作相应的处理。
主要由软件实现。
它的主要功能是调用其它模块对系统工作进行协调,读小键盘输入键值并执行要做的工作,如图1图12.2小键盘模块小键盘模块送入主控模块的子功能模块。
由软件和硬件实现,硬件上由小键盘和8255互连,将小键值由8255送入主控模块。
软件上使用行扫描法获得键值并送回主控模块。
本课题只考虑去抖动。
执行一个约10ms的延时程序后再扫描键盘,若F0=1表示真正有键按下,从而消除了抖动影响,如图2图22.3 LED显示模块显示模块是将显示缓冲区的数值送到LED显示的功能模块,显示缓冲区是由六个字节构成,分别保存时的高位和低位,分的高位和低位,秒的高位和低位。
硬件上由六个LED构成,软件上由扫描显示的方法实现,如图3。
图3其中,由于实际应用中要求显示为十进制数,而在程序中处理的数据都为十六进制,因此在程序中要对显示缓冲区的数据进行十进制调整。
在总的电路图中用8255并行通信接口的PC 端口进行片选,位选由PB 端口输出,根据如下段码表来设计 。
表1三、 程序设计与分析:各模块程序的设计、完整的程序框图:3.1设计流程图 3.1.1主程序流程N图43.1.2时间程序更改流程图Y N NYNN图53.1.3 键盘扫描程序流程图:Array图63.2程序设计与分析:3.2.1各模块程序的设计(1)8255A初始化程序开始时对8255A进行初始化,PA、PB、PC组控制工作在方式0,PA 端口为输入端口。
PB、PC为输出端口。
DATA SEGMENTLED DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HX DW ?Y DW ?Z DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,46H ;0100 0110 [8255] 控制口地址46hMOV AL,82H ;1000 0010 A方式0输出B方式0输入C输出OUT DX,AL ;向8255写控制字NEXT: MOV X,59 ;记录按键次数MOV Y,59MOV Z,23LEA SI ,LEDMOV AL,00010111B ;定时器0方式0OUT 4EH,AL ;向8253写控制字MOV AL,255 ;计数初值为1MOV DX,48H ;计数器0的端口地址OUT DX,ALREPEAT0:(2)显示程序模块根据方式控制字和连线可知,B口连接数码管的A~Dp进行段锁存,C口进行位锁存。
显示程序如下:CONVER PROCMOV AX,XMOV CL,10DIV CL ;按键次数除以10,商是次数的十位存在AL中,余数是次数的各位,存在AH中MOV BX,AX ;AH:BH AL:BLMOV AL,02HOUT 44H,AL ;向8255端口C的Pc0置1 使显示管1工作MOV BP,BXAND BP,0FFH ;清除余数,保留商MOV AL,[SI+BP] ;使显示管显示相应的值OUT 40H,AL ;将商的值显示通过PACALL DELYMOV AL, 01H ;0000 0001OUT 44H, AL ;点亮各位led 置8255的Pc1为0XCHG BH,BL ;交换商和余数MOV BP,BXAND BP,0FFH ;清除商,保留余数MOV AL,[SI+BP]OUT 40H,AL ;将余数的值显示通过PACALL DELYMOV AX,YMOV CL,10DIV CL ;按键次数除以10,商是次数的十位,存在AL中,余数是次数的各位,存在AH中MOV BX,AX ;AH..BH AL..BLMOV AL,20HOUT 44H, AL ;向8255端口C的Pc0置1 使显示管1工作MOV BP,BXAND BP,0FFH ;清除余数,保留商MOV AL,[SI+BP] ;使显示管显示相应的值OUT 40H,AL ;将商的值显示通过PACALL DELYMOV AL, 10H ;0000 0010OUT 44H, AL ;点亮各位led 置8255的Pc1为0XCHG BH,BL ;交换商和余数MOV BP,BXAND BP,0FFH ;清除商,保留余数MOV AL,[SI+BP]OUT 40H,AL ;将余数的值显示通过PACALL DELYMOV AX,ZMOV CL,10DIV CL ;按键次数除以10,商是次数的十位,存在AL中,余数是次数的各位,存在AH中MOV BX,AX ;AH..BH AL..BLMOV AL,80HOUT 44H, AL ;向8255端口C的Pc0置1 使显示管1工作MOV BP,BXAND BP,0FFH ;清除余数,保留商MOV AL,[SI+BP] ;使显示管显示相应的值OUT 40H,AL ;将商的值显示通过PACALL DELYMOV AL, 40H ;0100 0000OUT 44H, AL ;点亮各位led,置8255的Pc1为0XCHG BH,BL ;交换商和余数MOV BP,BXAND BP,0FFH ;清除商,保留余数MOV AL,[SI+BP]OUT 40H,AL ;将余数的值显示通过PACALL DELYRETCONVER ENDP(3)延时程序模块控制一个循环程序循环以到达延时的目的。
具体语句如下:DELY PROCPUSH CXMOV CX,1000L: LOOP LPOP CXRETDELY ENDP3.3 程序代码:DATA SEGMENTLED DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HX DW ?Y DW ?Z DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV DX,46H ;0100 0110[8255] 控制口地址46hMOV AL,82H ;1000 0010 A方式0输出B方式0输入C输出OUT DX,AL ;向8255写控制字NEXT: MOV X,59 ;记录按键次数MOV Y,59MOV Z,23LEA SI ,LEDMOV AL,00010111B ;定时器0方式0OUT 4EH,AL ;向8253写控制字MOV AL,255 ;计数初值为1MOV DX,48H ;计数器0的端口地址OUT DX,ALREPEAT0:REPEAT1: CALL CONVER ;显示子程序MOV DX,42HIN AL,DX ;将PB中的值输入到AL PB的值取决于PB7CMP AL,0FEHJZ NEXTTEST AL,80H ;判断计数是否结束TEST相与但不改变相应的值JNZ REPEAT1 REPEAT2: CALL CONVERMOV DX,42HIN AL,DXCMP AL,7EHJZ NEXTTEST AL,80HJZ REPEAT2DEC X ;计数结束,按键次数减1 CMP X,0JNZ NEXT1MOV X,59DEC Y NEXT1: CMP Y,0JNZ NEXT2MOV Y,59DEC ZNEXT2: CMP Z,0JNZ NEXT3MOV Z,23NEXT3: CALL CONVER ;显示子程序JMP REPEAT0 ;重新初始化定时器,为下一次按键准备CONVER PROCMOV AX,XMOV CL,10DIV CL ;按键次数除以10,商是次数的十位存在AL中,余数是次数的各位,存在AH中MOV BX,AX ;AH:BH AL:BLMOV AL,02HOUT 44H,AL ;向8255端口C的Pc0置1 使显示管1工作MOV BP,BXAND BP,0FFH ;清除余数,保留商MOV AL,[SI+BP] ;使显示管显示相应的值OUT 40H,AL ;将商的值显示通过PACALL DELYMOV AL, 01H ;0000 0001OUT 44H, AL ;点亮各位led 置8255的Pc1为0XCHG BH,BL ;交换商和余数MOV BP,BXAND BP,0FFH ;清除商,保留余数MOV AL,[SI+BP]OUT 40H,AL ;将余数的值显示通过PACALL DELYMOV AX,YMOV CL,10DIV CL ;按键次数除以10,商是次数的十位,存在AL中,余数是次数的各位,存在AH中MOV BX,AX ;AH..BH AL..BL MOV AL,20HOUT 44H, AL ;向8255端口C的Pc0置1 使显示管1工作MOV BP,BXAND BP,0FFH ;清除余数,保留商MOV AL,[SI+BP] ;使显示管显示相应的值OUT 40H,AL ;将商的值显示通过PACALL DELYMOV AL, 10H ;0000 0010OUT 44H, AL ;点亮各位led 置8255的Pc1为0XCHG BH,BL ;交换商和余数MOV BP,BXAND BP,0FFH ;清除商,保留余数MOV AL,[SI+BP] OUT 40H,AL ;将余数的值显示通过PACALL DELYMOV AX,ZMOV CL,10DIV CL ;按键次数除以10,商是次数的十位,存在AL中,余数是次数的各位,存在AH中MOV BX,AX ;AH..BH AL..BL MOV AL,80HOUT 44H, AL ;向8255端口C的Pc0置1 使显示管1工作MOV BP,BXAND BP,0FFH ;清除余数,保留商MOV AL,[SI+BP] ;使显示管显示相应的值OUT 40H,AL ;将商的值显示通过PACALL DELYMOV AL, 40H ;0100 0000OUT 44H, AL ;点亮各位led,置8255的Pc1为0XCHG BH,BL ;交换商和余数MOV BP,BXAND BP,0FFH ;清除商,保留余数MOV AL,[SI+BP]OUT 40H,AL ;将余数的值显示通过PACALL DELYRETCONVER ENDP DELY PROCPUSH CXMOV CX,1000L: LOOP LPOP CXRETDELY ENDPCODE ENDSEND START图7微机原理和接口技术是一门实践性强的学科,其中很多的原理、规则、现象等仅仅靠学习教科书是无法完全掌握的,必须通过实践才能比较直观和深刻的理解。